mysql mycat 1.6.6.1-release 批量 insert 數據丟失問題(續)


 

我在項目中使用mycat進行分表,分了20個表,然后發現偶爾會出現分批次insert數據丟失問題。
比如從日志發現一共17020條記錄,分批每次1000條insert入庫,最后只insert成功了13020條。看了java的日志和mycat的日志沒有發現任何error。

而且我查看了mybatis 的debug日志  ,除了第5個批量Insert 1000條  打印的      2020-01-10 14:13:40.325 http-nio-9080-exec-3 DEBUG org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159) - <==    Updates: 1

 

其他地方都是正常打印的 Updates: 1000      2020-01-10 14:13:39.116 http-nio-9080-exec-3 DEBUG org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159) - <==    Updates: 1000

 

而且我查了數據發現前面4000條數據丟失了,也就是說打印   <==    Updates: 1 之前的4次分批1000條insert都丟失了,java和mycat沒有任何報錯。

這個問題困擾了我很久,可以看我之前寫的2個文章也是解決這個問題的,但是都沒有完全解決,小概率還是會發生丟失數據問題。我猜測要么是mycat的問題或者就是spring 的事務沒有配置正確。

https://www.cnblogs.com/xiaohanlin/p/11850508.html

https://www.cnblogs.com/xiaohanlin/p/11492715.html

 

然后我在mycat的github issues 里面提了這個問題,很快就得到了回復。建議我把mycat的dbDriver="jdbc"  試試,我的配置如下

 

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>

<writeHost host="Master1" url="jdbc:mysql://15.31.213.44:3306/nova?allowMultiQueries=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;autoReconnect=true" user="root"
password="123456">

</writeHost>

 

(注意:從  dbDriver="nvative"改成  dbDriver="jdbc"   后 allowMultiQueries=true 需要加在mycat和微服務的jdbc參數里面,不然批量update執行報錯) 

 

然后我把每個微服務的數據庫配置也修改成了

 url: jdbc:mysql://15.31.213.44:8066/nova?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&autoReconnect=true

 

 

然后需要再觀察一段時間會不會再出現丟失數據的這個問題。

 

 

 

 

2020-01-17

在線上環境發現一個bug:從odm發給hp進行send task config review的CTP-TASK0000000059 在hp端打了一些np進行save的時候發現有些np沒生效。但是不是每次都能復現出來

小概率會出現。

我查看了java的日志中的mybatis的debug打印日志,發現沒有任何報錯,先刪除struct表9258條數據,然后分10次一共9258條數據批量insert打印都是成功的   Updates: 1000

 

然后我查看了mycat的mycat.log日志從 2020-01-17 09:36:46.189  開始就有如下日志(上面所說的insert完成9258條數據是在09:36:59     到09:37:04左右結束的)

 

2020-01-17 09:36:46.189 INFO [Timer1] (io.mycat.backend.datasource.PhysicalDatasource.closeByIdleMany(PhysicalDatasource.java:337)) - too many ilde cons ,close some for datasouce Master1
2020-01-17 09:36:46.189 INFO [Timer1] (io.mycat.net.AbstractConnection.close(AbstractConnection.java:520)) - close connection,reason:too many idle con ,MySQLConnection [id=14812, lastTime=1579224996188, user=root, schema=nova, old shema=nova, borrowed=false, fromSlaveDB=false, threadId=65605, charset=utf8, txIsolation=3, autocommit=true, attachment=null, respHandler=null, host=15.32.134.247, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]

 

而且mycat.log日志中有很多  close connection,reason:quit cmd的日志,如下所示

 

2020-01-17 09:36:59.122 INFO [$_NIOREACTOR-29-RW] (io.mycat.net.AbstractConnection.close(AbstractConnection.java:520)) - close connection,reason:quit cmd ,ServerConnection [id=92542, schema=nova, host=15.32.134.247, user=root,txIsolation=3, autocommit=true, schema=nova, executeSql=null]

 

 

然后我看了一下 44 的trialrun環境上面的mycat的日志由於我把改成了dbDriver="jdbc"  發現很少有上述的 close connection,reason:quit cmd的日志 或者幾乎沒有

 

后續再觀察一下是不是改成dbDriver="jdbc"  就解決這個問題了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM