QuickStart · alibaba/canal Wiki (github.com)
1.1 启动 mysql 服务器
docker run --name mysql-canal ^
-p 3306:3306 ^
-e MYSQL_ROOT_PASSWORD=root ^
-d mysql:5.7.36
1.2 开启 Binlog 写入功能
对于自建 MySQL容器 , 我们需要开启 Binlog 写入功能。
1.2.1创建 binlog 配置文件
在宿主机上创建 my.cnf
文件,配置 binlog-format 为 ROW 模式。my.cnf
的配置内容如下:
[mysqld]
# 开启 binlog
log-bin=mysql-bin
# 选择 ROW 模式
binlog-format=ROW
# 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
server_id=1
1.2.2 修改配置文件权限
进入 MySQL 容器并修改 MySQL 容器配置文件 /etc/mysql/my.cnf
权限,以避免权限警告:
# 进入 MySQL 容器
$ docker exec -it mysql-canal bash
# 修改文件权限
$ chmod 644 /etc/mysql/my.cnf
$ exit
注意,在没有修改配置文件并启动 MySQL 容器情况下,MySQL 会警告配置文件 /etc/mysql/my.cnf
权限设置不当,允许所有用户写入(world-writable)。由于安全原因,MySQL 会忽略这个配置文件。
[Warning] World-writable config file '/etc/mysql/my.cnf' is ignored.
1.2.3 挂载配置文件
在 MySQL 容器运行后,使用以下命令将创建的 my.cnf
文件挂载到容器内的 /etc/mysql/my.cnf
:
# 将本地的 my.cnf 文件复制到容器的指定目录下
$ docker cp D:\Learning\java-demos\middleware-demos\spring-boot-canal\src\main\resources\conf\my.cnf mysql-canal:/etc/mysql/
# 为了使新的配置生效,重启 MySQL 容器
$ docker restart mysql-canal
注意,MySQL 容器的 /etc/mysql/my.cnf
是一个符号链接,直接指定完整路径时会导致问题。
MySQL 启动时会首先加载主配置文件
/etc/mysql/my.cnf
,然后加载conf.d
目录下的所有配置文件。
1.2.4 检测 binlog 配置是否成功
进入 MySQL, 利用 show variables like 'log_bin';
查看是否打开 binlog 模式:
$ docker exec -it mysql-canal bash
# 查看挂载后的 my.cnf 文件
$ tail /etc/mysql/my.cnf
# 查看 binlog 是否开启
$ mysql -uroot -proot
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.01 sec)
# 查看 binlog 日志文件列表
mysql> show binary logs;
# 查看正在写入的 binlog 文件
mysql> show master status;
# 查看 Binlog 文件内容
mysql> mysqlbinlog /var/lib/mysql/mysql-bin.000001
1.3 创建账户并授权
授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant
# 进入 mysql 容器
$ docker exec -it mysql-canal mysql -uroot -proot
# 创建用户名和密码都为 canal 的账户
mysql> CREATE USER canal IDENTIFIED BY 'canal';
# 授予权限 GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
mysql> GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;