mysql 删除表卡死,或是截断(truncate)卡死解决办法

mysql 删除表卡死,或是截断(truncate)卡死解决办法

利用工具进行truncate表的时候,一直运行,运行了十几分钟也没有成功。中止之后再运行也是一样。但是删除表的数据以及查询表数据都是可以的。猜测是锁死了。

使用

show processlist;

发现Waiting for table metadata lock 问题;

mysql> show processlist;

+-------+-----------------+-----------+------+---------+--------+---------------------------------+-----------------------------------------------------------------------+

| ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO |

+-------+-----------------+-----------+------+---------+--------+---------------------------------+-----------------------------------------------------------------------+

| 1 | event_scheduler | localhost | NULL | Daemon | 365869 | Waiting on empty queue | NULL |

| 13040 | root | localhost | NULL | Query | 0 | executing | select * from information_schema.processlist where command != 'sleep' |

| 13044 | root | localhost | NULL | Query | 4 | Waiting for table metadata lock | truncate table test_; |

+-------+-----------------+-----------+------+---------+--------+---------------------------------+-----------------------------------------------------------------------+

尝试利用 kill 杀死 Waiting for table metadata lock 的线程,但是重新执行 truncate 操作 仍然会报 这个问题。

mysql> kill 13044;

重启一下mysql服务,再去执行命令,还是会报这个问题。。。😒😒😒执行命令查询死锁 SELECT * FROM information_schema.INNODB_TRX/G

mysql> SELECT * FROM information_schema.INNODB_TRX; (这里如果感觉用命令行的时候看不清排版,在后面加/G,变成竖向排版输出)

+------------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+---------------------+

| trx_id | trx_state | trx_started | trx_requested_lock_id | trx_wait_started | trx_weight | trx_mysql_thread_id | trx_query | trx_operation_state | trx_tables_in_use | trx_tables_locked | trx_lock_structs | trx_lock_memory_bytes | trx_rows_locked | trx_rows_modified | trx_concurrency_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 | trx_schedule_weight |

+------------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+---------------------+

| 2234640445 | RUNNING | 2023-03-09 12:26:38 | NULL | NULL | 5 | 0 | NULL | NULL | 0 | 2 | 3 | 1346 | 1 | 2 | 0 | REPEATABLE READ | 1 | 1 | NULL | 0 | 0 | 0 | 0 | NULL |

+------------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+---------------------+

发现trx_mysql_thread_id = 0的不能通过 kill 来进行杀死。如果不为0可直接kill。

如果不能kill,我们需要进行事务回滚操作。

先使用 xa recover 获取XA的事务信息。

mysql> xa recover;

+----------+--------------+--------------+-------------------------------------------+

| formatID | gtrid_length | bqual_length | data |

+----------+--------------+--------------+-------------------------------------------+

| 1 | 39 | 2 | kdisieus-783s-780e-kdsk-bf1eafe7sdd6:5434 |

+----------+--------------+--------------+-------------------------------------------+

根据事务信息,进行回滚操作。按照以下格式进行带入# xa rollback ‘left(data,gtrid_length)’,‘substr(data,gtrid_length+1,bqual_length)’, formatID;

mysql> xa rollback ‘kdisieuns-783s-780e-kdsk-bf1eafe7sdd6:54’,‘34’, 1;

再次执行truncate ,执行成功。

插叙:中间还去mysql的数据存储位置,将这个表直接删除了。但是再去创建这个表的时候发现提示表已经存在。这里猜测是可能是因为事务还在运行,在某个地方还缓存着这个表。

最后将锁死解决之后,查询这个表已经不存在了。但是还是不能创建这个表。报了1030 (HY000): Got error 168 from storage engine错误。

最终从别的地方又将这两个文件导入进来了,在进行drop,然后在create,解决完毕。

可能还有其它办法,欢迎进行评论。

这里不建议修改mysql的一些参数,毕竟在公司的话,参数也都是经过DBA精心设计的。(当然了也有可能都是默认的)。

相关推荐

lol延迟最低加速器推荐,这5款已成uzi打韩服专用
神仙岭(长沙与宁乡界山)
英国beat365官方登录

神仙岭(长沙与宁乡界山)

📅 10-17 👁️ 5448
注销qq要多长时间 注销QQ账号要多久
365网新闻

注销qq要多长时间 注销QQ账号要多久

📅 08-24 👁️ 8765
网红饮料“咔哇潮饮”真是“毒品”吗?
英国beat365官方登录

网红饮料“咔哇潮饮”真是“毒品”吗?

📅 09-20 👁️ 5574
当感觉快晕倒时,记住这几招简单的自救措施
吡虫啉都有哪些优点和缺点?
中爱365APP

吡虫啉都有哪些优点和缺点?

📅 09-24 👁️ 1064
秒账和公司账哪个好用
365网新闻

秒账和公司账哪个好用

📅 09-05 👁️ 1419
江门鮨文(海逸新天地店)好吃吗,鮨文(海逸新天地店)味道怎么样,环境/服务好不好
精灵宝可梦太阳月亮z神制造心得
中爱365APP

精灵宝可梦太阳月亮z神制造心得

📅 08-16 👁️ 4842
严重影响手机寿命!错误的充电方法,有这几种→
英国beat365官方登录

严重影响手机寿命!错误的充电方法,有这几种→

📅 08-07 👁️ 465
1G等于1000兆,还是等于1024兆?
中爱365APP

1G等于1000兆,还是等于1024兆?

📅 09-19 👁️ 3421
《QQ》怎么发起抽奖
365网新闻

《QQ》怎么发起抽奖

📅 07-19 👁️ 6587