当前位置: 首页 > news >正文

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
port3306→ 实例1保留3306,实例2用3307
mysqlx_port33060→ 实例2改为33070,避免冲突
bind-address0.0.0.0→ 改为 127.0.0.1(更安全,可改回)
character-set-serverutf8mb4保留
collation-serverutf8mb4_unicode_ci 保留
default_authentication_pluginmysql_native_password(你原配置)→ 升级为 caching_sha2_password(MySQL 8.4 推荐),但你可改回
secure-file-priv/var/lib/mysql-files 保留
innodb_buffer_pool_size1G→ 调整为 256M(因多实例需节省内存,你可调回)
max_connections200→ 调整为 50(按实例分配,你可调回)

三、systemd 多实例模板

设计原则

  • 使用 systemd 模板单元(template unit)mysqld@.service
  • 每个实例通过 端口号标识(如 mysqld@3306mysqld@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,互不可见
http://www.dtcms.com/a/516438.html

相关文章:

  • 微网站建设招聘做招聘网站代理商需要多少钱
  • Android 网络变动监听
  • Deep Metric Learning(深度度量学习)
  • 消息队列RabbitMQ、Kafka、ActiveMQ 、Redis、 ZeroMQ、Apache Pulsar对比和如何使用
  • 建网站专用网站标准物质网站建设模板
  • (四)Flutter插件之IOS插件开发
  • 湘潭网站建设 x磐石网络广州网站建设培训学校
  • 织梦做的网站老是被黑国外做美食视频网站有哪些
  • 自动化测试相关使用
  • 做移门图的 网站有哪些做招聘网站需要做什么公司
  • TDengine 数字函数 RADIANS 用户手册
  • 做导航网站赚钱企业网站搜索优化外
  • 网站网页设计公司海南省建设执业中心网站
  • 如何解压一个MacOs PKG 安装包修改内容后重新打包
  • Linux 与 Windows:谁更适合 CLI 模式 AI 编程工具?
  • 深度学习(15)-PyTorch torch.nn 参考手册
  • 人工智能Pytorch开发环境的搭建
  • 【研究生随笔】Pytorch中的多层感知机
  • 广州知名网站建设性价比高三乡网站建设公司
  • 网站的建设流程图跨境电子商务网站建设
  • 佛山小学网站建设上海上市公司全部名单
  • linux怎么管理文件空间
  • Isaac-GR00T valueerror: no valid stream found in input file accept image
  • 如何在Linux安装 dotnet-sdk-2.2.207-linux-x64.tar.gz(解压+配置+验证)
  • js图片展示网站wordpress 豆瓣评分
  • 深度学习-175-知识图谱技术之langchain与neo4j的深入剖析
  • JAVA算法练习题day49
  • P1028 [NOIP 2001 普及组] 数的计算
  • centos怎么查看磁盘是机械还是固态
  • 全面掌握 PostgreSQL 关系型数据库,PostgreSQL 介绍,笔记02