MySQL 9.6的主从复制(主从同步)

       主从复制可以使MySQL数据库主服务器的主数据库,复制到一个或多个MySQL从服务器从数据库,默认情况下,复制异步; 根据配置,可以复制数据库中的所有数据库,选定的数据库或甚至选定的表。横向扩展解决方案:在多个从库之间扩展负载以提高性能。在这种环境中,所有写入和更新在主库上进行。但是,读取可能发生在一个或多个从库上。该模型可以提高写入的性能(由于主库专用于更新),同时在多个从库上读取,可以大大提高读取速度。

1.软件环境(docker环境中)

Mysql版本:MySQL 9.6

Master-Server : 192.168.1.5 

Slave-Server : 192.168.1.6

2. Master-Server 配置

停止MySQL服务,修改 my.cnf

配置 Master 以使用基于二进制日志文件位置的复制,必须启用二进制日志记录并建立唯一的服务器ID,否则则无法进行主从复制。

要确保配置前,两台服务器的数据是一样的

[mysqld]
# 服务器唯一ID(主服务器)
server-id=1

# 启用二进制日志
log-bin=mysql-bin

# GTID 模式(默认启用,MySQL 9.1)
gtid-mode=ON
enforce-gtid-consistency=ON

# 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

# 时区
default-time-zone='+08:00'

# 跳过域名解析
skip-name-resolve

# 禁止本地文件导入
local_infile=0

# 连接配置
max_connections=500
max_connect_errors=1000
wait_timeout=28800

# 缓冲区(根据 NAS 内存调整)
innodb_buffer_pool_size=1G
innodb_redo_log_capacity=128M
innodb_log_buffer_size=64M
innodb_flush_log_at_trx_commit=2

# 日志
log_error=/var/log/mysql/error.log
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=2

# ========== 二进制日志配置 ==========
# MySQL 9.x 使用 binlog_expire_logs_seconds(替代 expire_logs_days)
# 604800 秒 = 7 天
binlog_expire_logs_seconds=604800

[client]
default-character-set=utf8mb4

3.重起Mysql,进入Mysql命令行创建复制用的远程账号

# 进入 MySQL
docker exec -it mysql mysql -uroot -p
# 或
mysql -uroot -p
-- 创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY '你的密码';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 授予连接权限(可选)
GRANT REPLICATION CLIENT ON *.* TO 'repl'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 查看主服务器状态
SHOW BINARY LOG STATUS;

小风博客

4.从服务器(Slave)配置,编辑 MySQL 配置文件

[mysqld]
# 服务器唯一ID(从服务器,必须与主服务器不同)
server-id=2

# 中继日志
relay-log=relay-bin
relay-log-index=relay-bin.index

# 只读模式(推荐)
# read-only=1

# 超级用户也可以只读(可选,更严格)
# super-read-only=1

# GTID 模式
gtid-mode=ON
enforce-gtid-consistency=ON

# 并行复制(提高性能)
# slave_parallel_type=LOGICAL_CLOCK
# slave_parallel_workers=4

# 禁用中继日志自动清除(可选)
# relay_log_purge=OFF

# 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

# 时区
default-time-zone='+08:00'

# 跳过域名解析
skip-name-resolve

# 禁止本地文件导入
local_infile=0

# 连接配置
max_connections=500
max_connect_errors=1000
wait_timeout=28800

# 缓冲区(根据 NAS 内存调整)
innodb_buffer_pool_size=1G
innodb_redo_log_capacity=128M
innodb_log_buffer_size=64M
innodb_flush_log_at_trx_commit=2

# 日志
log_error=/var/log/mysql/error.log
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=2

# ========== 二进制日志配置 ==========
# MySQL 9.x 使用 binlog_expire_logs_seconds(替代 expire_logs_days)
# 604800 秒 = 7 天
binlog_expire_logs_seconds=604800

[client]
default-character-set=utf8mb4

5.重启 MySQL,进入到Mysql命令行配置主从复制

-- 停止从服务器(如果有旧的配置)
STOP REPLICA;
-- 重置从服务器(清空旧的复制信息)
RESET REPLICA ALL;
-- ===== 方案A:使用 GTID 方式(推荐,MySQL 9.1) =====
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='主服务器IP',           -- 例如:192.168.1.10
  SOURCE_USER='repl',                 -- 复制用户
  SOURCE_PASSWORD='你的密码',          -- 复制用户密码
  SOURCE_PORT=3306,                   -- MySQL 端口
  SOURCE_AUTO_POSITION=1;             -- 自动使用 GTID
  
-- ===== 方案B:使用传统方式(如果需要精确控制) 
=====-- 先在主服务器执行 
SHOW BINARY LOG STATUS;获取 File(SOURCE_LOG_FILE) 和 Position(SOURCE_LOG_POS)

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='主服务器IP',
  SOURCE_USER='repl',
  SOURCE_PASSWORD='你的密码',
  SOURCE_PORT=3306,
  SOURCE_LOG_FILE='mysql-bin.000001',  -- 从主服务器获取
  SOURCE_LOG_POS=156;                 -- 从主服务器获取                

-- 启动从服务器
START REPLICA;
-- 查看从服务器状态
SHOW REPLICA STATUS\G;

小风博客

打 赏

小风博客
请点评论按钮,登录后发表评论
  • 最新评论
  • 总共0条评论