目录
- 一、多实例核心思想
- 二、目录结构规划
- 1.对比说明:从你的单实例 → 多实例
- 三、systemd 多实例模板
- 设计原则
- 1. 创建 systemd 模板单元文件
- /data/mysql/instance_3306/my.cnf
- /data/mysql/instance_3307/my.cnf(仅端口/路径不同)
- 1. 检查状态(使用mysqladmin)
- 2. 登录不同实例
- 3. 创建测试库,验证隔离性
- 4. 验证日志分离
- 四、配置文件(启用慢查询日志)
- 五、初始化并启动实例
- 六、使用mysqladmin检查实例状态
- 七、验证多实例功能
- 八、systemd 管理命令汇总
- 九、总结:多实例核心验证点
一、多实例核心思想
- 每个实例有独立的:
datadirsocketportpid-filelog-errormysqlx_port(如启用)
- 共享同一个 MySQL 二进制文件(
/usr/local/mysql/bin/mysqld) - 使用 单独的配置文件 或 同一文件中的多个
[mysqldN]段
二、目录结构规划
/data/mysql/
├── instance_3306/
│ ├── data/ # 数据目录
│ ├── logs/
│ │ ├── error.log # 错误日志
│ │ └── slow.log # 慢查询日志
│ └── my.cnf # 配置文件
│
└── instance_3307/
├── data/php
├── 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.python0.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
# 环境(可选)
Environmeandroidnt="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.pid log-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 = 1 port = 3307 mysqlx_port = 33070 mysqlx_socket = /data/mysql/instance_3307/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
五、初始化并启动实例
# 初始化 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/in编程stance_3307/my.cnf \ --initialize-insecure # 启动并启用开机自启 sudo systemctl start mysqld@3306 sudo systemctl enable mysqld@3306 sudo 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 statuphps 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,互不可见 |
到此这篇关于MySQL多实例部署实战完美攻略的文章就介绍到这了,更多相关mysql多实例部署内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
加载中,请稍侯......
精彩评论