mysql更新数据导致锁表怎么解决?

XIAO 2020-05-16 15:22:30 java常见问答 4177

我们平时在使用mysql数据库时可能会遇到各种各样的小问题,这是很正常的,比如说mysql更新数据库导致锁表了,该怎么办呢?

SHOW PROCESSLIST

但是此命令只能显示前100条数据,要想看全部的数据的话,请输入:

SHOW FULL PROCESSLIST

下面这个命令里面最关键的就是state列了,mysql列出的状态主要是有以下几种的:

Checking table

正在检查数据表。

Closing tables

正在将表中修改的数据会刷新到磁盘中,同时会正在关闭已经用完的表。

Connect Out

复制从服务器正在连接主服务器。

Copying to tmp table on disk

正在创建临时表用来存放部分查询结果。

deleting from main table

服务器正在执行多表删除中的第一部分,刚删除第一个表。

deleting from reference tables

正在执行FLUSH TABLES,等待其他线程关闭数据表。

Killed

被其他查询锁住了。

Sending data

下面正在处理SELECT查询的记录,同时正在把结果发送给客户端。

Sorting for group

正在为GROUP BY做排序。

Sorting for order

正在为ORDER BY做排序。

Opening tables

这个过程应该会很快,除非受到其他因素的干扰。

Removing duplicates

正在执行一个SELECT DISTINCT方式的查询,但是MySQL无法在前一个阶段优化掉那些重复的记录。因此,MySQL需要再次去掉重复的记录,然后再把结果发送给客户端。

Reopen table

获得了对一个表的锁,但是必须在表结构修改之后才能获得这个锁。已经释放锁,关闭数据表,正尝试重新打开数据表。

Repair by sorting

修复指令正在排序以创建索引。

Repair with keycache

修复指令正在利用索引缓存一个一个地创建新索引。它会比Repair by sorting慢些。

Searching rows for update

正在讲符合条件的记录找出来以备更新。它必须在UPDATE要修改相关的记录之前就完成了。

Sleeping

正在等待客户端发送新请求.

System lock

正在等待取得一个外部的系统锁。如果当前没有运行多个mysqld服务器同时请求同一个表,那么可以通过增加--skip-external-locking参数来禁止外部系统锁。

Upgrading lock

INSERT DELAYED正在尝试取得一个锁表以插入新记录。

Updating

正在搜索匹配的记录,并且修改它们。

User Lock

正在等待GET_LOCK()。

Waiting for tables

该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。以下几种情况下会产生这个通知:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE,或OPTIMIZE TABLE。

waiting for handler insert

假如发现锁表进程,请输入kill指令将他剔除

KILL "id"

那么以上就是本篇文章的所有内容了,还想了解更多java常见问答知识吗?如果是的话,赶快来关注本站消息获取吧。

推荐阅读:

mysql更新数据库慢是为什么?如何解决?

mysql性能优化配置,优化方案整理

java数据类型有哪些?该如何定义?