1.Canal介绍
Canal把自己伪装成从数据库,获取mysql主数据库的日志(binlog)信息,所以要想使用canal就得先开启数据库日志
https://github.com/alibaba/canal
Canal 主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费,工作原理如下:
Canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议
MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 Canal )
Canal 解析 binary log 对象(原始为 byte 流)
可以用于以下业务场景:
-
数据库镜像
-
数据库实时备份
-
索引构建和实时维护(拆分异构索引、倒排索引等)
-
业务 cache 刷新
-
带业务逻辑的增量数据处理
当前的 Canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x。
2.原理
1. 准备MySql主库(开启Mysql日志)
MySql binlog介绍
1.在服务器新建文件夹 mysql/data,新建文件 mysql/conf.d/my.cnf
其中my.cnf 内容如下
[mysqld]
log_timestamps=SYSTEM
default-time-zone='+8:00'
server-id=1
log-bin=mysql-bin
binlog-do-db = mall # 要监听的库
binlog_format=ROW
配置解读:
① server-id :指定当前服务的id,必须指定,否则会报错
② log-bin :设置binlog文件的存放地址和文件名,叫做mysql-bin,此处指定的目录前缀是mysql容器的数据存放目录,所以可以在挂载目录中看到相关的文件,命名格式是mysql-bin.000001开始慢慢叠加
③ binlog-do-db :指定针对哪个数据库记录binlog的events事件,此处记录mall库
如果在 MySQL 配置中没有显式地配置 binlog-do-db 参数,那么 MySQL 的二进制日志(binlog)将会记录所有数据库的变更操作。
binlog-do-db 参数用于指定需要被记录到 binlog 中的数据库。通过配置 binlog-do-db,你可以选择只记录指定的数据库的变更操作,而忽略其他数据库的变更操作。
如果没有配置 binlog-do-db 参数,或者将其设置为一个空值(例如 binlog-do-db=),那么 MySQL 将会监听并记录所有数据库的变更操作到 binlog 中。
4. binlog_format
在 MySQL 配置中,binlog_format 是用于配置二进制日志(binlog)的格式。binlog 是 MySQL 中用于记录数据库的变更操作的日志文件。
binlog_format 可以设置为以下几种值:
1. STATEMENT:以 SQL 语句的形式记录数据库的变更操作。这种格式记录的是每个执行的 SQL 语句,可以通过 replay SQL 语句的方式来还原数据变更。
2. ROW:以行的形式记录数据库的变更操作。这种格式记录的是每一行数据的变更情况,包括被修改、插入或删除的数据。ROW 格式记录了更加详细和精确的变更信息,但相对于 STATEMENT 格式来说,会占用更多的存储空间。
3. MIXED:混合模式,根据具体的情况自动选择 STATEMENT 或 ROW 格式来记录数据库的变更操作。MIXED 模式会根据 SQL 语句的类型和特性来决定使用哪种格式,以达到性能和存储空间的平衡。
binlog_format 的选择需要根据实际需求和应用场景来决定。不同的格式具有不同的优缺点,需要根据具体情况来进行权衡和选择
2.启动数据库
docker run --name mysql01 \
-p 3306:3306 \
-v /opt/mysql/conf.d:/etc/mysql/conf.d \
-v /opt/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0
3.校验是否开启成功
show variables like 'log_%';
show variables like 'binlog_format';
show variables li