为了查询 INFORMATION_SCHEMA.PROCESSLIST
和 INFORMATION_SCHEMA.INNODB_TRX
表,你可以使用以下 SQL 语句。这些查询可以帮助你找到那些正在运行的事务,特别是那些长时间持有锁的事务。
查询 INFORMATION_SCHEMA.PROCESSLIST
这个表包含了所有当前 MySQL 进程的信息,包括每个进程的状态和正在执行的查询。
SELECT
ID,
USER,
HOST,
DB,
COMMAND,
TIME,
STATE,
INFO
FROM
INFORMATION_SCHEMA.PROCESSLIST
WHERE
TIME > 60; -- 你可以调整这个时间阈值
查询 INFORMATION_SCHEMA.INNODB_TRX
这个表包含了所有当前 InnoDB 事务的信息,包括事务的开始时间、事务状态等。
SELECT
trx_id,
trx_state,
trx_started,
trx_requested_lock_id,
trx_wait_started,
trx_weight,
trx_mysql_thread_id,
trx_query
FROM
INFORMATION_SCHEMA.INNODB_TRX
WHERE
trx_state = 'LOCK WAIT' AND
TIMESTAMPDIFF(SECOND, trx_wait_started, NOW()) > 60; -- 你可以调整这个时间阈值
结合两个表的信息
为了更详细地了解哪些事务正在等待锁,你可以将这两个表结合起来查询:
SELECT
p.ID AS process_id,
p.USER,
p.HOST,
p.DB,
p.COMMAND,
p.TIME,
p.STATE,
p.INFO,
t.trx_id,
t.trx_state,
t.trx_started,
t.trx_requested_lock_id,
t.trx_wait_started,
t.trx_weight,
t.trx_mysql_thread_id,
t.trx_query
FROM
INFORMATION_SCHEMA.PROCESSLIST p
JOIN
INFORMATION_SCHEMA.INNODB_TRX t
ON
p.ID = t.trx_mysql_thread_id
WHERE
t.trx_state = 'LOCK WAIT' AND
TIMESTAMPDIFF(SECOND, t.trx_wait_started, NOW()) > 60; -- 你可以调整这个时间阈值
终止事务
如果你确定某个事务需要终止,可以使用 KILL
命令:
KILL <process_id>;
其中 <process_id>
是从 INFORMATION_SCHEMA.PROCESSLIST
中获取的进程 ID。
注意事项
- 在生产环境中使用
KILL
命令时要非常小心,因为这可能会导致数据不一致或其他问题。 - 调整时间阈值以适应你的具体需求。
- 确保你有足够的权限来执行这些查询和终止事务。