源碼編譯安裝能精準控制特性裁剪、安裝路徑、編譯優化,是定制化部署的首選。本文以 MySQL 5.5.47 為例,覆蓋依賴準備、CMake 關鍵參數、編譯安裝、數據初始化、系統服務註冊、密碼設置全流程,Ubuntu/CentOS 雙平台通用。
| 套件 | Ubuntu/Debian | CentOS/RHEL | 用途 |
|---|---|---|---|
| CMake | apt-get install cmake | yum -y install cmake (或 cmake3) | 構建系統 |
| ncurses | apt-get install libncurses5-dev | yum -y install ncurses-devel | 終端交互庫 |
| 開發工具鏈 | apt-get install build-essential | yum -y groupinstall "Development Tools" | gcc/g++/make |
# 1. 用戶
groupadd mysql
useradd -r -g mysql -s /sbin/nologin mysql
# 2. 目錄(遵循 FHS,分離程序與數據)
mkdir -p /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql
cd mysql-5.5.47
mkdir build && cd build
cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DMYSQL_TCP_PORT=3306 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_C_FLAGS="-O2 -fPIC" \
-DCMAKE_CXX_FLAGS="-O2 -fPIC"
| 類別 | 參數 | 建議值/說明 |
|---|---|---|
| 安裝路徑 | CMAKE_INSTALL_PREFIX | /usr/local/mysql (程序文件) |
MYSQL_DATADIR | /usr/local/mysql/data (數據文件) | |
MYSQL_UNIX_ADDR | /usr/local/mysql/mysql.sock | |
| 字符集 | DEFAULT_CHARSET | utf8 (5.5 不支持 utf8mb4,升級 5.7+ 才有) |
DEFAULT_COLLATION | utf8_general_ci | |
WITH_EXTRA_CHARSETS | all 或 utf8,gbk | |
| 存儲引擎 | WITH_INNOBASE_STORAGE_ENGINE | 1 (啟用 InnoDB,5.5 默認已內建) |
WITH_PARTITION_STORAGE_ENGINE | 1 (啟用分區表) | |
| 性能優化 | CMAKE_BUILD_TYPE | RelWithDebInfo (Release + 調試符號) |
| 系統集成 | WITH_SSL/WITH_ZLIB | system (使用系統庫,減小體積) |
# 並行編譯(核心數 +1)
make -j$(($(nproc)+1)) && make install
# 安裝後權限修正
chown -R mysql:mysql /usr/local/mysql
# 1. 複製配置模板
cp support-files/my-medium.cnf /etc/my.cnf
# 編輯 /etc/my.cnf 確認 basedir/datadir/socket/pid-file/log-error 指向正確路徑
# 2. 初始化系統表(5.5 專用腳本)
chmod 755 scripts/mysql_install_db
scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 3. 註冊系統服務
cp support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
# 4. 啟動
service mysqld start
# 5. 設置 root 密碼
/usr/local/mysql/bin/mysqladmin -u root password 'StrongP@ssw0rd!'
# 版本確認
/usr/local/mysql/bin/mysql -V
# 連接測試
/usr/local/mysql/bin/mysql -uroot -p'StrongP@ssw0rd!' -e "SELECT VERSION(), CURRENT_USER();"
# 進程與端口
ps -ef | grep mysqld
netstat -antp | grep 3306
# 常見報錯
# [ERROR] Can't start server: Bind on unix socket: Permission denied
# -> chown mysql:mysql /usr/local/mysql/ (含 socket 目錄)
# [ERROR] Fatal error: Can't open and lock privilege tables
# -> datadir 路徑錯誤或權限問題,檢查 my.cnf datadir
build 目錄隔離源碼與產物,便於 make clean 重編mysql_install_db 必須指定 --basedir --datadir,否則默認路徑不匹配semanage fcontext -a -t mysqld_db_t "/usr/local/mysql/data(/.*)?" + restorecon -Rvchkconfig --add mysqld && chkconfig mysqld on (CentOS 6) / systemctl enable mysqld (CentOS 7)源碼編譯安裝是理解 MySQL 內核依賴、特性裁剪、性能優化的最佳實踐場。建議將 CMake 參數、目錄佈局、初始化腳本封裝為 Ansible Role,實現「一鍵交付、版本可控、審計可追」。