原始碼編譯安裝 MySQL 能針對特定硬體架構優化、精簡模組、掌控版本細節,是高效能、高安全性生產環境的首選部署方式。本文基於 MySQL 5.0/5.1 經典流程,補充現代 CMake 建構系統、系統服務管理、安全硬化、備份策略的完整實戰指南。
yum groupinstall "Development Tools" -y
yum install cmake ncurses-devel openssl-devel bison libaio-devel -y
apt-get update
apt-get install build-essential cmake libncurses5-dev libssl-dev bison libaio-dev -y
groupadd -r mysql
useradd -r -g mysql -s /sbin/nologin -M mysql
# 目錄規劃
mkdir -p /usr/local/mysql # 安裝根目錄
mkdir -p /data/mysql/data # 資料目錄
mkdir -p /data/mysql/logs # 日誌目錄
mkdir -p /data/mysql/tmp # 臨時目錄
chown -R mysql:mysql /data/mysql
cd /usr/local/src
# 官方下載頁:https://dev.mysql.com/downloads/mysql/
wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.44.tar.gz
# 驗證 GPG 簽名(略)
tar -zxvf mysql-5.7.44.tar.gz
cd mysql-5.7.44
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql/data \
-DSYSCONFDIR=/etc \
-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 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=1 \
-DENABLED_LOCAL_INFILE=1 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DWITH_DEBUG=0 \
-DCMAKE_BUILD_TYPE=Release \
-DWITH_SYSTEMD=1
| 參數 | 建議值 | 影響 |
|---|---|---|
| DEFAULT_CHARSET | utf8mb4 | 支援完整 Unicode (含 Emoji),避免 utf8 截斷 Bug |
| WITH_SSL | system | 使用系統 OpenSSL,自動受益安全補丁 |
| CMAKE_BUILD_TYPE | Release | 啟用 -O2/-O3 優化,去除除錯符號 |
| WITH_DEBUG | 0 | 生產環境關閉除錯,效能提升 15-30% |
| WITH_SYSTEMD | 1 | 生成 systemd 服務單元,現代 Linux 標準 |
# 編譯(根據 CPU 核心數並行,如 8 核用 -j8)
make -j$(nproc)
# 安裝
make install
# 設定目錄權限
cd /usr/local/mysql
chown -R root .
chown -R mysql /data/mysql/data
chown -R mysql /data/mysql/logs
chown -R mysql /data/mysql/tmp
chgrp -R mysql /usr/local/mysql
# 初始化資料字典 (5.7.6+ 使用 --initialize 或 --initialize-insecure)
bin/mysqld --initialize-insecure --user=mysql \
--basedir=/usr/local/mysql \
--datadir=/data/mysql/data \
--log-error=/data/mysql/logs/error.log
注意: --initialize-insecure 會建立無密碼 root,**僅限受信網路/首次部署**,生產環境建議用 --initialize 產生隨機密碼並記錄日誌。
[mysqld]
# 基礎路徑
basedir = /usr/local/mysql
datadir = /data/mysql/data
tmpdir = /data/mysql/tmp
socket = /tmp/mysql.sock
port = 3306
# 字元集
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
# 連線與安全
max_connections = 2000
max_connect_errors = 100000
skip_name_resolve = 1
local_infile = 0
skip_show_database = 1
sql_mode = STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
# InnoDB 核心
innodb_buffer_pool_size = 4G # 實體記憶體 60-70%
innodb_log_file_size = 512M
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_io_capacity = 4000 # SSD 建議 4000-10000
innodb_read_io_threads = 8
innodb_write_io_threads = 8
# 日誌
log_error = /data/mysql/logs/error.log
slow_query_log = 1
slow_query_log_file = /data/mysql/logs/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
# 二進制日誌 (複寫/時間點恢復必備)
log_bin = /data/mysql/logs/binlog
binlog_format = ROW
expire_logs_days = 7
sync_binlog = 1
gtid_mode = ON
enforce_gtid_consistency = 1
server_id = 1
# 其他
tmp_table_size = 64M
max_heap_table_size = 64M
open_files_limit = 65535
table_open_cache = 4000
cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable mysqld
systemctl start mysqld
systemctl status mysqld
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld start
# 1. 設定 root 密碼
/usr/local/mysql/bin/mysqladmin -u root password 'StrongPass@2024'
# 2. 執行安全腳本
/usr/local/mysql/bin/mysql_secure_installation
# 依提示:移除匿名用戶、禁止遠端 root、移除 test 庫、重新載入權限
# 3. 建立應用帳號
mysql -u root -p -e "
CREATE USER 'app_user'@'10.0.%' IDENTIFIED BY 'AppPass@2024';
GRANT SELECT,INSERT,UPDATE,DELETE ON app_db.* TO 'app_user'@'10.0.%';
FLUSH PRIVILEGES;"
| 操作 | 指令 |
|---|---|
| 登入 | /usr/local/mysql/bin/mysql -u root -p |
| 修改密碼 | /usr/local/mysql/bin/mysqladmin -u root -p password 'newpass' |
| 建庫 | CREATE DATABASE mydb CHARACTER SET utf8mb4; |
| 刪庫 | DROP DATABASE mydb; |
| 查庫 | SHOW DATABASES; |
| 看表結構 | DESC tbl_name; / SHOW CREATE TABLE tbl_name; |
| 全庫備份 | /usr/local/mysql/bin/mysqldump -u root -p --single-transaction --routines --triggers --all-databases > /backup/full_$(date +%F).sql |
| 單庫備份 | /usr/local/mysql/bin/mysqldump -u root -p --single-transaction --routines --triggers mydb > /backup/mydb_$(date +%F).sql |
| 還原 | /usr/local/mysql/bin/mysql -u root -p mydb < /backup/mydb_20240101.sql |
| 維度 | 原始碼編譯 | 官方二進制包 | yum/apt 套件 |
|---|---|---|---|
| 效能優化 | ✅ 針對 CPU 指令集 (AVX2/SSE4.2) | ✅ 通用優化 | ⚠️ 保守編譯參數 |
| 模組裁剪 | ✅ 僅編譯所需引擎/外掛 | ❌ 全含 | ❌ 全含 |
| 版本掌控 | ✅ 任意版本/分支/提交 | ✅ 官方釋出版本 | ⚠️ 發行版鎖定版本 |
| 安全補丁 | 🔄 手動重編譯升級 | 🔄 手動替換二進制 | ✅ 系統自動更新 |
| 部署複雜度 | 高 | 中 | 低 |
| 適用場景 | 高效能/高安全/特殊架構 | 標準生產/快速部署 | 開發測試/非核心業務 |
原始碼編譯安裝 MySQL 雖流程較長,但能獲得**極致效能、精簡攻擊面、完全版本掌控**三大核心價值。關鍵成功因子:CMake 參數精準配置、InnoDB 參數匹配硬體、systemd 服務化管理、持續安全基線檢查。建議將編譯安裝流程封裝為 Ansible Role / Shell 腳本 / Dockerfile,實現基礎設施即代碼。