首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 二進制包安裝、升級與多實例部署生產實戰全記錄

     編輯:MySQL 綜合教學

部署目標與選型原則

  • 版本:生產推薦 5.7 / 8.0 (長期支持),避開 5.1/5.5 終止維護版本
  • 分支:官方社區版 (上手快、生態全) / Percona Server (性能增強、工具鏈豐富) / MariaDB (開源社區驅動)
  • 安裝方式:二進制包 (Generic Linux) —— 版本可控、無編譯依賴、部署快、極易多實例、滾動升級友好
  • 路徑規範:/usr/local/mysql-{version} + 軟鏈接 /usr/local/mysql,數據目錄 /data/mysql/{port}
  • 實例模式:高配機器 (64G+ 內存、NVMe SSD) 推薦 多實例 (端口隔離、資源隔離、故障域隔離);低配單實例

一、二進制包標準化安裝流程 (以 5.5.50 為例,同理適用 5.6/5.7/8.0)

1.1 下載與解壓

wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.5.50-linux2.6-x86_64.tar.gz
tar zxf mysql-5.5.50-linux2.6-x86_64.tar.gz
mv mysql-5.5.50-linux2.6-x86_64 /usr/local/mysql-5.5.50
ln -s /usr/local/mysql-5.5.50 /usr/local/mysql

1.2 系統依賴

# CentOS/RHEL
yum install -y libaio numactl-libs
# Ubuntu/Debian
apt-get install -y libaio1 libnuma1

1.3 創建用戶與目錄

groupadd -r mysql
useradd -r -g mysql -s /sbin/nologin mysql
mkdir -p /data/mysql/3306/{data,logs,tmp}
chown -R mysql:mysql /data/mysql/3306

1.4 初始化數據目錄 (5.7+ 用 --initialize-insecure / --initialize)

# 5.6/5.7 通用腳本
/usr/local/mysql/scripts/mysql_install_db \
  --basedir=/usr/local/mysql \
  --datadir=/data/mysql/3306/data \
  --user=mysql

成功標誌:data/ 下生成 mysql、performance_schema、test 目錄及 ibdata1、ib_logfile*。

1.5 配置文件模板 (/data/mysql/3306/my.cnf)

[client]
port = 3306
socket = /data/mysql/3306/tmp/mysql.sock

[mysqld]
port = 3306
socket = /data/mysql/3306/tmp/mysql.sock
pid-file = /data/mysql/3306/logs/mysql.pid
basedir = /usr/local/mysql
datadir = /data/mysql/3306/data
tmpdir = /data/mysql/3306/tmp
log-error = /data/mysql/3306/logs/mysql.err
slow_query_log = 1
slow_query_log_file = /data/mysql/3306/logs/slow.log
long_query_time = 1
log-bin = /data/mysql/3306/logs/mysql-bin
binlog_format = ROW
server-id = 1
gtid_mode = ON
enforce_gtid_consistency = ON
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
skip-name-resolve
sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
innodb_buffer_pool_size = 4G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
sync_binlog = 500
max_connections = 2000
open_files_limit = 65535

1.6 啟動腳本與系統服務

# 方式一:mysqld_safe 直接啟動 (測試用)
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/3306/my.cnf &

# 方式二:systemd 服務單元 (生產標準)
cat > /etc/systemd/system/mysqld@.service <<'EOF'
[Unit]
Description=MySQL Server (%i)
After=network.target

