在进程列表中声明“等待表刷新”

Car*_*rlo 7 mysql

如果我尝试在模式中的某些特定表上运行查询(甚至像 select id from table limit 1 一样简单)(其中只有少数有这个问题),我会卡住。查看进程列表时,状态为“等待表刷新”。关于如何解锁这些表以便查询它们的任何建议?

小智 1

对于MySQL

  1. 确定导致问题的流程。

    • 此命令将有助于检测处于 D 状态等待磁盘 I/O 的进程:

      watch "ps -eo pid,user,state,command | awk '\$3 == /D/ { print \$0 }'"

    • 您还可以像这样寻找运行时间长的进程:

      SHOW FULL PROCESSLIST\G

  2. 修复您之前检测到的进程或相关查询。

  3. 如果需要杀死检测到的进程,可以使用之前的完整进程列表找到它们的 id 并执行命令:KILL <pid>;

如果您想修复 SQL 的相同问题

  1. 查找导致问题的进程。此查询将列出它们:
SELECT TOP 20
    qs.sql_handle,
    qs.execution_count,
    qs.total_worker_time AS Total_CPU,
    total_CPU_inSeconds = --Converted from microseconds
        qs.total_worker_time/1000000,
    average_CPU_inSeconds = --Converted from microseconds
        (qs.total_worker_time/1000000) / qs.execution_count,
    qs.total_elapsed_time,
    total_elapsed_time_inSeconds = --Converted from microseconds
        qs.total_elapsed_time/1000000,
    st.text,
    qp.query_plan
FROM
    sys.dm_exec_query_stats AS qs
CROSS APPLY 
    sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS APPLY
    sys.dm_exec_query_plan (qs.plan_handle) AS qp
ORDER BY 
    qs.total_worker_time DESC
Run Code Online (Sandbox Code Playgroud)
  1. 修复您之前检测到的进程或相关查询。

  2. 如果需要杀死检测到的进程,可以使用之前的完整进程列表找到它们的 id 并执行命令:

KILL <SPID>
GO
EXEC sp_who2
GO
Run Code Online (Sandbox Code Playgroud)

您可以在以下来源问题/答案/评论中找到更多替代方案和详细信息:

https://serverfault.com/questions/316922/how-to-detect-the-process-and-mysql-query-that-makes-high-load-on-server 如何找出是什么在影响我的 SQL Server ?

您还可以使用分步 SQL 相关文章:https://www.wearediagram.com/blog/termination-sql-server-blocking-processes