單物理機運行多個隔離的 MySQL 實例,各自擁有獨立的:
適用場景:開發測試環境資源隔離、多租戶 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
使用 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 獨立 |
對於傳統單機多實例場景,mysqld_multi 仍是輕量、成熟、零依賴的首選方案。