Canal本地部署保姆级教程

以下是我配置学习项目zhiguang的过程中,配置Canal的详细步骤

一.确认前置条件:

1.MySQL 已开启 binlog 且是 ROW 模式

进入本地sql:

sql 复制代码
win+r

mysql -h 127.0.0.1 -P 3306 -u root -p

在 MySQL 里执行:

sql 复制代码
SHOW VARIABLES LIKE 'log_bin';
SHOW VARIABLES LIKE 'binlog_format';
SHOW VARIABLES LIKE 'server_id';

要求:

  • log_bin = ON

  • binlog_format = ROW

  • server_id 必须非 0(比如 1)

一般都是符合要求的,如果不满足要求的话,执行以下步骤:

修改 MySQL 配置(根据你是 ini / cnf 选其一)

例如 my.ini / my.cnf 增加或修改这些,没找到就在MySQL文件夹新建一个:

sql 复制代码
[mysqld]
server_id=1
log_bin=mysql-bin
binlog_format=ROW
binlog_row_image=FULL
# 注意不要设 binlog_do_db/binlog_ignore_db(或者别把你要的库过滤掉)

改完后 重启 MySQL ,再用上面那几条 SHOW 命令确认生效。

2.给 Canal 准备一个 MySQL 账号

sql 复制代码
CREATE USER 'canal'@'%' IDENTIFIED BY 'Canal@123456';

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT
ON *.* TO 'canal'@'%';

FLUSH PRIVILEGES;

二.下载Canal

下载链接:

https://github.com/alibaba/canal/releases

下完之后放入一个文件夹中并解压

三.配置 Canal Server(本地连接本地 MySQL)

1.修改 canal.properties(全局配置)

路径:D:\canal\conf\canal.properties

核心几行先确认:

sql 复制代码
canal.id = 1
canal.ip =
canal.port = 11111

# 单机模式,zookeeper 不用配
canal.zkServers = 

# 是否 TCP 模式
canal.serverMode = tcp

说明:

  • canal.ip 为空表示监听 0.0.0.0(一般这样就行);

  • canal.port=11111:客户端用这个端口连;

  • serverMode=tcp:我们现在只用 TCP,不用 Kafka/RocketMQ 模式。

2.配置 instance:example

Canal 默认有一个 example 实例,可以直接用。

路径:D:\canal\conf\example\instance.properties

把与 MySQL / 要抓的库相关的配置改掉:

sql 复制代码
#################################################
## mysql serverId , v1.0.26+ will autoGen
canal.instance.mysql.slaveId = 2   # 随便一个不同于 MySQL 本身 server_id 的数,不等于1就行

# position info (首次可以空着用 timestamp 找)
canal.instance.master.address = 127.0.0.1:3306
canal.instance.master.journal.name =
canal.instance.master.position =
canal.instance.master.timestamp =

# 链接 MySQL 的账号密码
canal.instance.dbUsername = canal
canal.instance.dbPassword = Canal@123456
canal.instance.connectionCharset = UTF-8

# 抓哪些库/表:正则
# 示例:只抓 zhiguang 库的 outbox 表
canal.instance.filter.regex = zhiguang\\.outbox

# 排除的库表(默认保持)
canal.instance.filter.black.regex = ^mysql\\.slave_table$,^test\\..*$

四.在本地启动Canal

点击D:\Canal\bin目录的startup.bat文件启动Canal,会出现以下页面