[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/%i/my.cnf
ExecStop=/usr/local/mysql/bin/mysqladmin --defaults-file=/data/mysql/%i/my.cnf shutdown
PIDFile=/data/mysql/%i/logs/mysql.pid
TimeoutSec=300
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
LimitNPROC=65535

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable mysqld@3306
systemctl start mysqld@3306

1.7 安全初始化

# 登入 (臨時密碼在 error log 中,5.7+ --initialize 生成)
mysql -uroot -p -S /data/mysql/3306/tmp/mysql.sock

# 刪除匿名、遠程 root、test 庫
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE Host NOT IN ('localhost','127.0.0.1','::1');
DROP DATABASE test;

# 創建管理員
CREATE USER 'dba'@'10.0.0.%' IDENTIFIED BY 'StrongPass!23';
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'10.0.0.%' WITH GRANT OPTION;

# 修改 root 密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY 'AnotherStrongPass!23';
FLUSH PRIVILEGES;

二、就地升級實戰 (5.5 → 5.6/5.7)

核心原則

  1. 僅替換二進制目錄,數據目錄 (datadir) 不動
  2. 修改配置文件 basedir 指向新版本
  3. 以新版本 mysqld_safe 拉起實例
  4. 強制執行 mysql_upgrade 更新系統表

步驟詳解

# 1. 停止舊實例
systemctl stop mysqld@3306

# 2. 部署新版本二進制包 (如 5.6.32)
tar zxf mysql-5.6.32-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.6.32 /usr/local/mysql-5.6.32
ln -snf /usr/local/mysql-5.6.32 /usr/local/mysql  # 原子切換軟鏈接

# 3. 更新 my.cnf basedir (若未用軟鏈接則需改配置)
# 基於軟鏈接部署則無需改動 my.cnf

# 4. 以新版本啟動
systemctl start mysqld@3306

# 5. 驗證版本
mysql -uroot -p -S /data/mysql/3306/tmp/mysql.sock -e "SELECT VERSION();"
# 應顯示 5.6.32-log

# 6. 執行 mysql_upgrade (關鍵!更新 mysql 系統表、performance_schema、sys)
/usr/local/mysql/bin/mysql_upgrade -uroot -p -S /data/mysql/3306/tmp/mysql.sock
# 輸出所有表 OK,最後顯示 "OK" 表示成功

# 7. 二次驗證
/usr/local/mysql/bin/mysql_upgrade -uroot -p -S /data/mysql/3306/tmp/mysql.sock
# 提示 "This installation of MySQL is already upgraded to 5.6.32"

升級注意事項

  • 跨大版本升級 (5.5→5.6→5.7→8.0) 必須逐級,不可跳級
  • mysql_upgrade 會鎖表,建議低峰期執行,大庫預留時間
  • 升級前全量備份,驗證備份可恢復
  • 關注 sql_mode 默認變化 (5.7 嚴格模式默認開啟,應用可能報錯)
  • 8.0 移除查詢緩存、FRM 文件、mysql.proc 表等,需提前適配

三、多實例部署架構

3.1 目錄規劃

/data/mysql/
├── 3306/   # 核心交易實例
│   ├── data/, logs/, tmp/, my.cnf
├── 3307/   # 報表/只讀實例
│   ├── data/, logs/, tmp/, my.cnf
├── 3308/   # 歸檔/備份實例
│   ├── data/, logs/, tmp/, my.cnf

3.2 核心差異化配置 (以 3307 為例)

[mysqld]
port = 3307
socket = /data/mysql/3307/tmp/mysql.sock
pid-file = /data/mysql/3307/logs/mysql.pid
datadir = /data/mysql/3307/data
tmpdir = /data/mysql/3307/tmp
log-error = /data/mysql/3307/logs/mysql.err
log-bin = /data/mysql/3307/logs/mysql-bin
server-id = 2
innodb_buffer_pool_size = 8G  # 視機器內存分配
# 其他參數同 3306 模板

3.3 系統服務管理

mysql -uroot -p -S /data/mysql/3307/tmp/mysql.sock
# 同單實例:刪匿名、禁遠程 root、改密碼、建業務用戶、授最小權限

3.5 資源隔離進階 (cgroups v1 示例)

# 為 3306 實例限制 CPU 80%、內存 32G
cgcreate -g cpu,memory:mysql_3306
echo 80000 > /sys/fs/cgroup/cpu/mysql_3306/cpu.cfs_quota_us
echo 100000 > /sys/fs/cgroup/cpu/mysql_3306/cpu.cfs_period_us
echo 34359738368 > /sys/fs/cgroup/memory/mysql_3306/memory.limit_in_bytes

# 啟動服務加入 cgroup (systemd 服務單元添加)
# ControlGroup=cpu,memory:mysql_3306

四、生產部署檢查清單

類別檢查項驗證命令/標準
二進制包版本一致性、軟鏈接指向正確ls -l /usr/local/mysql、mysql -V
目錄權限datadir/logs/tmp 屬主 mysql:mysqlls -ld /data/mysql/3306/data
配置文件my.cnf 權限 600、關鍵參數生效stat /data/mysql/3306/my.cnf、mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
服務管理systemd 單元啟用、開機自啟systemctl is-enabled mysqld@3306
安全無匿名用戶、root 僅本地、強密碼、最小權限mysql -e "SELECT User,Host FROM mysql.user;"
字符集庫/表/連接均為 utf8mb4SHOW VARIABLES LIKE 'character_set%';
複制GTID 模式、server-id 唯一、Binlog ROW 格式SHOW VARIABLES LIKE 'gtid_mode';
監控慢查詢開啟、長查詢閾值 1s、錯誤日志輪轉ls -lh /data/mysql/3306/logs/
備份每日全量 + 定期增量、異地存儲、恢復演練備份腳本、恢復演練記錄
多實例端口/目錄/Server-ID 隔離、資源限制生效netstat -lntup | grep 330

五、總結

  1. 二進制包 + 軟鏈接 + systemd 模板 + 模板化 my.cnf 是生產部署的「黃金組合」,支撐秒級版本切換、多實例批量管理。
  2. 升級核心:替換 basedir → 啟動新版本 → mysql_upgrade,全程數據目錄不動,風險可控。
  3. 多實例通過 端口、Socket、datadir、server-id、systemd 實例名 完全隔離,配合 cgroups 實現硬資源配額。
  4. 安全、字符集、複制、監控、備份 —— 五大生產紅線,逐項落地、定期巡檢、演練驗證。
  5. 建議將本文檢查清單制成團隊「上線驗收單」,每次新建實例、變更配置、升級版本必走清單。

掌握這套體系,從單節點到百實例集群,部署運維都能做到有章可循、有據可查、有備無患。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved