源碼編譯安裝 MySQL 可深度定製功能模組、優化編譯參數、適配特定硬體架構,是高效能生產環境的首選部署方式。本文以 CentOS 7 + MySQL 5.5.40 為例,完整記錄從依賴安裝到服務驗證的標準化流程。
yum install -y gcc gcc-c++ autoconf libjpeg libjpeg-devel perl perl-CPAN \ libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel \ zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel \ ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel \ krb5 krb5-devel libidn libidn-devel openssl openssl-devel \ openldap openldap-devel nss_ldap openldap-clients openldap-servers \ cmake make ncurses-devel pcre pcre-devel libtool libxml2-devel \ ntpdate gd-devel libpng-devel zip unzip gzip
說明:以上套件涵蓋編譯工具鏈、壓縮庫、SSL、LDAP、正則表達式、圖形庫等 MySQL 編譯所需所有依賴。CentOS 8/RHEL 8 請改用 dnf 並注意套件名稱差異(如 e2fsprogs-devel 非 e2frogs-devel)。
# 建立無登入權限的 mysql 系統用戶
useradd -s /sbin/nologin -M mysql
# 建議目錄規劃
mkdir -p /usr/local/mysql/{data,logs,tmp}
chown -R mysql:mysql /usr/local/mysql
cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DWITH_FEDERATED_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DENABLED_LOCAL_INFILE=1 \ -DMYSQL_USER=mysql \ -DMYSQL_TCP_PORT=3306 \ -DMYSQL_UNIX_ADDR=/usr/local/mysql/tmp/mysql.sock \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_BOOST=boost_1_69_0 \ -DDOWNLOAD_BOOST=1 \ -DCMAKE_BUILD_TYPE=Release
| 關鍵參數 | 用途 | 建議值 |
|---|---|---|
| CMAKE_INSTALL_PREFIX | 安裝根目錄 | /usr/local/mysql |
| DEFAULT_CHARSET | 預設字元集 | utf8mb4(支援 Emoji) |
| WITH_INNOBASE_STORAGE_ENGINE | 啟用 InnoDB | 1 (必須) |
| WITH_PARTITION_STORAGE_ENGINE | 啟用分區引擎 | 1 |
| WITH_BOOST / DOWNLOAD_BOOST | MySQL 5.7+ 需 Boost 庫 | 自動下載或指定本地路徑 |
| CMAKE_BUILD_TYPE | 編譯優化等級 | Release(生產)/ Debug(開發) |
# 多核並行編譯加速 (假設 8 核) make -j8 && make install # 複製配置檔範本 cp support-files/my-large.cnf /etc/my.cnf # 或依實際記憶體選擇 my-small/medium/large/huge/innodb-heavy-4G.cnf # 複製啟動腳本 cp support-files/mysql.server /etc/init.d/mysqld chmod 755 /etc/init.d/mysqld # 初始化系統表 (MySQL 5.7+) /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql \ --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data # MySQL 5.5/5.6 使用 /usr/local/mysql/scripts/mysql_install_db --user=mysql \ --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 目錄權限 chown -R mysql:mysql /usr/local/mysql chmod 755 /usr/local/mysql # 註冊系統服務 chkconfig --add mysqld chkconfig mysqld on chkconfig --list mysqld # 輸出應包含 2:on 3:on 4:on 5:on # 啟動服務 service mysqld start # 或 systemctl start mysqld (CentOS 7+) # 驗證連線 /usr/local/mysql/bin/mysql -u root -e "SELECT VERSION(), CURRENT_USER();" # MySQL 5.7+ 初始無密碼,直接登入;5.5/5.6 預設 root 空密碼
/usr/local/mysql/bin/mysql_secure_installation # 依提示操作: # 1. 設定 root 強密碼 # 2. 移除匿名用戶 # 3. 禁止 root 遠程登入 # 4. 移除 test 資料庫 # 5. 重新載入權限表
| 錯誤現象 | 原因 | 解決方案 |
|---|---|---|
| CMake Error: Could NOT find Curses | 缺 ncurses-devel | yum install ncurses-devel |
| error: 'MYSQL_SERVER_VERSION' undeclared | Boost 版本不符 | 指定 -DWITH_BOOST=正確路徑 或 -DDOWNLOAD_BOOST=1 |
| ld: cannot find -lssl | OpenSSL 開發包缺失 | yum install openssl-devel |
| make[2]: *** [sql/sql_acl.cc] Error 1 | 記憶體不足導致 OOM Killer | 增加 swap 或減少 -j 並行數 |
mysql_upgrade。/usr/local/mysql/data/*.err 錯誤日誌。