MySQL多实例部署实战指南
一、多实例核心思想
- 每个实例有独立的:
datadir
socket
port
pid-file
log-error
mysqlx_port
(如启用)
- 共享同一个 MySQL 二进制文件(
/usr/local/mysql/bin/mysqld
) - 使用 单独的配置文件 或 同一文件中的多个
[mysqldN]
段
二、目录结构规划
/data/mysql/
├── instance_3306/
│ ├── data/ # 数据目录
│ ├── logs/
│ │ ├── error.log # 错误日志
│ │ └── slow.log # 慢查询日志
│ └── my.cnf # 配置文件
│
└── instance_3307/├── data/├── logs/│ ├── error.log│ └── slow.log└── my.cnf
创建目录并授权:
sudo mkdir -p /data/mysql/instance_3306/{data,logs}
sudo mkdir -p /data/mysql/instance_3307/{data,logs}
sudo chown -R mysql:mysql /data/mysql
1.对比说明:从你的单实例 → 多实例
保留的核心元素:
配置项 | 你的原始值 | 多实例中保留 |
---|---|---|
datadir | /data/mysql | → 拆分为 /data/mysql/instance_3306/data 等 |
socket | /data/mysql/mysql.sock | → 每个实例独立 socket |
log-error | /data/mysql/mysqld.log | → 拆分为各实例的 logs/error.log |
port | 3306 | → 实例1保留3306,实例2用3307 |
mysqlx_port | 33060 | → 实例2改为33070,避免冲突 |
bind-address | 0.0.0.0 | → 改为 127.0.0.1 (更安全,可改回) |
character-set-server | utf8mb4 | 保留 |
collation-server | utf8mb4_unicode_ci | 保留 |
default_authentication_plugin | mysql_native_password (你原配置) | → 升级为 caching_sha2_password (MySQL 8.4 推荐),但你可改回 |
secure-file-priv | /var/lib/mysql-files | 保留 |
innodb_buffer_pool_size | 1G | → 调整为 256M (因多实例需节省内存,你可调回) |
max_connections | 200 | → 调整为 50 (按实例分配,你可调回) |
三、systemd 多实例模板
设计原则
- 使用 systemd 模板单元(template unit):
mysqld@.service
- 每个实例通过 端口号标识(如
mysqld@3306
、mysqld@3307
) - 实例配置文件路径约定:
/data/mysql/instance_<port>/my.cnf
- 完全兼容你原有的路径风格:
/data/mysql/...
1. 创建 systemd 模板单元文件
sudo tee /etc/systemd/system/mysqld@.service <<'EOF'
[Unit]
Description=MySQL Server for instance on port %i
After=network.target
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/[Service]
Type=simple
User=mysql
Group=mysql# 动态配置文件路径:/data/mysql/instance_3306/my.cnf
ExecStart=/usr/local/mysql/bin/mysqld \--defaults-file=/data/mysql/instance_%i/my.cnf# 安全加固(可选)
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true# 重启策略
Restart=on-failure
RestartSec=5
TimeoutSec=300# 环境(可选)
Environment="MYSQLD_OPTS=--defaults-file=/data/mysql/instance_%i/my.cnf"[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
%i
是 systemd 的实例标识符(如3306
),会自动替换。
四、配置文件(启用慢查询日志)
/data/mysql/instance_3306/my.cnf
[client]
port = 3306
socket = /data/mysql/instance_3306/mysql.sock[mysql]
socket = /data/mysql/instance_3306/mysql.sock[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /data/mysql/instance_3306/data
socket = /data/mysql/instance_3306/mysql.sock
pid-file = /data/mysql/instance_3306/mysqld.pid# 日志
log-error = /data/mysql/instance_3306/logs/error.log
slow_query_log = ON
slow_query_log_file = /data/mysql/instance_3306/logs/slow.log
long_query_time = 1# 网络
port = 3306
mysqlx_port = 33060
mysqlx_socket = /data/mysql/instance_3306/mysqlx.sock
bind-address = 127.0.0.1# 安全与字符集
symbolic-links = 0
secure-file-priv = /var/lib/mysql-files
default_authentication_plugin = caching_sha2_password
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci# 性能
innodb_buffer_pool_size = 256M
max_connections = 50
/data/mysql/instance_3307/my.cnf
(仅端口/路径不同)
[client]
port = 3307
socket = /data/mysql/instance_3307/mysql.sock[mysql]
socket = /data/mysql/instance_3307/mysql.sock[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /data/mysql/instance_3307/data
socket = /data/mysql/instance_3307/mysql.sock
pid-file = /data/mysql/instance_3307/mysqld.pidlog-error = /data/mysql/instance_3307/logs/error.log
slow_query_log = ON
slow_query_log_file = /data/mysql/instance_3307/logs/slow.log
long_query_time = 1port = 3307
mysqlx_port = 33070
mysqlx_socket = /data/mysql/instance_3307/mysqlx.sock
bind-address = 127.0.0.1symbolic-links = 0
secure-file-priv = /var/lib/mysql-files
default_authentication_plugin = caching_sha2_password
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ciinnodb_buffer_pool_size = 256M
max_connections = 50
五、初始化并启动实例
# 初始化 3306
sudo -u mysql /usr/local/mysql/bin/mysqld \--defaults-file=/data/mysql/instance_3306/my.cnf \--initialize-insecure# 初始化 3307
sudo -u mysql /usr/local/mysql/bin/mysqld \--defaults-file=/data/mysql/instance_3307/my.cnf \--initialize-insecure# 启动并启用开机自启
sudo systemctl start mysqld@3306
sudo systemctl enable mysqld@3306sudo systemctl start mysqld@3307
sudo systemctl enable mysqld@3307
使用
--initialize-insecure
是为了测试方便(root 无密码)。生产环境请用--initialize
并从error.log
获取临时密码。
六、使用 mysqladmin
检查实例状态
# 检查 3306
/usr/local/mysql/bin/mysqladmin \-S /data/mysql/instance_3306/mysql.sock \-u root ping# 检查 3307
/usr/local/mysql/bin/mysqladmin \-S /data/mysql/instance_3307/mysql.sock \-u root ping
正常输出:
mysqld is alive
也可以用
-h 127.0.0.1 -P 3306
通过 TCP 检查。
七、验证多实例功能
1. 检查状态(使用 mysqladmin
)
/usr/local/mysql/bin/mysqladmin -S /data/mysql/instance_3306/mysql.sock ping
# 输出:mysqld is alive/usr/local/mysql/bin/mysqladmin -S /data/mysql/instance_3307/mysql.sock ping
# 输出:mysqld is alive
2. 登录不同实例
# 登录 3306
/usr/local/mysql/bin/mysql -u root -S /data/mysql/instance_3306/mysql.sock# 登录 3307
/usr/local/mysql/bin/mysql -u root -S /data/mysql/instance_3307/mysql.sock
3. 创建测试库,验证隔离性
在 3306 中:
CREATE DATABASE test_from_3306;
SHOW DATABASES;
-- 应包含 test_from_3306,不包含 test_from_3307
在 3307 中:
CREATE DATABASE test_from_3307;
SHOW DATABASES;
-- 应包含 test_from_3307,不包含 test_from_3306
证明:两个实例数据完全隔离!
4. 验证日志分离
# 触发慢查询
echo "SELECT SLEEP(2);" | /usr/local/mysql/bin/mysql -S /data/mysql/instance_3306/mysql.sock# 检查日志
cat /data/mysql/instance_3306/logs/slow.log # 有记录
cat /data/mysql/instance_3307/logs/slow.log # 无记录# 错误日志
tail /data/mysql/instance_3306/logs/error.log
tail /data/mysql/instance_3307/logs/error.log
八、systemd 管理命令汇总
# 启动/停止/重启
sudo systemctl start mysqld@3306
sudo systemctl stop mysqld@3307
sudo systemctl restart mysqld@3306# 查看状态
systemctl status mysqld@3306# 查看启动日志(systemd journal)
journalctl -u mysqld@3306 -f# 开机自启
sudo systemctl enable mysqld@3306
sudo systemctl disable mysqld@3307
九、总结:多实例核心验证点
项目 | 是否满足 |
---|---|
独立数据目录 | /data/mysql/instance_3306/data vs .../3307/data |
独立配置文件 | 两个 my.cnf |
独立错误日志 | error.log 分开 |
独立慢查询日志 | slow.log 分开 |
mysqladmin 检查状态 | 通过 socket 指定实例 |
mysql 登录不同实例 | -S 指定 socket |
数据库完全隔离 | 各自创建 DB,互不可见 |