1.首先docker拉去canal镜像,这里不加版本号,默认为latest

docker pull canal/canal-server

2.查看镜像是否拉去成功

docker images

3.拉去完成后,先启动下canal,主要是为了从里面copy出配置文件

#启动镜像 
docker run --name canal -d canal/canal-server
#进入容器 查看配置文件路径
docker exec -it canal bash

#找到文件位置后 exit退出容器 将容器内部文件copy到外部
docker cp canal:/home/admin/canal-server/conf/canal.properties /root/canal
docker cp canal:/home/admin/canal-server/conf/example/instance.properties /root/canal

4.文件copy完成后主要是修改instance这个文件。第一个红框是你需要监听数据库的地址和端口;第二个红框是你数据库的用户和密码,这个用户信息一定是要有全部权限的用户,非root用户;第三个是匹配数据表的规则,我这里默认为全部表

 5.修改完成后,将之前的canal容器关闭,重新起一个新的容器.

#关闭容器
docker stop canal

#移除容器
docker rm canal

#启动新的 这里-v是将外部的文件挂载到容器内部 这样就不用每次启动都要配置参数了
docker run --name canal -p 11111:11111 -d \
-v /root/canal/instance.properties:/home/admin/canal-server/conf/example/instance.properties \
-v /root/canal/canal.properties:/home/admin/canal-server/conf/canal.properties \
-v /root/canal/logs/:/home/admin/canal-server/logs/ \
canal/canal-server:v1.1.4 

注意: 需要注释掉,不然修改mysql数据时,没有向java客户端返回响应

canal.properties 

MySQL 配置

可以命令查找文件

find / -name mysqld.cnf

进入容器编辑:

vi /etc/mysql/mysql.conf.d/mysqld.cnf

修改 MySQL 配置文件 my.cnf,开启 binlog 写入功能,并配置模式为 ROW。

log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=66 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复

重启数据库,查看配置是否生效。

mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.19 sec)
mysql>
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql>
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |     4230 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

然后创建用户,并授权。

mysql> CREATE USER canal IDENTIFIED BY 'canal';
mysql> GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%%';
mysql> FLUSH PRIVILEGES;
mysql> show grants for 'canal'@'%%';
+----------------------------------------------------------------------------+
| Grants for canal@%%                                                        |
+----------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO `canal`@`%%` |
+----------------------------------------------------------------------------+
1 row in set (0.00 sec)

 7.使用java代码来进行测试,这里是依赖

坑记录

搭建的测试环境一切正常,但放到项目 beta 环境上还是遇到了一个问题:

fetch failed by table meta:schemeName.tableName

查了一下说是由于表删除,或者表结构变更引起的解析错误,增加一条配置就可以解决:

canal.instance.filter.table.error=true

加上之后,报错信息的确都没有了,但消费出来的数据没有 ROWDATA

调试程序,并不怕碰到报错,怕的是没有报错,然后程序还不正常。

忽略表错误的配置删除,仔细看了一遍日志,发现还有一个报错:

Caused by: java.io.IOException: ErrorPacket [errorNumber=1142, fieldCount=-1, message=SHOW command denied to user

是权限不够, binlog 账号默认是没有 select 权限的,加上之后,问题就成功解决了。

GitHub 加速计划 / ca / canal
28.22 K
7.57 K
下载
alibaba/canal: Canal 是由阿里巴巴开源的分布式数据库同步系统,主要用于实现MySQL数据库的日志解析和实时增量数据订阅与消费,广泛应用于数据库变更消息的捕获、数据迁移、缓存更新等场景。
最近提交(Master分支:3 个月前 )
1e5b8a20 - 2 个月前
ff82fd65 2 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