為什麼編譯安裝?
- 自定義安裝路徑、功能模組
- 啟用特定存儲引擎、字符集
- 優化編譯參數 (CPU 指令集、LTO)
- 無 root 權限安裝到用戶目錄
- 學習 MySQL 內部構建
前置依賴 (Ubuntu/Debian)
sudo apt-get update
sudo apt-get install -y cmake build-essential libncurses5-dev \
libssl-dev bison pkg-config libaio-dev libreadline-dev \
libjemalloc-dev libnuma-dev
libncurses5-dev:解決 Curses library not found 錯誤
libssl-dev:SSL/TLS 支援
libjemalloc-dev:高效能記憶體分配器 (可選)
下載源碼
VERSION=5.7.44 # 或 8.0.36
wget https://cdn.mysql.com/archives/mysql-$VERSION/mysql-$VERSION.tar.gz
tar -xzf mysql-$VERSION.tar.gz
cd mysql-$VERSION
CMake 配置選項詳解
mkdir build && cd build
cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=0 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=0 \
-DWITH_ARCHIVE_STORAGE_ENGINE=0 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_unicode_ci \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_JEMALLOC=1 \
-DCMAKE_BUILD_TYPE=Release \
-DCOMPILATION_COMMENT="Custom Build $(date +%F)"
關鍵選項說明
| 選項 | 說明 | 建議 |
CMAKE_INSTALL_PREFIX | 安裝根目錄 | /usr/local/mysql |
MYSQL_DATADIR | 資料目錄 (與安裝目錄分離) | /data/mysql |
SYSCONFDIR | my.cnf 搜尋目錄 | /etc |
WITH_*_STORAGE_ENGINE | 編譯進核心的引擎 | InnoDB/MyISAM/Partition=1,其餘=0 |
DEFAULT_CHARSET | 預設字符集 | utf8mb4 (支援 Emoji) |
WITH_JEMALLOC | 使用 jemalloc 分配器 | 1 (高併發顯著降低延遲) |
CMAKE_BUILD_TYPE | Release/Debug/RelWithDebInfo | Release |
編譯安裝
# 多核並行編譯 (n = CPU 核心數)
make -j$(nproc)
# 安裝
sudo make install
# 建立軟連結方便使用
sudo ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
sudo ln -s /usr/local/mysql/bin/mysqldump /usr/bin/mysqldump
後續配置
1. 用戶權限
sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql
sudo chown -R mysql:mysql /usr/local/mysql
sudo chown -R mysql:mysql /data/mysql
2. 配置文件 (/etc/my.cnf)
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql
socket = /tmp/mysql.sock
port = 3306
user = mysql
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-storage-engine = InnoDB
lower_case_table_names = 1
skip-name-resolve
max_connections = 1000
# InnoDB 核心參數參考前文生產配置
3. 初始化資料字典
# MySQL 5.7+
sudo /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql \
--basedir=/usr/local/mysql --datadir=/data/mysql
# MySQL 5.6/5.5
sudo /usr/local/mysql/scripts/mysql_install_db --user=mysql \
--basedir=/usr/local/mysql --datadir=/data/mysql
4. SSL/RSA 憑證生成 (5.7+)
sudo /usr/local/mysql/bin/mysql_ssl_rsa_setup --uid=mysql --datadir=/data/mysql
5. systemd 服務
sudo cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
# 或建立 systemd unit (參考前文)
sudo systemctl daemon-reload
sudo systemctl enable mysql
sudo systemctl start mysql
6. 修改 root 密碼
/usr/local/mysql/bin/mysqladmin -u root password 'StrongPass123!'
# 或登入後
ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongPass123!';
驗證安裝
# 1. 進程
ps -ef | grep mysqld
# 2. 埠
netstat -tnlp | grep 3306
# 3. 版本
mysqladmin version
# 4. 字符集
mysql -e "SHOW VARIABLES LIKE 'character_set%';"
# 5. 引擎
mysql -e "SHOW ENGINES;"
常見編譯錯誤對策
| 錯誤 | 原因 | 解決 |
| Curses library not found | 缺 libncurses5-dev | apt-get install libncurses5-dev; rm CMakeCache.txt; 重跑 cmake |
| Boost not found (8.0) | 需指定 -DWITH_BOOST= | wget boost_1_73_0.tar.gz; -DWITH_BOOST=/path/to/boost |
| ld: cannot find -laio | 缺 libaio-dev | apt-get install libaio-dev |
| CMakeCache.txt 殘留 | 重跑 cmake 前必須刪除 | rm -rf build/* 或 rm CMakeCache.txt |
升級遷移建議
- 編譯安裝升級:新版本安裝新前綴 (如
/usr/local/mysql-8.0),修改軟連結、my.cnf、systemd 指向新版
- 資料遷移:
mysqldump --all-databases --routines --triggers --events | 新版mysql
- 就地升級風險高,生產環境建議藍綠部署
copyright ©
萬盛學電腦網 all rights reserved