首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 多實例部署指南:mysqld_multi 實現單機多實例隔離

     編輯:MySQL 綜合教學

MySQL 多實例部署指南:mysqld_multi 實現單機多實例隔離

在單台伺服器運行多個獨立 MySQL 實例(不同埠、資料目錄、配置),可滿足多租戶隔離、版本並行測試、資源配額控制等需求。官方工具 mysqld_multi 是標準解決方案,本文記錄源碼安裝 + 多實例配置全流程。

架構規劃

實例埠Socket資料目錄PID 檔
mysqld13306/var/lib/mysql1/mysql1.sock/var/lib/mysql1/var/lib/mysql1/mysql1.pid
mysqld23307/var/lib/mysql2/mysql2.sock/var/lib/mysql2/var/lib/mysql2/mysql2.pid
mysqld33308/var/lib/mysql3/mysql3.sock/var/lib/mysql3/var/lib/mysql3/mysql3.pid
mysqld43309/var/lib/mysql4/mysql4.sock/var/lib/mysql4/var/lib/mysql4/mysql4.pid

步驟 1:源碼編譯安裝(以 5.7 為例)

# 安裝依賴
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

步驟 2:建立 mysql 使用者與目錄

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}

步驟 3:初始化各實例資料目錄

# 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

步驟 4:編寫多實例配置檔 /etc/mysqld_multi.cnf

[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

步驟 5:管理操作

# 查看實例狀態
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

步驟 6:驗證連線

# 透過 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';  -- 應顯示對應目錄

systemd 服務化(生產環境推薦)

建立 /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

資源隔離與監控

資源隔離手段監控指標
CPUcgroups cpuset / taskset 綁核per-instance CPU usage
記憶體各實例獨立 innodb_buffer_pool_sizebuffer pool hit rate, memory usage
磁碟 IO不同掛載點/磁碟陣列iostat -x /dev/nvmeXnY
網路不同埠,防火牆限制存取來源netstat -an | grep :3306
連線數各實例獨立 max_connectionsThreads_connected / max_connections

常見問題

  • 啟動失敗 Permission denied: 確認 datadir 擁有者為 mysql:mysql,權限 750;socket 目錄同樣。
  • mysqld_multi report 顯示 not running 但進程存在: PID 檔路徑不匹配,檢查 pid-file 設定與實際生成位置。
  • 無法遠端連線: 檢查 bind_address(預設 127.0.0.1),改為 0.0.0.0 或具體 IP;防火牆放行對應埠。
  • 共享庫依賴缺失: ldd /usr/local/mysql/bin/mysqld 檢查,缺 libssl/libcrypto 需安裝對應 openssl-devel。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved