mysql主从同步

0 阅读3分钟

介绍:主从同步是一种数据库复制技术,用于将主数据库(Master)中的数据实时或接近实时地复制到一个或多个从数据库(Slave)中 核心流程: 主库(Master) 记录所有数据变更到二进制日志(binlog) 从库(Slave) 通过 I/O 线程拉取主库的 binlog,写入本地中继日志(relay log) 从库的 SQL 线程 解析 relay log 并执行 SQL 操作,保持数据一致性 实现方式: 基于语句的复制(Statement - based Replication,SBR):主数据库将执行的 SQL 语句记录在二进制日志中,从数据库在复制时会重新执行这些语句来实现数据同步。

基于行的复制(Row - based Replication,RBR):主数据库会将每一行数据的更改记录在二进制日志中,从数据库根据这些记录来更新相应的行。

混合模式复制(Mixed - mode Replication):结合了基于语句和基于行的复制方式

mysql主从的应用场景: 读写分离:主库处理写操作,从库处理读请求 数据热备:主库故障时快速切换至从库 负载均衡:分散高并发查询压力

MySQL主从复制操作

  1. 服务器要求 角色 IP 示例 MySQL 版本 操作系统 主库 192.168.25.141 8+ CentOS 7.9 从库 192.168.25.139 8+ CentOS 7.9

环境注意事项: 主从库 MySQL 版本需一致 确保主从服务器网络互通(禁用防火墙或开放 3306 端口)

主库配置:

  1. 编辑主库配置文件
    sudo vim /etc/my.cnf
    在 [mysqld] 段添加以下参数
    [mysqld]
    server-id = 1 # 主库唯一标识
    log-bin = /var/log/mysql/mysql-bin.log # 启用二进制日志

保存后重启 MySQL 服务: sudo systemctl restart mysqld

  1. 登录数据库修改密码,创建同步专用账号 -- 登录 MySQL 主库 mysql -u root -p -- 创建同步专用账号
    CREATE USER 'repl'@'%' IDENTIFIED BY 'Password123!';
    GRANT REPLICATION SLAVE ON . TO 'repl'@'%';
    FLUSH PRIVILEGES;

select * from mysql.user where User='repl' \G; #查看账号权限 image.png

  1. 查看主库状态 --mysql 8.4版本前使用这条命令查看 show master status;

--MySQL 8.4版本后使用这条命令查看 SHOW BINARY LOG STATUS;

输出示例: mysql> SHOW BINARY LOG STATUS; +---------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------+----------+--------------+------------------+-------------------+ | binlog.000013 | 158 | | | | +---------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)

记录 File 和 Position 值(用于从库配置)

从库配置

  1. 修改配置文件 -- 编辑从库配置文件
    sudo vim /etc/my.cnf
    --在 [mysqld] 段添加以下参数
    [mysqld]
    server-id = 2 # 从库唯一标识(需与主库不同)
    relay-log = /var/log/mysql/relay-bin.log # 启用中继日志
    read_only = 1 # 从库只读(防止误操作)

注意:这里的中继日志可能位置不同或者没有,可以去除该字段,否则在设置主库信息会报错

保存后重启 MySQL 服务 sudo systemctl restart mysqld

  1. 配置主从连接 -- 登录 MySQL 从库
    mysql -u root -p

-- 设置主库信息(替换实际值) -- MSQL 8.23前 CHANGE MASTER TO
MASTER_HOST = 'IP',
MASTER_USER = 'repl',
MASTER_PASSWORD = '密码',
MASTER_LOG_FILE = ' File',
MASTER_LOG_POS = Position;

--MSQL 8.23后 change replication source to source_host='主库ip', source_user='主库上复制用户', source_password='主库上复制用户的密码', source_port=3306, source_log_file='mysql-bin.000002', source_log_pos=Position, source_ssl=1; #是否加密 image.png

-- 启动同步
start replica ; #8之后 start slave ; #8之前

  1. 同步设置完成之后 -- 查看状态,\G表示行转列,便于查看 show replica status\G ; #8.0.22之后 show slave status\G ; #8.0.22之前

主要检查的关键指标: Slave_IO_Running: Yes(I/O 线程运行正常) Slave_SQL_Running: Yes(SQL 线程运行正常) image.png

若出现错误,查看 Last_IO_Error 或 Last_SQL_Error 字段

验证主从同步是否生效 创建数据库linux image.png 同步成功 image.png

配置主从同步的过程中常见的故障和维护 问题 解决方案 主从连接失败 检查防火墙、主库账号权限 主从数据不一致 使用 pt-table-checksum 工具校验 同步延迟过高 优化慢查询,增加从库硬件资源

日常维护需要使用的命令 重置主从关系: STOP SLAVE;
RESET SLAVE ALL;

跳过指定错误(谨慎使用): SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;