找回密码
 立即注册
首页 业界区 安全 GreatSQL通过伪装从库回放Binlog文件

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

些耨努 2025-7-4 10:27:28
GreatSQL通过伪装从库回放Binlog文件

一、适用场景说明

1、主库误操作恢复
利用 Binlog 在其他实例解析、回放,根据gtid只回放到指定位点。
2、网络隔离环境同步
备份恢复后可以拉去主库Binlog文件至新实例同步增量数据。
3、备份恢复遇到Binlog文件过大处理
恢复实例时有可能主库的 Binlog 超过限定大小,无法用mysqlbinlog工具恢复。
以上只是列举部分场景,而且恢复的方式也并非一种,本文讲解通过伪装从库的方式去回放所需的binlog。
二、测试环境实例信息

实例1192.168.138.239:3301实例2192.168.135.196:3302三、实例1生成测试数据

在实例1创建4个新库,用sysbench生成测试数据,每执行一次sysbench就刷新一下Binlog,生成多个Binlog文件。
  1. 192.168.138.239:3301
  2. create database wl_greatsql1;
  3. create database wl_greatsql2;
  4. create database wl_greatsql3;
  5. create database wl_greatsql4;
  6. sysbench ./src/lua/oltp_read_write.lua
  7. --mysql-db=wl_greatsql1-4
  8. --mysql-host=192.168.138.239
  9. --mysql-port=3301
  10. --mysql-user=greatsql
  11. --mysql-password='QW12er#$'
  12. --mysql-ignore-errors=all
  13. --tables=5
  14. --table_size=10000
  15. --threads=10
  16. --report-interval=2
  17. --time=1800
  18. prepare
复制代码
通过flush logs;命令生成多个Binlog文件。
  1. -rw-r-----. 1 greatsql greatsql    9545477 Jun  4 17:53 binlog.000001
  2. -rw-r-----. 1 greatsql greatsql    9544713 Jun  4 17:54 binlog.000002
  3. -rw-r-----. 1 greatsql greatsql    9544713 Jun  4 17:54 binlog.000003
  4. -rw-r-----. 1 greatsql greatsql    9544713 Jun  4 17:54 binlog.000004
复制代码
四、查看实例2状态

实例2的状态确保没有重复数据记录,做了reset master以及slave。
  1. greatsql> SHOW MASTER STATUS\G
  2. *************************** 1. row ***************************
  3.              File: binlog.000001
  4.          Position: 153
  5.      Binlog_Do_DB:
  6. Binlog_Ignore_DB:
  7. Executed_Gtid_Set:
  8. 1 row in set (0.00 sec)
  9. greatsql> SHOW SLAVE STATUS\G
  10. Empty set, 1 warning (0.00 sec)
复制代码
五、实例2伪装从库应用实例1binlog数据

1、处理实例2的slave信息
  1. # reset slave;之后relaylog就被全清了变成以下样子
  2. -rw-r----- 1 greatsql greatsql 177 Apr  4 02:32 relaylog.000001
  3. -rw-r----- 1 greatsql greatsql  51 Apr  4 02:32 relaylog.index
复制代码
关于 RESET SLAVE  [ALL] 的操作说明:
  1. RESET SLAVE
  2. 会移除当前从库的复制状态信息。
  3. 会删除所有和该从库关联的 relay log(中继日志)文件。
  4. 会将与复制位点(例如 Master_Log_File、Read_Master_Log_Pos 等)相关的信息重置为空。
  5. 不会清除通过 CHANGE MASTER TO 设置的复制连接参数(如主库地址、用户、密码等),在较新的 GreatSQL 版本中这些连接参数会保留。
  6. RESET SLAVE ALL
  7. 会执行与 RESET SLAVE 相同的操作(删除 relay log、重置复制状态)。
  8. 此外,还会清空通过 CHANGE MASTER TO 配置的所有主库连接信息(主库地址、端口、用户、密码等),相当于是把复制相关的所有设置都恢复到初始默认状态。
复制代码
2、将实例1生成的binlog文件传输到实例2主机并修改名称
  1. #拷贝到实例2。
  2. binlog.000001  
  3. binlog.000002  
  4. binlog.000003  
  5. binlog.000004  
  6. #修改名称
  7. mv binlog.000001 relaylog.000002
  8. mv binlog.000002 relaylog.000003
  9. mv binlog.000003 relaylog.000004
  10. mv binlog.000004 relaylog.000005
  11. #修改权限
  12. chown -R greatsql:greatsql /greatsql/dbdata/log/
复制代码
3、修改实例2 relay-bin.index文件
  1. # 修改实例2 index文件内容同上。
  2. vi relaylog.index
  3. # 新增
  4. /greatsql/dbdata/log/relaylog.000002  
  5. /greatsql/dbdata/log/relaylog.000003  
  6. /greatsql/dbdata/log/relaylog.000004  
  7. /greatsql/dbdata/log/relaylog.000005  
复制代码
4、实例2建立复制通道
说明:
只需要sql_thread即可应用relay log,io_thread并不用配置实际的信息。关键是在执行 CHANGE MASTER TO 操作时要指定 RELAY_LOG_FILE 和 RELAY_LOG_POS 的详细信息。
  1. # 建立slave通道
  2. 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
  1. # 只启动sql线程
  2. START SLAVE sql_thread;
  3. # 如果想指定位点恢复可执行下面的命令,加上 SQL_AFTER_GTIDS 参数
  4. START SLAVE sql_thread UNTIL SQL_AFTER_GTIDS = 'AAAAAAAA-0000-0000-0000-000000000000:XXX';
