單機跑多個 MySQL 實例是資源隔離、版本共存、測試驗證的常見需求。本文對比「多配置文件+獨立腳本」與「官方 mysqld_multi」兩大模式,提供完整安裝、配置、啟動、管理、開機自啟的生產級實施步驟(基于 MySQL 5.1.50 源碼編譯,SUSE 11 環境,邏輯通用)。
每個實例擁有獨立的 datadir、socket、port、my.cnf、啟動腳本,進程間完全隔離,互不干擾。
groupadd mysql; useradd -g mysql mysql mkdir -p /data/dbdata_3306 /data/dbdata_3307 /data/dbdata_3308
./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-plugins=partition,innobase,blackhole,myisam,innodb_plugin,heap,archive ... make && make install
/usr/local/mysql/bin/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/dbdata_3306 --user=mysql # 3307、3308 同理
# /data/dbdata_3306/my.cnf [mysqld] datadir=/data/dbdata_3306/ port=3306 socket=/data/dbdata_3306/mysql.sock server-id=1 ... (其他參數通用) # 3307/3308 修改 port、socket、datadir、server-id=2/3
#!/bin/bash
mysql_port=3306
mysql_username="admin"
mysql_password="password"
function_start_mysql() {
/bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/dbdata_${mysql_port}/my.cnf 2>&1 > /dev/null &
}
function_stop_mysql() {
/usr/local/mysql/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S /data/dbdata_${mysql_port}/mysql.sock shutdown
}
case $1 in start) function_start_mysql;; stop) function_stop_mysql;; restart) function_stop_mysql; function_start_mysql;; esac
/data/dbdata_3306/mysqld start /usr/local/mysql/bin/mysqladmin -uroot password 'password' -S /data/dbdata_3306/mysql.sock # 創建 admin 關閉賬號 echo 'PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile; source /etc/profile echo '/data/dbdata_3306/mysqld start' >> /etc/init.d/boot.local # SUSE # CentOS/RHEL 用 /etc/rc.local
單一 /etc/my.cnf 內定義 [mysqld1]、[mysqld2]... 區段,統一由 mysqld_multi 進程按組啟停,共享二進制、集中日志。
[mysqld_multi] mysqld = /usr/local/mysql/bin/mysqld_safe mysqladmin = /usr/local/mysql/bin/mysqladmin user = admin password = password [mysqld1] port = 3306 socket = /data/dbdata_3306/mysql.sock pid-file = /data/dbdata_3306/3306.pid datadir = /data/dbdata_3306 server-id = 1 ... (其餘參數同方案一) [mysqld2] port = 3307 socket = /data/dbdata_3307/mysql.sock pid-file = /data/dbdata_3307/3307.pid datadir = /data/dbdata_3307 server-id = 2 ... [mysqld3] port = 3308 socket = /data/dbdata_3308/mysql.sock pid-file = /data/dbdata_3308/3308.pid datadir = /data/dbdata_3308 server-id = 3 ...
# 啟動所有 /usr/local/mysql/bin/mysqld_multi start 1-3 # 單獨操作 /usr/local/mysql/bin/mysqld_multi start 2 /usr/local/mysql/bin/mysqld_multi stop 1 /usr/local/mysql/bin/mysqld_multi report # 查看狀態
| 維度 | 多配置文件獨立啟動 | mysqld_multi 集中管理 |
|---|---|---|
| 配置隔離性 | 完全隔離,參數可差異化 | 共享全局參數,實例參數需在區段覆蓋 |
| 啟停操作 | 分別執行腳本,可精細控制 | 單命令批量操作,適合批量維護 |
| 進程可見性 | ps 見多個 mysqld_safe | ps 見一個 mysqld_multi 父進程 |
| 日志管理 | 各實例自定義 error log | 統一由 mysqld_multi 管控 |
| 升級遷移 | 單實例滾動升級無影響 | 升級需停全組或修改配置排除 |
| 適用場景 | 版本不同、參數差異大、強隔離需求 | 版本一致、參數統一、追求運維效率 |
mysqlmanager 圖形化管理。server-id 全局唯一(含主從場景)。port/socket/datadir/pid-file 四要素不衝突。innodb_buffer_pool_size 總和 ≤ 物理內存 70%)。SHOW GLOBAL STATUS、SHOW ENGINE INNODB STATUS。多實例不等於高可用,合理規劃資源邊界,才能發揮硬件最大價值。