雖然現代部署多使用官方 RPM、Docker 或包管理器,但原始碼編譯安裝仍具備不可替代的優勢:完全掌控安裝路徑、編譯參數、版本選擇,適合對效能、安全、合規有嚴格要求的生產環境。本文以 MySQL 4.0.16 為例(現代版本流程一致),詳細記錄解壓、配置、編譯、安裝、配置、初始化、啟動與安全加固的完整步驟。
/usr/local/mysql(遵循 FHS,便於多版本共存)/usr/local/mysql/var/usr/local/mysql/var/mysql.sockmysql(專用系統帳號,非 root)cd /usr/local/mysql/software
tar zxvf mysql-4.0.16.tar.gz
cd mysql-4.0.16
./configure \
--prefix=/usr/local/mysql/mysql \
--with-mysqld-user=mysql \
--with-extra-charsets=all \
--with-unix-socket-path=/usr/local/mysql/mysql/var/mysql.sock
| 參數 | 作用 | 現代版本對應 |
|---|---|---|
--prefix |
指定安裝根目錄 | -DCMAKE_INSTALL_PREFIX=... (CMake) |
--with-mysqld-user |
指定 mysqld 執行使用者,增強安全性 | -DWITH_MYSQLD_USER=mysql |
--with-extra-charsets |
字元集支援範圍,all 含所有 | -DDEFAULT_CHARSET=utf8mb4 -DWITH_EXTRA_CHARSETS=all |
--with-unix-socket-path |
Unix socket 檔路徑,客戶端連線依賴 | -DMYSQL_UNIX_ADDR=... |
關鍵安全原則:絕不可用 root 執行 mysqld。專用使用者程序異常時會自動退出,避免殭屍進程佔用資源且難以清理。
make
make install
現代版本(5.7+)改用 CMake:cmake .. && make && make install。編譯時間視 CPU 核心數與記憶體而定,可加 -j$(nproc) 並行加速。
my.cnf 部署# 複製預設配置範本
cp /usr/local/mysql/mysql/share/mysql/my-medium.cnf /etc/my.cnf
# 或建立自訂最小配置
cat > /etc/my.cnf <<'EOF'
[mysqld]
datadir=/usr/local/mysql/mysql/var
socket=/usr/local/mysql/mysql/var/mysql.sock
user=mysql
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/usr/local/mysql/mysql/var/mysql.sock
EOF
/usr/local/mysql/mysql/bin/mysql_install_db --user=mysql
mysql 系統資料庫(權限表、時區表、幫助表等)datadir 下建立 var 目錄與各系統表檔案# 方式一:使用啟動腳本
/usr/local/mysql/mysql/share/mysql/mysql.server start
# 方式二:直接啟動(除錯用)
/usr/local/mysql/mysql/bin/mysqld_safe --user=mysql &
# 設定 root 密碼
/usr/local/mysql/mysql/bin/mysqladmin -u root password '強密碼123!'
# 驗證登入
/usr/local/mysql/mysql/bin/mysql -u root -p
cat > /etc/systemd/system/mysqld.service <<'EOF'
[Unit]
Description=MySQL Server
After=network.target
[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/mysql/share/mysql/mysql.server start
ExecStop=/usr/local/mysql/mysql/share/mysql/mysql.server stop
PIDFile=/var/run/mysqld/mysqld.pid
TimeoutSec=300
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now mysqld
| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 啟動失敗,無 socket 檔 | datadir 權限錯誤、配置路徑不一致、未執行 mysql_install_db | 檢查 /var/log/mysqld.log、確認 my.cnf 路徑、重新初始化 |
| 連線被拒 | 防火牆阻擋 3306、bind-address=127.0.0.1、skip-networking | 開放防火牆、設定 bind-address=0.0.0.0 |
| 中文亂碼 | 字元集未設為 utf8mb4 | my.cnf 設定 character-set-server=utf8mb4、collation-server=utf8mb4_unicode_ci |