DRDS运维指令详解
帮助语句
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:查看数据库下指定逻辑表的拆分情况。
重要列详解:
BROADCAST:是否为广播表(0:否,1:是)
DB_PARTITION_KEY:分库的拆分键,没有分库的话,值为空
DB_PARTITION_POLICY:分库的拆分策略,取值包括哈希或YYYYMM等日期策略
DB_PARTITION_COUNT:分库数
TB_PARTITION_KEY:分表的拆分键,没有分表的话,值为空
TB_PARTITION_POLICY:分表的拆分策略,取值包括哈希或MM、DD等日期策略
TB_PARTITION_COUNT:分表数
# SHOW FULL RULE [FROM table_name]
查看数据库下逻辑表的拆分规则,比SHOW RULE指令展示的信息更加详细。
重要列详解:
BROADCAST:是否为广播表(:否,1:是)
JOIN_GROUP:保留字段,暂时无意义
ALLOW_FULL_TABLE_SCAN:分库分表在没有指定分表键值的情况下是否允许查询数据,如果配置为1,此时需要扫描每一个物理表来查找出符合条件的数据,简称为全表扫描
DB_NAME_PATTERN:DB_NAME_PATTERN中{}之间的0为占位符,执行SQL时会被DB_RULES_STR计算出的值替代,并保持位数。比如,DB_NAME_PATTERN的值为SEQ__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_,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
查看指定逻辑表的拓扑分布,展示该逻辑表保存在哪些分库中,每个分库下包含哪些分表。
# SHOW PARTITIONS FROM table_name
查看分库分表键集合,分库键和分表键之间用逗号分割。如果最终结果有两个值,说明是既分库又分表的情形,第一个是分库键,第二个是分表键。如果结果只有一个值,说明是分库不分表的情形,该值是分库键。
# SHOW BROADCASTS
查看广播表列表。
# SHOW DATASOURCES
查看底层存储信息,包含数据库名、数据库分组名、连接信息、用户名、底层存储类型、读写权重、连接池信息等。
重要列详解:
SCHEMA:数据库名;
GROUP:数据库分组名。分组的目标是管理多组数据完全相同的数据库,比如通过RDS(MySQL)进行数据复制后的主备数据库。主要用来解决读写分离、主备切换的问题;
URL:底层RDS(MySQL)的连接信息;
TYPE:底层存储类型,目前只支持RDS(MySQL);
READ_WEIGHT:读权重。在主实例的读压力比较大的时候,可以通过DRDS读写分离功能将读流量进行分流,减轻RDS主实例的压力。DRDS会自动识别读写流量,引导写流量进入RDS主实例,读流量则按配置的权重流向所有RDS实例;
WRITE_WEIGHT:写权重。解释见上。
# SHOW NODE
查看物理库的读写次数(历史累计数据)、读写权重(历史累计数据)。
重要列详解:
MASTER_READ_COUNT:RDS主实例处理的只读查询次数(历史累计数据);
SLAVE_READ_COUNT:RDS备实例处理的只读查询次数(历史累计数据);
MASTER_READ_PERCENT:RDS主实例处理的只读查询占比(注意该列显示的是累计的实际数据占比,并不是用户配置的百分比);
SLAVE_READ_PERCENT:RDS备实例处理的只读查询占比(注意该列显示的是累计的实际数据占比,并不是用户配置的百分比)。
注意:事务中的只读查询会被发送到RDS主实例;
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 table_name
SHOW TABLE STATUS
#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 语句是影响行数;对于查询语句是返回的记录数。
mysql> show slow where execute_time > 1000 limit 1;
# 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 语句是影响行数;对于查询语句是返回的记录数。
mysql> show physical_slow;
# CLEAR SLOW
清空自 DRDS 启动或者上次执行CLEAR SLOW以来最慢的 100 条逻辑慢 SQL 和 最慢的 100 条物理慢 SQL。
注意:SHOW SLOW和SHOW PHYSICAL_SLOW展示的是最慢的 100 个 SQL,如果长时间未执行CLEAR SLOW,可能都是非常老的 SQL 了,一般执行过 SQL 优化之后,建议都执行下CLEAR SLOW。
# EXPLAIN SQL
查看指定 SQL 在 DRDS 层面的执行计划,注意这条 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' | WHERE expr]
获取表的信息,该指令聚合了底层各个物理分表的数据。
重要列详解:
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 的 SCAN HINT 结合,还可以查看每个物理分表的数据量。
mysql> /!TDDL:SCAN='table_name'*/show table status like 'table_name';
统计信息查询类语句
DRDS 提供以下语句用于查询实时统计信息。
SHOW [FULL] STATS
SHOW DB STATUS
SHOW FULL DB STATUS
# SHOW [FULL] STATS
查看整体的统计信息,这些信息都是瞬时值。注意不同版本的 DRDSSHOW FULL STATS的结果是有区别的。
重要列说明:
QPS:应用到 DRDS 的 QPS,通常称为逻辑 QPS;
RDS_QPS:DRDS 到 RDS 的 QPS,通常称为物理 QPS;
ERROR_PER_SECOND:每秒的错误数,包含 SQL 语法错误,主键冲突,系统错误,连通性错误等各类错误总和;
VIOLATION_PER_SECOND:每秒的主键或者唯一键冲突;
MERGE_QUERY_PER_SECCOND:通过分库分表,从多表中进行的查询;
ACTIVE_CONNECTIONS:正在使用的连接;
CONNECTION_CREATE_PER_SECCOND:每秒创建的连接数;
RT(MS):应用到 DRDS 的响应时间,通常称为逻辑 RT(响应时间);
RDS_RT(MS):DRDS 到 RDS/MySQL 的响应时间,通常称为物理 RT;
NET_IN(KB/S):DRDS 收到的网络流量;
NET_OUT(KB/S):DRDS 输出的网络流量;
THREAD_RUNNING:正在运行的线程数;
# SHOW DB STATUS
用于查看物理库容量/性能信息,所有返回值为实时信息。 容量信息通过 MySQL 系统表获得,与真实容量情况可能有差异。
重要列说明:
NAME:代表一个 DRDS DB,此处显示的是 DRDS 内部标记,与 DRDS DB 名称不同;
CONNECTION_STRING:分库的连接信息;
PHYSICAL_DB:分库名称,TOTAL行代表一个 DRDS DB 中所有分库容量的总和;
SIZE_IN_MB:分库中数据占用的空间,单位为 MB;
RATIO:单个分库数据量在当前 DRDS DB 总数据量中的占比;
THREAD_RUNNING:物理数据库实例当前正在执行的线程情况,含义与 MySQLSHOW GLOBAL STATUS指令返回值的含义相同,
# SHOW FULL DB STATUS [LIKE ]
用于查看物理库表容量和性能信息,所有返回值为实时信息。 容量信息通过 MySQL 系统表获得,与真实容量情况可能有差异。
重要列说明:
NAME:代表一个 DRDS DB。此处显示的是 DRDS 内部标记,与 DRDS DB 名称不同;
CONNECTION_STRING:分库的连接信息;
PHYSICAL_DB:分库名称,TOTAL行代表经过 LIKE 关键字筛选后得到的分库容量的总和。如果没有 LIKE,则为全部分库容量的总和;
PHYSICAL_TABLE:分表名称,TOTAL行代表经过 LIKE 关键字筛选后得到的分表容量的总和。如果没有LIKE,则为全部分表容量的总和;
SIZE_IN_MB:分表中数据占用的空间,单位为 MB;
RATIO:单个分表数据量在当前筛选出的分表总数据量中的占比;
THREAD_RUNNING:物理数据库实例当前正在执行的线程情况,含义与 MySQLSHOW GLOBAL STATUS指令返回值的含义相同。
SHOW PROCESSLIST 指令与 KILL 指令
# SHOW PROCESSLIST 指令
DRDS 中,可以使用SHOW PROCESSLIST指令查看 DRDS 中的连接与正在执行的 SQL 等信息。
SHOW [FULL] PROCESSLIST \G;
结果集各字段含义:
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指令等价。
注意:与 MySQL 不同,DRDS 返回的物理连接的 ID 列为一个字符串,并非一个数字。
# 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
终止一个特定的物理 SQL:KILL 'PHYSICAL_PROCESS_ID'
SQL 自动保护
# SQL 限制
为了防止误操作,DRDS 默认禁止全表删除和全表更新的操作。
下列语句默认会被禁止:
DELETE 语句不带 WHERE 条件或者 LIMIT 条件;
UPDATE 语句不带 WHERE 条件或者 LIMIT 条件。
如果确实需要执行这类操作,可以通过 HINT 来临时跳过这个限制:
HINT:/!TDDL:FORBID_EXECUTE_DML_ALL=false*/
领取专属 10元无门槛券
私享最新 技术干货