复制代码
6、查看实例2的复制通道
  1. # 查看master信息
  2. greatsql> SHOW MASTER STATUS\G
  3. *************************** 1. row ***************************
  4.              File: binlog.000001
  5.          Position: 38179345
  6.      Binlog_Do_DB:
  7. Binlog_Ignore_DB:
  8. Executed_Gtid_Set: 32ab2502-3492-11f0-891f-00163e7e5561:1-124
  9. 1 row in set (0.00 sec)
  10. # 查看slave信息
  11. greatsql> SHOW SLAVE STATUS\G
  12. *************************** 1. row ***************************
  13.                Slave_IO_State:
  14.                   Master_Host: source2.example.com
  15.                   Master_User: repl
  16.                   Master_Port: 3301
  17.                 Connect_Retry: 60
  18.               Master_Log_File:
  19.           Read_Master_Log_Pos: 4
  20.                Relay_Log_File: relaylog.000006
  21.                 Relay_Log_Pos: 4
  22.         Relay_Master_Log_File: binlog.000005
  23.              Slave_IO_Running: No
  24.             Slave_SQL_Running: Yes
  25.               Replicate_Do_DB:
  26.           Replicate_Ignore_DB:
  27.            Replicate_Do_Table:
  28.        Replicate_Ignore_Table:
  29.       Replicate_Wild_Do_Table:
  30.   Replicate_Wild_Ignore_Table:
  31.                    Last_Errno: 0
  32.                    Last_Error:
  33.                  Skip_Counter: 0
  34.           Exec_Master_Log_Pos: 4
  35.               Relay_Log_Space: 153
  36.               Until_Condition: None
  37.                Until_Log_File:
  38.                 Until_Log_Pos: 0
  39.            Master_SSL_Allowed: No
  40.            Master_SSL_CA_File:
  41.            Master_SSL_CA_Path:
  42.               Master_SSL_Cert:
  43.             Master_SSL_Cipher:
  44.                Master_SSL_Key:
  45.         Seconds_Behind_Master: 0
  46. Master_SSL_Verify_Server_Cert: No
  47.                 Last_IO_Errno: 0
  48.                 Last_IO_Error:
  49.                Last_SQL_Errno: 0
  50.                Last_SQL_Error:
  51.   Replicate_Ignore_Server_Ids:
  52.              Master_Server_Id: 0
  53.                   Master_UUID:
  54.              Master_Info_File: /greatsql/dbdata/data/master.info
  55.                     SQL_Delay: 0
  56.           SQL_Remaining_Delay: NULL
  57.       Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
  58.            Master_Retry_Count: 86400
  59.                   Master_Bind:
  60.       Last_IO_Error_Timestamp:
  61.      Last_SQL_Error_Timestamp:
  62.                Master_SSL_Crl:
  63.            Master_SSL_Crlpath:
  64.            Retrieved_Gtid_Set:
  65.             Executed_Gtid_Set: 32ab2502-3492-11f0-891f-00163e7e5561:1-124
  66.                 Auto_Position: 0
  67.          Replicate_Rewrite_DB:
  68.                  Channel_Name:
  69.            Master_TLS_Version:
  70.        Master_public_key_path:
  71.         Get_master_public_key: 0
  72.             Network_Namespace:
  73. 1 row in set, 1 warning (0.00 sec)
复制代码
6、数据验证
  1. greatsql> SHOW DATABASES;
  2. +--------------------+
  3. | Database           |
  4. +--------------------+
  5. | information_schema |
  6. | mysql              |
  7. | performance_schema |
  8. | sys                |
  9. | wl_greatsql1       |
  10. | wl_greatsql2       |
  11. | wl_greatsql3       |
  12. | wl_greatsql4       |
  13. +--------------------+
  14. 8 rows in set (0.01 sec)
  15. greatsql> USE wl_greatsql1
  16. Reading table information for completion of table and column names
  17. You can turn off this feature to get a quicker startup with -A
  18. Database changed
  19. greatsql> SHOW TABLES;
  20. +------------------------+
  21. | Tables_in_wl_greatsql1 |
  22. +------------------------+
  23. | sbtest1                |
  24. | sbtest2                |
  25. | sbtest3                |
  26. | sbtest4                |
  27. | sbtest5                |
  28. +------------------------+
  29. 5 rows in set (0.00 sec)
  30. greatsql> SELECT COUNT(*) FROM sbtest1;
  31. +----------+
  32. | count(*) |
  33. +----------+
  34. |    10000 |
  35. +----------+
  36. 1 row in set (0.01 sec)
复制代码
六、操作风险

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


  • 如果伪从库中本身已存在部分数据,必须提前核实与 Binlog 中即将回放的数据是否存在冲突,避免出现主键冲突、重复插入、逻辑错误等情况。
  • 建议在回放前执行一次结构与关键数据校验,确保数据状态与预期一致。
2、主库误操作场景需精准识别回放的事务范围


  • 若回放 Binlog 是为了修复主库误操作(如误删、误更新等),必须提前通过 mysqlbinlog 工具明确要回放的具体事务,避免出现“多执行”或“漏执行”。
  • 回放应尽量以事务为单位分批控制,必要时使用 START SLAVE UNTIL 或 mysqlbinlog --stop-position 等方式精准切点。
3、严控伪从库的主从配置,避免误接入真实主库


  • 伪装从库的核心在于模拟中继日志环境,不应真实接入主库。
  • 配置 CHANGE MASTER TO 时,务必使用虚假地址或,防止误连主库造成非预期的主从同步或写入操作。

Enjoy GreatSQL
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册