开发者

MySQL多实例部署实战完美攻略

开发者 https://www.devze.com 2025-10-24 09:08 出处:网络 作者: zz-zjx
目录一、多实例核心思想二、目录结构规划1.对比说明:从你的单实例 → 多实例三、systemd 多实例模板设计原则1. 创建 systemd 模板单元文件/data/mysql/instance_3306/my.cnf/data/mysql/instance_3307/my.cnf(
目录
  • 一、多实例核心思想
  • 二、目录结构规划
    • 1.对比说明:从你的单实例 → 多实例
  • 三、systemd 多实例模板
    • 设计原则
    • 1. 创建 systemd 模板单元文件
      • /data/mysql/instance_3306/my.cnf
      • /data/mysql/instance_3307/my.cnf(仅端口/路径不同)
      • 1. 检查状态(使用mysqladmin)
      • 2. 登录不同实例
      • 3. 创建测试库,验证隔离性
      • 4. 验证日志分离
  • 四、配置文件(启用慢查询日志)
    • 五、初始化并启动实例
      • 六、使用mysqladmin检查实例状态
        • 七、验证多实例功能
          • 八、systemd 管理命令汇总
            • 九、总结:多实例核心验证点

              一、多实例核心思想

              • 每个实例有独立的
                • 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/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
              port3306→ 实例1保留3306,实例2用3307
              mysqlx_port33060→ 实例2改为33070,避免冲突
              bind-address0.0.python0.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
              # 环境(可选)
              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)!

              0

              精彩评论

              暂无评论...
              验证码 换一张
              取 消

              关注公众号