https://github.com/alibaba/canal/releases
下载 canal.deployer-1.1.5
文档 https://github.com/alibaba/canal/wiki
准备mysql
cat ./my.cnf
[mysql]
default-character-set=utf8mb4
[client]
default-character-set=utf8mb4
[mysqld]
default-time-zone='+08:00'
character-set-client-handshake = FALSE
character_set_server=utf8mb4
collation-server = utf8mb4_unicode_ci
log-bin=/var/lib/mysql/mysql-bin
binlog_format=row
# 双1配置, 刷盘, 方便调试
innodb_flush_log_at_trx_commit=1
sync_binlog=1
# ==============
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
binlog-do-db=gmall-2021
binlog-do-db=gmall-2022
log-bin用于指定binlog日志文件名前缀,默认存储在/var/lib/mysql 目录下。
server-id用于标识唯一的数据库,不能和别的服务器重复,建议使用ip的最后一段,默认值也不可以。
binlog-ignore-db:表示同步的时候忽略的数据库。
binlog-do-db:指定需要同步的数据库(如果没有此项,表示同步所有的库)。
注意:binlog-do-db 根据自己的情况进行修改,指定具体要同步的数据库,如果不配置 则表示所有数据库均开启 Binlog
是否启用了日志
mysql>show variables like 'log_bin';
怎样知道当前的日志
mysql> show master status;
查看mysql binlog模式
show variables like 'binlog_format';
获取binlog文件列表
show binary logs;
查看当前正在写入的binlog文件
show master status\G
查看指定binlog文件的内容
show binlog events in 'mysql-bin.000001';
有mysql-bin和mysql-bin.index
root@box1:/mydata/mysql57/data # ll
total 188M
-rw-r----- 1 999 docker 56 Feb 10 14:04 auto.cnf
-rw------- 1 999 docker 1.7K Feb 10 14:04 ca-key.pem
-rw-r--r-- 1 999 docker 1.1K Feb 10 14:04 ca.pem
-rw-r--r-- 1 999 docker 1.1K Feb 10 14:04 client-cert.pem
-rw------- 1 999 docker 1.7K Feb 10 14:04 client-key.pem
-rw-r----- 1 999 docker 1.4K Feb 10 14:04 ib_buffer_pool
-rw-r----- 1 999 docker 76M Feb 10 14:04 ibdata1
-rw-r----- 1 999 docker 48M Feb 10 14:04 ib_logfile0
-rw-r----- 1 999 docker 48M Feb 10 14:04 ib_logfile1
-rw-r----- 1 999 docker 12M Feb 10 14:04 ibtmp1
drwxr-x--- 2 999 docker 4.0K Feb 10 14:04 mysql
-rw-r----- 1 999 docker 177 Feb 10 14:04 mysql-bin.000001
-rw-r----- 1 999 docker 3.0M Feb 10 14:04 mysql-bin.000002
-rw-r----- 1 999 docker 154 Feb 10 14:04 mysql-bin.000003
-rw-r----- 1 999 docker 96 Feb 10 14:04 mysql-bin.index
drwxr-x--- 2 999 docker 4.0K Feb 10 14:04 performance_schema
-rw------- 1 999 docker 1.7K Feb 10 14:04 private_key.pem
-rw-r--r-- 1 999 docker 452 Feb 10 14:04 public_key.pem
-rw-r--r-- 1 999 docker 1.1K Feb 10 14:04 server-cert.pem
-rw------- 1 999 docker 1.7K Feb 10 14:04 server-key.pem
drwxr-x--- 2 999 docker 12K Feb 10 14:04 sys
赋予权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
准备mysql数据
CREATE TABLE `user_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`sex` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `gmall`.`user_info` (`id`, `name`, `sex`) VALUES (1, 'abc', '0');
INSERT INTO `gmall`.`user_info` (`id`, `name`, `sex`) VALUES (2, 'jdxia', '1');
canal.properties配置
canal.serverMode = tcp
这个文件是 canal 的基本通用配置,canal 端口号默认就是 11111,修改 canal 的 输出 model,默认 tcp
多实例配置如果创建多个实例,通过前面 canal 架构,我们可以知道,一个 canal 服务 中可以有多个 instance,conf/下的每一个 example 即是一个实例,每个实例下面都有独立的 配置文件。默认只有一个实例 example,如果需要多个实例处理不同的 MySQL 数据的话,直 接拷贝出多个 example,并对其重新命名,命名和配置文件中指定的名称一致,然后修改 canal.properties 中的 canal.destinations=实例 1,实例 2,实例 3。
#################################################
######### destinations#############
#################################################
# 这个可以配多个的, 监控多个
canal.destinations = example
instance.properties配置
只读取一个 MySQL 数据, 所以只有一个实例, 这个实例的配置文件在 conf/example 目录下
/opt/module/canal/conf/example
当前实例的配置信息
#################################################
## mysql serverId , v1.0.26+ will autoGen
# 修改为和mysql不一样的
canal.instance.mysql.slaveId=219
# enable gtid use true/false
canal.instance.gtidon=false
# position info
# 需要改为MySQL实例所在的的IP,若为集群以逗号分隔
canal.instance.master.address=192.168.33.151:3306
# table regex
canal.instance.filter.regex = .*\\..*
# table black regex
canal.instance.filter.black.regex =
设置规则方式为:
mysql 数据解析关注的表,Perl正则表达式.
多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)
常见例子:
1. 所有表:.* or .*\\..*
2. canal schema下所有表:canal\\..*
3. canal下的以canal打头的表:canal\\.canal.*
4. canal schema下的一张表:canal.test1
5. 多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔)
配置连接 MySQL 的用户名和密码,默认就是我们前面授权的 canal
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
java导包
<!-- https://mvnrepository.com/artifact/com.alibaba.otter/canal.client -->
<dependency>
<groupId>com.alibaba.otter</groupId>
<artifactId>canal.client</artifactId>
<version>1.1.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>3.1.0</version>
</dependency>
启动
在这个shell文件里面, 去掉 UseCMSCompactAtFullCollection 这个java8 搞版本不支持
-Xss调大一点, 改为512k, 不然启动不了
./bin/startup.sh
停止是
./bin/stop.sh
查看日志
查看instance日志
cat ./logs/example/example.log
查看server日志
cat ./logs/canal/canal.log
mysql5.6注意
mysql版本为5.6时,
这个错误一般出现在master5.6,slave在低版本的情况下。这是由于5.6使用了crc32做binlog的checksum;
当一个event被写入binary log(二进制日志)的时候,checksum也同时写入binary log,然后在event通过网络传输到从服务器(slave)之后,再在从服务器中对其进行验证并写入从服务器的relay log.
由于每一步都记录了event和checksum,所以我们可以很快地找出问题所在。
在master中设置binlog_checksum =none;
mysql> set global binlog_checksum='NONE';
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like "%sum%";
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| binlog_checksum | NONE |
| innodb_checksum_algorithm | crc32 |
| innodb_checksums | ON |
| innodb_log_checksums | ON |
| master_verify_checksum | OFF |
| slave_sql_verify_checksum | ON |
+---------------------------+-------+
6 rows in set (0.01 sec)