首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 多實例部署實戰:基於 mysqld_multi 的單機多實例配置全流程

     編輯:MySQL 資料庫相關知識

架構概覽

單物理機運行多個隔離的 MySQL 實例,各自擁有獨立的:

  • 數據目錄(datadir)
  • 端口(port)
  • Socket 文件
  • PID 文件
  • 錯誤日志、慢查詢日志
  • 配置參數(緩存大小、連接數等)

適用場景:開發測試環境資源隔離、多租戶 SaaS、版本兼容性驗證、備庫延遲模擬等。

前置準備:源碼編譯安裝

# 1. 下載源碼(示例 5.1.60)
wget ftp://ftp.mirrorservice.org/sites/ftp.mysql.com/Downloads/MySQL-5.1/mysql-5.1.60.tar.gz

# 2. 解壓編譯安裝
tar -zxvf mysql-5.1.60.tar.gz
cd mysql-5.1.60
./configure \
  --prefix=/usr/local/mysql \
  --with-charset=utf8 \
  --with-extra-charsets=all \
  --enable-thread-safe-client \
  --enable-assembler \
  --with-readline \
  --with-big-tables \
  --with-named-curses-libs=/usr/lib/libncursesw.so.5
make && make install

系統用戶與目錄初始化

# 創建 mysql 用戶組/用戶
groupadd mysql
useradd -g mysql mysql

# 修改安裝目錄權限
chown -R root:mysql /usr/local/mysql

# 將工具鏈接到 PATH
ln -s /usr/local/mysql/bin/mysqld_multi /usr/bin/mysqld_multi
ln -s /usr/local/mysql/bin/mysql_install_db /usr/bin/mysql_install_db

# 初始化 4 個實例數據目錄
for i in 1 2 3 4; do
  mysql_install_db --datadir=/usr/local/var/mysql$i --user=mysql
  chown -R mysql /usr/local/var/mysql$i
done

啟動腳本部署

# 複製源碼自帶的多實例啟動腳本
cp /usr/local/src/mysql-5.1.60/support-files/mysqld_multi.server /etc/init.d/mysqld_multi.server

# 編輯腳本,修改 basedir 和 bindir
vim /etc/init.d/mysqld_multi.server
# basedir=/usr/local/mysql
# bindir=/usr/local/mysql/bin

核心配置文件:/etc/mysqld_multi.cnf

使用 mysqld_multi --example 獲取模板,關鍵配置如下:

[mysqld_multi]
mysqld     = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
# user       = mysql
# password   = my_password

[mysqld1]
socket     = /usr/local/var/mysql1/mysql1.sock
port       = 3306
pid-file   = /usr/local/var/mysql1/mysql1.pid
datadir    = /usr/local/var/mysql1
user       = mysql

[mysqld2]
socket     = /usr/local/var/mysql2/mysql2.sock
port       = 3307
pid-file   = /usr/local/var/mysql2/mysql2.pid
datadir    = /usr/local/var/mysql2
user       = mysql

[mysqld3]
socket     = /usr/local/var/mysql3/mysql3.sock
port       = 3308
pid-file   = /usr/local/var/mysql3/mysql3.pid
datadir    = /usr/local/var/mysql3
user       = mysql

[mysqld4]
socket     = /usr/local/var/mysql4/mysql4.sock
port       = 3309
pid-file   = /usr/local/var/mysql4/mysql4.pid
datadir    = /usr/local/var/mysql4
user       = mysql
關鍵點: 每實例 port、socket、pid-file、datadir 必須唯一;user 統一為 mysql;可按需差異化配置 innodb_buffer_pool_size、max_connections 等參數。

實例生命周期管理

# 加載 PATH
export PATH=/usr/local/mysql/bin:$PATH

# 查看所有實例狀態
mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf report

# 啟動所有實例
mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf start

# 啟動指定實例(如 2、3)
mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf start 2,3

# 停止所有實例
mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf stop

# 停止指定實例
mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf stop 1

驗證與連接測試

# 檢查端口監聽
netstat -tunlp | grep 330

# 檢查進程
ps -aux | grep mysql

# 連接實例 1(端口 3306)
mysql -uroot -p -h127.0.0.1 -P3306

# 連接實例 1(Socket 方式)
mysql -uroot -p -S /usr/local/var/mysql1/mysql1.sock

# 驗證實例隔離性
mysql> SHOW VARIABLES LIKE 'socket';
mysql> SHOW VARIABLES LIKE '%pid%';
mysql> SHOW VARIABLES LIKE 'port';

運維避坑指南

問題原因解決
啟動報錯 "Manager of pid-file quit without updating file"datadir 權限錯誤、配置衝突、殘留進程檢查 chown、端口衝突、kill 殘留進程
無法通過 Socket 連接Socket 路徑不匹配、實例未啟動確認 my.cnf socket 路徑與連接參數一致
mysqld_multi report 顯示 not running 但進程存在PID 文件路徑錯誤或權限不足核對 pid-file 配置、目錄寫權限
實例間數據誤串datadir 配置指向同一目錄嚴格保證每實例 datadir 獨立

現代替代方案

  • Docker 容器化:每實例一容器,資源隔離更徹底,部署運維標準化
  • MySQL 8.0 資源組:單實例內通過 Resource Groups 實現負載隔離
  • TiDB / PolarDB:原生分佈式架構,彈性擴縮容,無需手工多實例
對於傳統單機多實例場景,mysqld_multi 仍是輕量、成熟、零依賴的首選方案。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved