1.Canal介绍
GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件
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.原理
3.canal使用(基于docker)
1. 准备MySql主库
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 中。
需要注意的是,即使没有配置 binlog-do-db 参数,你仍然可以通过其他方式(如 MySQL 的权限控制)来限制用户对数据库的操作权限,从而间接地控制 binlog 中的记录内容
4. binlog_format
在 MySQL 配置中,binlog_format 是用于配置二进制日志(binlog)的格式。binlog 是 MySQL 中用于记录数据库的变更操作的日志文件。
binlog_format 可以设置为以下几种值:
1. STATEMENT:以 SQL 语句的形式记录数据库的变更操作。这种格式记录的是每个执行的 SQL 语句,可以通过 replay SQL 语句的方式来还原数据变更。但是,由于某些情况下,同一个 SQL 语句在不同的数据库上执行可能会产生不同的结果,所以在使用 STATEMENT 格式时需要注意一致性问题。
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 like 'server_id';
--查看所有日志
show binlog events;
--查看最新的日志
show master status
-- 查询指定的binlog日志
show binlog events in 'XTZJ-20221008CY-bin.000020'
--清空所有的 binlog 日志文件
reset master
DML与DDL的区别
MySQL中,DML(Data Manipulation Language)和DDL(Data Definition Language)是两种不同类型的SQL语句,它们分别用于不同的数据库操作目的:
DML(数据操作语言): DML语句主要用于对数据库表中的实际数据进行操作,主要包括以下几种命令:
-
INSERT
:向表中插入新的行数据。 -
UPDATE
:更新表中已存在的行数据。 -
DELETE
:从表中删除满足特定条件的行数据。 -
SELECT
:从表中检索数据,虽然SELECT
不改变数据本身,但因其属于对数据的操作,所以也被归类于DML。
DML操作通常发生在事务中,可以被用户手动控制事务的开启、提交和回滚,确保数据的一致性和完整性。
DDL(数据定义语言): DDL语句主要用于创建、修改或删除数据库的结构元素,例如:
-
CREATE
:创建新的数据库、表、索引、视图等。 -
ALTER
:更改现有数据库对象的结构,例如增加或删除列,修改列的数据类型,重命名表等。 -
DROP
:删除数据库对象,如表、索引、视图等。 -
TRUNCATE
:清空表的内容,但保留表的结构。
4.安装canal
1.新建文件夹logs, 新建文件canal.properties instance.properties docker.compose.yml
如下图
canal配置文件:
canal.rar - 蓝奏云
修改canal.properties内容如下
修改instance.properties内容如下
2.启动容器 (在canal路径下)
docker-compose up -d
3.查看结果(交换机和队列需要自己创建)
随数据库操作: