源碼編譯安裝可深度定製 MySQL 功能、優化性能(靜態編譯、禁用 Debug),但依賴處理、參數選擇極易踩坑。本文匯總實戰經驗,覆蓋依賴解決、CMake 參數、登錄崩潰修復。
apt-get update
apt-get install -y build-essential cmake libncurses5-dev libssl-dev bison pkg-config
關鍵點: libncurses5-dev 提供 curses.h,缺失會報 curses library not found。若 find / -name *curses* 找到庫在 /usr/lib/x86_64-linux-gnu/,需指定路徑:
cmake . -DCURSES_LIBRARY=/usr/lib/x86_64-linux-gnu/ -DCURSES_INCLUDE_PATH=/usr/include/
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNODB_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_ZLIB=system \
-DWITH_SSL=system \
-DWITH_LIBEVENT=system \
-DCURSES_LIBRARY=/usr/lib/x86_64-linux-gnu/libncurses.so \
-DCURSES_INCLUDE_PATH=/usr/include/ncurses \
-DCMAKE_BUILD_TYPE=Release \
-DCOMPILATION_COMMENT="Custom Build" \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock
核心優化參數說明:
-DCMAKE_BUILD_TYPE=Release:釋出版本,禁用 Debug 符號,性能提升 5-10%。-DWITH_SSL=system:使用系統 OpenSSL,避免捆綁舊版本漏洞。-DDEFAULT_CHARSET=utf8mb4:默認支持 Emoji/生僻字。make -j$(nproc) # 多核並行編譯
make install
# 初始化數據目錄 (MySQL 5.7+)
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 生成 SSL 文件
/usr/local/mysql/bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
現象: 執行 mysql -uroot -p 直接段錯誤退出。
原因: MySQL 5.6/5.7 捆綁的 libedit 與系統 ncurses 版本不兼容,導致 terminal.c 中緩衝區處理缺陷。
修復: 編輯源碼 cmd-line-utils/libedit/terminal.c:
// 找到第 869 行左右
// char buf[TC_BUFSIZE]; // 註釋掉
char *area = NULL; // 修改為 NULL,原為 area = buf;
保存後重新 make && make install。
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld start
/usr/local/mysql/bin/mysqladmin -u root password 'NewPass123!'
/usr/local/mysql/bin/mysql -uroot -p -e "GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'NewPass123!' WITH GRANT OPTION; FLUSH PRIVILEGES;"
-DWITH_BOOST=/path/to/boost 或 -DDOWNLOAD_BOOST=1 自動下載。chown -R mysql:mysql /usr/local/mysql /usr/local/mysql/data。setsebool -P mysql_connect_any 1。echo never > /sys/kernel/mm/transparent_hugepage/enabled。源碼編譯雖繁瑣,但能構建最貼合業務、性能最優的 MySQL 實例。掌握依賴鏈、CMake 參數、已知 Bug 修復,是 DBA 進階的必修課。