最新帖子 精华区 社区服务 会员列表 统计排行 道具中心 银行
主题 : MySQL 5.1 中 Innodb 的事务完整性Bug[转]
sky000 离线
www.jianzhaoyang.com
级别: 总版主
显示用户信息 
0  发表于: 2009-04-13 00:09
1

MySQL 5.1 中 Innodb 的事务完整性Bug[转]

在 5.1 版本中,Innodb 存储引擎如果使用autocommit=0的情况下,单条SQL在执行过程中如果异常中断的话,事务完整性可能无法保证,不论是STATEMENT还是MIXED的binlog_format,都存在相同的问题,可以重现,屡试不爽。
测试环境如下:
OS:SunOS 5.10 Generic_137138-09
DB:MySQL 5.1.31/32-log Source distribution
binlog_format:MIXED/STATEMENT
tx_isolation:REPEATABLE-READ测试脚本如下:
[root@dc-5 /tmp]#cat deletetest.sh
#/bin/sh
mysql -uadmin -h127.0.0.1 -pxxx -e"set autocommit=0;delete from test.test;"
[root@dc-5 /tmp]#cat killtest.sh
#/bin/sh
mysqladmin -uroot processlist |grep "admin"|awk '{print $2}'|xargs mysqladmin -uroot kill将删除的脚本放到后台执行,然后执行kill脚本:
[root@dc-5 /tmp]#time ./deletetest.sh &
[1] 6708
[root@dc-5 /tmp]#./killtest.sh
ERROR 1053 (08S01) at line 1: Server shutdown in progress

real    0m2.901s
user    0m0.007s
sys     0m0.007s
[root@dc-5 /tmp]#
[1]+  Exit 1                  time ./deletetest.sh到Master 和 Slave 两端分别检查数据,看上去很正常:
root@dc-5 : (none) 01:35:43> select count(*) from test.test;
+----------+
|
count(*) |
+----------+
|
1000000|
+----------+
1 row in set (1.71 sec)
 
root@dc-6 : (none) 01:36:01> select count(*) from test.test;
+----------+
|
count(*) |
+----------+
|
1000000|
+----------+
1 row in set (1.69 sec)我们再将set autocommit=0拿掉试试看,也就是允许系统自动提交:
[root@dc-5 /tmp]#cat deletetest.sh
#/bin/sh
mysql -uadmin -h127.0.0.1 -pxxx -e"delete from offer1.test;"
[root@dc-5 /tmp]#time ./deletetest.sh &
[1] 6722
[root@dc-5 /tmp]#./killtest.sh
[root@dc-5 /tmp]#ERROR 1053 (08S01) at line 1: Server shutdown in progress

real    0m2.462s
user    0m0.006s
sys     0m0.007s

[1]+  Exit 1                  time ./deletetest.sh再检查 Master 和 Slave 两端的数据:
root@dc-5 : (none) 01:40:30> select count(*) from offer1.test;
+----------+
|
count(*) |
+----------+
887377 |
+----------+
1 row in set (1.66 sec)
root@dc-6 : offer1 01:44:05select count(*) from offer1.test;
+----------+
|
count(*) |
+----------+
|
1000000|
+----------+
1 row in set (1.70 sec)Master 和 Slave 两端数据居然出现不一致,在 Master 端已经删除掉了部分数据,在 Slave 端却没有任何变化。执行deletetest.sh 脚本前后检查 Master 的 Binary Log(SHOW Master STATUS),没有任何变化。这个Bug 简直是太扯淡了,数据完全没有事务完整性可言了啊。
邮件组:mysqler@googlegroups.com
个人网站:http://www.jianzhaoyang.com
From:浙江省杭州市 顶端
eugene 离线
宁静致远,淡泊明知!
级别: 论坛版主
显示用户信息 
1  发表于: 2009-05-24 14:33
这个BUG是你测试出来的,怎么叫转呢    

汇报另外一个BUG:mysql-5.1.31版本无法正常复制TRUNCATE TABLE 语句

在MASTER上执行了,SLAVE上的数据依然存在......


另外说下,大数据量写入的情况,INSERT INTO tablename SELECT ......方式

可能会造成的延迟严重,我发布一个项目的时候,等了3分钟,还没看到数据,以为出问题了,就两边做,导致出现 主健冲突....


大家还是要有耐心哦!
From:浙江省杭州市 顶端
eugene 离线
宁静致远,淡泊明知!
级别: 论坛版主
显示用户信息 
2  发表于: 2009-05-24 14:56
另外一件事情,千万别让磁盘写慢了,否则会造成,线程无法kill掉,只有重新启动mysql
From:浙江省杭州市 顶端
awifnkgtn28 离线
级别: 新手上路
显示用户信息 
3  发表于: 2010-08-19 21:26
就算和你没有结局,我还是喜欢你。

     我想忘记你,可做不到.....
  其实你并不是完美得无可替代,
  你永远是不懂我的心思
  不知道我为什么会因为一件小事
  就能开心一整天
  也不知道我为什么会因为一句话
  而难过好多天
  不懂我的任性
  我的乱发脾气
  我的恨从哪里来?
  为什么我总是有那么多脾气
  总是那么斤斤计较
  总是那么不懂事
  其实所有的所有
  只是因为爱你
  心里全部都是你
  你能够活在一个没有我的世界
  而我却只能活在一个只有你的天空
  谁让我先动了情
  谁让我爱上了一个不爱我的人
  所以在这场比赛里
  我就注定是输家
  但是我就是爱你爱得无可救药,
  即使你的心里根本没有我的位置
  然而,你知道吗?
  这辈子最大的幸运就是认识你,而最大的不幸却是不能拥有你,可是你却不会遇到第2个像我这么爱你的人。
  在错的时间遇上对的人是一场伤,在对的时间遇上错的人是一声叹息,在对的时间遇上对的人是一生的幸福,你是幸福的吗?
  如果爱你是错,我情愿一错再错。选择你所爱的,然后爱你所选择的。
  爱你,却不能与你长相厮守,这是一种痛苦,等你却不知道结局,这是一种无耐,但求此刻能拥有你,但求此生能与你在一起!
  不再相见并不一定等于分离,不再通讯也不一定等于忘记,因为你的幸福和快乐,会是我一直的期盼。别把我忘了,请让我占据你心中唯一我的地盘,好吗?
  爱你,却要无欲无求,好难!爱你却要偷偷摸摸,好累!爱你却让自己心碎,好惨!但竟然心甘情 愿,好傻!
  想起你,我的心就有说不出的痛,你是否知道?我能感到你的痛因为你在我的心中,不知远方的你现在还好吗?
  很爱你才会怕明天一切都更改,在乎你才会经不起任何小小的伤害。
  如果有一天,当你想起有谁爱过你,那其中一定有我一个,如果有一天,没有人爱你了,那一定是我死了。
  有一些人,有些感情,错过了一次,也许就会错错这整整的一生。
  如果输家可以一直这样爱下去,
  我甘愿成为一个输家,acdsee5.0免费下载
  然后,
  一直这样爱下去,就算和你没有结局,我还是喜欢你.......
  无怨无悔,
  直至心灰意冷....
  不再提起。
From:江苏省盐城市 顶端
快速回复 顶端
内容
HTML 代码不可用
使用签名
Wind Code自动转换

认证码:
验证问题:100-1=?  正确答案:99
按 Ctrl+Enter 直接提交