從源碼編譯安裝 MySQL 可根據硬體特性啟用最優化選項,移除無用模組,顯著提升效能。本文記錄基於 CMake 的現代編譯流程、GCC 4.8.2 升級步驟、核心配置參數詳解與安裝後初始化腳本。
Ubuntu 10.04 預設 GCC 4.4 版本較舊,編譯 MySQL 5.6+ 建議升級至 4.8+ 以獲得更好優化與 C++11 支援。
# 官方鏡像
wget https://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.2/gcc-4.8.2.tar.gz
# 依賴庫
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
#!/bin/bash
gccver=4.8.2; gmpver=4.3.2; mpfrver=2.4.2; mpcver=0.8.1
pkgdir=.; rootdir=gcc-${gccver}; prefix=/opt/gcc-${gccver}; langs=c,c++
mkdir -p ${rootdir}
tar xzf ${pkgdir}/gcc-${gccver}.tar.gz
tar xjf ${pkgdir}/gmp-${gmpver}.tar.bz2
tar xjf ${pkgdir}/mpfr-${mpfrver}.tar.bz2
tar xzf ${pkgdir}/mpc-${mpcver}.tar.gz
# 將依賴庫移入 gcc 源碼目錄(自動編譯模式)
mv gmp-${gmpver} ${rootdir}/gmp
mv mpfr-${mpfrver} ${rootdir}/mpfr
mv mpc-${mpcver} ${rootdir}/mpc
pushd ${rootdir}
./configure --prefix=${prefix} --enable-languages=${langs} --disable-multilib
make -j$(nproc)
make install
popd
# 更新系統預設編譯器
update-alternatives --remove-all gcc
update-alternatives --remove-all g++
update-alternatives --install /usr/bin/gcc gcc /opt/gcc-4.8.2/bin/gcc 40
update-alternatives --install /usr/bin/g++ g++ /opt/gcc-4.8.2/bin/g++ 40
update-alternatives --config gcc
update-alternatives --config g++
# 替換 libstdc++.so(關鍵步驟,避免運行時連結舊版)
rm -f /usr/lib/libstdc++*
cp -f /opt/gcc-4.8.2/lib64/libstdc++.so.6.0.18 /usr/lib/
cp -f /opt/gcc-4.8.2/lib64/libstdc++.so.6 /usr/lib/
MySQL 5.5+ 全面改用 CMake,以下為生產環境推薦配置(針對 5.6 版本):
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DCMAKE_BUILD_TYPE=Release \
-DSYSCONFDIR=/etc \
-DINSTALL_SBINDIR=/usr/local/mysql/bin \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_TCP_PORT=3306 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_EMBEDDED_SERVER=0 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=0 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=0 \
-DWITH_MEMORY_STORAGE_ENGINE=0 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=0 \
-DWITH_EXTRA_CHARSETS=none \
-DWITH_DEBUG=0 \
-DWITH_ASAN=0
| 參數 | 建議值 | 說明 |
|---|---|---|
| CMAKE_BUILD_TYPE | Release | 啟用 -O2 優化,去除除錯符號 |
| DEFAULT_CHARSET | utf8mb4 | 支援完整 Unicode,含 Emoji |
| WITH_INNOBASE_STORAGE_ENGINE | 1 | InnoDB 核心引擎,必須啟用 |
| WITH_PARTITION_STORAGE_ENGINE | 1 | 分區表支援 |
| WITH_DEBUG | 0 | 生產環境關閉除錯,提升 10-15% 效能 |
| WITH_ASAN | 0 | AddressSanitizer 僅用於開發測試 |
# 編譯(多核加速)
make -j$(nproc)
make install
# 建立用戶與權限
groupadd mysql
useradd -r -g mysql mysql
chown -R mysql:mysql /usr/local/mysql/data
# 初始化系統表 (MySQL 5.7+ 使用 --initialize-insecure)
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 啟動服務
/usr/local/mysql/support-files/mysql.server start
# 設定 root 密碼
/usr/local/mysql/bin/mysql -uroot -D mysql -e "UPDATE mysql.user SET authentication_string=PASSWORD('123456') WHERE user='root'; FLUSH PRIVILEGES;"
[mysqld]
# 連線設定
max_connections=4000
back_log=1500
table_open_cache=8000
table_open_cache_instances=16
# InnoDB 核心
innodb_file_per_table=1
innodb_buffer_pool_size=32G
innodb_buffer_pool_instances=32
innodb_log_file_size=1G
innodb_log_files_in_group=3
innodb_flush_log_at_trx_commit=2
innodb_flush_method=O_DIRECT
innodb_read_io_threads=4
innodb_write_io_threads=4
innodb_io_capacity=4000
innodb_thread_concurrency=0
# 關閉無用特性
innodb_doublewrite=0
innodb_support_xa=0
innodb_adaptive_hash_index=0
query_cache_type=0
performance_schema=OFF
# 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
/usr/lib/libstdc++.so.6 為新版 GCC 編譯產出的版本。CMAKE_BUILD_TYPE=Debug 導致效能極差:生產務必使用 Release 或 RelWithDebInfo。large-pages,需在 OS 層面配置 vm.nr_hugepages 並給 mysql 用戶 cap_ipc_lock 權限。參考資源: MySQL 官方 CMake 選項 | 本文配套腳本與配置檔打包