利用多核 CPU 優勢,單機部署多個 MySQL 實例(不同端口、數據目錄、配置),通過 mysqld_multi 統一管理。本文覆蓋源碼編譯安裝、目錄規劃、配置文件、初始化、啟動驗證、運維腳本。
# 1. 依賴包
yum install -y cmake gcc gcc-c++ ncurses-devel libaio-devel bison make
# 2. 創建用戶
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
# 3. 編譯安裝
tar -xvf mysql-5.6.12.tar.gz
cd mysql-5.6.12
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/home/data/mysql/data \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DMYSQL_USER=mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
make -j$(nproc)
make install
# 程序目錄 (共享二進制)
# /usr/local/mysql (已安裝)
# 實例專用目錄
mkdir -p /usr/local/mysql3307
chown -R mysql:mysql /usr/local/mysql3307
# 數據目錄
mkdir -p /home/data/mysql3307/data
chown -R mysql:mysql /home/data/mysql3307
# Binlog 目錄
mkdir -p /home/data/mysql3307/binlog
chown -R mysql:mysql /home/data/mysql3307/binlog
# Relay log 目錄
mkdir -p /home/data/mysql3307/relay_log
chown -R mysql:mysql /home/data/mysql3307/relay_log
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
log = /home/mysql/mydata/log/mysqld_multi.log
[mysqld1] # 實例標識,對應 mysqld_multi start 1
socket = /usr/local/mysql3307/mysql.sock
port = 3307
pid-file = /usr/local/mysql3307/mysqld.pid
datadir = /home/data/mysql3307/data
log_bin = /home/data/mysql3307/binlog/mysql-bin
server-id = 1230
relay_log = /home/data/mysql3307/relay_log/mysql-relay-bin
log_slave_updates = 1
read_only = 0
innodb_buffer_pool_size = 128M
innodb_flush_log_at_trx_commit = 0
# 其他優化參數...
# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
# 使用安裝目錄的腳本 (MySQL 5.6/5.7)
/usr/local/mysql/scripts/mysql_install_db \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/home/data/mysql3307/data \
--defaults-file=/etc/my3307.cnf
# MySQL 8.0+
/usr/local/mysql/bin/mysqld --initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/home/data/mysql3307/data \
--defaults-file=/etc/my3307.cnf
# 啟動所有實例
mysqld_multi start
# 啟動指定實例
mysqld_multi start 1
# 停止所有
mysqld_multi stop
# 停止指定
mysqld_multi stop 1
# 查看狀態
mysqld_multi report
# 連線測試
mysql -u root -p -S /usr/local/mysql3307/mysql.sock -P 3307
# 1. 目錄
mkdir -p /usr/local/mysql3308 /home/data/mysql3308/{data,binlog,relay_log}
chown -R mysql:mysql /usr/local/mysql3308 /home/data/mysql3308
# 2. 配置追加 [mysqld2]
[mysqld2]
socket = /usr/local/mysql3308/mysql.sock
port = 3308
pid-file = /usr/local/mysql3308/mysqld.pid
datadir = /home/data/mysql3308/data
log_bin = /home/data/mysql3308/binlog/mysql-bin
server-id = 1231
relay_log = /home/data/mysql3308/relay_log/mysql-relay-bin
server-id = 1231
innodb_buffer_pool_size = 256M
# 3. 初始化
mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/home/data/mysql3308/data
# 4. 啟動
mysqld_multi start 2
<?bash
# /usr/local/bin/mysql_multi_manager.sh
ACTION=$1 # start|stop|restart|status
INSTANCE=${2:-all}
case $ACTION in
start)
if [ "$INSTANCE" = "all" ]; then
mysqld_multi start
else
mysqld_multi start $INSTANCE
fi
;;
stop)
if [ "$INSTANCE" = "all" ]; then
mysqld_multi stop
else
mysqld_multi stop $INSTANCE
fi
;;
status)
mysqld_multi report
;;
*)
echo "Usage: $0 {start|stop|restart|status} [instance_num|all]"
exit 1
;;
esac
mysqld_exporter (Prometheus) 抓取指標,標籤區分 instance="3307"Threads_connected/Max_used_connections、Innodb_buffer_pool_pages_free、Queries_per_sec、Slow_querieslogrotate 配置各實例 error.log/slow.logxtrabackup --socket=/usr/local/mysql3307/mysql.sock 實例級備份| 坑點 | 後果 | 規避 |
|---|---|---|
| 共享 basedir 但配置衝突 | 啟動失敗/行為異常 | 每實例獨立 defaults-file,核心參數隔離 |
| server-id 重複 | 複製中斷/數據不一致 | 規劃 server-id 池:3307→1230, 3308→1231... |
| 端口衝突 | 啟動失敗 | /etc/services 註冊,防火牆放行 |
| 內存總和超物理內存 | OOM Killer 殺進程 | Σ innodb_buffer_pool_size < 物理內存 70% |
| 文件描述符不足 | Too many open files | ulimit -n 65535、open_files_limit=65535 |