[廚餘回收] 在 CentOS 7 上安裝 MySQL 踩了幾顆地雷

原以為在 CentOS 7 上安裝 MySQL 是探嚢取物,照著官方的步驟按圖施工,必定成功,還是踩了幾顆地雷炸掉我不少時間,我選擇安裝 MySQL 的方式是用二進制包(Generic Binaries)的安裝方式,這種方式可以讓我更方便地修改環境變數,照著官方的步驟是一定可以安裝成功的,但是有幾點我們需要注意一下。

移除 CentOS 7 內建的 MariaDB Libraries

CentOS 7 預設內建 MariaDB Libraries,我們可以執行下面這兩行指令的其中一行,就能列出已經安裝的 MariaDB Packages。

rpm -qa | grep mariadb 
# or
yum list installed | grep mariadb

移除也挺簡單的,我建議用 yum remove 指令來移除套件,讓 yum 幫我們處理套件相依的問題。

yum remove -y mariadb-libs

啟動 MySQL 服務時 libnuma.so.1 報錯

如果我們看到下列這串錯誤訊息,那很有可能是我們少裝了 numactl 套件。

bin/mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory

執行 yum install 指令把它裝起來就行了

yum install -y numactl

MySQL 從 5.7.18 開始 my-default.cnf 不再內含在二進制包內

從 5.7.18 版本開始沒有 my.cnf 設定檔也可以執行 MySQL 服務,如果有朋友參考到 5.7.18 版本以前的二進制包安裝教學文章,通常會有一個步驟是複製 support-files/my-default.cnf/etc 底下,這個步驟從 5.7.18 開始可以省略了。

可是如果要自訂環境變數怎麼辦? 一樣可以產生一個 my.cnf 放到 /etc 底下,而設定檔的內容只要設定我們想要調整的環境變數就行了,其他會維持預設值,這個連結說明了 MySQL 讀取設定檔位置的順序。

底下附上安裝 MySQL 5.7.19 的指令

yum install -y libaio
yum install -y numactl
yum install -y wget
cd /tmp
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz

# -C: 如果要解壓縮到某個目錄,必須加上這個參數。
tar -zxvf mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz  -C  /usr/local

cd /usr/local
mv mysql-5.7.19-linux-glibc2.12-x86_64 mysql
cd mysql
groupadd mysql

# -r: 建立一個系統的帳號,這個帳號的 UID 會有限制(/etc/login.defs)。
# -g: 帳號的 Initial Group
# -s: 後面接一個 Shell,預設是 /bin/bash。
# /bin/false: 這是最嚴格的禁止 Login 選項,一切服務都不能用,這樣該用戶即使登錄,也不能夠執行 Linux 下的命令。
useradd -r -g mysql -s /bin/false mysql

mkdir data
chmod 750 data

# -R: 進行遞迴(Recursive)的持續變更,亦即連同次目錄下的所有檔案都變更。
# 小數點(.): 目前的工作目錄
chown -R mysql .
chgrp -R mysql .

# 初始化MySQL,記得把臨時密碼記下來。
bin/mysqld --initialize --user=mysql

# 產生 RSA 私鑰
bin/mysql_ssl_rsa_setup

chown -R root .
chown -R mysql data

# 建立啟動腳本
cp support-files/mysql.server /etc/init.d/mysql.server

# 啟動 mysql.server 服務
service mysql.server start

# 使用剛剛生成的密碼登入 mysql
bin/mysql -u root -p

# 重設密碼
set password=password('{密碼}');

# 開啟 root 的遠端登入權限
grant all privileges on *.* to 'root'@'%' identified by '{密碼}' with grant option;
flush privileges;
exit

# 開啟防火牆 3306 埠號
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload

參考資料

C# 指南ASP.NET 教學ASP.NET MVC 指引
Azure SQL Database 教學SQL Server 教學Xamarin.Forms 教學