I / O操作阻止了mysql事务

时间:2010-12-17 10:31:39

标签: mysql locking innodb

这里我们有一个带有MySQL 5.1.47的x64 Debian Lenny和一些InnoDB数据库。 ibdata文件和其他东西在同一个文件系统(ext3)上。我注意到,在某些情况下,MySQL进程列表中有许多进程挂起“释放项目”状态。当我在shell上执行以下操作时会发生这种情况(file1和file2大约是2.5gb)

cat file1 file2 >new_file

或执行以下SQL语句

SELECT 'name' AS col UNION SELECT col FROM db_name.table_name INTO OUTFILE ('/var/xxx/yyy')

当这两件事中的一件正在运行时,我可以看到许多MySQL进程无休止地运行“释放项目”状态(我正在使用innotop)。在杀死此shell进程(或SQL语句)时,这些被阻止的事务将消失。

在互联网上,我发现了一些禁用InnoDB自适应哈希索引和常见查询缓存的提示,但这没有用。是否有人有相同的经历?

此致

3 个答案:

答案 0 :(得分:2)

我们发现启用截止日期的i / o调度程序非常有助于防止我们的数据库在文件系统上的高外部负载期间挨饿。试试

 echo deadline > /sys/block/sda/queue/scheduler

并测试问题是否更小。 (替换您的数据库所在设备的sda

答案 1 :(得分:1)

稍微退一步,你做过一些基本的InnoDB调整吗? MySQL默认值可能非常有限。一个很好的概述:

http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/

答案 2 :(得分:0)

有趣的是:

  • 此服务器上的所有数据库都保存在一个InnoDB文件中(one_file_per_table已禁用)
  • 我们编写了一个小的shell脚本,每秒在此服务器上的新数据库中的新表中插入10行
  • 然后我们通过“cat”(如上所述)并行复制了一些大文件......
  • 和:没有任何事情发生,没有锁,没有无尽的“释放物品”
  • 所以我们更改了shell脚本,将行插入现有数据库中的新表中,导致出现此问题并再次复制文件
  • 和:锁回来了!啊?
  • 最后一次尝试:我们已将服务器本身的“buggy”数据库复制到新数据库(具有完整结构和数据)并再次启动shell脚本
  • 和:没有“释放项目”流程!?

我不明白这种行为:在旧数据库中插入会让这些“释放项目”进程出现,但是插入新数据库(旧数据库的完整副本)可以吗?