Slave被误写入数据如何恢复到主库
背景
在GreatSQL主从复制环境中,有时候可能会出现一些误操作,将本应该写入到主库的数据写入到了从库,导致主从数据不一致,影响数据同步。是否可以将写入从库的数据同步写入主库呢?
测试环境
| 角色 | IP地址 | 数据库开放端口 | 版本 |
|---|---|---|---|
| 主库 | 192.168.137.179 | 3308 | GreatSQL 8.0.32 |
| 从库 | 192.168.137.180 | 3308 | GreatSQL 8.0.32 |
复制链路:
greatsql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.137.179
Master_User: root
Master_Port: 3308
Connect_Retry: 60
Master_Log_File: binlog.000001
Read_Master_Log_Pos: 157
Relay_Log_File: oracle_dts-relay-bin.000002
Relay_Log_Pos: 367
Relay_Master_Log_File: binlog.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
表数据
主库
greatsql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
| 60 | it | 成都 |
+--------+------------+----------+
5 rows in set (0.00 sec)
greatsql> insert into dept select 70,'IT','CTU';
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
greatsql> commit;
Query OK, 0 rows affected (0.00 sec)
从库
greatsql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
| 60 | it | 成都 |
| 70 | IT | CTU |
+--------+------------+----------+
6 rows in set (0.00 sec)
主库写入的数据正常同步到从库
在从库写入数据
greatsql> insert into dept select 80,'IT','SZ';
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
greatsql> insert into dept select 90,'SALES','SZ';
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
从库数据
greatsql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
| 60 | it | 成都 |
| 70 | IT | CTU |
| 80 | IT | SZ |
| 90 | SALES | SZ |
+--------+------------+----------+
8 rows in set (0.00 sec)
主库数据
greatsql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
| 60 | it | 成都 |
| 70 | IT | CTU |
+--------+------------+----------+
6 rows in set (0.01 sec)
此时从库写入的数据在主库中并没有出现
解析从库的二进制日志
$ mysqlbinlog -vv --base64-output=decode-rows binlog.000002>b002.sql
BEGIN
/*!*/;
#at 354
#240221 16:10:25 server id 18001 end_log_pos 416 CRC32 0xcc81584b Table_map: `scott`.`dept` mapped to number 101
#has_generated_invisible_primary_key=0
#at 416
#240221 16:10:25 server id 18001 end_log_pos 462 CRC32 0x5149e38a Write_rows: table id 101 flags:
STMT_END_F
###INSERT INTO `scott`.`dept`
###SET
###@1=80 /* INT meta=0 nullable=0 is_null=0 */
###@2='IT' /* VARSTRING(56) meta=56 nullable=1 is_null=0 */
###@3='SZ' /* VARSTRING(52) meta=52 nullable=1 is_null=0 */
#at 462
#240221 16:10:25 server id 18001 end_log_pos 493 CRC32 0xab795e4a Xid = 34
可以看到写入的从库写入的数据在 binlog.000002,我们可以通过 grep 从库的 server id 确定日志文件中有没有在从库写入的数据。
复制从库日志到主库
$ scp binlog.000002 192.168.137.179:/tmp/
Warning: Permanently added '192.168.137.179' (ECDSA) to the list of known hosts.
root@192.168.137.179's password:
binlog.000002 100% 836 1.1MB/s 00:00
应用从库的二进制日志
应用从库的日志到主库
$ mysqlbinlog binlog.000002|mysql -uroot -p -h127.1 -P3308
主库应用从库二进制日志时,从库二进制日志信息未发生变化
greatsql> show binary logs;
+---------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000001 | 498 | No |
| binlog.000002 | 836 | No |
| binlog.000003 | 237 | No |
+---------------+-----------+-----------+
3 rows in set (0.00 sec)
主从复制链路状态正常
greatsql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.137.179
Master_User: root
Master_Port: 3308
Connect_Retry: 60
Master_Log_File: binlog.000001
Read_Master_Log_Pos: 1059
Relay_Log_File: oracle_dts-relay-bin.000002
Relay_Log_Pos: 1269
Relay_Master_Log_File: binlog.000001
Slave_IO_Running: Yes
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). ),出现主键冲突,导致复制状态出错
查看主库数据
greatsql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
| 60 | it | 成都 |
| 70 | IT | CTU |
| 80 | IT | SZ |
| 90 | SALES | SZ |
+--------+------------+----------+
8 rows in set (0.00 sec)
后续测试,主库写入数据可正常同步到从库。
Enjoy GreatSQL :)
关于 GreatSQL
GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。
相关链接: GreatSQL社区 Gitee GitHub Bilibili
GreatSQL社区:
社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html
社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html
(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)
技术交流群:
微信&QQ群:
QQ群:533341697
微信群:添加GreatSQL社区助手(微信号:wanlidbc )好友,待社区助手拉您进群。
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
活动必备利器:使用低代码打造一个抽奖系统
前言 在我们生活中的各种活动和促销中,抽奖活动一直是吸引人们参与和互动的利器,它不仅能够吸引更多的观众,还可以调动活动现场的气氛,本文小编旨在介绍如何通过低代码搭建一个完善的年会抽奖系统,帮助读者了解低代码开发的优势。 一、低代码概述 低代码平台的含义及其特征: 低代码平台,作为一种加速应用构建的工具,通过提供一个可视化操作界面和拖放组件,允许开发者以图形方式设计应用的用户界面、业务逻辑和数据库连接等。这种方法与传统编程相比,极大地减轻了应用开发的复杂性。 可视化构建过程:借助直观的可视化编辑器,低代码平台使得开发人员可以简单地通过拖放组件和配置其属性及事件来创建应用的界面和逻辑。 快速开发迭代:基于模块化和可重用性原则,低代码平台减少了从头开始编码的需求,进而提高了开发速度。 集成性与扩展性:低代码平台通常能够轻松集成多种外部系统和服务,并支持自定义插件与扩展功能,以满足开发人员对业务需求的多样化。 低代码开发的益处: 提速开发流程:利用可视化操作和自动代码生成的特点,低代码平台显著降低了重复代码编写的时间,实现了快速产品迭代和发布。 降低学习门槛:通过将开发过程抽象化,低代码平台使...
-
下一篇
实例详解数据库的游标管理
本文分享自华为云社区《GaussDB数据库SQL系列-游标管理》,作者:酷哥。 一、前言 在数据库中,游标(cursor)是一种非常重要的工具,用于在数据库查询结果集中进行定位和操作。游标提供了一种在多行数据结果集中逐行处理每一行的机制,允许开发人员对每一行的数据进行操作,如检索、过滤、修改等。本文将结合GaussDB数据库,简单的给大家做一介绍。 二、概述(GaussDB) 1、游标概述 在GaussDB数据库中,为了处理SQL语句,存储过程进程分配一段内存区域来保存上下文联系。游标是指向上下文区域的句柄或指针。借助游标,存储过程可以控制上下文区域的变化。 2、游标的使用分类 游标的使用分为显式游标和隐式游标。对于不同的SQL语句,游标的使用情况不同。 序号 SQL语句 游标 1 结果是多行的查询语句 显式的 2 非查询语句 隐式的 3 结果是单行的查询语句 隐式 / 显式 •显式游标:显式游标主要用于对查询语句的处理,尤其是在查询结果为多条记录的情况下。 •隐式游标:对于非查询语句,如修改、删除操作,则由系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS关闭SELinux安全模块
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker容器配置,解决镜像无法拉取问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2更换Tomcat为Jetty,小型站点的福音


微信收款码
支付宝收款码