mysql之表锁定问题

背景

今天在mysql数据库中执行了一个错误的语句,导致mysql执行窗口直接宕了,毫无反应。但该数据的其他表操作都是正常的。

因此判断是这张表被锁定了。

排查与解决

可以先查看当前的所有进程:

1
SHOW PROCESSLIST

MYSQL表锁定

发现有一个进程一直在查询,删除进程:

1
2
3
4
KILL 568

受影响的行: 0
时间: 0.005s

删除之后,再次运行对该表的操作,发现仍然卡死状态。

但此时再次查看进程,已经没有了。

通过搜索,若存在未提交的事务也会导致表被锁死。

切换到mysql的root用户,查看是否有未提交事务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
select * from information_schema.innodb_trx;
+-----------------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+-------
--------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+--------------
-----------+---------------------+-------------------+------------------------+----------------------------+---------------------------+--------------
-------------+------------------+----------------------------+
| trx_id | trx_state | trx_started | trx_requested_lock_id | trx_wait_started | trx_weight | trx_mysql_thread_id | trx_query | trx_op
eration_state | trx_tables_in_use | trx_tables_locked | trx_lock_structs | trx_lock_memory_bytes | trx_rows_locked | trx_rows_modified | trx_concurren
cy_tickets | trx_isolation_level | trx_unique_checks | trx_foreign_key_checks | trx_last_foreign_key_error | trx_adaptive_hash_latched | trx_adaptive_
hash_timeout | trx_is_read_only | trx_autocommit_non_locking |
+-----------------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+-------
--------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+--------------
-----------+---------------------+-------------------+------------------------+----------------------------+---------------------------+--------------
-------------+------------------+----------------------------+
| 281475149994912 | RUNNING | 2019-07-31 13:59:08 | NULL | NULL | 0 | 407 | NULL | NULL
| 0 | 0 | 0 | 1136 | 0 | 0 |
0 | REPEATABLE READ | 1 | 1 | NULL | 0 |
0 | 0 | 0 |
+-----------------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+-------
--------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+--------------
-----------+---------------------+-------------------+------------------------+----------------------------+---------------------------+--------------
-------------+------------------+----------------------------+
1 row in set (0.00 sec)

发现有一个未提交事务,进程id为407。

删除该进程:

1
2
mysql> kill 407;
Query OK, 0 rows affected (0.00 sec)

在查询一次未提交事务:

1
2
mysql> select * from information_schema.innodb_trx;
Empty set (0.00 sec)

此时再对该表进行操作,恢复正常了。

总结

当数据库某张表出现卡死等待的异常时,可以参考如下两步排查:

  • 检查是否有卡死的进程,有的话,结束进程。

    1
    SHOW PROCESSLIST
  • 检查是否有未提交的事务,有的话,结束进程。

    1
    select * from information_schema.innodb_trx;