DRDS运维管理常见指令总结

DRDS 提供了一系列辅助 SQL 指令帮助用户方便使用 DRDS。

主要包括以下几大类:

  • 帮助语句
  • 查看规则和节点拓扑类语句
  • SQL 调优类语句
  • 统计信息查询类语句
  • SHOW PROCESSLIST 指令和 KILL 指令

一、帮助语句

# SHOW HELP

SHOW HELP 语句,展示了DRDS 所有辅助SQL指令及其说明。

 

二、查看规则和节点拓扑类语句

查看规则和节点拓扑类语句如下:

SHOW RULE [FROM table_name] 语句

SHOW FULL RULE [FROM table_name] 语句

SHOW TOPOLOGY FROM table_name 语句

SHOW PARTITIONS FROM table_name 语句

SHOW BROADCASTS 语句

SHOW DATASOURCES 语句

SHOW NODE 语句

 # 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 [FROM table_name]

查看数据库下逻辑表的拆分规则,比 SHOW RULE 指令展示的信息更加详细。

 

输出信息列详解:

TABLE_NAME:逻辑表的名称

BROADCAST:是否为广播表(0:否,1:是)

JOIN_GROUP:保留字段,暂时无意义

ALLOW_FULL_TABLE_SCAN:分库分表在没有指定分表键值的情况下是否允许查询数据,如果配置为 true,此时需要扫描每一个物理表来查找出符合条件的数据,简称为全表扫描

DB_NAME_PATTERN: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 调优类语句

SQL 调优类语句如下:

SHOW [FULL] SLOW [WHERE expr] [limit expr] 语句

SHOW [FULL] PHYSICAL_SLOW [WHERE expr] [limit expr] 语句

CLEAR SLOW 语句

EXPLAIN SQL 语句

EXPLAIN DETAIL SQL 语句

EXPLAIN EXECUTE SQL 语句

TRACE SQL 和 SHOW TRACE 语句

CHECK TABLE tablename 语句

SHOW TABLE STATUS 语句

 

# SHOW [FULL] SLOW [WHERE expr] [limit expr]

执行时间超过 1 秒的 SQL 语句是慢 SQL,逻辑慢 SQL 是指应用发送到 DRDS 的慢 SQL。

 

# SHOW SLOW

SHOW SLOW: 查看自DRDS启动或者自上次执行CLEAR SLOW以来最慢的 100 条逻辑慢 SQL(注意,这里记录的是最慢的 100 个,缓存在 DRDS 系统中,当实例重启或者执行 CLEAR SLOW 时会丢失)。

 

# SHOW FULL 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:指表创建时的其他所有选项。

 

四、统计信息查询类语句

DRDS 提供以下语句用于查询实时统计信息。

SHOW [FULL] STATS

SHOW DB STATUS

 

# 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: 执行的语句。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章