背景:從 autotools 到 CMake
MySQL 5.5 起棄用傳統 ./configure,全面轉向 CMake 構建系統。優勢:跨平台一致性、並行編譯、依賴檢測更智能、IDE 整合友好。
核心命令語法對照
| 傳統 configure | CMake 對應 | 說明 |
./configure | cmake . | 預設配置生成 |
./configure --help | cmake . -LH 或 ccmake . (互動式) | 查看所有選項 |
make clean | make clean && rm -f CMakeCache.txt | 清除快取重新配置 |
安裝路徑參數映射表
| 功能 | configure 選項 | CMake 選項 | 備註 |
| 安裝根目錄 | --prefix=/usr | -DCMAKE_INSTALL_PREFIX=/usr | 其他路徑若為相對值,基於此前綴 |
| mysqld 執行檔 | --libexecdir=/usr/sbin | -DINSTALL_SBINDIR=sbin | 相對路徑 |
| 資料目錄 | --localstatedir=/var/lib/mysql | -DMYSQL_DATADIR=/var/lib/mysql | 建議絕對路徑 |
| 配置檔目錄 | --sysconfdir=/etc/mysql | -DSYSCONFDIR=/etc/mysql | |
| 插件目錄 | --with-plugindir=... | -DINSTALL_PLUGINDIR=lib/mysql/plugin | |
| Man page | --mandir=/usr/share/man | -DINSTALL_MANDIR=share/man | |
| 共享資料 | --sharedstatedir=/usr/share/mysql | -DINSTALL_SHAREDIR=share | |
| 庫檔安裝 | --libdir=/usr/lib64/mysql | -DINSTALL_LIBDIR=lib64/mysql | |
| 頭檔安裝 | --includedir=/usr/include/mysql | -DINSTALL_INCLUDEDIR=include/mysql | |
儲存引擎(插件)編譯控制
MySQL 5.5+ 採用插件式架構,--with-plugins 替換為獨立 CMake 選項:
| 引擎 | 啟用選項 | 停用選項 | 預設行為 |
| InnoDB | -DWITH_INNOBASE_STORAGE_ENGINE=1 | -DWITHOUT_INNOBASE_STORAGE_ENGINE=1 | 內建(非共享) |
| Archive | -DWITH_ARCHIVE_STORAGE_ENGINE=1 | -DWITHOUT_ARCHIVE_STORAGE_ENGINE=1 | 共享模組 |
| Blackhole | -DWITH_BLACKHOLE_STORAGE_ENGINE=1 | -DWITHOUT_BLACKHOLE_STORAGE_ENGINE=1 | 共享模組 |
| CSV / MyISAM / MEMORY / MERGE | 無需指定 | 強制內建 |
| Partition | -DWITH_PARTITION_STORAGE_ENGINE=1 | -DWITHOUT_PARTITION_STORAGE_ENGINE=1 | 內建 |
| Federated | -DWITH_FEDERATED_STORAGE_ENGINE=1 | -DWITHOUT_FEDERATED_STORAGE_ENGINE=1 | 共享模組 |
共享模組 vs 內建:若未指定 WITH/WITHOUT,預設編譯為共享模組(.so),需執行 INSTALL PLUGIN 或 --plugin-load 載入。生產環境建議核心引擎(InnoDB)內建編譯。
第三方庫依賴選項
| 庫 | configure | CMake | 說明 |
| Readline | --with-readline | -DWITH_READLINE=1 | 命令列編輯支援 |
| SSL/TLS | --with-ssl=/usr | -DWITH_SSL=system | 或 bundled 使用內建 yaSSL |
| zlib | --with-zlib-dir=/usr | -DWITH_ZLIB=system | |
| libwrap (tcp_wrappers) | --without-libwrap | -DWITH_LIBWRAP=0 | 預設啟用 |
完整實戰編譯腳本範例
#!/bin/bash
# build_mysql.sh - MySQL 5.5/5.6/5.7 通用編譯範例
VERSION="5.7.44"
PREFIX="/usr/local/mysql-${VERSION}"
DATADIR="/data/mysql/${VERSION}"
BUILD_DIR="/tmp/mysql-build"
# 1. 準備環境
yum install -y cmake gcc gcc-c++ ncurses-devel bison openssl-devel libaio-devel
# 2. 解壓並進入
tar zxvf mysql-${VERSION}.tar.gz
cd mysql-${VERSION}
# 3. 配置(釋放建構目錄隔離源碼)
mkdir -p ${BUILD_DIR}
cd ${BUILD_DIR}
cmake /path/to/mysql-${VERSION} \
-DCMAKE_INSTALL_PREFIX=${PREFIX} \
-DMYSQL_DATADIR=${DATADIR} \
-DSYSCONFDIR=/etc/mysql \
-DINSTALL_SBINDIR=sbin \
-DINSTALL_PLUGINDIR=lib/mysql/plugin \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_READLINE=1 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_DEBUG=0 \
-DCMAKE_BUILD_TYPE=Release
# 4. 編譯安裝(並行加速)
make -j$(nproc)
make install
# 5. 後續初始化(略,參考官方文件)
# scripts/mysql_install_db --user=mysql --datadir=${DATADIR}
常見編譯錯誤與解決
| 錯誤訊息 | 原因 | 解決 |
Curses library not found | 缺少 ncurses-devel | yum install ncurses-devel |
Could not find OpenSSL | OpenSSL 開發包缺失 | yum install openssl-devel 或 -DWITH_SSL=bundled |
Boost not found (MySQL 5.7+) | 需 Boost 庫 | -DWITH_BOOST=/usr/local/boost 或 -DDOWNLOAD_BOOST=1 |
CMakeCache.txt 衝突 | 舊快取干擾 | rm -rf CMakeCache.txt CMakeFiles 重新 cmake |
升級遷移提醒
- 5.5 → 5.6/5.7/8.0:
mysql_upgrade 必執行,系統表結構變更大
- 預設字元集變更:5.5 latin1 → 5.7 utf8mb4 → 8.0 utf8mb4(排序規則
utf8mb4_0900_ai_ci)
- InnoDB 參數重命名:
innodb_file_per_table、innodb_buffer_pool_instances 等
- 密碼驗證插件:8.0 預設
caching_sha2_password,舊客戶端需指定 mysql_native_password