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 = FALSEcharacter_set_server=utf8mb4collation-server = utf8mb4_unicode_cilog-bin=/var/lib/mysql/mysql-binbinlog_format=row# 双1配置, 刷盘, 方便调试innodb_flush_log_at_trx_commit=1sync_binlog=1# ==============binlog-ignore-db=information_schemabinlog-ignore-db=mysqlbinlog-ignore-db=performance_schemabinlog-ignore-db=sysbinlog-do-db=gmall-2021binlog-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.indexroot@box1:/mydata/mysql57/data # lltotal 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 ibtmp1drwxr-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.indexdrwxr-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.pemdrwxr-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/falsecanal.instance.gtidon=false# position info# 需要改为MySQL实例所在的的IP,若为集群以逗号分隔canal.instance.master.address=192.168.33.151:3306# table regexcanal.instance.filter.regex = .*\\..*# table black regexcanal.instance.filter.black.regex =
设置规则方式为:
mysql 数据解析关注的表,Perl正则表达式.多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)常见例子:1. 所有表:.* or .*\\..*2. canal schema下所有表:canal\\..*3. canal下的以canal打头的表:canal\\.canal.*4. canal schema下的一张表:canal.test15. 多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔)
配置连接 MySQL 的用户名和密码,默认就是我们前面授权的 canal
# username/passwordcanal.instance.dbUsername=canalcanal.instance.dbPassword=canalcanal.instance.connectionCharset = UTF-8# enable druid Decrypt database passwordcanal.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)
