全部产品

查询慢SQL记录

更新时间:2020-08-07 21:05:19

PolarDB-X将执行时间超过1秒的SQL定义为慢SQL。PolarDB-X中的慢SQL包括逻辑慢SQL和物理慢 SQL。

  • 逻辑慢SQL:应用发送到PolarDB-X的慢SQL。
  • 物理慢SQL:PolarDB-X发送到RDS的慢SQL。

每个PolarDB-X节点最多保存5000条慢SQL记录,超过限制数量的慢SQL明细会被滚动删除。

语法

  1. SHOW FULL {SLOW | PHYSICAL_SLOW} [WHERE where_condition]
  2. [ORDER BY col_name [ASC | DESC], ...]
  3. [LIMIT {[offset,] row_count | row_count OFFSET offset}]

解释

SHOW FULL SLOW显示的是逻辑慢SQL,即应用发送到PolarDB-X的SQL。

其结果集的各列含义如下:

  • TRACE_ID: 该SQL的唯一标记,同一个逻辑SQL以及该逻辑SQL产生的物理SQL的TRACE\_ID 相同,同时TRACE_ID也会以注释的形式发送到RDS,在RDS的SQL明细中可以根据TRACE_ID找到该SQL。
  • HOST:发送该SQL的客户端的IP,注意:在VPC模式下可能无法获取客户端IP。
  • START_TIME:PolarDB-X收到这个SQL的时间。
  • EXECUTE_TIME:PolarDB-X执行该SQL消耗的时间。
  • AFFECT_ROW:该SQL返回的记录数或者影响的行数。
  • SQL:执行的语句。

SHOW FULL PHYSICAL_SLOW指的是物理慢SQL,即PolarDB-X发送到RDS(MySQL)的SQL。

其结果集的各列含义如下:

  • TRACE_ID:该SQL的唯一标记,同一个逻辑SQL以及该逻辑SQL产生的物理SQL的TRACE_ID相同,同时TRACE_ID也会以注释的形式发送到RDS,在RDS的SQL明细中可以根据TRACE_ID找到该SQL。
  • GROUP_NAME:数据库分组名,分组的目标是管理多组数据完全相同的数据库,比如通过RDS(MySQL)进行数据复制后的主备数据库,主要用来解决读写分离,主备切换的问题。
  • DBKEY_NAME:执行的分库信息;
  • START_TIME:PolarDB-X开始执行这个SQL的时间。
  • EXECUTE_TIME:PolarDB-X执行该SQL消耗的时间。
  • SQL_EXECUTE_TIME:PolarDB-X调用 RDS 执行该SQL消耗的时间。
  • GETLOCK_CONNECTION_TIME:PolarDB-X从连接池获取连接消耗的时间,该值如果很大,说明RDS的连接已被耗尽,一般是慢SQL比较多引起,登录到相应的RDS,结合SHOW PROCESSLIST指令来排查。
  • CREATE_CONNECTION_TIME:PolarDB-X建立RDS连接消耗的时间,该值如果很大,很大原因是底层的 RDS 压力比较大或者挂掉了。
  • AFFECT_ROW:该SQL返回的记录数或者影响的行数。
  • SQL:执行的语句。

使用示例

大部分情况下,PolarDB-X都能以令人满意的方式将SQL下推到MySQL,如果发现慢SQL,有可能是因为物理SQL慢导致的。通过查询逻辑和物理慢SQL日志,可以帮助我们找到问题的原因。

示例一:在PolarDB-X上定位到慢SQL,如何找到相应的物理慢SQL?

  1. 通过一些条件,例如执行时间,SQL字符串匹配等方式来获取我们想要的慢SQL。

    1. mysql> show full slow where `SQL` like '%select sleep(50)%';
    2. +-----------------+-----------+-------------------------+--------------+------------+------------------+
    3. | TRACE_ID | HOST | START_TIME | EXECUTE_TIME | AFFECT_ROW | SQL |
    4. +-----------------+-----------+-------------------------+--------------+------------+------------------+
    5. | ae0e565b8c00000 | 127.0.0.1 | 2017-03-29 19:28:43.028 | 50009 | 1 | select sleep(50) |
    6. +-----------------+-----------+-------------------------+--------------+------------+------------------+
    7. 1 row in set (0.02 sec)
  2. 根据逻辑慢SQL中获取到的TRACE_ID,执行SHOW FULL PHYSICAL_SLOW指令获取这个SQL的物理执行情况;

    1. mysql> show full physical_slow where trace_id = 'ae0e565b8c00000';
    2. +-----------------+----------------------------------------------------+-----------------------------------------------+------------------------+--------------+------------------+-------------------------+------------------------+------------+------------------+
    3. | TRACE_ID | GROUP_NAME | DBKEY_NAME | START_TIME | EXECUTE_TIME | SQL_EXECUTE_TIME | GETLOCK_CONNECTION_TIME | CREATE_CONNECTION_TIME | AFFECT_ROW | SQL |
    4. +-----------------+----------------------------------------------------+-----------------------------------------------+------------------------+--------------+------------------+-------------------------+------------------------+------------+------------------+
    5. | ae0e565b8c00000 | PRIV_TEST_1489167306631PJAFPRIV_TEST_APKK_0000_RDS | rdso6g5b6206sdq832ow_priv_test_apkk_0000_nfup | 2017-03-29 19:27:53.02 | 50001 | 50001 | 0 | 0 | 1 | select sleep(50) |
    6. +-----------------+----------------------------------------------------+-----------------------------------------------+------------------------+--------------+------------------+-------------------------+------------------------+------------+------------------+
    7. 1 row in set (0.01 sec)
  3. 可以在RDS的SQL明细与慢SQL中,根据这个TRACE_ID查看这个SQL在RDS上的执行情况。
    慢SQL明细1

示例二:在RDS中找到一个慢SQL,如何找到PolarDB-X中的原始SQL?

  1. 在RDS的管理控制台 -> 日志管理 -> 慢SQL明细页面中,观察到慢SQL的TRACE_ID为 ae0e55660c00000。
    慢SQL明细2

  2. 根据第一步获取到的TRACE_ID,执行SHOW FULL PHYSICAL_SLOW指令获取这个SQL的物理执行情况。

    1. mysql> show full physical_slow where trace_id = 'ae0e55660c00000';
    2. +-----------------+----------------------------------------------------+-----------------------------------------------+-------------------------+--------------+------------------+-------------------------+------------------------+------------+------------------+
    3. | TRACE_ID | GROUP_NAME | DBKEY_NAME | START_TIME | EXECUTE_TIME | SQL_EXECUTE_TIME | GETLOCK_CONNECTION_TIME | CREATE_CONNECTION_TIME | AFFECT_ROW | SQL |
    4. +-----------------+----------------------------------------------------+-----------------------------------------------+-------------------------+--------------+------------------+-------------------------+------------------------+------------+------------------+
    5. | ae0e55660c00000 | PRIV_TEST_1489167306631PJAFPRIV_TEST_APKK_0000_RDS | rdso6g5b6206sdq832ow_priv_test_apkk_0000_nfup | 2017-03-29 19:27:37.308 | 10003 | 10001 | 0 | 0 | 1 | select sleep(10) |
    6. +-----------------+----------------------------------------------------+-----------------------------------------------+-------------------------+--------------+------------------+-------------------------+------------------------+------------+------------------+
    7. 1 row in set (0.02 sec)