一、帮助语句
SHOW HELP
SHOW HELP 语句,展示了DRDS 所有辅助SQL指令及其说明。
二、查看规则和节点拓扑类语句
SHOW RULE [FROM TABLE_NAME]
- show rule: 查看数据库下每一个逻辑表拆分情况。
- show rule from table_name: 查看数据库下指定逻辑表的拆分情况。
输出信息列详解:
- TABLE_NAME::逻辑表的名称。
- BROADCAST:是否为广播表(0否、1是)。
- DB_PARTITION_KEY:分库的拆分键,没有分库的话,值为空。
- DB_PARTITION_POLICY:分库的拆分策略,取值包括哈希或YYYYMM、YYYYDD、YYYYWEEK等日期策略。
- DB_PARTITION_COUNT:分库数,默认是8。
- TB_PARTITION_KEY:分表的拆分键,没有分表的话,值为空。
- TB_PARTITION_POLICY:分表的拆分策略,取值包括哈希或MM、DD、MMDD、WEEK等日期策略。
- TB_PARTITION_COUNT:分表数。
SHOW FULL RULE[FORM TABLE_NAME]
查看数据库下逻辑表的拆分规则,比SHOW FULE指令展示的信息更加详细
输出信息列详解:
- TABLE_NAME:逻辑表的名称。
- BROADCAST:是否为广播表(0否、1是)。
- JOIN_GROUP:保留字段
- ALLOW_FULL_TABLE_SCAN:分库分表在没有指定分表键值的情况下是否允许查询数据,如果配置为true,此时需要扫描每一个物理表来查找符合条件的数据,简称为全表扫描。
- DB_NAME_PATTERN:{}之间的0为占位符,执行具体的SQL时会被 DB_RULES_STR 计算出的值替代,并保持位数。比如 DB_NAME_PATTERN 的值为 SEQ_{0000}_RDS,DB_RULES_STR 的值为[1,2,3,4],则会产生4个 DB_NAME,分别为 SEQ_0001_RDS、SEQ_0002_RDS、SEQ_0003_RDS、SEQ_0004_RDS。
- DB_RULES_STR:具体的分库规则。
- TB_NAME_PATTERN:TB_NAME_PATTERN 中 {} 之间的 0 为占位符,执行具体的 SQL 时会被 TB_RULES_STR计算出的值替代,并保持位数。比如,TB_NAME_PATTERN 的值为 table_{00},TB_RULES_STR 的值为[1,2,3,4,5,6,7,8],则会产生8张表,分别为table_01、table_02、table_03、table_04、table_05、table_06、table_07、table_08。
- TB_RULES_STR:分表规则。
- PARTITION_KEYS:分库和分表键集合,对于既分库又分表的情形,分库键在前,分表键在后。
- DEFAULT_DB_INDEX:单库单表存放的分库。
SHOW TOPOLOGY FROM TABLE_NAME
查看指定逻辑表的拓扑分布,展示该逻辑表保存在哪些分库中,每个分库下包含哪些分表。
输出信息列详解:
- GROUP_NAME:物理库的名称。
- TABLE_NAME:物理表的名称。
SHOW PARTITIONS FROM TABLE_NAME
查看分库分表键集合,分库键和分表键之间用逗号分隔。如果最终结果有两个值,说明是既分库又分表的情形,第一个是分库键,第二个是分表键。如果结果只有一个值,说明是分库不分表的情形,该值是分库键。
SHOW BROADCASTS
查看广播表列表。
SHOW DATASOURCES
查看底层存储信息,包含数据库名、数据库分组名、连接信息、用户名、底层存储类型、读写权重、连接池信息等。
输出信息列详解:
- SCHEMA:数据库名
- GROUP:数据库分组名,分组的目标是管理多组数据完全相同的数据库,比如通过 RDS进行数据复制后的主备数据库。主要用来解决读写分离,主备切换的问题。
- URL:底层 RDS的连接信息。
- TYPE:底层存储类型,目前只支持 mysql
- READ_WEIGHT:读权重,在主实例的读压力比较大的时候,可以通过 DRDS 读写分离功能将读流量进行分流,减轻 RDS 主实例的压力。DRDS 会自动识别读写流量,引导写流量进入 RDS 主实例,读流量则按配置的权重流向所有 RDS 实例。
- WRITE_WEIGHT:写权重。
SHOW NODE
查看物理库的读写次数(历史累计数据)、读写权重(历史累计数据)。
输出信息列详解:
- NAME:数据库名称。
- MASTER_READ_COUNT:RDS 主实例处理的只读查询次数(历史累计数据)
- SLAVE_READ_COUNT:RDS 备实例处理的只读查询次数(历史累计数据)
- MASTER_READ_PERCENT:RDS 主实例处理的只读查询占比(注意该列显示的是累计的实际数据占比,并不是用户配置的百分比)
- SLAVE_READ_PERCENT:RDS 备实例处理的只读查询占比(注意该列显示的是累计的实际数据占比,并不是用户配置的百分比)
注意:
事务中的只读查询会被发送到 RDS 主实例。
由于 MASTER_READ_PERCENT,SLAVE_READ_PERCENT 这两列代表的是历史累计数据,更改读写权重的配比后,这几个数值并不能立即反应最新的读写权重配比,需累计一段比较长的时间才行。
三、SQL 调优类语句
SHOW [FULL] SLOW [WHERE expr] [limit expr]
执行时间超过 1 秒的 SQL 语句是慢 SQL,逻辑慢 SQL 是指应用发送到 DRDS 的慢 SQL。
SHOW SLOW
查看自DRDS启动或者自上次执行CLEAR SLOW以来最慢的 100 条逻辑慢 SQL(注意,这里记录的是最慢的 100 个,缓存在 DRDS 系统中,当实例重启或者执行 CLEAR SLOW 时会丢失)。
SHOW FULL SLOW
查看自实例启动以来记录的所有逻辑慢 SQL(持久化到 DRDS 的内置数据库中)。该记录数有一个上限(具体数值跟购买的实例规格相关),DRDS 会滚动删除比较老的慢 SQL 语句。实例的规格如果是4C4G 的话,最多记录 10000 条慢 SQL 语句(包括逻辑慢 SQL 和 物理慢 SQL两种);实例的规格如果是 8C8G的话,最多记录 20000 条慢 SQL 语句(包括逻辑慢 SQL 和 物理慢 SQL),其它规格依此类推。
输出信息列详解:
- HOST:来源 IP
- START_TIME:执行开始时间
- EXECUTE_TIME:执行时间
- AFFECT_ROW:对于 DML 语句是影响行数;对于查询语句是返回的记录数
show slow where execute_time > 1000
3.1 排查 DRDS 慢 SQL
在 DRDS 中,一条 SQL 语句会在 DRDS 和 RDS 节点上逐步执行。任意节点上的执行损耗过大都会导致慢SQL。
慢 SQL 的一般排查步骤为:
定位慢 SQL
定位性能损耗节点
定位性能损耗原因并处理
3.2 定位慢 SQL
定位慢 SQL 一般有两种场景:历史信息可从慢 SQL 记录中查询;实时慢 SQL 执行信息可使用 SHOW PROCESSLIST 指令展示。
查看慢 SQL 记录
执行以下指令查询慢 SQL Top 10。此查询针对 DRDS 层面的逻辑 SQL 。一个逻辑 SQL 对应一个或者多个RDS 库表的 SQL 执行。
SHOW SLOW limit 10
查看当前实时 SQL 执行信息
如果当前服务器中正在执行的 SQL 比较慢,可以使用 SHOW PROCESSLIST 指令来查看当前 DRDS 数据库中实时的执行信息。其中 TIME 列代表的是该 SQL 已经执行的时间。
SHOW PROCESSLIST WHERE COMMAND != 'Sleep'
输出信息列详解:
- ID:连接标识。
- USER:执行该 SQL 的分库用户名。
- DB:指定的数据库,如果没有指定则为 NULL。
- COMMAND:正在执行的命令类型。SLEEP 代表空闲连接。
- TIME:SQL 已执行的时间,单位是秒。
- STATE:当前的执行状态。
- INFO:正在执行的 SQL 语句,有可能因为过长而无法完全显示,此时可以结合业务参数等信息把完整 SQL推导出来。
3.3 定位性能损耗节点
从慢 SQL 记录或者实时 SQL 执行信息中定位到慢 SQL 后,可以执行 TRACE 指令跟踪该 SQL 在 DRDS 和RDS 上的运行时间,以便定位瓶颈。TRACE 命令会实际执行 SQL,在执行过程中记录所有节点消耗的时间,并返回执行结果。
TRACE SELECT SQL_STATEMENT
TRACE 指令执行完毕后,可以执行 SHOW TRACE 命令查看结果,根据每个组件的时间消耗来判断慢 SQL 的瓶颈。
SHOW TRACE
SHOW TRACE 返回的结果中,根据 TIME_COST (单位毫秒)列可以判断哪个节点上的执行时间消耗大。同时可以看到对应的 GROUP_NAME (即 DRDS/RDS 节点),以及 STATEMENT 列信息(即正在执行的 SQL)。通过GROUP_NAME 是否等于 DRDS 可以判断该慢节点存在于 DRDS 还是 RDS。
3.4 定位性能损耗原因并处理
DRDS 慢节点处理
当慢 GROUP_NAME 是 DRDS 时,请检查执行过程中是否存在 Merge Sorted、Temp Table Merge、Aggregate等计算耗时操作。
RDS 慢节点处理
当慢节点在 RDS 时,请检查该 SQL 语句在 RDS 上的执行计划。
在 DRDS 中,可以使用 /!TDDL:node={GROUP_NAME}*/ EXPLAIN 来查看某个 RDS 的执行计划。执行计划展示了 RDS 执行该 SQL 的过程信息,包括表间关联及索引信息等。
详细过程如下:
依据 GROUP_NAME 组装 HINT:/!TDDL:node=’TEST_123__TEST_123__RDS’*/
将组装好的 HINT 及带 EXPLAIN 前缀的 STATEMENT 拼装成新的 SQL 并执行。EXPLAIN 指令不会真正执行,而只是显示该 SQL 的执行计划信息。
SHOW [FULL] PHYSICAL_SLOW [WHERE expr] [limit expr]
执行时间超过1秒的 SQL 语句是慢 SQL,物理慢 SQL 是指 DRDS 发送到 RDS 的慢 SQL
SHOW PHYSICAL_SLOW
查看自 DRDS 启动或者上次执行CLEAR SLOW以来最慢的 100 条物理慢 SQL(注意,这里记录的是最慢的100 个,缓存在 DRDS 系统中,当实例重启或者执行 CLEAR SLOW 时会丢失)
SHOW FULL PHYSICAL_SLOW
查看实例启动以来记录的所有物理慢 SQL(持久化到 DRDS 的内置数据库中)。该记录数有一个上限(具体数值跟购买的实例规格相关),DRDS 会滚动删除比较老的慢 SQL 语句。实例的规格如果是 4C4G 的话,最多记录 10000 条慢 SQL 语句(包括逻辑慢 SQL 和 物理慢 SQL);实例的规格如果是 8C8G 的话,最多记录20000 条慢 SQL 语句(包括逻辑慢 SQL 和 物理慢 SQL),其它规格依此类推
输出信息列详解:
- GROUP_NAME:数据库分组。
- START_TIME:执行开始时间。
- EXECUTE_TIME:执行时间。
- AFFECT_ROW:对于 DML 语句是影响行数;对于查询语句是返回的记录数。
CLEAR SLOW
清空自 DRDS 启动或者上次执行CLEAR SLOW以来最慢的 100 条逻辑慢 SQL 和 最慢的 100 条物理慢 SQL。注意:SHOW SLOW 和 SHOW PHYSICAL_SLOW展示的是最慢的100个 SQL,如果长时间未执行CLEAR SLOW,可能都是非常老的 SQL 了,一般执行过 SQL 优化之后,建议都执行下CLEAR SLOW,等待系统运行一段时间,再查看下慢 SQL 的优化效果。
EXPLAIN DETAIL SQL
查看指定 SQL 在 DRDS 层面的执行计划,注意这条 SQL 不会实际执行。
EXPLAIN EXECUTE SQL
查看底层存储的执行计划,等同于 MYSQL 的 EXPLAIN 语句。
TRACE SQL 和 SHOW TRACE
查看具体 SQL 的执行情况。TRACE [SQL] 和 SHOW TRACE 要结合使用。注意 TRACE SQL 和 EXPLAIN SQL 的区别在于 TRACE SQL 会实际执行该语句。
CHECK TABLE table_name
对数据表进行检查。主要用于 DDL 建表失败的情形。
对于拆分表,检查底层物理分表是否有缺失的情况,底层的物理分表的列和索引是否是一致。
对于单库单表,检查表是否存在。
SHOW TABLE STATUS LIKE ‘pattern’
获取表的信息,该指令聚合了底层各个物理分表的数据。
重要列详解:
- NAME:表名称。
- ENGINE:表的存储引擎。
- VERSION:表的存储引擎的版本。
- ROW_FORMAT:行格式,主要是 Dynamic、Fixed、Compressed 这三种格式。动态(Dynamic)行的行长度可变,例如 VARCHAR 或 BLOB 类型字段;固定(Fixed)行是指行长度不变,例如 CHAR 和 INTEGER 类型字段。
- ROWS:表中的行数。
- AVG_ROW_LENGTH:平均每行包括的字节数。
- DATA_LENGTH:整个表的数据量(单位:字节)。
- MAX_DATA_LENGTH:表可以容纳的最大数据量。
- INDEX_LENGTH:索引占用磁盘的空间大小。
- CREATE_TIME:表的创建时间。
- UPDATE_TIME:表的最近更新时间。
- COLLATION:表的默认字符集和字符排序规则。
- CREATE_OPTIONS:指表创建时的其他所有选项。
四、统计信息查询类语句
SHOW [FULL] STATS
查看整体的统计信息,这些信息都是瞬时值。注意不同版本的 DRDS SHOW FULL STATS的结果是有区别的。
重要列说明:
- QPS:逻辑 QPS。
- RDS_QPS:物理 QPS。
- ERROR_PER_SECOND:每秒的错误数,包含语法错误,主键冲突等等所有异常。
- VIOLATION_PER_SECOND:每秒的主键或者唯一键冲突。
- MERGE_QUERY_PER_SECCOND:通过分库分表,从多表中进行的查询。
- ACTIVE_CONNECTIONS:正在使用的连接。
- CONNECTION_CREATE_PER_SECCOND:每秒创建的连接数。
- RT(MS):逻辑 RT(响应时间)。
- RDS_RT(MS):物理 RT。
- NET_IN(KB/S):DRDS 收到的网络流量。
- NET_OUT(KB/S):DRDS 输出的网络流量。
- THREAD_RUNNING:正在运行的线程数。
- HINT_USED_PER_SECOND:每秒带 HINT 的查询的数量。
- HINT_USED_COUNT:启动到现在带 HINT 的查询总量。
- AGGREGATE_QUERY_PER_SECCOND:每秒聚合查询的频次。
- AGGREGATE_QUERY_COUNT:聚合查询总数(历史累计数据)。
- TEMP_TABLE_CREATE_PER_SECCOND:每秒创建的临时表的数量。
- TEMP_TABLE_CREATE_COUNT:启动到现在创建的临时表总数量。
- MULTI_DB_JOIN_PER_SECCOND:每秒跨库 JOIN 的数量。
- MULTI_DB_JOIN_COUNT:启动到现在跨库 JOIN 的总量。
SHOW DB STATUS
用于查看物理库容量/性能信息,所有返回值为实时信息。容量信息通过 MySQL 系统表获得,与真实容量情况可能有差异。
重要列说明:
- NAME: 代表一个 DRDS DB,此处显示的是 DRDS 内部标记,与 DRDS DB 名称不同。
- CONNECTION_STRING: 分库的连接信息。
- PHYSICAL_DB: 分库名称,TOTAL 行代表一个数据库实例下所有 DRDS 分库容量的总和。
- SIZE_IN_MB: 分库中数据占用的空间,单位为 MB。
- RATIO: 单个分库数据量在实例上所有分库总数据量中的占比。
- THREAD_RUNNING: 物理数据库实例当前正在执行的线程情况,各个参数含义与 MySQL SHOW GLOBAL STATUS 指令返回值的含义相同。
五、SHOW PROCESSLIST 指令与 KILL 指令
SHOW PROCESSLIST
DRDS 中,可以使用 SHOW PROCESSLIST 指令查看 DRDS 中的连接与正在执行的 SQL 等信息。
重要列说明:
- ID:连接的 ID,为一个 Long 型数字。
- USER:建立此连接所使用的用户名。
- HOST:建立此连接的机器的 IP 与端口。
- DB:此连接所访问的库名。
- COMMAND,目前有两种取值:Query,代表当前连接正在执行 SQL 语句。Sleep,代表当前连接正处于空闲状态。TIME, 连接处于当前状态持续的时间:当 COMMAND 为 Query 时,代表当此连接上正在执行的 SQL 已经执行的时间。当 COMMAND 为 Sleep 时,代表当此连接空闲的时间。STATE:目前无意义,恒为空值。
- INFO:当 COMMAND 为 Query 时,为此连接上正在执行的 SQL 的内容。当不带 FULL 参数时,最多返回正在执行的 SQL 的前 30 个字符。当带 FULL 参数时,最多返回正在执行的 SQL 的前1000个字符。当 COMMAND 为其他值时,无意义,为空值。
SHOW PHYSICAL_PROCESSLIST
DRDS 中,可以使用 SHOW PHYSICAL_PROCESSLIST 指令查看底层所有 MySQL/RDS 上正在执行的 SQL 信息。
语法:
SHOW [FULL] PHYSICAL_PROCESSLIST
当 SQL 比较长的时候,SHOW PHYSICAL_PROCESSLIST 会截断,这时可以使用 SHOW FULL PHYSICAL_PROCESSLIST 获取完整 SQL。
返回结果中每一列的含义与 MySQL 的 SHOW PROCESSLIST 指令等价。
KILL
KILL 指令用于终止一个正在执行的 SQL。
DRDS 使用 DRDS 在 MySQL/RDS 上创建的用户名连接 MySQL/RDS,所以一般直接连接MySQL/RDS 是没有权限对 DRDS 发起的请求进行 KILL 操作的。
如果需要终止一个 DRDS 上正在执行的 SQL,需要使用 MySQL 命令行、DMS 等工具连接 DRDS,在 DRDS上执行 KILL 指令
语法:
KILL PROCESS_ID | 'PHYSICAL_PROCESS_ID' | 'ALL'
有三种用法:
终止一个特定的逻辑 SQL: KILL PROCESS_ID。
PROCESS_ID 为 SHOW [FULL] PROCESSLIST 指令返回的 ID 列。
DRDS 中,KILL PROCESS_ID 指令会将此连接正在执行的逻辑 SQL 与物理 SQL 均终止掉,并断开此连接。
DRDS 不支持 KILL QUERY 指令。
终止一个特定的物理 SQL: KILL 'PHYSICAL_PROCESS_ID'。
其中的 PHYSICAL_PROCESS_ID 来自SHOW PHYSICAL_PROCESS_ID指令返回的 ID 列。
注意:由于 PHYSICAL_PROCESS_ID 列为一个字符串,并非一个数字,因此 KILL 指令中,PHYSICAL_PROCESS_ID 需要使用单引号括起来。
终止当前库上所有通过 DRDS 执行的物理SQL: KILL 'ALL'。
当底层 MySQL/RDS 因为一些 SQL 导致压力非常大的时候,可以使用 KILL 'ALL' 指令终止当前 DRDS 库上所有正在执行的物理 SQL。
符合以下条件的物理 PROCESS 会被KILL 'ALL'指令终止:
该 PROCESS 的 User 是 DRDS 在 MySQL/RDS 上所创建的用户名。
该 PROCESS 正在执行查询,也即 COMMAND 为 Query。
六、DRDS 慢SQL明细
DRDS 将执行时间超过1秒的 SQL 定义为慢 SQL。DRDS 中的慢 SQL 分为两种:逻辑慢 SQL 和 物理慢SQL。
逻辑慢 SQL:应用发送到 DRDS 的 慢SQL。
物理慢 SQL:DRDS 发送到 RDS 的 慢SQL。
实例规格为 2C2G 的实例会记录 5000 条慢 SQL 明细,实例规格为 4C4G 的实例,会记录 10000 条慢 SQL明细。DRDS 会滚动删除超过限制数量的慢 SQL 明细。
语法:
SHOW FULL {SLOW | PHYSICAL_SLOW} [WHERE where_condition]
[ORDER BY col_name [ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
解释
SHOW FULL SLOW显示的是逻辑慢 SQL,即应用发送到 DRDS 的 SQL。
其中SHOW FULL SLOW的结果集会包含以下列,其含义如下:
TRACE_ID: 该 SQL 的唯一标记,同一个逻辑 SQL 以及该逻辑 SQL 产生的物理 SQL 的 TRACE_ID 相同,同时TRACE_ID 也会以注释的形式发送到 RDS,在 RDS 的 SQL 明细中可以根据 TRACE_ID 找到该 SQL。
HOST: 发送该 SQL 的客户端的 IP,注意:在 VPC 模式下可能无法获取客户端 IP。
START_TIME: DRDS 收到这个 SQL 的时间。
EXECUTE_TIME: DRDS 执行该 SQL 消耗的时间。
AFFECT_ROW: 该 SQL 返回的记录数或者影响的行数。
SQL: 执行的语句。
SHOW FULL PHYSICAL_SLOW指的是物理慢 SQL,即 DRDS 发送到 RDS(MySQL) 的 SQL。
SHOW FULL PHYSICAL_SLOW 的结果集会包含以下列,其含义如下:
TRACE_ID: 该 SQL 的唯一标记,同一个逻辑 SQL 以及该逻辑 SQL 产生的物理 SQL 的 TRACE_ID 相同,同时 TRACE_ID 也会以注释的形式发送到 RDS,在 RDS 的 SQL 明细中可以根据 TRACE_ID 找到该 SQL。
GROUP_NAME: 数据库分组名,分组的目标是管理多组数据完全相同的数据库,比如通过 RDS(MySQL)进行数据复制后的主备数据库,主要用来解决读写分离,主备切换的问题。
DBKEY_NAME: 执行的分库信息。
START_TIME: DRDS 开始执行这个 SQL 的时间。
EXECUTE_TIME: DRDS 执行该 SQL 消耗的时间。
SQL_EXECUTE_TIME: DRDS 调用 RDS 执行该 SQL 消耗的时间。
GETLOCK_CONNECTION_TIME: DRDS 从连接池获取连接消耗的时间,该值如果很大,说明 RDS 的连接已被耗尽,一般是慢 SQL 比较多引起,登录到相应的 RDS,结合SHOW PROCESSLIST指令来排查。
CREATE_CONNECTION_TIME: DRDS 建立 RDS 连接消耗的时间,该值如果很大,很大原因是底层的 RDS 压力比较大或者挂掉了。
AFFECT_ROW: 该 SQL 返回的记录数或者影响的行数。
SQL: 执行的语句。