写点什么

GreatSQL 通过伪装从库回放 Binlog 文件

作者:GreatSQL
  • 2025-07-04
    福建
  • 本文字数:3923 字

    阅读完需:约 13 分钟

GreatSQL 通过伪装从库回放 Binlog 文件

一、适用场景说明

1、主库误操作恢复


利用 Binlog 在其他实例解析、回放,根据 gtid 只回放到指定位点。


2、网络隔离环境同步


备份恢复后可以拉去主库 Binlog 文件至新实例同步增量数据。


3、备份恢复遇到 Binlog 文件过大处理


恢复实例时有可能主库的 Binlog 超过限定大小,无法用 mysqlbinlog 工具恢复。


以上只是列举部分场景,而且恢复的方式也并非一种,本文讲解通过伪装从库的方式去回放所需的 binlog。

二、测试环境实例信息

三、实例 1 生成测试数据

在实例 1 创建 4 个新库,用 sysbench 生成测试数据,每执行一次 sysbench 就刷新一下 Binlog,生成多个 Binlog 文件。


192.168.138.239:3301create database wl_greatsql1;create database wl_greatsql2;create database wl_greatsql3;create database wl_greatsql4;
sysbench ./src/lua/oltp_read_write.lua --mysql-db=wl_greatsql1-4 --mysql-host=192.168.138.239 --mysql-port=3301 --mysql-user=greatsql --mysql-password='QW12er#$' --mysql-ignore-errors=all --tables=5 --table_size=10000 --threads=10 --report-interval=2 --time=1800 prepare
复制代码


通过flush logs;命令生成多个 Binlog 文件。


-rw-r-----. 1 greatsql greatsql    9545477 Jun  4 17:53 binlog.000001-rw-r-----. 1 greatsql greatsql    9544713 Jun  4 17:54 binlog.000002-rw-r-----. 1 greatsql greatsql    9544713 Jun  4 17:54 binlog.000003-rw-r-----. 1 greatsql greatsql    9544713 Jun  4 17:54 binlog.000004
复制代码

四、查看实例 2 状态

实例 2 的状态确保没有重复数据记录,做了reset master以及slave


greatsql> SHOW MASTER STATUS\G*************************** 1. row ***************************             File: binlog.000001         Position: 153     Binlog_Do_DB: Binlog_Ignore_DB:Executed_Gtid_Set:1 row in set (0.00 sec)
greatsql> SHOW SLAVE STATUS\GEmpty set, 1 warning (0.00 sec)
复制代码

五、实例 2 伪装从库应用实例 1binlog 数据

1、处理实例 2 的 slave 信息


# reset slave;之后relaylog就被全清了变成以下样子-rw-r----- 1 greatsql greatsql 177 Apr  4 02:32 relaylog.000001-rw-r----- 1 greatsql greatsql  51 Apr  4 02:32 relaylog.index
复制代码


关于 RESET SLAVE [ALL] 的操作说明:


RESET SLAVE会移除当前从库的复制状态信息。会删除所有和该从库关联的 relay log(中继日志)文件。会将与复制位点(例如 Master_Log_File、Read_Master_Log_Pos 等)相关的信息重置为空。不会清除通过 CHANGE MASTER TO 设置的复制连接参数(如主库地址、用户、密码等),在较新的 GreatSQL 版本中这些连接参数会保留。
RESET SLAVE ALL会执行与 RESET SLAVE 相同的操作(删除 relay log、重置复制状态)。此外,还会清空通过 CHANGE MASTER TO 配置的所有主库连接信息(主库地址、端口、用户、密码等),相当于是把复制相关的所有设置都恢复到初始默认状态。
复制代码


2、将实例 1 生成的 binlog 文件传输到实例 2 主机并修改名称


#拷贝到实例2。binlog.000001  binlog.000002  binlog.000003  binlog.000004  
#修改名称mv binlog.000001 relaylog.000002 mv binlog.000002 relaylog.000003mv binlog.000003 relaylog.000004mv binlog.000004 relaylog.000005

#修改权限chown -R greatsql:greatsql /greatsql/dbdata/log/
复制代码


3、修改实例 2 relay-bin.index 文件


