如何解决是什么导致等待表级锁定错误?
- 进程 ID 42686 表示它准备执行 SELECT 查询
- 有一些休眠连接
- 所有其他进程无法获取表锁
- 我本来希望 UPDATE、DELETE 或 INSERT 来执行锁定。没有声称对相关表的所有权。
- 在进程 ID 42686 中看不到完整的查询,但我怀疑它涉及
JOIN
、GROUP BY
或ORDER BY
工作原理
如果你给我的进程列表用完了磁盘空间,那么我们可以把责任归咎于 MyISAM 存储引擎。为什么?
在您的特定情况下,它不是您的一张桌子。如果正在执行 a JOIN
, GROUP BY
, orORDER BY
并且正在将临时表写入磁盘(在磁盘临时表上使用 MyISAM 存储引擎),则 MySQL 会在空间不足时冻结。我怎么知道?
如果在向 MyISAM 表添加行时磁盘空间不足,则不会发生错误。服务器暂停操作,直到空间可用,然后完成操作。
建议
建议 #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
解决方法
我们已经让数据库挂了两次,并试图找到原因。
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 引擎的表。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。