本腳本實現單機部署多個獨立 MySQL 實例(端口 2016、3017、4018、5019、6020),採用 mysqld_multi 管理框架,統一配置文件、獨立數據目錄、獨立錯誤日誌、獨立 Socket,適配生產環境資源隔離需求。
[mysqld_multi] mysqld = /usr/local/mysql/bin/mysqld_safe mysqladmin = /usr/local/mysql/bin/mysqladmin log = /usr/local/mysql/multi_log/mysqld_multi.log
[mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 256M sort_buffer_size = 256M read_buffer = 2M write_buffer = 2M
[mysqld{port:2}] # 實例組名,port 為 2016/3017...
port = {port}
socket = /data/mysql_root/mysql/data{port}/mysql.socket
datadir = /data/mysql_root/mysql/data{port}
pid-file = /data/mysql_root/mysql/data{port}/mysql.pid
log_error = /data/mysql_root/mysql/data{port}/mysql.err
server-id = {port} # 唯一標識,關鍵!
# 複製必備
log-bin = mysql-bin
binlog_format = ROW
expire_logs_days = 3
binlog_cache_size = 32M
# 慢查詢
slow_query_log = 1
long_query_time = 2
# 字符集與大小寫
character_set_server = utf8
lower_case_table_names = 1
# InnoDB 核心調優(按 8G 內存示例)
innodb_buffer_pool_size = 5972M # 物理內存 70-80%
innodb_log_file_size = 512M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 2 # 性能與安全平衡
innodb_flush_method = O_DIRECT # 繞過文件系統緩存
innodb_file_per_table = 1
innodb_io_capacity = 600 # SSD 建議 1000-2000
innodb_read_io_threads = 12
innodb_write_io_threads = 12
innodb_thread_concurrency = 0 # 0 表示不限制
/usr/local/mysqlmy.cnf 全局段與 [mysqld_multi] 段my.cnfmysql_install_db --defaults-file=my.cnf 初始化系統表chown mysql:mysql 數據目錄與安裝目錄/usr/local/mysql/bin 加入 /etc/profile# 啟動所有實例 mysqld_multi start # 啟動指定實例(組名對應配置段後綴) mysqld_multi start 2016 3017 # 停止所有 mysqld_multi stop # 查看運行狀態 mysqld_multi report
innodb_buffer_pool_size 之和 ≤ 物理內存 75%,預留 OS 與連接緩存mysqld_exporter --web.listen-address=:9104 --config.my-cnf=/etc/my.cnf.2016)xtrabackup --defaults-file=/etc/my.cnf.2016 並行備份,避免全庫鎖定| 現象 | 根因 | 修正 |
|---|---|---|
| mysqld_multi report 顯示未運行 | Socket 路徑不匹配或權限不足 | 檢查 socket 參數、目錄擁有者、SELinux |
| 實例啟動即退出 | innodb_buffer_pool_size 總和超限導致 OOM | 縮減各實例 buffer pool 或增加物理內存 |
| 複製報錯 Server ID 冲突 | 腳本未正確賦值 server-id = {port} | 確保每實例 server-id 全局唯一 |