#进入mysql数据库 [root@localhost mysql]# mysql -uroot -p Enter password: #创建从数据库的root用户和权限 mysql> grant replication slave on *.* to root@'192.168.20.%' identified by 'Lgq081538';
grant replication slave on *.* to '123456' #备注 #192.168.20.%通配符,表示0-255的IP都可访问主服务器,正式环境请配置指定从服务器IP #若将 192.168.20.% 改为 %,则任何ip均可作为其从数据库来访问主服务器 #退出mysql mysql> exit;
4. 重启 mysql 服务
1 2 3
[root@localhost mysql]# service mysql restart Shutting down MySQL.... SUCCESS! Starting MySQL. SUCCESS!
5. 查看主服务器状态
1 2 3 4 5 6 7 8 9 10 11 12
#进入mysql数据库 [root@localhost mysql]# mysql -uroot -p Enter password: #查看主服务器状态 mysql> show master status; +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | master-bin.000001 | 154 | test | | | +-------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
# 2. Reason: No converter found capable of converting from type [java.lang.String] to type [java.util.Map<java.lang.String, java.lang.String>]
启动 canal-adapter 报错:
1 2 3
Failed to bind properties under 'canal.conf.canal-adapters[0].groups[0].outer-adapters[1].properties' to java.util.Map<java.lang.String, java.lang.String>:
Reason: No converter found capable of converting from type [java.lang.String] to type [java.util.Map<java.lang.String, java.lang.String>]
# 5. java.sql.SQLException: null, message from server: “Host ‘172.16.188.2’ is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’”
同一个 ip 在短时间内产生太多中断的数据库连接而导致的阻塞
登录对应的 mysql,执行如下指令
1
flush hosts;
# 6. IllegalStateException: Extension instance(name: es7, class: interface com.alibaba.otter.canal.client.adapter.OuterAdapter) could not be instantiated: class could not be found
一般 could not be instantiated: class could not be found 这样的报错是配置文件的问题,如上的报错可以看到是 name: es7 中的错误,在官方的示例文档中使用的是 name: es6 # or es7 。
在 canal1.1.5 + 版本中设置的是 name: es6 # 或者 es7
但在 1.1.4 版本中直接使用 name: es 即可
# 7. IllegalArgumentException: Not found the mapping info of index: user
1、这个报错是 ES 的 mapping 设置的问题,确保 es 中有该索引,并且确认是否有部分字段没有在 es 中设置 mapping, 这个要对应之前设置的 sql,以及 es 中的 mappings 来解决
# 8. IllegalArgumentException: Illegal character in scheme name at index 0: 172.16.188.7:9200
如果连接 es 使用的是 rest 方式,那么 hosts 中的 ip 前要添加 http:// ,如
1
hosts: http://172.16.188.7:9200
# 9. com.alibaba.druid.pool.DruidDataSource cannot be cast to com.alibaba.druid.pool.DruidDataSource
1 2 3 4 5 6 7 8 9
java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassCastException: com.alibaba.druid.pool.DruidDataSource cannot be cast to com.alibaba.druid.pool.DruidDataSource at com.alibaba.otter.canal.client.adapter.es7x.ES7xAdapter.init(ES7xAdapter.java:54) ~[client-adapter.es7x-1.1.5-jar-with-dependencies.jar:na] at com.alibaba.otter.canal.adapter.launcher.loader.CanalAdapterLoader.loadAdapter(CanalAdapterLoader.java:225) [client-adapter.launcher-1.1.5.jar:na] at com.alibaba.otter.canal.adapter.launcher.loader.CanalAdapterLoader.init(CanalAdapterLoader.java:56) [client-adapter.launcher-1.1.5.jar:na] at com.alibaba.otter.canal.adapter.launcher.loader.CanalAdapterService.init(CanalAdapterService.java:60) [client-adapter.launcher-1.1.5.jar:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_271] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_271] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_271] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_271]
canal.conf: mode: tcp #tcp kafka rocketMQ rabbitMQ flatMessage: true zookeeperHosts: syncBatchSize: 1000 retries: 0 timeout: accessKey: secretKey: consumerProperties: # canal tcp consumer canal.tcp.server.host: 127.0.0.1:11111 canal.tcp.zookeeper.hosts: canal.tcp.batch.size: 500 canal.tcp.username: canal.tcp.password: # kafka consumer kafka.bootstrap.servers: 127.0.0.1:9092 kafka.enable.auto.commit: false kafka.auto.commit.interval.ms: 1000 kafka.auto.offset.reset: latest kafka.request.timeout.ms: 40000 kafka.session.timeout.ms: 30000 kafka.isolation.level: read_committed kafka.max.poll.records: 1000 # rocketMQ consumer rocketmq.namespace: rocketmq.namesrv.addr: 127.0.0.1:9876 rocketmq.batch.size: 1000 rocketmq.enable.message.trace: false rocketmq.customized.trace.topic: rocketmq.access.channel: rocketmq.subscribe.filter: # rabbitMQ consumer rabbitmq.host: rabbitmq.virtual.host: rabbitmq.username: rabbitmq.password: rabbitmq.resource.ownerId: srcDataSources: defaultDS: url: jdbc:mysql://172.16.188.1:3306/bladex?useUnicode=true #driverClassName: com.mysql.cj.jdbc.Driver username: root password: 123456 canalAdapters: - instance: example # canal instance Name or mq topic name groups: - groupId: g1 outerAdapters: - name: logger - key: esKey name: es7 # es6 or es7 hosts: http://172.16.188.7:9200 # 集群地址,逗号隔开. 127.0.0.1:9200 for rest mode or 127.0.0.1:9300 for transport mode properties: mode: rest # rest or transport # security.auth: test:123456 # only used for rest mode cluster.name: cluster1
# 17 Field error in object ‘target’ on field ‘esMapping’: rejected value [];
1 2 3 4 5 6 7
Field error in object 'target' on field 'esMapping': rejected value []; codes [typeMismatch.target.esMapping,typeMismatch.esMapping,typeMismatch.com.alibaba.otter.canal.client.adapter.es.core.config.ESSyncConfig$ESMapping,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [target.esMapping,esMapping]; arguments []; default message [esMapping]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.alibaba.otter.canal.client.adapter.es.core.config.ESSyncConfig$ESMapping' for property 'esMapping'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'com.alibaba.otter.canal.client.adapter.es.core.config.ESSyncConfig$ESMapping' for property 'esMapping': no matching editors or conversion strategy found]
2022-05-21 06:28:44.444 [pool-2-thread-1] ERROR c.a.otter.canal.adapter.launcher.loader.AdapterProcessor - java.lang.NullPointerException java.lang.RuntimeException: java.lang.NullPointerException at com.alibaba.otter.canal.client.adapter.es.core.service.ESSyncService.sync(ESSyncService.java:116) ~[na:na] at com.alibaba.otter.canal.client.adapter.es.core.service.ESSyncService.sync(ESSyncService.java:64) ~[na:na] at com.alibaba.otter.canal.client.adapter.es.core.ESAdapter.sync(ESAdapter.java:115) ~[na:na] at com.alibaba.otter.canal.client.adapter.es.core.ESAdapter.sync(ESAdapter.java:94) ~[na:na] at com.alibaba.otter.canal.adapter.launcher.loader.AdapterProcessor.batchSync(AdapterProcessor.java:139) ~[client-adapter.launcher-1.1.5.jar:na] at com.alibaba.otter.canal.adapter.launcher.loader.AdapterProcessor.lambda$null$1(AdapterProcessor.java:97) ~[client-adapter.launcher-1.1.5.jar:na] at java.util.concurrent.CopyOnWriteArrayList.forEach(CopyOnWriteArrayList.java:895) ~[na:1.8.0_312] at com.alibaba.otter.canal.adapter.launcher.loader.AdapterProcessor.lambda$null$2(AdapterProcessor.java:94) ~[client-adapter.launcher-1.1.5.jar:na] at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_312] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_312] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_312] at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_312] Caused by: java.lang.NullPointerException: null at com.alibaba.otter.canal.client.adapter.es7x.support.ES7xTemplate.insert(ES7xTemplate.java:79) ~[na:na] at com.alibaba.otter.canal.client.adapter.es.core.service.ESSyncService.singleTableSimpleFiledInsert(ESSyncService.java:448) ~[na:na] at com.alibaba.otter.canal.client.adapter.es.core.service.ESSyncService.insert(ESSyncService.java:139) ~[na:na] at com.alibaba.otter.canal.client.adapter.es.core.service.ESSyncService.sync(ESSyncService.java:99) ~[na:na] ... 11 common frames omitted 2022-05-21 06:28:44.449 [Thread-4] ERROR c.a.otter.canal.adapter.launcher.loader.AdapterProcessor - Outer adapter sync failed! Error sync but ACK!
canalAdapters: - instance: test # canal instance Name or mq topic name groups: - groupId: g2 outerAdapters: # - name: logger - key: esKey3 # 配置key name: es7 # es6 or es7 #hosts: http://192.168.101.11:9200 # 集群地址,逗号隔开. 127.0.0.1:9200 for rest mode or 127.0.0.1:9300 for transport mode hosts: http://192.168.244.11:9200 # 集群地址,逗号隔开. 127.0.0.1:9200 for rest mode or 127.0.0.1:9300 for transport mode properties: mode: rest # rest or transport security.auth: elastic:elastic # only used for rest mode cluster.name: blade-cluster
# 21. CanalParseException: parse row data failed. | column size is not match for table
deployser 日志报错:
1 2 3 4 5
2022-05-21 07:45:15.651 [MultiStageCoprocessor-Parser-fleet-0] ERROR com.alibaba.otter.canal.common.utils.NamedThreadFactory - from MultiStageCoprocessor-Parser-fleet-0 com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed. Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed. Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed. Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: column size is not match for table:fleet.source_project_cargo,9 vs 8
解决:
1、可以看到报错中已经给出明确提示了
1
column size is not match for table:fleet.source_project_cargo,9 vs 8
<select id="selectUser" parameterType="com.yjq.programmer.entity.User" resultType="com.yjq.programmer.entity.User"> select * from t_user t where t.sex = #{sex} and t.id = #{id} </select> </mapper> 12345678910111213 单元测试 @Test public void testShardingJDBCInsert() { User user = new User(); for(int i=0; i<10; i++) { user.setName("小明" + i); user.setSex(1); if(userDao.insertUser(user) == 1) { logger.info("插入成功!"); } else { logger.info("插入失败!"); } } }
@Test public void testShardingJDBCSelect() { User user = new User(); user.setSex(1); user.setId(821357967667363840L); List<User> userList = userDao.selectUser(user); logger.info("查询结果:{}", JSONObject.toJSONString(userList)); }
③结果说明 插入
sex 字段为奇数的数据落入 m2 数据源,为偶数的落入 m1 数据源。同时 id 字段值为奇数的,插入 t_user_2 表中,为偶数的插入 t_user_1 表中,达到预期目标。 查询
sharding-jdbc 分别去不同的表检索数据,达到预期目标;如果有传入 sex 进行查询,sharding-jdbc 会根据 t_user 的分库策略去锁定查哪个库,如果有传入 id 进行查询,sharding-jdbc 会根据 t_user 的分表策略去锁定查哪个表。