源碼編譯安裝 MySQL 可深度定製功能特性、優化性能參數,是掌握內核機制的必經之路。本文以 MySQL 5.6.31 於 RHEL 6.5 x86_64 為例,完整記錄依賴安裝、CMake 參數矩陣、編譯安裝、初始化、配置優化、服務管理全流程,附帶生產級 my.cnf 解析。
# 依賴包
yum install -y gcc gcc-c++ ncurses-devel perl cmake bison
# 用戶與目錄規劃
groupadd mysql
useradd -g mysql -s /sbin/nologin mysql
mkdir -p /usr/local/mysql # 安裝目錄
mkdir -p /data/mysqldb/{binlog,log} # 數據/日誌目錄
mkdir -p /opt/mysqltmp # 臨時表目錄
chown -R mysql:mysql /usr/local/mysql /data/mysqldb /opt/mysqltmp
| 參數 | 示例值 | 說明 |
|---|---|---|
-DCMAKE_INSTALL_PREFIX | /usr/local/mysql | 安裝根目錄 |
-DMYSQL_DATADIR | /data/mysqldb | 數據目錄 |
-DSYSCONFDIR | /etc | 配置文件目錄 |
-DMYSQL_UNIX_ADDR | /tmp/mysql.sock | Socket 文件 |
-DDEFAULT_CHARSET | utf8mb4 | 默認字符集(建議 utf8mb4) |
-DDEFAULT_COLLATION | utf8mb4_general_ci | 默認校驗規則 |
-DMYSQL_TCP_PORT | 3306 | 監聽端口 |
-DWITH_INNOBASE_STORAGE_ENGINE | 1 | InnoDB(必選) |
-DWITH_PARTITION_STORAGE_ENGINE | 1 | 分區支持 |
-DWITH_ARCHIVE_STORAGE_ENGINE | 1 | 歸檔引擎 |
-DWITH_BLACKHOLE_STORAGE_ENGINE | 1 | 黑洞引擎 |
-DWITH_FEDERATED_STORAGE_ENGINE | 1 | 聯邦引擎 |
-DWITH_PERFSCHEMA_STORAGE_ENGINE | 1 | Performance Schema |
-DWITH_SSL | system | OpenSSL 支持 |
-DWITH_ZLIB | system | 壓縮庫 |
-DENABLED_LOCAL_INFILE | 1 | LOAD DATA LOCAL |
-DENABLE_DOWNLOADS | 1 | 自動下載 Boost 等依賴 |
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysqldb \
-DSYSCONFDIR=/etc \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DMYSQL_TCP_PORT=3306 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DENABLED_LOCAL_INFILE=1 \
-DENABLE_DOWNLOADS=1
make -j$(nproc) && make install
注意:重新 CMake 需刪除 CMakeCache.txt。
# 初始化(5.7+ 用 mysqld --initialize,5.6 用 mysql_install_db)
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysqldb
# 服務腳本
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
# 編輯 /etc/init.d/mysqld 確認 basedir、datadir
[client]
port=3306
socket=/tmp/mysql.socket
default-character-set=utf8mb4
[mysqld]
# 基礎
user=mysql
port=3306
socket=/tmp/mysql.sock
pid-file=/tmp/mysql.pid
basedir=/usr/local/mysql
datadir=/data/mysqldb
tmpdir=/opt/mysqltmp
open_files_limit=10240
# SQL 模式:嚴格+無引擎替換
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
# 複制
server_id=706
log_bin=/data/mysqldb/binlog/mysql-bin
binlog_format=ROW
expire_logs_days=30
sync_binlog=1
gtid_mode=ON
enforce_gtid_consistency=1
# 連接與超時
max_connections=2000
max_connect_errors=100000
wait_timeout=600
interactive_timeout=600
skip_name_resolve=1
# 字符集
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci
# 緩衝區(按實例內存 60-70% 分配)
innodb_buffer_pool_size=1G
innodb_buffer_pool_instances=8
innodb_log_file_size=256M
innodb_log_files_in_group=3
innodb_flush_log_at_trx_commit=1
innodb_flush_method=O_DIRECT
innodb_file_per_table=1
innodb_io_capacity=2000
innodb_read_io_threads=8
innodb_write_io_threads=8
# 查詢緩存(5.6 仍可用,5.7+ 建議關閉)
query_cache_type=0
query_cache_size=0
# 線程與表緩存
thread_cache_size=100
table_open_cache=4000
table_definition_cache=2000
# 日誌
log_error=/data/mysqldb/log/mysql-error.log
slow_query_log=1
slow_query_log_file=/data/mysqldb/log/mysql-slow.log
long_query_time=1
log_queries_not_using_indexes=1
log_output=FILE
# MyISAM 兼容
key_buffer_size=32M
myisam_sort_buffer_size=64M
[mysql]
no-auto-rehash
prompt=(\u@\h) [\d]>
default-character-set=utf8mb4
# 環境變量
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile
source /etc/profile
# 啟動
service mysqld start
# 安全初始化
mysql_secure_installation
# 開機自啟
chkconfig mysqld on
CMakeCache.txt 殘留、Boost 下載失敗(可預下載 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/path)chown -R mysql:mysql /data/mysqldb、檢查 my.cnf 路徑、selinux / firewalldutf8mb4,含 client、connection、database、table、column