searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

MySQL添加索引导致表锁死解决方案

2023-05-29 02:07:48
51
0

场景:在给一张有几万条记录的表添加索引时,进度非常慢,导致其它查询无法进行

处理方式:

  1. 命令行模式下,执行以下命令:
show processlist;

这时会看到有哪些线程正在执行,也可以查看锁表的线程。你会发现alter table * add key ****那个线程状态是Waiting for table metadata lock,后面有个这个表的所有操作都是这个状态,很明显是这条加索引的语句把表给锁了。

  1. 查看线程ID,执行
kill 线程ID;

这样被锁住的表就能立即被使用了。

拓展2:

如果数据库中有锁的话,我们可以使用这条语句来查看运行的所有事务:

select * from information_schema.innodb_trx;

也能得到 trx_mysql_thread_id 为线程ID;

结论:

  1. 当一张表数据量很大时,不要轻易添加索引,会导致表被锁死!
  2. 如果非要添加,那么应该先把数据表进行备份,然后进行空表添加索引。
0条评论
0 / 1000
邱****先
5文章数
0粉丝数
邱****先
5 文章 | 0 粉丝
原创

MySQL添加索引导致表锁死解决方案

2023-05-29 02:07:48
51
0

场景:在给一张有几万条记录的表添加索引时,进度非常慢,导致其它查询无法进行

处理方式:

  1. 命令行模式下,执行以下命令:
show processlist;

这时会看到有哪些线程正在执行,也可以查看锁表的线程。你会发现alter table * add key ****那个线程状态是Waiting for table metadata lock,后面有个这个表的所有操作都是这个状态,很明显是这条加索引的语句把表给锁了。

  1. 查看线程ID,执行
kill 线程ID;

这样被锁住的表就能立即被使用了。

拓展2:

如果数据库中有锁的话,我们可以使用这条语句来查看运行的所有事务:

select * from information_schema.innodb_trx;

也能得到 trx_mysql_thread_id 为线程ID;

结论:

  1. 当一张表数据量很大时,不要轻易添加索引,会导致表被锁死!
  2. 如果非要添加,那么应该先把数据表进行备份,然后进行空表添加索引。
文章来自个人专栏
技术开发
5 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0