db-cdc之mysql 深入了解并使用binlog
1.什么是binlog?
2.binlog可以用来干什么?
3.怎么样使用binlog?
binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、
UPDATE、DELETE…)的二进制日志。实际落库产生的日志(事务提交后)。
我们先看一下Mysql数据更新的流程:
binlog可以干什么?
• 通过如上所述,我们知道binlog是mysql的已提交日志,是实际落库的,那么如果可以监听到binlog那么我们可以用来处理DB主从同步,跨库同步,数据备份,同步ES,缓存刷新等等
怎么样使用binlog?
准备工作
1.检查binlog是否开启
SHOW GLOBAL VARIABLES LIKE ‘log_bin%’; 结果返回不等于ON时代表关闭
可以通过my.ini配置文件(linux中为my.cnf) log-bin=mysql-bin //指定binlog日志文件的名称,可以根据实际需求进行命名。 binlog-format=ROW //设置binlog的格式,下面会解释这三种格式。
2.检查binlog格式
SHOW GLOBAL VARIABLES like ' binlog_format%’;
mysql binlog 分为三种模式(STATEMENT,ROW,MIXED)
- Statement(Statement-Based Replication,SBR):每一条会修改数据的 SQL 都会记录在 binlog 中
- Row(Row-Based Replication,RBR):不记录 SQL 语句上下文信息,仅保存哪条记录被修改
- Mixed(Mixed-Based Replication,MBR):Statement 和 Row 的混合体
这里我们设置Row即可
SET GLOBAL binlog_format = 'ROW’;
SET GLOBAL binlog_row_metadata = ‘FULL’;//8.0版本以下不需要设置
现在准备工作完成,可以开始写代码订阅master节点去获取binlog信息了,再次之前我们先了解下 binlog的存储原理
3.多文件存储
mysql 将数据库更新操作对应的event记录到本地的binlog文件中,显然在一个文件中记录所有的 event是不可能的,过大的文件会给我们的运维带来麻烦,如删除一个大文件,在I/O调度方面会给我们带来不可忽视的资源开销。
因此,目前基本上所有支持本地文件存储的组件,如MQ、Mysql等,都会控制一个文件的大小。在数据量较多的情况下,就分配到多个文件进行存储。
在mysql中可以通过
show binlog events;
得到binlog的log_name(文件名)和大小以及pos(偏移量位置)
这两个会在后面发送dump到master节点去订阅的时候用到,代表从binlog的哪处位置开始订阅,master 就会在EventStream中发送此文件节点之后的所有数据库变更信息
4.Binlog管理事件
所谓binlog管理事件,官方称之为binlog managent events,你可以认为是一些在任何模式下都有可能会出现的事件,不管你的配置binlog_format是Row、Statement还是Mixed。
每个binlog文件总是以Format Description Event作为开始,以Rotate Event结束作为结束。如果你使用的是很古老的Mysql版本中,开始事件也有可能是START EVENT V3,而结束事件是Stop Event。在开始和结束之间,穿插着其他各种事件。
在Event_Type列中,我们看到了三个事件类型:
- Format_desc:也就是我们所说的Format Description Event,是binlog文件的第一个事件。在Info列,我们可以看到,其标明了Mysql Server的版本是8.0,Binlog版本是4。
- Previous_gtids:该事件完整名称为,PREVIOUS_GTIDS_LOG_EVENT。熟悉Mysql 基于GTID复制的
同学应该知道,这是表示之前的binlog文件中,已经执行过的GTID。需要我们开启GTID选项,这个事件才会有值,在后文中,将会详细的进行介绍。
- Rotate:Rotate Event是每个binlog文件的结束事件。在Info列中,我们看到了其指定了下一个 binlog文件的名称是mysql-bin.000004。
5.开始发送一个dump到master节点
serverId代表此slave节点的id(不要跟master节点重复),订阅binlog需要模拟一个slave(从节点)去向master节点发送dump,后续就会接收的订阅返回的事件流信息 filename和position前面提到过的文件名和偏移量
发送成功后就会接收到master节点返回的event信息
每个binlog事件都以一个事件头(event header)开始,然后是一个binlog事件类型特定的数据部分,称为事件体(event body)。
事件体的具体结构与事件类型相关,以QUERY_EVENT类型为例,存储格式如下:
常见的事件类型有:
- FORMAT_DESCRIPTION_EVENT:该部分位于整个文件的头部,每个binlog文件都必定会有唯一一个该event
- PREVIOUS_GTIDS_EVENT:包含在每个binlog的开头,用于描述所有以前binlog所包含的全部*GTID*的一个集合(包括已经删除的binlog)
- GTID_EVENT/ANONYMOUS_GTID_EVENT:每一个Query事务前都会有这样的一个GTID_EVENT,如果未开启则是ANONYMOUS_GTID_EVENT。
事务开始时,执行的BEGIN操作;ROW格式中的DDL操作等
- TABLE_MAP_EVENT:每个DML事务之前,都会有一个TABLE_MAP_EVENT,记录操作对应的表的信息。
- WRITE_ROW_EVENT:插入操作。
- DELETE_ROW_EVENT:删除操作。
- UPDATE_ROW_EVENT:更新操作。记载的是一条记录的完整的变化情况,即从前量变为后量的过程 • XID_EVENT:主要是事务提交的时候回在最后生成一个xid号,有这个便代表事务已经成功提交了
- ROTATE_EVENT:Binlog结束时的事件,与一样仅有一个
具体的源码可以通过以下链接去下载:
https://github.com/kogel-net/Kogel.Subscribe
尾言
这个轮子是在前两年时候写的,那时候想利用mysql的cdc解决缓存刷新的问题,但是找了一圈发现只有 java开源的轮子例如canal,flinkcdc等,c#社区好像并无此类似轮子就想写一个,完善下c#/.net社区,希望以后.net发展能够越来越好吧。
db-cdc之mysql 深入了解并使用binlog的更多相关文章
- j2ee 使用db.properties连接mysql数据库
转自: http://blog.csdn.net/u013815546/article/details/50808493 注: 下面的方法是未安装构架的写法,需要自己加载驱动并建立连接. 若引入了Ac ...
- 在MySQL中使用init-connect与binlog来实现用户操作追踪记录
在MySQL中使用init-connect与binlog来实现用户操作追踪记录 分类: MySQL 前言: 测试环境莫名其妙有几条重要数据被删除了,由于在binlog里面只看到是公用账号删除的,无法查 ...
- MySQL在线删除多余的binlog文件
如果你的MySQL搭建了主从同步 , 或者数据库开启了log-bin日志(MySQL默认开启) , 那么随着时间的推移 , 你的数据库data 目录下会产生大量的日志文件 ll /opt/mysql/ ...
- MySQL和Mariadb二进制日志binlog详解
Mariadb/mysql提供了4中不同的日志,分别是错误日志(error.log).普通日志(general log).慢日志(slow log)以及二进制日志(binlog).错误日志记录了系统启 ...
- 使用MySQL自身复制来恢复binlog
如果需要恢复的二进制日志较多,较复杂,强烈建议使用MySQL自身复制来恢复binlog,而不要使用mysqlbinlog. 目录 [hide] 1. 如何操作 1.1 将binlog作为relay l ...
- Mysql三种日志(binlog,redolog,undolog)的作用和区别
Mysql有三种很重要的日志也是面试经常涉及到的考点,分别是 binlog .redo log和undo log, 这里面binlog 是server层实现的日志,而redo log 和undo lo ...
- webstorm里用 DB browser 连接 mysql SQlite Oracle数据库
(1)插件名:DB browser preferences -> plugin -> 搜索 DB browser (2)在view里勾上 Tool Buttons,左侧会显示插件快捷入口 ...
- 菜鸟崛起 DB Chapter 3 MySQL 5.6的基本操作
3 MySQL的基本操作 上面我们学习一如何安装数据库,那么这节我们来认识一下数据库: 我们在MySQL安装后,在data目录下会自动生成几个必须的数据库,可以使用SHOW DATABASES语句 ...
- 菜鸟崛起 DB Chapter 2 MySQL 5.6的概述与安装
在上文菜鸟崛起 DB Chapter 1 数据库概述我们初步认识了数据库,也知道市面上常见的几种数据库,下面我们就针对常见的MySQL数据库展开对DataBase的探讨. 2.1 MySQL介绍 M ...
- [DB]MariaDB 与 MySql 数据库
目前 MariaDB 已经出来几年了,本文编辑时的官网最新稳定版本是 10.1.14 链接:https://downloads.mariadb.org/ 但百度没有下载,搜狗给的下载版本是 5.5.2 ...
随机推荐
- Selenium:设置元素等待、上传文件、下载文件
前言:在工作和学习selenium自动化过程中记录学习知识点,深化知识点 1. 设置元素等待 元素定位之元素等待-- WebDriver提供了两种类型的等待:显示等待和隐式等待. 1.1 显示等待 显 ...
- 2023-07-05:爱丽丝和鲍勃继续他们的石子游戏 许多堆石子 排成一行,每堆都有正整数颗石子 piles[i] 游戏以谁手中的石子最多来决出胜负。 爱丽丝和鲍勃轮流进行,爱丽丝先开始。最初,
2023-07-05:爱丽丝和鲍勃继续他们的石子游戏 许多堆石子 排成一行,每堆都有正整数颗石子 piles[i] 游戏以谁手中的石子最多来决出胜负. 爱丽丝和鲍勃轮流进行,爱丽丝先开始.最初,M = ...
- (占坑编辑中)hexo个人博客主页添加百度搜索资源平台
hexo个人博客主页添加百度搜索资源平台 目的是在百度搜你的网站,可以搜到 配置过程 添加效果: 我的个人博客主页,欢迎访问 我的CSDN主页,欢迎访问 我的简书主页,欢迎访问 我的GitHub主页, ...
- (数据科学学习手札153)基于martin的高性能矢量切片地图服务构建
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,在日常研发地图类应用的场景中, ...
- grafana 容器无法启动,打印权限问题
报错日志 open /var/lib/grafana/alerting/1/notifications: permission denied 问题原因 sudo chown -R docker: /v ...
- MongoDB索引操作和执行计划Explain()详解
一.索引操作 说明,下面的内容举例时,以"dailyTrip"collection为例. 字段内容如下: { "_id" : ObjectId("63 ...
- Pandas 使用教程 Series、DataFrame
目录 Series (一维数据) 指定索引值 使用 key/value 对象,创建对象 设置 Series 名称参数 DataFrame(二维数据) 使用字典(key/value)创建 loc 属性返 ...
- 《Linux基础》07. 软件管理
@ 目录 1:软件管理 1.1:rpm 1.1.1:查询 1.1.2:卸载 1.1.3:安装 1.2:yum 1.3:dpkg 1.4:apt 1.4.1:相关配置 1.4.2:常用指令 1.4.3: ...
- Andrew Ng 机器学习&深度学习课程 代码作业解答 集合
写在最前 2018年是对自己来说是崭新的一年,在过去的3个多月里,从最基础的lr, 学到现在的LSTM, GAN..感觉第一次追上了计算机科学飞速发展的浪潮.虽然很多地方都仍是一知半解,但时间还长 ...
- Spring Boot 中使用 Poi-tl 渲染数据并生成 Word 文档
本文 Demo 已收录到 demo-for-all-in-java 项目中,欢迎大家 star 支持!后续将持续更新! 前言 产品经理急冲冲地走了过来.「现在需要将按这些数据生成一个 Word 报告文 ...