MySQL 安裝方式多樣,各有優劣。本文涵蓋 RPM 套件 (紅帽系最快)、二進制 tarball (通用、可自訂路徑)、原始碼編譯 (極致客製化) 三大主流方式,並說明初始化、服務註冊、安全性設定等後續必要步驟。
# 下載 RPM 套件至 /tmp
cd /tmp
su - root
# 一次安裝所有 MySQL 相關套件 (server、client、libs、devel)
rpm -Uvh MySQL-*.rpm
✅ 優點:依賴自動解決、檔案配置標準化、易於升級/移除
❌ 缺點:安裝路徑固定、版本受限於發行版倉庫
cd /usr/local
tar -zxvf /tmp/mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz
# 建立版本無關的符號連結,方便日後升級切換
ln -s mysql-8.0.36-linux-glibc2.28-x86_64 mysql
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
# 修正目錄擁有權
chown -R mysql:mysql /usr/local/mysql-8.0.36-linux-glibc2.28-x86_64
chown -R mysql:mysql /usr/local/mysql
cd /usr/local/mysql
bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# --initialize-insecure:產生無密碼 root (需事後設定)
# 生產環境建議用 --initialize 產生隨機密碼 (記錄在 error log)
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
# 或直接使用官方提供的 systemd unit file
cp support-files/mysql.service /etc/systemd/system/mysqld.service
systemctl daemon-reload
systemctl enable mysqld
systemctl start mysqld
# 安裝建構依賴
yum install -y cmake gcc gcc-c++ ncurses-devel bison openssl-devel
# 下載原始碼
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36.tar.gz
tar -zxvf mysql-8.0.36.tar.gz
cd mysql-8.0.36
# 配置編譯選項
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_INNODB=ON \
-DWITH_SSL=system \
-DWITH_ZLIB=system
make -j$(nproc)
make install
後續初始化、服務設定同方式二。
/usr/local/mysql/bin/mysqladmin -u root password 'StrongP@ssw0rd!'
# 或登入後執行
ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongP@ssw0rd!';
/usr/local/mysql/bin/mysql_secure_installation
# 移除匿名用戶、禁止 root 遠端登入、移除 test 資料庫、重新載入權限表
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
mysql -u root -p -e "SHOW DATABASES;"
# 應顯示 mysql、performance_schema、information_schema、sys
| 現象 | 可能原因 | 解決方向 |
|---|---|---|
| mysqld 無法啟動 | datadir 權限錯誤、port 3306 衝突、selinux 阻擋 | chown -R mysql:mysql data/;netstat -tlnp;setenforce 0 或設定 selinux policy |
| 連線被拒 | skip-networking、bind-address=127.0.0.1、防火牆 | 修改 my.cnf bind-address=0.0.0.0;firewall-cmd --add-port=3306/tcp |
| 中文亂碼 | 字符集不一致 | my.cnf 設定 character-set-server=utf8mb4;重建資料庫/表 |