# 修改实例2 index文件内容同上。vi relaylog.index
# 新增/greatsql/dbdata/log/relaylog.000002 /greatsql/dbdata/log/relaylog.000003 /greatsql/dbdata/log/relaylog.000004 /greatsql/dbdata/log/relaylog.000005
复制代码


4、实例 2 建立复制通道


说明:


只需要 sql_thread 即可应用 relay log,io_thread 并不用配置实际的信息。关键是在执行 CHANGE MASTER TO 操作时要指定 RELAY_LOG_FILERELAY_LOG_POS 的详细信息。


# 建立slave通道CHANGE MASTER TO MASTER_HOST='source2.example.com', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_PORT=3301, Relay_Log_File='relaylog.000001', Relay_Log_POS=4;
复制代码


5、启动 sql_thread


# 只启动sql线程START SLAVE sql_thread;
# 如果想指定位点恢复可执行下面的命令,加上 SQL_AFTER_GTIDS 参数START SLAVE sql_thread UNTIL SQL_AFTER_GTIDS = 'AAAAAAAA-0000-0000-0000-000000000000:XXX';
复制代码


6、查看实例 2 的复制通道


# 查看master信息greatsql> SHOW MASTER STATUS\G*************************** 1. row ***************************             File: binlog.000001         Position: 38179345     Binlog_Do_DB: Binlog_Ignore_DB:Executed_Gtid_Set: 32ab2502-3492-11f0-891f-00163e7e5561:1-1241 row in set (0.00 sec)
# 查看slave信息greatsql> SHOW SLAVE STATUS\G*************************** 1. row *************************** Slave_IO_State: Master_Host: source2.example.com Master_User: repl Master_Port: 3301 Connect_Retry: 60 Master_Log_File: Read_Master_Log_Pos: 4 Relay_Log_File: relaylog.000006 Relay_Log_Pos: 4 Relay_Master_Log_File: binlog.000005 Slave_IO_Running: No Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 4 Relay_Log_Space: 153 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0 Master_UUID: Master_Info_File: /greatsql/dbdata/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: 32ab2502-3492-11f0-891f-00163e7e5561:1-124 Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace:1 row in set, 1 warning (0.00 sec)
复制代码


6、数据验证


greatsql> SHOW DATABASES;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || sys                || wl_greatsql1       || wl_greatsql2       || wl_greatsql3       || wl_greatsql4       |+--------------------+8 rows in set (0.01 sec)
greatsql> USE wl_greatsql1Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -A
Database changedgreatsql> SHOW TABLES;+------------------------+| Tables_in_wl_greatsql1 |+------------------------+| sbtest1 || sbtest2 || sbtest3 || sbtest4 || sbtest5 |+------------------------+5 rows in set (0.00 sec)
greatsql> SELECT COUNT(*) FROM sbtest1;+----------+| count(*) |+----------+| 10000 |+----------+1 row in set (0.01 sec)
复制代码

六、操作风险

1、确认伪从库已有数据是否安全兼容回放操作

  • 如果伪从库中本身已存在部分数据,必须提前核实与 Binlog 中即将回放的数据是否存在冲突,避免出现主键冲突、重复插入、逻辑错误等情况。

  • 建议在回放前执行一次结构与关键数据校验,确保数据状态与预期一致。

2、主库误操作场景需精准识别回放的事务范围

  • 若回放 Binlog 是为了修复主库误操作(如误删、误更新等),必须提前通过 mysqlbinlog 工具明确要回放的具体事务,避免出现“多执行”或“漏执行”。

  • 回放应尽量以事务为单位分批控制,必要时使用 START SLAVE UNTILmysqlbinlog --stop-position 等方式精准切点。

3、严控伪从库的主从配置,避免误接入真实主库

  • 伪装从库的核心在于模拟中继日志环境,不应真实接入主库。

  • 配置 CHANGE MASTER TO 时,务必使用虚假地址或,防止误连主库造成非预期的主从同步或写入操作。

发布于: 刚刚阅读数: 2
用户头像

GreatSQL

关注

GreatSQL社区 2023-01-31 加入

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。 社区:https://greatsql.cn/ Gitee: https://gitee.com/GreatSQL/GreatSQL

评论

发布
暂无评论
GreatSQL通过伪装从库回放Binlog文件_GreatSQL_InfoQ写作社区