MySQL数据同步神器Canal常见错误总结
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、启动常见错误</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1. 网络连接错误</a></li><li><a href="#_lab2_0_1">2. 权限不足</a></li><li><a href="#_lab2_0_2">3. Binlog格式问题</a></li><li><a href="#_lab2_0_3">4. Canal实例配置错误</a></li><li><a href="#_lab2_0_4">5. 驱动版本不兼容</a></li><li><a href="#_lab2_0_5">6. 内存不足</a></li></ul><li><a href="#_label1">二、运行时常见错误</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_6">1. meta.dat与instance.properties不一致</a></li><li><a href="#_lab2_1_7">2. 全量同步问题</a></li><li><a href="#_lab2_1_8">3. adapter启动报错(空指针)</a></li><li><a href="#_lab2_1_9">4. 配置文件格式错误</a></li><li><a href="#_lab2_1_10">5. 字段不匹配错误</a></li><li><a href="#_lab2_1_11">6. 连接ES问题</a></li><li><a href="#_lab2_1_12">7. 服务连接断开</a></li><li><a href="#_lab2_1_13">8. 驱动包冲突</a></li></ul><li><a href="#_label2">三、解决方案总结</a></li><ul class="second_class_ul"></ul><li><a href="#_label3">四、最佳实践建议</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、启动常见错误</h2><p class="maodian"><a name="_lab2_0_0"></a></p><h3>1. 网络连接错误</h3>
<p><strong>报错内容</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">ERROR c.a.otter.canal.server.netty.handler.SessionHandler - something goes wrong with channel:, exception=java.nio.channels.ClosedChannelException</pre></div>
<p><strong>原因</strong>:</p>
<ul><li>Canal实例与MySQL主库之间的网络连接不稳定或中断</li><li>防火墙设置阻止了Canal访问MySQL端口</li></ul>
<p><strong>解决方案</strong>:</p>
<ol><li>检查网络连接是否正常</li><li>确保防火墙允许Canal访问MySQL端口(默认3306)</li><li>增加网络重试机制提高稳定性</li></ol>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>2. 权限不足</h3>
<p><strong>报错内容</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">ERROR c.a.otter.canal.parse.inbound.mysql.MysqlConnection - Error connecting to MySQL server</pre></div>
<p><strong>原因</strong>:</p>
<ul><li>Canal用户在MySQL上的权限不够,无法获取binlog信息</li></ul>
<p><strong>解决方案</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal_user'@'%' ;
FLUSH PRIVILEGES;</pre></div>
<p class="maodian"><a name="_lab2_0_2"></a></p><h3>3. Binlog格式问题</h3>
<p><strong>报错内容</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">Received error packet: errno = 1236, sqlstate = HY000 errmsg = Could not find first log file name in binary log index file</pre></div>
<p><strong>原因</strong>:</p>
<ul><li>MySQL的binlog格式设置为ROW或MIXED以外的格式</li></ul>
<p><strong>解决方案</strong>:</p>
<div class="jb51code"><pre class="brush:plain;"># 修改MySQL配置文件(my.cnf)
binlog_format = ROW</pre></div>
<p>重启MySQL服务后生效</p>
<p class="maodian"><a name="_lab2_0_3"></a></p><h3>4. Canal实例配置错误</h3>
<p><strong>报错内容</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">com.alibaba.otter.canal.parse.exception.CanalParseException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tableMetaTSDB' defined in class path resource : Cannot resolve reference to bean 'metaHistoryDAO' while setting bean property 'metaHistoryDAO'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'metaHistoryDAO' defined in class path resource : Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource : Cannot resolve reference to bean 'dataSource' while setting bean property</pre></div>
<p><strong>原因</strong>:</p>
<ul><li>Canal实例的配置参数不正确,如数据库连接串、用户名、密码等</li></ul>
<p><strong>解决方案</strong>:<br />检查<code>conf/example/instance.properties</code>文件,确保:</p>
<div class="jb51code"><pre class="brush:plain;"># mysql serverId
canal.instance.mysql.slaveId = 1234
# position info
canal.instance.master.address=127.0.0.1:3306
canal.instance.master.journal.name=mysql-bin.000001
canal.instance.master.position=157
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=Canal@123456!</pre></div>
<p class="maodian"><a name="_lab2_0_4"></a></p><h3>5. 驱动版本不兼容</h3>
<p><strong>报错内容</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">Unknown system variable 'query_cache_size'</pre></div>
<p><strong>原因</strong>:</p>
<ul><li>MySQL驱动包的版本过低,query cache在MySQL5.7.20已过时,MySQL8.0已移除</li></ul>
<p><strong>解决方案</strong>:</p>
<ol><li>将<code>lib</code>目录中的驱动包替换为<code>mysql-connector-java-8.0.22.jar</code></li><li>修改驱动器权限</li></ol>
<p class="maodian"><a name="_lab2_0_5"></a></p><h3>6. 内存不足</h3>
<p><strong>报错内容</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">hs_err_pid13418.log (JVM运行异常生成的日志文件)</pre></div>
<p><strong>原因</strong>:</p>
<ul><li>Canal启动时JVM内存不足</li></ul>
<p><strong>解决方案</strong>:<br />修改Canal启动程序中的JVM配置,增加内存参数</p>
<p class="maodian"><a name="_label1"></a></p><h2>二、运行时常见错误</h2>
<p class="maodian"><a name="_lab2_1_6"></a></p><h3>1. meta.dat与instance.properties不一致</h3>
<p><strong>报错内容</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">ERROR c.a.otter.canal.server.netty.handler.SessionHandler - something goes wrong with channel:, exception=java.nio.channels.ClosedChannelException</pre></div>
<p><strong>原因</strong>:</p>
<ul><li><code>conf/example/meta.dat</code>与<code>instance.properties</code>文件中的<code>journalName, position, timestamp</code>不一致</li></ul>
<p><strong>解决方案</strong>:</p>
<ol><li>将<code>meta.dat</code>文件删除(生产环境需谨慎)</li><li>或修改<code>instance.properties</code>文件中的参数与<code>meta.dat</code>一致</li><li>重启Canal服务</li></ol>
<p class="maodian"><a name="_lab2_1_7"></a></p><h3>2. 全量同步问题</h3>
<p><strong>报错内容</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">binlog也设置为000001了,timestamp也设置了,但就是无法实现全量同步</pre></div>
<p><strong>原因</strong>:</p>
<ul><li>binlog只记录增量操作,开启binlog之前的历史数据不会被记录</li></ul>
<p><strong>解决方案</strong>:</p>
<ol><li>删除<code>conf/example/meta.dat</code></li><li>调整<code>conf/example/instance.properties</code>中的配置</li><li>重启deployer</li><li>如需同步历史数据,可采用以下方法:<ul><li>通过logstash-input-jdbc实现</li><li>通过业务代码实现</li><li>复制原数据库数据到开启了binlog的从数据库,然后从从数据库同步</li></ul></li></ol>
<p class="maodian"><a name="_lab2_1_8"></a></p><h3>3. adapter启动报错(空指针)</h3>
<p><strong>报错内容</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">adapter启动报错:something goes wrong when starting up the canal client adapters: java.lang.NullPointerException: null</pre></div>
<p><strong>原因</strong>:</p>
<ul><li>adapter配置文件中打开了不需要的配置项(如<code>zookeeperHosts</code>)但未配置具体值</li></ul>
<p><strong>解决方案</strong>:</p>
<ol><li>注释掉不需要的配置项</li><li>例如,不需要Zookeeper时,注释掉<code>zookeeperHosts</code>配置</li><li>或检查并正确配置所有必要参数</li></ol>
<p class="maodian"><a name="_lab2_1_9"></a></p><h3>4. 配置文件格式错误</h3>
<p><strong>报错内容</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">Field error in object 'target' on field 'esMapping': rejected value [];
Reason: No converter found capable of converting from type to type </pre></div>
<p><strong>原因</strong>:</p>
<ul><li>配置文件中配置项排版错误,特别是SQL语句语法问题</li></ul>
<p><strong>解决方案</strong>:</p>
<ol><li>检查es配置文件中的SQL语句语法</li><li>确保配置项排版正确,特别是<code>_index</code>, <code>_type</code>等属性要放在<code>esMappings</code>下</li></ol>
<p class="maodian"><a name="_lab2_1_10"></a></p><h3>5. 字段不匹配错误</h3>
<p><strong>报错内容</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">java.util.NoSuchElementException</pre></div>
<p><strong>原因</strong>:</p>
<ul><li>canal配置文件中的字段在ES mapping中找不到对应的字段</li><li>字段大小写不一致或遗漏</li></ul>
<p><strong>解决方案</strong>:</p>
<ol><li>检查canal配置文件中的字段是否在ES mapping中有对应</li><li>确认大小写是否一致</li><li>确认sql中设置的别名是否与ES mappings中的名称一致</li></ol>
<p class="maodian"><a name="_lab2_1_11"></a></p><h3>6. 连接ES问题</h3>
<p><strong>报错内容</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">DocumentMissingException</pre></div>
<p><strong>原因</strong>:</p>
<ul><li>ES集群出现问题,分片数问题或数据不存在</li></ul>
<p><strong>解决方案</strong>:</p>
<ol><li>调整ES分片设置(单节点环境:主分片数=1,副本分片数=0)</li><li>确保数据在ES中存在(先进行全量同步,再进行增量同步)</li></ol>
<p class="maodian"><a name="_lab2_1_12"></a></p><h3>7. 服务连接断开</h3>
<p><strong>报错内容</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">CanalClientException: java.io.IOException: Broken pipe Error sync but ACK</pre></div>
<p><strong>原因</strong>:</p>
<ul><li>服务连接断开</li></ul>
<p><strong>解决方案</strong>:</p>
<ol><li>将deployer和adapter都关闭</li><li>先启动deployer</li><li>再启动adapter</li></ol>
<p class="maodian"><a name="_lab2_1_13"></a></p><h3>8. 驱动包冲突</h3>
<p><strong>报错内容</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">com.alibaba.druid.pool.DruidDataSource cannot be cast to com.alibaba.druid.pool.DruidDataSource</pre></div>
<p><strong>原因</strong>:</p>
<ul><li>Druid包冲突</li></ul>
<p><strong>解决方案</strong>:</p>
<ol><li>修改<code>client-adapter/escore/pom.xml</code></li><li>重新打包</li><li>替换<code>adataper/plugin</code>下的同名jar文件</li><li>给该文件赋权</li><li>重启服务</li></ol>
<p class="maodian"><a name="_label2"></a></p><h2>三、解决方案总结</h2>
<table><thead><tr><th>错误类型</th><th>报错内容</th><th>解决方案</th></tr></thead><tbody><tr><td>网络连接错误</td><td><code>ClosedChannelException</code></td><td>检查网络连接,确保防火墙允许访问</td></tr><tr><td>权限不足</td><td><code>Error connecting to MySQL server</code></td><td>授予REPLICATION SLAVE, REPLICATION CLIENT权限</td></tr><tr><td>Binlog格式问题</td><td><code>Could not find first log file name</code></td><td>修改MySQL配置,设置binlog_format=ROW</td></tr><tr><td>配置错误</td><td><code>BeanCreationException</code></td><td>检查instance.properties配置文件</td></tr><tr><td>驱动版本不兼容</td><td><code>Unknown system variable 'query_cache_size'</code></td><td>替换为MySQL 8.0驱动包</td></tr><tr><td>meta.dat不一致</td><td><code>ClosedChannelException</code></td><td>删除或修改meta.dat与instance.properties一致</td></tr><tr><td>全量同步失败</td><td><code>无法实现全量同步</code></td><td>删除meta.dat,调整配置,重启</td></tr><tr><td>adapter空指针</td><td><code>NullPointerException: null</code></td><td>注释掉不需要的配置项</td></tr><tr><td>配置格式错误</td><td><code>rejected value []</code></td><td>检查配置文件排版和SQL语法</td></tr><tr><td>字段不匹配</td><td><code>NoSuchElementException</code></td><td>检查字段大小写和ES mapping</td></tr><tr><td>ES连接问题</td><td><code>DocumentMissingException</code></td><td>调整ES分片设置,确保数据存在</td></tr><tr><td>服务连接断开</td><td><code>Broken pipe Error sync but ACK</code></td><td>先启动deployer,再启动adapter</td></tr></tbody></table>
<p class="maodian"><a name="_label3"></a></p><h2>四、最佳实践建议</h2>
<p><strong>版本匹配</strong>:</p>
<p>Canal 1.1.6 + MySQL 8.0 + MySQL Connector 8.0.22</p>
<p><strong>配置检查</strong>:</p>
<div class="jb51code"><pre class="brush:plain;"># instance.properties
canal.instance.mysql.slaveId = 1234
canal.instance.master.address=127.0.0.1:3306
canal.instance.master.journal.name=mysql-bin.000001
canal.instance.master.position=157
canal.instance.dbUsername=canal
canal.instance.dbPassword=Canal@123456!
canal.instance.filter.regex=.*\\..*</pre></div>
<p><strong>初始化步骤</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">CREATE USER 'canal'@'%' IDENTIFIED BY 'Canal@123456!';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;</pre></div>
<ul><li><strong>全量同步处理</strong>:
<ul><li>删除<code>conf/example/meta.dat</code></li><li>调整<code>instance.properties</code>中的<code>binlog</code>起点</li><li>重启Canal服务</li></ul></li><li><strong>生产环境注意事项</strong>:<ul><li>生产环境删除<code>meta.dat</code>前确认数据同步需求</li><li>定期检查Canal日志</li><li>监控Canal服务运行状态</li></ul></li></ul>
頁:
[1]