3307、3308[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = multi_admin
password = multi_pass
[mysqld1] # 實例 1 (GNR=1)
socket = /data/mysqldata/master/mysql.sock
port = 3307
pid-file = /data/mysqldata/master/mysql.pid
datadir = /data/mysqldata/master
user = mysql
server-id = 1
# 其餘緩衝區參數按需配置...
[mysqld2] # 實例 2 (GNR=2)
socket = /data/mysqldata/slave/mysql.sock
port = 3308
pid-file = /data/mysqldata/slave/mysql.pid
datadir = /data/mysqldata/slave
user = mysql
server-id = 2
# 其餘緩衝區參數按需配置...
# 共用客戶端工具段落
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
關鍵點: 每個[mysqld#]對應一個 GNR(Group Number),必須指定獨立的datadir、socket、port、pid-file、server-id。
# 實例 1
mkdir -p /data/mysqldata/master
chown -R mysql:mysql /data/mysqldata/master
mysqld --initialize-insecure --datadir=/data/mysqldata/master --user=mysql
# 實例 2
mkdir -p /data/mysqldata/slave
chown -R mysql:mysql /data/mysqldata/slave
mysqld --initialize-insecure --datadir=/data/mysqldata/slave --user=mysql
# 在每個實例啟動後執行
mysql -u root -p -S /data/mysqldata/master/mysql.sock -e "CREATE USER 'multi_admin'@'localhost' IDENTIFIED BY 'multi_pass'; GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost';"
mysql -u root -p -S /data/mysqldata/slave/mysql.sock -e "CREATE USER 'multi_admin'@'localhost' IDENTIFIED BY 'multi_pass'; GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost';"
# 啟動實例 1 和 2
mysqld_multi --defaults-file=/etc/my.cnf start 1,2
# 停止實例 1
mysqld_multi --defaults-file=/etc/my.cnf stop 1
# 查看所有實例狀態
mysqld_multi --defaults-file=/etc/my.cnf report
GNR 寫法:1、1,2、1-3、1,3-5(逗號分隔、連字符表示範圍,**不可有空格**)。
# 連線實例 1
mysql -u multi_admin -pmulti_pass -P 3307 -h 127.0.0.1 --protocol=TCP
# 連線實例 2
mysql -u multi_admin -pmulti_pass -P 3308 -h 127.0.0.1 --protocol=TCP
必須指定 -P 端口與 -h 127.0.0.1,否則客戶端會嘗試連接預設 3306 或本地 socket,導致「Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'」錯誤。
| 現象 | 原因 | 解決 |
|---|---|---|
WARNING! my_print_defaults command not found! | PATH 缺少 MySQL bin 目錄 | export PATH=$PATH:/usr/bin 或用絕對路徑 |
FATAL ERROR: Tried to use mysqladmin in group [mysqld1], but no mysqladmin binary was found | [mysqld_multi] 段未指定 mysqladmin 路徑 | 在 [mysqld_multi] 加 mysqladmin = /usr/bin/mysqladmin |
啟動失敗,日誌提示 Can't create test file | datadir 權限或路徑錯誤 | 確認 chown -R mysql:mysql datadir 且路徑存在 |
| 端口衝突 | 3307/3308 被佔用 | netstat -tlnp | grep 330 檢查並修改 port |
# /etc/systemd/system/mysqld@.service
[Unit]
Description=MySQL Server (instance %i)
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/mysqld_multi --defaults-file=/etc/my.cnf start %i
ExecStop=/usr/bin/mysqld_multi --defaults-file=/etc/my.cnf stop %i
PIDFile=/data/mysqldata/%i/mysql.pid
[Install]
WantedBy=multi-user.target
啟用:systemctl enable mysqld@1 mysqld@2 && systemctl start mysqld@1 mysqld@2
mysqld_multi 是 MySQL 官方提供的輕量級多實例管理工具,配置清晰、啟停方便、資源隔離徹底。配合獨立 datadir、socket、port、server-id,即可在單機穩定運行多個互不干擾的 MySQL 服務。現代部署建議改用 systemd 模板單元或容器化(Docker/K8s),獲得更好的生命週期管理與資源配額控制。