翼度科技»论坛 编程开发 mysql 查看内容

Slave被误写入数据如何恢复到主库

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
背景

在GreatSQL主从复制环境中,有时候可能会出现一些误操作,将本应该写入到主库的数据写入到了从库,导致主从数据不一致,影响数据同步。是否可以将写入从库的数据同步写入主库呢?
测试环境

角色IP地址数据库开放端口版本主库192.168.137.1793308GreatSQL 8.0.32从库192.168.137.1803308GreatSQL 8.0.32复制链路:
  1. greatsql> show slave status\G;
  2. *************************** 1. row ***************************
  3.                Slave_IO_State: Waiting for source to send event
  4.                   Master_Host: 192.168.137.179
  5.                   Master_User: root
  6.                   Master_Port: 3308
  7.                 Connect_Retry: 60
  8.               Master_Log_File: binlog.000001
  9.           Read_Master_Log_Pos: 157
  10.                Relay_Log_File: oracle_dts-relay-bin.000002
  11.                 Relay_Log_Pos: 367
  12.         Relay_Master_Log_File: binlog.000001
  13.              Slave_IO_Running: Yes
  14.             Slave_SQL_Running: Yes
复制代码
表数据

主库
  1. greatsql> select * from dept;
  2. +--------+------------+----------+
  3. | DEPTNO | DNAME      | LOC      |
  4. +--------+------------+----------+
  5. |     10 | ACCOUNTING | NEW YORK |
  6. |     20 | RESEARCH   | DALLAS   |
  7. |     30 | SALES      | CHICAGO  |
  8. |     40 | OPERATIONS | BOSTON   |
  9. |     60 | it         | 成都     |
  10. +--------+------------+----------+
  11. 5 rows in set (0.00 sec)
  12. greatsql> insert into dept select 70,'IT','CTU';
  13. Query OK, 1 row affected (0.01 sec)
  14. Records: 1  Duplicates: 0  Warnings: 0
  15. greatsql> commit;
  16. Query OK, 0 rows affected (0.00 sec)
复制代码
从库
  1. greatsql> select * from dept;
  2. +--------+------------+----------+
  3. | DEPTNO | DNAME      | LOC      |
  4. +--------+------------+----------+
  5. |     10 | ACCOUNTING | NEW YORK |
  6. |     20 | RESEARCH   | DALLAS   |
  7. |     30 | SALES      | CHICAGO  |
  8. |     40 | OPERATIONS | BOSTON   |
  9. |     60 | it         | 成都     |
  10. |     70 | IT         | CTU      |
  11. +--------+------------+----------+
  12. 6 rows in set (0.00 sec)
复制代码
主库写入的数据正常同步到从库
在从库写入数据
  1. greatsql> insert into dept select 80,'IT','SZ';
  2. Query OK, 1 row affected (0.01 sec)
  3. Records: 1  Duplicates: 0  Warnings: 0
  4. greatsql> insert into dept select 90,'SALES','SZ';
  5. Query OK, 1 row affected (0.01 sec)
  6. Records: 1  Duplicates: 0  Warnings: 0
复制代码
从库数据
  1. greatsql> select * from dept;
  2. +--------+------------+----------+
  3. | DEPTNO | DNAME      | LOC      |
  4. +--------+------------+----------+
  5. |     10 | ACCOUNTING | NEW YORK |
  6. |     20 | RESEARCH   | DALLAS   |
  7. |     30 | SALES      | CHICAGO  |
  8. |     40 | OPERATIONS | BOSTON   |
  9. |     60 | it         | 成都     |
  10. |     70 | IT         | CTU      |
  11. |     80 | IT         | SZ       |
  12. |     90 | SALES      | SZ       |
  13. +--------+------------+----------+
  14. 8 rows in set (0.00 sec)
复制代码
主库数据
  1. greatsql> select * from dept;
  2. +--------+------------+----------+
  3. | DEPTNO | DNAME      | LOC      |
  4. +--------+------------+----------+
  5. |     10 | ACCOUNTING | NEW YORK |
  6. |     20 | RESEARCH   | DALLAS   |
  7. |     30 | SALES      | CHICAGO  |
  8. |     40 | OPERATIONS | BOSTON   |
  9. |     60 | it         | 成都     |
  10. |     70 | IT         | CTU      |
  11. +--------+------------+----------+
  12. 6 rows in set (0.01 sec)
