是什么导致“等待表级锁定”错误?


8

我们已经使数据库挂起了两次,并试图找到原因。

show processlist
Waiting for global read lock | INSERT INTO {myisam_table} ...

在这里,磁盘空间已满,因此我们认为问题已经解决了,但第二天中午又挂起了:

show processlist
Waiting for table level lock | UPDATE {myisam_table} ... 

是什么原因造成的?

Mysql默认引擎:InnoDB。

数据库混合了MyISAM和InnoDB引擎的表。

日志发布在这里:

http://arturito.net/2013/08/28/mysql-waiting-for-table-level-lock-errors/


这两个事件可能是无关的,因为您一次说过磁盘空间问题,并且由于这是两种不同类型的锁,它们可能是由无关的事情引起的。可能造成两者的一种可能是备份mysqldump。您当时正在运行备份吗?
Michael-sqlbot

所有备份都在上午7:00完成,并且永远不会在工作时间内运行。数据库在午餐时间卡住了。
ArturKędzior13年

如果MyISAM表被锁定在一个数据库会话中,则必须有另一个数据库会话将其锁定。请在下次发生此情况时显示完整的过程清单。
RolandoMySQLDBA 2013年


@Arturito我们可能不需要SHOW FULL PROCESSLISTSHOW PROCESSLIST所以我们可以看到每个线程的整个查询...但是就目前而言,如果MyISAM涉及到表,则看起来像长时间运行的SELECT查询在42686中正在阻塞UPDATE在43506中的查询,这反过来又阻止SELECT了紧随其后的每个查询。
Michael-sqlbot

Answers:


8

初步观察

  • 进程ID 42686表示准备执行SELECT查询
  • 有一些睡觉的联系
  • 所有其他进程无法获取表锁
  • 我本来希望通过UPDATE,DELETE或INSERT来进行锁定。没有声称该表的所有权。
  • 不能看到进程ID 42686完整的查询,但我怀疑这涉及到一个JOINGROUP BYORDER BY

工作理论

如果您用给我的进程列表用完了磁盘空间,那么我们可以将责任归咎于MyISAM存储引擎。为什么?

在您的特定情况下,它不是您的表之一。如果JOINGROUP BY或者ORDER BY正在执行和临时表正在写入到磁盘(磁盘上的临时表使用MyISAM存储引擎)MySQL的简单地冻结的空间时进行。我怎么知道呢?

根据MySQL 5.0认证学习指南

在此处输入图片说明 页面408,409第29.2节的第11点说:

如果在向MyISAM表添加行时磁盘空间不足,则不会发生任何错误。服务器将挂起操作,直到有可用空间,然后再完成操作。

我之前讨论过这种情况

某件事告诉我您有以下两种情况之一

  • SELECT的基于磁盘的临时表,并与常规数据竞争空间
  • 如果临时表/tmp位于根分区中,则空间不足

建议

建议1:将tmpdir映射到另一个磁盘

[mysqld]
tmpdir = /another/disk/besides/root/partition

建议2:创建RAM磁盘

运行此代码以安装将在Linux重新引导时可用的RAM磁盘。

RAMDISK_SIZE=32g
service mysql stop
mkdir /var/tmpfs
echo "none   /var/tmpfs  tmpfs  defaults,size=${RAMDISK_SIZE} 1 2" >> /etc/fstab
mount -t tmpfs -o size=${RAMDISK_SIZE} none /var/tmpfs
cp -R /var/lib/mysql/* /var/tmpfs
mv /var/lib/mysql /var/lib/mysql_old
ln -s /var/tmpfs /var/lib/mysql
chown -R mysql:mysql /var/tmpfs
chown -R mysql:mysql /var/lib/mysql
service mysql start

然后,将tmpdir映射到/var/tmpfs

试试看 !!!


关于RAM磁盘的好建议-要获得很大的速度,就需要大量内存-就像制作SSD一样。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.