问题产生线上一直有个历史遗留问题,最近DBA提了出来,所以跟了下代码,作了下简单分析,问题描述如下:
在master-slave的环境下,对master上的某个表中的数据插入,会导致master-slave数据不一致的情况,通过反复试验,确定出现该情况的条件如下:
master上设置了character_set_server=gbk
应用中采用了prepared statement并且设置了useCursorFetch=true
对于master上某个表中的int字段,采用了字符的形式进行插入
比如,master上有张表,结构如下:
create table t(id intauto_increment primay key,count int)engine=innodb;
进行的操作如下:
conn =DriverManager.getConnection("jdbc:mysql://192.168.0.1:3307/test?useCursorFetch=true&user=root");
pstmt =conn.prepareStatement("insert into test(count) values(?)");
pstmt.setString(1,"1");
pstmt.execute();
通过上面的操作,我们发现,在master上,插入后的结果如下:
mysql>select*fromt;
+----+-------+