canal安装配置与mysql操作监听,我已经帮你踩过了所有的坑
canal安装配置与mysql操作监听,我已经帮你踩过了所有的坑
废话不再多说,直接撸代码
第一步,canal配置
打开canal/conf/example/instance.properties文件,配置如下
canal.instance.mysql.slaveId = 1234 canal.instance.gtidon=false canal.instance.master.address=127.0.0.1:3306 canal.instance.master.journal.name= canal.instance.master.position= canal.instance.master.timestamp= canal.instance.master.gtid= canal.instance.rds.accesskey= canal.instance.rds.secretkey= canal.instance.rds.instanceId= canal.instance.tsdb.enable=true canal.instance.dbUsername=root #就这两行需要配置,你的数据库用户名和密码 canal.instance.dbPassword=xxxxxxx canal.instance.connectionCharset = UTF-8 canal.instance.enableDruid=false canal.instance.filter.regex=.*\\..* canal.instance.filter.black.regex=canal\\..*,kettle\\..*,finebi\\..*,finedb\\..* canal.mq.topic=example canal.mq.partition=0
第二步,mysql配置
打开mysql安装文件夹里的my.ini文件
然后
[mysqld] port=3306 basedir=E:/mysql-5.7.27-winx64 datadir=E:/mysql-5.7.27-winx64/data max_connections=200 character-set-server=utf8 default-storage-engine=INNODB sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #添加以下这三行 log-bin=mysql-bin binlog-format=ROW server_id=1
然后,打开命令窗口—>win+R,输入cmd,回车
输入以下命令:
mysql -uroot -p
然后输入数据库密码
然后依次执行以下几条命令
create user ‘canal’@’%’ identified by ‘canal’;
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘canal’@’%’;
GRANT ALL PRIVILEGES ON . TO ‘canal’@’%’ ;
FLUSH PRIVILEGES;
然后重启mysql(打开任务管理器,然后点击服务,找到mysql的服务后点击重启)
第三步,如何解决出现的错误
因为错误有很多,我无法一一指出,但经过几天的纠错,总结出以下的“万能解决方法”,前提是你的代码没有错误,配置没有错误。
万能解决方法
步骤一:将你的程序中的canal的连接地址改为127.0.0.1,如下
new InetSocketAddress(“127.0.0.1”,port),这一步也可以不用,前提是经过下面的步骤可以连接成功,则不需要这一步。
步骤二:删除canal/conf/example中的meta.dat文件
步骤三:删除mysql的binlog日志,win+R 输入cmd进入命令行界面,
然后输入:mysql -uroot -p
然后:输入数据库密码
然后输入: show binary logs;
这时会显示出所有日志
然后输入:RESET MASTER;//删除所有binlog日志
此时,大功告成。下面附上简单的canal客户端代码,供大家测试使用:
import java.net.InetSocketAddress; import java.util.List; import com.alibaba.otter.canal.client.CanalConnector; import com.alibaba.otter.canal.client.CanalConnectors; import com.alibaba.otter.canal.common.utils.AddressUtils; import com.alibaba.otter.canal.protocol.CanalEntry.Column; import com.alibaba.otter.canal.protocol.CanalEntry.Entry; import com.alibaba.otter.canal.protocol.CanalEntry.EntryType; import com.alibaba.otter.canal.protocol.CanalEntry.RowChange; import com.alibaba.otter.canal.protocol.CanalEntry.RowData; import com.alibaba.otter.canal.protocol.Message; import com.alibaba.otter.canal.protocol.CanalEntry.EventType; public class ClientSample{ public static void main(String args[]) { // 创建链接 CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("127.0.0.1",11111), "example", "", ""); int batchSize = 1000; int emptyCount = 0; try { connector.connect(); connector.subscribe(".*\\..*"); connector.rollback(); int totalEmptyCount = 120; while (emptyCount < totalEmptyCount) { Message message = connector.getWithoutAck(batchSize); // 获取指定数量的数据 long batchId = message.getId(); int size = message.getEntries().size(); if (batchId == -1 || size == 0) { emptyCount++; System.out.println("empty count : " + emptyCount); try { Thread.sleep(1000); } catch (InterruptedException e) { } } else { emptyCount = 0; // System.out.printf("message[batchId=%s,size=%s] \n", batchId, size); printEntry(message.getEntries()); } connector.ack(batchId); // 提交确认 // connector.rollback(batchId); // 处理失败, 回滚数据 } System.out.println("empty too many times, exit"); } finally { connector.disconnect(); } } private static void printEntry(List<Entry> entrys) { for (Entry entry : entrys) { if (entry.getEntryType() == EntryType.TRANSACTIONBEGIN || entry.getEntryType() == EntryType.TRANSACTIONEND) { continue; } RowChange rowChage = null; try { rowChage = RowChange.parseFrom(entry.getStoreValue()); } catch (Exception e) { throw new RuntimeException("ERROR ## parser of eromanga-event has an error , data:" + entry.toString(), e); } EventType eventType = rowChage.getEventType(); System.out.println(String.format("================> binlog[%s:%s] , name[%s,%s] , eventType : %s", entry.getHeader().getLogfileName(), entry.getHeader().getLogfileOffset(), entry.getHeader().getSchemaName(), entry.getHeader().getTableName(), eventType)); for (RowData rowData : rowChage.getRowDatasList()) { if (eventType == EventType.DELETE) { printColumn(rowData.getBeforeColumnsList()); } else if (eventType == EventType.INSERT) { printColumn(rowData.getAfterColumnsList()); } else { System.out.println("-------> before"); printColumn(rowData.getBeforeColumnsList()); System.out.println("-------> after"); printColumn(rowData.getAfterColumnsList()); } } } } private static void printColumn(List<Column> columns) { for (Column column : columns) { System.out.println(column.getName() + " : " + column.getValue() + " update=" + column.getUpdated()); } } }
数据库配置:
打开application.properties文件
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/数据库名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.username=root spring.datasource.password=数据库密码
如果大家问题解决了请给点个赞哈,谢谢。
- 点赞
- 收藏
- 分享
- 文章举报
- 基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
- Linux ubuntu下安装配置apache,php,mysql并实现操作
- Centos6.5 安装配置 Apache +mysql +php 操作文档
- Mysql5.7.14安装配置方法操作图文教程(密码问题解决办法)
- [MySQL]brew 安装 配置 操作 mysql(中文问题)
- win下mysql的安装,配置及操作
- mysql 5.7.20常用下载、安装和配置方法及简单操作技巧(解压版免安装)
- python操作三大主流数据库(3)python操作mysql③python操作mysql的orm工具sqlaichemy安装配置和使用
- redhat mysql 安装配置及基本操作
- 绿色版 MySQL 安装配置的正确操作步骤
- 所有配置正确,安装成功,但MySQL 服务无法启动(mysql-5.7.13-winx64)
- 基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
- MySQL-brew 安装 配置 操作 mysql(中文问题)
- mysql5.7.20安装、配置和基本操作
- mysql-5.7.20实用下载、安装和配置方法,以及简单操作
- MySQL5.5.22版本安装配置以及基本命令的使用和管理数据库备份与恢复操作详解
- mysql 5.7.20下载、安装和配置方法及简单操作技巧(解压版免安装)
- mysql在centos上的安装以及canal数据同步配置
- RedHat 上安装多个 mysql 实例并配置 django 连接的操作记录