DRDS 提供了一系列輔助 SQL 指令幫助用戶方便使用 DRDS。html
主要包括如下幾大類:node
# SHOW HELPsql
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]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 這兩列表明的是歷史累計數據,更改讀寫權重的配比後,這幾個數值並不能當即反應最新的讀寫權重配比,需累計一段比較長的時間才行。
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
在 DRDS 中,一條 SQL 語句會在 DRDS 和 RDS 節點上逐步執行。任意節點上的執行損耗過大都會致使慢SQL。
慢 SQL 的通常排查步驟爲:
定位慢 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推導出來。
從慢 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。
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 指令
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 將執行時間超過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: 執行的語句。
參考資料