复制代码
此时从库写入的数据在主库中并没有出现
解析从库的二进制日志
  1. $ mysqlbinlog -vv --base64-output=decode-rows  binlog.000002>b002.sql
  2. BEGIN
  3. /*!*/;
  4. #at 354
  5. #240221 16:10:25 server id 18001  end_log_pos 416 CRC32 0xcc81584b      Table_map: `scott`.`dept` mapped to number 101
  6. #has_generated_invisible_primary_key=0
  7. #at 416
  8. #240221 16:10:25 server id 18001  end_log_pos 462 CRC32 0x5149e38a      Write_rows: table id 101 flags:
  9. STMT_END_F
  10. ###INSERT INTO `scott`.`dept`
  11. ###SET
  12. ###@1=80 /* INT meta=0 nullable=0 is_null=0 */
  13. ###@2='IT' /* VARSTRING(56) meta=56 nullable=1 is_null=0 */
  14. ###@3='SZ' /* VARSTRING(52) meta=52 nullable=1 is_null=0 */
  15. #at 462
  16. #240221 16:10:25 server id 18001  end_log_pos 493 CRC32 0xab795e4a      Xid = 34
复制代码
可以看到写入的从库写入的数据在 binlog.000002,我们可以通过 grep 从库的 server id 确定日志文件中有没有在从库写入的数据。
复制从库日志到主库
  1. $ scp binlog.000002  192.168.137.179:/tmp/
  2. Warning: Permanently added '192.168.137.179' (ECDSA) to the list of known hosts.
  3. root@192.168.137.179's password:
  4. binlog.000002                                                        100%  836     1.1MB/s   00:00
复制代码
应用从库的二进制日志

应用从库的日志到主库
  1. $ mysqlbinlog binlog.000002|mysql -uroot -p -h127.1 -P3308
复制代码
主库应用从库二进制日志时,从库二进制日志信息未发生变化
  1. greatsql> show binary logs;
  2. +---------------+-----------+-----------+
  3. | Log_name      | File_size | Encrypted |
  4. +---------------+-----------+-----------+
  5. | binlog.000001 |       498 | No        |
  6. | binlog.000002 |       836 | No        |
  7. | binlog.000003 |       237 | No        |
  8. +---------------+-----------+-----------+
  9. 3 rows in set (0.00 sec)
复制代码
主从复制链路状态正常
  1. greatsql> show slave status\G;
  2. *************************** 1. row ***************************
  3.                Slave_IO_State: Waiting for source to send event
  4.                   Master_Host: 192.168.137.179
  5.                   Master_User: root
  6.                   Master_Port: 3308
  7.                 Connect_Retry: 60
  8.               Master_Log_File: binlog.000001
  9.           Read_Master_Log_Pos: 1059
  10.                Relay_Log_File: oracle_dts-relay-bin.000002
  11.                 Relay_Log_Pos: 1269
  12.         Relay_Master_Log_File: binlog.000001
  13.              Slave_IO_Running: Yes
  14.             Slave_SQL_Running: Yes
复制代码
可以看到主库在应用从库产生的二进制日志时,从库没有重复应用这些二进制日志(By default, the replication I/O (receiver) thread does not write binary log events to the relay log if they have the replica's server ID (this optimization helps save disk usage). ),出现主键冲突,导致复制状态出错
查看主库数据
  1. greatsql> select * from dept;
  2. +--------+------------+----------+
  3. | DEPTNO | DNAME      | LOC      |
  4. +--------+------------+----------+
  5. |     10 | ACCOUNTING | NEW YORK |
  6. |     20 | RESEARCH   | DALLAS   |
  7. |     30 | SALES      | CHICAGO  |
  8. |     40 | OPERATIONS | BOSTON   |
  9. |     60 | it         | 成都     |
  10. |     70 | IT         | CTU      |
  11. |     80 | IT         | SZ       |
  12. |     90 | SALES      | SZ       |
  13. +--------+------------+----------+
  14. 8 rows in set (0.00 sec)
复制代码
后续测试,主库写入数据可正常同步到从库。

Enjoy GreatSQL
来源:https://www.cnblogs.com/greatsql/p/18033738
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具