在單台伺服器運行多個獨立 MySQL 實例(不同埠、資料目錄、配置),可滿足多租戶隔離、版本並行測試、資源配額控制等需求。官方工具 mysqld_multi 是標準解決方案,本文記錄源碼安裝 + 多實例配置全流程。
| 實例 | 埠 | Socket | 資料目錄 | PID 檔 |
|---|---|---|---|---|
| mysqld1 | 3306 | /var/lib/mysql1/mysql1.sock | /var/lib/mysql1 | /var/lib/mysql1/mysql1.pid |
| mysqld2 | 3307 | /var/lib/mysql2/mysql2.sock | /var/lib/mysql2 | /var/lib/mysql2/mysql2.pid |
| mysqld3 | 3308 | /var/lib/mysql3/mysql3.sock | /var/lib/mysql3 | /var/lib/mysql3/mysql3.pid |
| mysqld4 | 3309 | /var/lib/mysql4/mysql4.sock | /var/lib/mysql4 | /var/lib/mysql4/mysql4.pid |
# 安裝依賴
yum install -y gcc gcc-c++ cmake ncurses-devel bison openssl-devel
# 下載源碼
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.44.tar.gz
tar -zxvf mysql-5.7.44.tar.gz
cd mysql-5.7.44
# 編譯安裝
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_INNODB=ON \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_BOOST=boost/boost_1_59_0.tar.gz
make -j$(nproc) && make install
# 建立軟連結方便呼叫
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
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
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
mkdir -p /var/lib/mysql{1,2,3,4}
chown -R mysql:mysql /var/lib/mysql{1,2,3,4}
chmod 750 /var/lib/mysql{1,2,3,4}
# 5.7 使用 mysql_install_db(8.0+ 改用 mysqld --initialize-insecure)
mysql_install_db --datadir=/var/lib/mysql1 --user=mysql --basedir=/usr/local/mysql
mysql_install_db --datadir=/var/lib/mysql2 --user=mysql --basedir=/usr/local/mysql
mysql_install_db --datadir=/var/lib/mysql3 --user=mysql --basedir=/usr/local/mysql
mysql_install_db --datadir=/var/lib/mysql4 --user=mysql --basedir=/usr/local/mysql
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = mysql
password = your_admin_password
[mysqld1]
port = 3306
socket = /var/lib/mysql1/mysql1.sock
pid-file = /var/lib/mysql1/mysql1.pid
datadir = /var/lib/mysql1
basedir = /usr/local/mysql
user = mysql
server-id = 1
log-error = /var/lib/mysql1/error.log
slow_query_log_file = /var/lib/mysql1/slow.log
# 實例專屬參數
innodb_buffer_pool_size = 512M
max_connections = 200
[mysqld2]
port = 3307
socket = /var/lib/mysql2/mysql2.sock
pid-file = /var/lib/mysql2/mysql2.pid
datadir = /var/lib/mysql2
basedir = /usr/local/mysql
user = mysql
server-id = 2
log-error = /var/lib/mysql2/error.log
innodb_buffer_pool_size = 512M
max_connections = 200
[mysqld3]
port = 3308
socket = /var/lib/mysql3/mysql3.sock
pid-file = /var/lib/mysql3/mysql3.pid
datadir = /var/lib/mysql3
basedir = /usr/local/mysql
user = mysql
server-id = 3
innodb_buffer_pool_size = 512M
[mysqld4]
port = 3309
socket = /var/lib/mysql4/mysql4.sock
pid-file = /var/lib/mysql4/mysql4.pid
datadir = /var/lib/mysql4
basedir = /usr/local/mysql
user = mysql
server-id = 4
innodb_buffer_pool_size = 512M
# 查看實例狀態
mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf report
# 啟動所有實例
mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf start
# 啟動指定實例
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
# 透過 TCP 連線
mysql -u root -p -h 127.0.0.1 -P 3306
mysql -u root -p -h 127.0.0.1 -P 3307
# 透過 Socket 連線(本機更快)
mysql -u root -p -S /var/lib/mysql1/mysql1.sock
mysql -u root -p -S /var/lib/mysql2/mysql2.sock
# 驗證實例隔離
mysql> SHOW VARIABLES LIKE 'port'; -- 應顯示對應埠
mysql> SHOW VARIABLES LIKE 'datadir'; -- 應顯示對應目錄
建立 /etc/systemd/system/mysqld@.service 模板:
[Unit]
Description=MySQL Server Instance %i
After=network.target
[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf start %i
ExecStop=/usr/local/mysql/bin/mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf stop %i
PIDFile=/var/lib/mysql%i/mysql%i.pid
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
# 啟用並啟動實例 1,2
systemctl daemon-reload
systemctl enable mysqld@1 mysqld@2
systemctl start mysqld@1 mysqld@2
# 查看狀態
systemctl status mysqld@1
| 資源 | 隔離手段 | 監控指標 |
|---|---|---|
| CPU | cgroups cpuset / taskset 綁核 | per-instance CPU usage |
| 記憶體 | 各實例獨立 innodb_buffer_pool_size | buffer pool hit rate, memory usage |
| 磁碟 IO | 不同掛載點/磁碟陣列 | iostat -x /dev/nvmeXnY |
| 網路 | 不同埠,防火牆限制存取來源 | netstat -an | grep :3306 |
| 連線數 | 各實例獨立 max_connections | Threads_connected / max_connections |
datadir 擁有者為 mysql:mysql,權限 750;socket 目錄同樣。pid-file 設定與實際生成位置。bind_address(預設 127.0.0.1),改為 0.0.0.0 或具體 IP;防火牆放行對應埠。ldd /usr/local/mysql/bin/mysqld 檢查,缺 libssl/libcrypto 需安裝對應 openssl-devel。