安裝方式選型指引
| 維度 | 源碼編譯 | 二進制包 (Generic Linux) |
| 定製化程度 | 極高(功能裁剪、優化參數) | 固定配置 |
| 安裝耗時 | 15-60 分鐘 | 2-5 分鐘 |
| 依賴管理 | 手動解決 | 自包含,無依賴 |
| 升級維護 | 重新編譯 | 替換目錄+數據遷移 |
| 適用場景 | 特殊優化需求、老舊系統、學習研究 | 生產環境標準部署、CI/CD、容器化 |
方式一:源碼編譯安裝(MySQL 5.7 為例)
1. 環境準備
# CentOS/RHEL
yum install -y gcc gcc-c++ cmake ncurses-devel libaio-devel openssl-devel bison
# Ubuntu/Debian
apt-get install -y build-essential cmake libncurses5-dev libaio-dev libssl-dev bison
# 創建用戶
groupadd mysql
useradd -r -g mysql -s /sbin/nologin mysql
2. 下載與編譯
cd /usr/local/src
wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.42.tar.gz
tar xf mysql-5.7.42.tar.gz
cd mysql-5.7.42
# 編譯配置(生產常用優化參數)
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.42 \
-DMYSQL_DATADIR=/data/mysql/3306/data \
-DSYSCONFDIR=/etc \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_BOOST=boost_1_59_0
make -j$(nproc)
make install
3. 後續配置
# 創建軟連接
ln -s /usr/local/mysql-5.7.42 /usr/local/mysql
# 目錄結構
mkdir -p /data/mysql/3306/{data,logs,tmp}
chown -R mysql:mysql /data/mysql
# 拷貝配置模板
cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
# 初始化數據字典 (MySQL 5.7.6+)
/usr/local/mysql/bin/mysqld --initialize-insecure \
--basedir=/usr/local/mysql \
--datadir=/data/mysql/3306/data \
--user=mysql
# SSL 憑證生成
/usr/local/mysql/bin/mysql_ssl_rsa_setup --datadir=/data/mysql/3306/data
# 服務腳本
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
4. 常見編譯錯誤解決
| 錯誤現象 | 原因 | 解決方案 |
| No curses/termcap library | 缺 ncurses-devel | yum install ncurses-devel |
| Boost not found | MySQL 5.7 依賴 Boost | -DWITH_BOOST=/path/to/boost 或下載官方帶 boost 包 |
| CMake 版本過低 | 需要 3.5+ | 源碼編裝 CMake 3.18+ |
| mysql-test 卡住 | 運行測試套件耗時極長 | 加參數 -DWITH_UNIT_TESTS=OFF 跳過 |
方式二:二進制包部署(推薦生產環境)
1. 下載解壓
# MySQL 8.0.33 為例
cd /opt
wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.33-linux-glibc2.17-x86_64.tar.xz
tar xf mysql-8.0.33-linux-glibc2.17-x86_64.tar.xz
mv mysql-8.0.33-linux-glibc2.17-x86_64 /usr/local/mysql-8.0.33
ln -s /usr/local/mysql-8.0.33 /usr/local/mysql
2. 初始化與配置
# 目錄準備
mkdir -p /data/mysql/3306/{data,logs,tmp}
useradd -r -g mysql -s /sbin/nologin mysql
chown -R mysql:mysql /data/mysql /usr/local/mysql-8.0.33
# 配置文件 /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql/3306/data
socket = /data/mysql/3306/mysql.sock
port = 3306
pid-file = /data/mysql/3306/mysql.pid
log-error = /data/mysql/3306/logs/error.log
# 初始化 (MySQL 8.0 生成臨時 root 密碼)
/usr/local/mysql/bin/mysqld --initialize \
--basedir=/usr/local/mysql \
--datadir=/data/mysql/3306/data \
--user=mysql
# 輸出中包含:[Note] [Entryl]: A temporary password is generated for root@localhost: xxxx
# 啟動服務
/usr/local/mysql/support-files/mysql.server start
# 首次登錄修改密碼
mysql -u root -p'臨時密碼' -S /data/mysql/3306/mysql.sock
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass@123';
3. systemd 服務管理(現代 Linux 標準)
# /etc/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
After=network.target
[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/support-files/mysql.server start
ExecStop=/usr/local/mysql/support-files/mysql.server stop
PIDFile=/data/mysql/3306/mysql.pid
TimeoutSec=300
Restart=on-failure
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
# 管理命令
systemctl daemon-reload
systemctl enable mysqld
systemctl start mysqld
systemctl status mysqld
通用後續配置(兩種方式通用)
安全初始化
/usr/local/mysql/bin/mysql_secure_installation
# 依次設置:root密碼、移除匿名用戶、禁止root遠程登錄、移除test庫、刷新權限
環境變量
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
防火牆放行
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
遷移舊數據到新安裝
# 停舊庫
systemctl stop mysqld_old
# 拷貝數據目錄(需相同大版本)
rsync -av /old/data/ /data/mysql/3306/data/
chown -R mysql:mysql /data/mysql/3306/data
# 啟新庫並升級系統表
systemctl start mysqld
/usr/local/mysql/bin/mysql_upgrade -u root -p --force