sql 复制代码
start cmd :  java   -Xms128m -Xmx512m -XX:PermSize=128m  -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dapplication.codeset=UTF-8 -Dfile.encoding=UTF-8  -server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=9099,server=y,suspend=n  -DappName=otter-canal -Dlogback.configurationFile="D:\Canal\bin\\..\conf\logback.xml" -Dcanal.conf="D:\Canal\bin\\..\conf\canal.properties" -classpath "D:\Canal\bin\\..\conf\..\lib\*;D:\Canal\bin\\..\conf" java   -Xms128m -Xmx512m -XX:PermSize=128m  -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dapplication.codeset=UTF-8 -Dfile.encoding=UTF-8  -server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=9099,server=y,suspend=n  -DappName=otter-canal -Dlogback.configurationFile="D:\Canal\bin\\..\conf\logback.xml" -Dcanal.conf="D:\Canal\bin\\..\conf\canal.properties" -classpath "D:\Canal\bin\\..\conf\..\lib\*;D:\Canal\bin\\..\conf" com.alibaba.otter.canal.deployer.CanalLauncher
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Listening for transport dt_socket at address: 9099
17:22:48,813 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [D:\Canal\bin\\..\conf\logback.xml] at [file:/D:/Canal/bin/../conf/logback.xml]
17:22:48,951 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
17:22:48,972 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Will scan for changes in [file:/D:/Canal/bin/../conf/logback.xml]
17:22:48,972 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Setting ReconfigureOnChangeTask scanning period to 5 seconds
17:22:48,975 |-INFO in ch.qos.logback.classic.joran.action.JMXConfiguratorAction - begin
17:22:49,113 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
17:22:49,127 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
17:22:49,136 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
17:22:49,224 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.classic.sift.SiftingAppender]
17:22:49,225 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [CANAL-ROOT]
17:22:49,233 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.sift.MDCBasedDiscriminator] for [discriminator] property
17:22:49,244 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.classic.sift.SiftingAppender]
17:22:49,244 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [CANAL-META]
17:22:49,245 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.sift.MDCBasedDiscriminator] for [discriminator] property
17:22:49,245 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
17:22:49,251 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [RocketmqClientAppender]
17:22:49,270 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@1847008471 - Will use gz compression
17:22:49,272 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@1847008471 - Will use the pattern ../logs/canal/%d{yyyy-MM-dd}/rocketmq_client-%d{yyyy-MM-dd}-%i.log for the active file
17:22:49,281 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@402bba4f - The date pattern is 'yyyy-MM-dd' from file name pattern '../logs/canal/%d{yyyy-MM-dd}/rocketmq_client-%d{yyyy-MM-dd}-%i.log.gz'.
17:22:49,281 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@402bba4f - Roll-over at midnight.
17:22:49,291 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@402bba4f - Setting initial period to Wed May 06 17:22:49 CST 2026
17:22:49,294 |-WARN in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@402bba4f - SizeAndTimeBasedFNATP is deprecated. Use SizeAndTimeBasedRollingPolicy instead
17:22:49,294 |-WARN in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@402bba4f - For more information see http://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedRollingPolicy
17:22:49,296 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
17:22:49,299 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[RocketmqClientAppender] - Active log file name: ../logs/canal/rocketmq_client.log
17:22:49,299 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[RocketmqClientAppender] - File property is set to [../logs/canal/rocketmq_client.log]
17:22:49,302 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [com.alibaba.otter.canal.instance] to false
17:22:49,303 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - com.alibaba.otter.canal.instance level set to INFO
17:22:49,303 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CANAL-ROOT] to Logger[com.alibaba.otter.canal.instance]
17:22:49,303 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [com.alibaba.otter.canal.deployer] to false
17:22:49,303 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - com.alibaba.otter.canal.deployer level set to INFO
17:22:49,303 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CANAL-ROOT] to Logger[com.alibaba.otter.canal.deployer]
17:22:49,304 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [com.alibaba.otter.canal.meta.FileMixedMetaManager] to false
17:22:49,304 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - com.alibaba.otter.canal.meta.FileMixedMetaManager level set to INFO
17:22:49,304 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CANAL-META] to Logger[com.alibaba.otter.canal.meta.FileMixedMetaManager]
17:22:49,304 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [com.alibaba.otter.canal.connector.kafka] to false
17:22:49,304 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - com.alibaba.otter.canal.connector.kafka level set to INFO
17:22:49,304 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CANAL-ROOT] to Logger[com.alibaba.otter.canal.connector.kafka]
17:22:49,304 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [com.alibaba.otter.canal.connector.rocketmq] to false
17:22:49,304 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - com.alibaba.otter.canal.connector.rocketmq level set to INFO
17:22:49,304 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CANAL-ROOT] to Logger[com.alibaba.otter.canal.connector.rocketmq]
17:22:49,304 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [com.alibaba.otter.canal.connector.rabbitmq] to false
17:22:49,304 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - com.alibaba.otter.canal.connector.rabbitmq level set to INFO
17:22:49,304 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CANAL-ROOT] to Logger[com.alibaba.otter.canal.connector.rabbitmq]
17:22:49,304 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [RocketmqClient] to false
17:22:49,304 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - RocketmqClient level set to INFO
17:22:49,304 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [RocketmqClientAppender] to Logger[RocketmqClient]
17:22:49,304 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [com.alibaba.otter.canal.connector.pulsarmq] to false
17:22:49,304 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - com.alibaba.otter.canal.connector.pulsarmq level set to INFO
17:22:49,304 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CANAL-ROOT] to Logger[com.alibaba.otter.canal.connector.pulsarmq]
17:22:49,304 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to WARN
17:22:49,304 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CANAL-ROOT] to Logger[ROOT]
17:22:49,304 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
17:22:49,305 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@795cd85e - Registering current configuration as safe fallback point

