由于我们在配置Canal时,没有指定用户名和密码,所以,我们还需要将如下代码。
CanalConnector connector = CanalConnectors.newSingleConnector(
new InetSocketAddress(ip, 11111),
destination,
“canal”,
“canal”);
修改为:
CanalConnector connector = CanalConnectors.newSingleConnector(
new InetSocketAddress(ip, 11111),
destination,
“”,
“”);
修改完成后,运行main方法启动程序。
测试数据变更
接下来,在MySQL中创建一个canaldb数据库。
create database canaldb;
此时会在IDEA的命令行输出相关的日志信息。
-
Batch Id: [7] ,count : [3] , memsize : [149] , Time : 2020-08-05 23:25:35
-
Start : [mysql-bin.000007:6180:1540286735000(2020-08-05 23:25:35)]
-
End : [mysql-bin.000007:6356:1540286735000(2020-08-05 23:25:35)]
接下来,我在canaldb数据库中创建数据表,并对数据表中的数据进行增删改查,程序输出的日志信息如下所示。
#在mysql进行数据变更后,这里会显示mysql的bin日志。
-
Batch Id: [7] ,count : [3] , memsize : [149] , Time : 2020-08-05 23:25:35
-
Start : [mysql-bin.000007:6180:1540286735000(2020-08-05 23:25:35)]
-
End : [mysql-bin.000007:6356:1540286735000(2020-08-05 23:25:35)]
================> binlog[mysql-bin.000007:6180] , executeTime : 1540286735000(2020-08-05 23:25:35) , gtid : () , delay : 393ms
BEGIN ----> Thread id: 43
----------------> binlog[mysql-bin.000007:6311] , name[canal,canal_table] , eventType : DELETE , executeTime : 1540286735000(2020-08-05 23:25:35) , gtid : () , delay : 393 ms
id : 8 type=int(10) unsigned
name : 512 type=varchar(255)
END ----> transaction id: 249
================> binlog[mysql-bin.000007:6356] , executeTime : 1540286735000(2020-08-05 23:25:35) , gtid : () , delay : 394ms
-
Batch Id: [8] ,count : [3] , memsize : [149] , Time : 2020-08-05 23:25:35
-
Start : [mysql-bin.000007:6387:1540286869000(2020-08-05 23:25:49)]
-
End : [mysql-bin.000007:6563:1540286869000(2020-08-05 23:25:49)]
================> binlog[mysql-bin.000007:6387] , executeTime : 1540286869000(2020-08-05 23:25:49) , gtid : () , delay : 976ms
BEGIN ----> Thread id: 43
----------------> binlog[mysql-bin.000007:6518] , name[canal,canal_table] , eventType : INSERT , executeTime : 1540286869000(2020-08-05 23:25:49) , gtid : () , delay : 976 ms
id : 21 type=int(10) unsigned update=true
name : aaa type=varchar(255) update=true
END ----> transaction id: 250
================> binlog[mysql-bin.000007:6563] , executeTime : 1540286869000(2020-08-05 23:25:49) , gtid : () , delay : 977ms
-
Batch Id: [9] ,count : [3] , memsize : [161] , Time : 2020-08-05 23:26:22
-
Start : [mysql-bin.000007:6594:1540286902000(2020-08-05 23:26:22)]
-
End : [mysql-bin.000007:6782:1540286902000(2020-08-05 23:26:22)]
================> binlog[mysql-bin.000007:6594] , executeTime : 1540286902000(2020-08-05 23:26:22) , gtid : () , delay : 712ms
BEGIN ----> Thread id: 43
----------------> binlog[mysql-bin.000007:6725] , name[canal,canal_table] , eventType : UPDATE , executeTime : 1540286902000(2020-08-05 23:26:22) , gtid : () , delay : 712 ms
id : 21 type=int(10) unsigned
name : aaac type=varchar(255) update=true
END ----> transaction id: 252
================> binlog[mysql-bin.000007:6782] , executeTime : 1540286902000(2020-08-05 23:26:22) , gtid : () , delay : 713ms
需求
将数据库数据的变化, 通过canal解析binlog日志, 实时更新到solr的索引库中。
具体实现
创建工程
创建Maven工程mykit-canal-demo,并在pom.xml文件中添加如下配置。
com.alibaba.otter
canal.client
1.0.24
com.alibaba.otter
canal.protocol
1.0.24
commons-lang
commons-lang
2.6
org.codehaus.jackson
jackson-mapper-asl
1.8.9
org.apache.solr
solr-solrj
4.10.3
junit
junit
4.9
test
创建log4j配置文件
在工程的src/main/resources目录下创建log4j.properties文件,内容如下所示。
log4j.rootCategory=debug, CONSOLE
CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
创建实体类
在io.mykit.canal.demo.bean包下创建一个Book实体类,用于测试Canal的数据传输,如下所示。
package