实时监听数据库变化
一些概念
CDC : Change Data Capture(改变数据捕获),可以识别提取从上次提取之后发生变化的数据
cdc 的两种模式:
同步:同步cdc主要是采用触发器 记录新增数据,基本能够做到实时增量提起
异步:异步cdc 通过分析已经提交的日志记录来得到增量数据信息,有一定的延时,并且提供了到 oracleStreams 的接口
源表(Source Table):业务数据库需要捕获数据的源表
变化表(Change Table):保存从源表捕获的变化数据
Mysql Binlog 研究
mysql-binlog 是mysql 数据库的二进制日志,用于记录用户对数据库操作的 sql 语句(除了查询语言)。可以使用mysql bin 命令查询二进制内容
binlog 的格式有三种: Statement,Row,Mixed
windows 下mysql5.7 启动 binlog : 参考
如何使用mysql binlog : 参考
Statement: 记录的是执行的语句
Row: 记录的是每行的修改记录,可能会产生大量日志
Mixed: Statement 与 Row 的结合
01. 查看 binlog_format
show variables like 'binlog_format'
02.查看是否开启 binlog
show variables like 'log_bin'
如果binlog没有开启,可以通过set sql_log_bin=1命令来启用;如果想停用binlog,可以使用set sql_log_bin=0
03.获取 binlog 文件列表
show binary logs
04.查看当前正在写入的 binlog 文件
show master status
05.查看第一个binlog日志内容
show binlog events
查看指定binlog 文件内容
show binlog events in 'mysql-bin.000002'
当停止或重启服务器时,服务器会把日志文件记入下一个日志文件,Mysql会在重启时生成一个新的日志文件,文件序号递增;此外,如果日志文件超过max_binlog_size(默认值1G)系统变量配置的上限时,
也会生成新的日志文件(在这里需要注意的是,如果你正使用大的事务,二进制日志还会超过max_binlog_size,不会生成新的日志文件,事务全写入一个二进制日志中,这种情况主要是为了保证事务的完整性);
日志被刷新时,新生成一个日志文件。
flush logs
使用 binlog:
06.如何解析binlog(https://www.percona.com/blog/2016/09/13/mysql-cdc-streaming-binary-logs-and-asynchronous-triggers/)
将binlog 事件保存到mysql 文档存储或者mongodb
对二进制日志时间做出反应:异步触发器
maxwell 是一个实时抓取mysql 二进制日志 binlog ,并生成 json 格式的消息,作为生产者发送给kafka ,kinesis,rabitmq 等,参考 https://blog.csdn.net/wwwdc1012/article/details/88388552
除此之外,目前常用的 mysql binlog 解析工具主要有: canal , mysql_Streamer
canal 由 Java 开发,分为服务端与客户端,拥有众多的衍生程序,canal 需要自己编写客户端消费canal 解析到的数据。
maxwell 相对 canal 的优势是使用简单,将数据变更输出未 json 字符串,不需要编写客户端。