然后去 logs/example/example.log 查看运行是否成功,出现start successful就算启动成功

sql 复制代码
2026-05-06 17:22:51.812 [main] INFO  c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start CannalInstance for 1-example 
2026-05-06 17:22:52.883 [main] WARN  c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table filter : ^zhiguang\.outbox$
2026-05-06 17:22:52.883 [main] WARN  c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table black filter : ^^mysql\.slave_table$$|^^test\..*$$
2026-05-06 17:22:52.892 [main] INFO  c.a.otter.canal.instance.core.AbstractCanalInstance - start successful....
2026-05-06 17:22:54.230 [destination = example , address = /127.0.0.1:3306 , EventParser] WARN  c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> begin to find start position, it will be long time for reset or first position
2026-05-06 17:22:54.231 [destination = example , address = /127.0.0.1:3306 , EventParser] WARN  c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - prepare to find start position just show master status
2026-05-06 17:22:54.585 [destination = example , address = /127.0.0.1:3306 , EventParser] WARN  c.a.otter.canal.parse.inbound.mysql.MysqlConnection - load MySQL @@version_comment : MySQL Community Server - GPL
2026-05-06 17:22:55.682 [destination = example , address = /127.0.0.1:3306 , EventParser] WARN  c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> find start position successfully, EntryPosition[included=false,journalName=binlog.000049,position=4,serverId=1,gtid=<null>,timestamp=1778046394000] cost : 1439ms , the next step is binlog dump
2026-05-06 17:22:55.717 [destination = example , address = /127.0.0.1:3306 , EventParser] WARN  c.a.otter.canal.parse.inbound.mysql.MysqlConnection - load MySQL @@version_comment : MySQL Community Server - GPL

五.做一条实际的 INSERT 来验证

然后观察:

  • Java 控制台是否打印这一条;

  • follower 表是否插入了数据

相关推荐
小仙女喂得猪3 小时前
2026 Android 组件化项目的AICoding落地实践
android·kotlin·ai编程
leory3 小时前
请详细描述JVM的垃圾回收机制?
android·面试
leory3 小时前
volatile关键字的作用是什么?它能保证原子性吗?
android·面试
消失的旧时光-19433 小时前
为什么 Linux / Android 系统里全是 struct + 函数指针?—— 一篇讲透 C 语言如何实现面向对象(OOP)
android·linux·c语言
沐言人生3 小时前
ReactNative 源码分析5——ReactActivity之启动RN应用
android·react native
leory3 小时前
synchronized和ReentrantLock的区别是什么?各自的使用场景?
android·面试
__water5 小时前
【关于unity打包Android失败问题】
android·unity
重生之小比特5 小时前
【MySQL 数据库】基本查询
android·数据库·mysql
薛定猫AI5 小时前
【技术干货】用 AI + Expo 打通 iOS / Android / Web 跨端应用开发:从架构到代码生成实战
android·人工智能·ios