Skip to content

mysql主从复制

ip 角色 环境
192.168.242.41 master mysql8.0.16
192.168.242.42 slave mysql8.0.16

master配置

master配置文件

vi /etc/my.cnf
# 配置唯一server id
server-id=41
# 打开二进制日志
log-bin=mysql-bin
# 关闭名称解释
skip-name-resolve

记得重启:systemctl restart mysqld

创建复制帐号

# 登录mysql
# 创建账户
create user 'copy'@'%' identified with mysql_native_password by'123';
# 赋予权限使其可以从主服务器copy二进制日志
GRANT REPLICATION SLAVE ON *.* TO 'copy'@'%';
# 刷新权限
flush privileges;
# 查看主服务器状态
show master status\G;

image-20241105133200179

image-20241105133444475

配置slave从服务器

slave配置文件

vi /etc/my.cnf
# 配置唯一server id
server-id=42
# 打开日志,格式为二进制
relay_log=mysql-relay
# 设置只读权限
read_only=1
# 打开二进制日志
log-bin=mysql-bin
# 使得更新的数据写入二进制日志中
log_slave_updates=1

记得重启mysql

启动从服务器复制线程

# 登录mysql

CHANGE MASTER TO
master_host='192.168.242.41',
master_user='copy',
master_password='123',
master_log_file='mysql-bin.000002',
master_log_pos=155;

第五六行数据从master中show master status\G;获取
# 启动slave(在数据库控制台输入)
start slave
# 查看slave状态
show slave status\G;

image-20241105134925701

互为主从

①配置方面两台都相同

vi /etc/my.cnf
# 配置唯一server id
server-id=41 # 要保证每台不一样
# 打开二进制日志
log-bin=mysql-bin
# 关闭名称解释
skip-name-resolve=on
# 使得更新的数据写入二进制日志中
log_slave_updates=1
auto_increment_increment=2
auto_increment_offset=1  # (这里每台递增)

②两台都设置一个复制账号(例如copy)

# 登录mysql
# 创建账户
create user 'copy'@'%' identified with mysql_native_password by'123';
# 赋予权限使其可以从主服务器copy二进制日志
GRANT REPLICATION SLAVE ON *.* TO 'copy'@'%';
# 刷新权限
flush privileges;
# 查看主服务器状态
show master status\G;

③两台主机都当作slave连接另一台

# 登录mysql
CHANGE MASTER TO
master_host='192.168.242.41',
master_user='copy',
master_password='123',
master_log_file='mysql-bin.000002',
master_log_pos=155;

# 第三行填写对方ip第六七行数据从master中show master status\G;获取
# 启动slave(在数据库控制台输入)
start slave
# 查看slave状态
show slave status\G;

如何安全关机(重要!!!)

主从复制的关机顺序确实很重要。如果关机顺序不当,可能导致数据丢失、复制中断或类似问题(如重复执行事务)。合理的关机顺序可以确保主从复制状态的完整性和一致性。


推荐的关机顺序

  1. 优先关闭从服务器 在关闭主服务器之前,先停止从服务器上的复制线程。这可以避免从服务器在主服务器关闭后尝试从主服务器拉取日志而发生错误。
  2. 然后关闭主服务器 关闭主服务器时,确保事务已提交并记录到二进制日志中。

详细步骤

关闭从服务器

  1. 停止复制线程 在从服务器上运行以下命令:
STOP SLAVE;
  1. 检查复制状态 确认复制线程已停止:
SHOW SLAVE STATUS\G;

确保 Slave_IO_RunningSlave_SQL_Running 均为 No

  1. 关闭从服务器 安全地关闭 MySQL 服务:
systemctl stop mysql

关闭主服务器

  1. 检查活动事务 确保没有未完成的事务,尤其是对于需要同步到从服务器的事务。可以使用以下命令检查:
SHOW PROCESSLIST;
  1. 刷新并同步日志 在关闭主服务器之前,刷新二进制日志,确保所有事务写入日志文件:
FLUSH LOGS;
  1. 关闭主服务器 使用以下命令安全地停止主服务器:
systemctl stop mysql

重新启动顺序

  1. 先启动主服务器 确保主服务器正常运行,监听指定端口,并可以接受从服务器的连接。

  2. 检查主服务器状态 使用以下命令检查主服务器的状态:

SHOW MASTER STATUS\G;
  1. 再启动从服务器 启动从服务器后,确认主从复制正常运行:
START SLAVE;
SHOW SLAVE STATUS\G;

注意事项

  1. 避免从服务器独立运行 如果主服务器已关闭,而从服务器仍在尝试同步日志,可能导致复制错误或状态混乱。
  2. 事务一致性 在主服务器关闭前,确保所有事务已提交并同步到从服务器。
  3. 日志和位置 在每次重新配置主从复制或遇到问题时,确保主从日志位置正确匹配。
  4. 启用 GTID(可选) 使用 GTID 模式,可以进一步简化主从复制的管理,避免复杂的日志位置匹配问题。

总结

关机顺序的基本原则是:

  1. 从服务器先关,确保复制线程停止。
  2. 主服务器后关,确保日志完整写入。

启动时,顺序相反:先主后从。

正确的顺序和操作可以避免大多数主从复制问题,如事务丢失、日志不一致等。

启动问题

太久未启动应该初始化slave

reset slave;
# 此时可能用户等或表提示重复,直接删除即可,会同步过来的

Comments