DRDS运维管理常见指令总结

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

主要包括如下几大类:node

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

1、帮助语句

# SHOW HELPsql

SHOW HELP 语句,展现了DRDS 全部辅助SQL指令及其说明。数据库

 

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

查看规则和节点拓扑类语句以下:缓存

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]bash

使用说明:服务器

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_0一、table_0二、table_0三、table_0四、table_0五、table_0六、table_0七、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 这两列表明的是历史累计数据,更改读写权重的配比后,这几个数值并不能当即反应最新的读写权重配比,需累计一段比较长的时间才行。

 

3、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:指表建立时的其余全部选项。

 

4、统计信息查询类语句

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 指令返回值的含义相同。

 

5、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。

 

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

 

参考资料

1. DRDS运维管理常见指令总结

相关文章
相关标签/搜索