非常感謝各位 TiDBer 在之前 【TiDBer 嘮嗑茶話會 48】非正式 TiDB 相關 SQL 腳本徵集大賽!( https://asktug.com/t/topic/996635 )裏提供的各種常用腳本。
在這篇文章中,我們整理了社區同學提供的一系列 TiDB 相關 SQL 腳本,希望能爲大家在 TiDB 的使用過程中提供一些幫助和參考。這些腳本涵蓋了常見場景下的 SQL 操作, 歡迎各位 TiDBer 持續補充更新~
未來,我們也將整理更多 TiDB 相關實用指南,幫助大家更好地瞭解、運用 TiDB,敬請期待!
1 緩存表
貢獻者:@ShawnYan
alter table xxx cache|nocache;
2 TSO 時間轉換
貢獻者:@我是咖啡哥
● 方法一:使用函數 TIDB_PARSE_TSO
SELECT TIDB_PARSE_TSO(437447897305317376);
+------------------------------------+
| TIDB_PARSE_TSO(437447897305317376) |
+------------------------------------+
| 2022-11-18 08:28:17.704000 |
+------------------------------------+
1 row in set (0.25 sec)
● 方法二:使用 pd-ctl
~$ tiup ctl:v6.4.0 pd -i -u http://pdip:2379
Starting component `ctl`: /Users/xxx/.tiup/components/ctl/v6.4.0/ctl pd -i -u http://pdip:2379
» tso 437447897305317376
system: 2022-11-18 08:28:17.704 +0800 CST
logic: 0
3 讀取歷史數據
貢獻者:@我是咖啡哥
● 使用 AS OF TIMESTAMP 語法讀取歷史數據,可以通過以下三種方式使用 AS OF TIMESTAMP 語法:
SELECT … FROM … AS OF TIMESTAMP
START TRANSACTION READ ONLY AS OF TIMESTAMP
SET TRANSACTION READ ONLY AS OF TIMESTAMP
select * from t as of timestamp '2021-05-26 16:45:26';
start transaction read only as of timestamp '2021-05-26 16:45:26';
set transaction read only as of timestamp '2021-05-26 16:45:26';
● 通過系統變量 tidb_read_staleness 讀取歷史數據
從 5 秒前至現在的時間範圍內選擇一個儘可能新的時間戳
set @@tidb_read_staleness="-5";
● 通過系統變量 tidb_snapshot 讀取歷史數據
設置一個特殊的環境變量,這個是一個 session scope 的變量,其意義爲讀取這個時間之前的最新的一個版本
set @@tidb_snapshot="2016-10-08 16:45:26";
清空這個變量後,即可讀取最新版本數據
set @@tidb_snapshot=“”;
4 查詢 tikv_gc_life_time 和 tikv_gc_safe_point 默認時長
貢獻者:@TiDBer_m6V1BalM
select VARIABLE_NAME, VARIABLE_VALUE from mysql.tidb where VARIABLE_NAME like “tikv_gc%”;
5 搜索某個用戶的 TopN 慢查詢
貢獻者:@fanruinet
select query_time,query,user
from information_schema.slow_query
where is_internal=false -- 排除 TiDB 內部的慢查詢 SQL
and user = "user1" -- 查找的用戶名
order by query_time desc
limit 2;
6 統計間隔 5 分鐘的數據
貢獻者:@forever
SELECT concat(date_format(create_time,‘%Y-%m-%d %H:’),floor(date_format(create_time,‘%i’)/5)),count(*)
FROM jcxx
GROUP BY 1;
7 反解析 digest 成 SQL 文本
貢獻者:@hey-hoho
select tidb_decode_sql_digests(‘[“xxxxx”]’);
8 不涉及分區表用下面的方式查看錶的使用情況
貢獻者:@xfworld
select TABLE_SCHEMA,TABLE_NAME,TABLE_ROWS,
(DATA_LENGTH+INDEX_LENGTH)/1024/1024/1024 as table_size from tables order by table_size
desc limit 20;
9 partition 表提供了分區表和非分區表的資源使用情況
貢獻者:@xfworld
select TABLE_SCHEMA,TABLE_NAME,PARTITION_NAME,TABLE_ROWS,
(DATA_LENGTH+INDEX_LENGTH)/1024/1024/1024 as table_size from
information_schema.PARTITIONS order by table_size desc limit 20;
10 查詢分析器中看配置文件參數
貢獻者:@Kongdom
show config
SHOW CONFIG 語句用於展示 TiDB 各個組件當前正在應用的配置,請注意,配置與系統變量作用於不同維度,請不要混淆,如果希望獲取系統變量信息,請使用 SHOW VARIABLES ( https://docs.pingcap.com/zh/tidb/stable/sql-statement-show-variables ) 語法。
11 查找讀流量排名前 10 的熱點 region
貢獻者:@BraveChen
SELECT DISTINCT region_id
FROM INFORMATION_SCHEMA.tikv_region_status
WHERE READ_BYTES > ?
ORDER BY READ_BYTES DESC
LIMIT 10
12 查看參數和變量的腳本
貢獻者:@buddyyuan
#!/bin/bash
case $1 in
-pd)
mysql -uroot -h127.0.0.1 -P4000 -p"" -e "SHOW CONFIG WHERE type ='pd' and name like '%$2%'"
;;
-tidb)
mysql -uroot -h127.0.0.1 -P4000 -p"" -e "SHOW CONFIG WHERE type ='tidb' and name like '%$2%'"
;;
-tikv)
mysql -uroot -h127.0.0.1 -P4000 -p"" -e "SHOW CONFIG WHERE type ='tikv' and name like '%$2%'"
;;
-tiflash)
mysql -uroot -h127.0.0.1 -P4000 -p"" -e "SHOW CONFIG WHERE type ='tiflash' and name like '%$2%'"
;;
-var)
mysql -uroot -h127.0.0.1 -P4000 -p"" -e "show variables like '%$2%';"
;;
-h)
echo "-pd show pd parameters"
echo "-tidb show tidb parameters"
echo "-tikv show tikv parameters"
echo "-tiflash show tiflash parameters"
echo "-var show itidb variables"
;;
esac
還能用 grep 在過濾一次
[root@vm172-16-201-125 ~]# sh showparammeter.sh -tikv memory-pool-quota | grep -i "210:29160"
tikv 192.16.201.210:29160 server.grpc-memory-pool-quota 9223372036854775807B
13 查找重複記錄
貢獻者:@ealam_ 小羽
select *
from 表
where 重複字段 in
(
select 重複字段
from 表
group by 重複字段
having count(*)>1
)
14 查詢耗時最高的慢 sql
貢獻者:@caiyfc
select query sql_text,
sum_query_time,
mnt as executions,
avg_query_time,
avg_proc_time,
avg_wait_time,
max_query_time,
avg_backoff_time,
Cop_proc_addr,
digest,
(case
when avg_proc_time = 0 then
'point_get or commit'
when (avg_proc_time > avg_wait_time and
avg_proc_time > avg_backoff_time) then
'coprocessor_process'
when (avg_backoff_time > avg_wait_time and
avg_proc_time < avg_backoff_time) then
'backoff'
else
'coprocessor_wait'
end) as type
from (select substr(query, 1, 100) query,
count(*) mnt,
avg(query_time) avg_query_time,
avg(process_time) avg_proc_time,
avg(wait_time) avg_wait_time,
max(query_time) max_query_time,
sum(query_time) sum_query_time,
digest,
Cop_proc_addr,
avg(backoff_time) avg_backoff_time
from information_schema.cluster_slow_query
where time >= '2022-07-14 17:00:00'
and time <= '2022-07-15 17:10:00'
and DB = 'web'
group by substr(query, 1, 100)) t
order by max_query_time desc limit 20;
15 日常維護用的最多的 SQL
貢獻者:@tracy0984
select * from information_schema.cluster_processlist;
– kill id;
16 恢復數據(適用於 drop 與 truncate)
貢獻者:@凌雲 Cloud
FLASHBACK TABLE target_table_name[TO new_table_name]
17 批量修改庫名
貢獻者:@TiDBer_dog
./bat_rename.sh lihongbao/ dev2_kelun dev2_sinodemo 路徑./leo_backup
18 高併發的場景下獲取 sql
貢獻者:@jiawei
select * from information_schema.processlist where info is not null
19 查看 schema 下的表都有哪些
貢獻者:@Ming
show tables in schema;
20 查看錶 leader
貢獻者:@TiDBer_wTKU9jv6
select count(1),tss.ADDRESS from INFORMATION_SCHEMA.TIKV_REGION_PEERS trp,INFORMATION_SCHEMA.TIKV_REGION_STATUS trs,INFORMATION_SCHEMA.TIKV_STORE_STATUS tss where trp.STORE_ID=tss.STORE_ID and trp.REGION_ID=trs.REGION_ID and trs.DB_NAME=‘test’ and trs.TABLE_NAME=‘test’ and trp.IS_LEADER=1 group by tss.ADDRESS order by tss.ADDRESS;
21 shell 的調皮加速腳本
貢獻者:@gcworkerishungry
alias ctidb=“mysql -u root -ptidb -Dcktest -h S001 -P4000”
alias dtidb=“tiup cluster display tidb-test”
alias etidb=“tiup cluster edit-config tidb-test”
alias ptidb=“tiup cluster prune tidb-test”
alias rtidb=“tiup cluster restart tidb-test”
22 恢復數據到新的數據庫
貢獻者:@TiDBer_ 徐川
./loader -h 192.168.180.3 -u root -p q1w2 -P 4000 -t 32 -d leo_backup/
23 開啓 tiflash
貢獻者:@TiDBer_pFFcXLgY
alter table xxx set tiflash replica 1
24 表 region 分佈語句
貢獻者:@秋楓之舞
select
trs.db_name,
trs.table_name,
trs.index_name,
trp.store_id,
count(*),
sum(approximate_keys)
from
information_schema.tikv_region_status trs,
information_schema.tikv_store_status tss,
information_schema.tikv_region_peers trp
where
trs.db_name = ‘prd01’
and trs.table_name = ‘tab_name’
and trp.is_leader = 1
and trp.store_id = tss.store_id
and trs.region_id = trp.region_id
group by
trs.db_name,
trs.table_name,
trs.index_name,
trp.store_id
order by
trs.index_name;
25 查看列的元數據
貢獻者:@張雨齊0720
show stats_histograms where db_name like ‘test’ and table_name like ‘test1’ ;
26 表的存儲位置(store、peer 信息)
貢獻者:@bert
SELECT distinct a.TIDB_TABLE_ID, b.DB_NAME, b.TABLE_NAME, b.REGION_ID, b.APPROXIMATE_SIZE
, c.PEER_ID, c.STORE_ID, c.IS_LEADER, c.STATUS, d.ADDRESS
, d.STORE_STATE_NAME, d.VERSION, d.CAPACITY, d.AVAILABLE, d.LABEL
FROM INFORMATION_SCHEMA.TABLES a
INNER JOIN INFORMATION_SCHEMA.TIKV_REGION_STATUS b
INNER JOIN INFORMATION_SCHEMA.TIKV_REGION_PEERS c
INNER JOIN INFORMATION_SCHEMA.TIKV_STORE_STATUS d
WHERE a.TIDB_TABLE_ID = b.TABLE_ID
AND b.REGION_ID = c.REGION_ID
AND c.STORE_ID = d.STORE_ID
AND a.TABLE_SCHEMA = ‘test’
AND a.TABLE_NAME = ‘t’;
27 將集羣升級到指定版本 ( 在線升級 )
貢獻者:@TiDBer_ 楊龜幹外公
tiup cluster upgrade
例如升級到 v4.0.0 版本:
tiup cluster upgrade tidb-test v4.0.0
28 查詢表大小
貢獻者:@我是咖啡哥
SELECT
t.TABLE\_NAME,
t.TABLE\_ROWS,
t.TABLE\_TYPE,
round(t.DATA\_LENGTH/1024/1024/1024,2) data\_GB,
round(t.INDEX\_LENGTH/1024/1024/1024,2) index\_GB,
t.CREATE\_OPTIONS,
t.TABLE\_COMMENT
FROM
INFORMATION\_SCHEMA.`TABLES` t
WHERE
table\_schema = 'test'
and t.table\_type='BASE TABLE'
order by t.TABLE\_ROWS desc;
SELECT CONCAT(table\_schema,'.',table\_name) AS 'Table Name', table\_rows AS 'Number of Rows', CONCAT(ROUND(data\_length/(1024*1024*1024),4),'G') AS 'Data Size', CONCAT(ROUND(index\_length/(1024*1024*1024),4),'G') AS 'Index Size', CONCAT(ROUND((data\_length+index\_length)/(1024*1024*1024),4),'G') AS'Total' FROM information\_schema.TABLES WHERE table\_schema LIKE 'test';
29 統計信息
貢獻者:@我是咖啡哥
● 查看錶的元數據
show stats_meta where db_name like '%sbtest%';
● 查看錶的健康狀態
show stats\_healthy;
Healthy 字段,一般小於等於 60 的表需要做 analyze
show stats\_healthy where table\_name ='xxx';
show stats\_healthy where db\_name='' and table\_name='orders';
_name like ‘sbtest’ and table_name like ‘sbtest1’ ;
● 查看直方圖信息
show stats\_buckets where db\_name='' and table\_name='';
● 查看 analyze 狀態
show analyze status;
● 分析表、分區
analyze table sbtest1;
ANALYZE TABLE xxx PARTITION P202204;
30 執行計劃
貢獻者:@我是咖啡哥
綁定執行計劃
● 默認是 session 級別
create binding for select \* from t using select \* from t use index()
create binding for SELECT \* FROM t1 INNER JOIN t2 ON t1.id = t2.t1\_id WHERE t1.int\_col = ? using SELECT /\*+ INL\_JOIN(t1, t2) \*/ \* FROM t1 INNER JOIN t2 ON t1.id = t2.t1\_id WHERE t1.int\_col = ?;
explain SELECT \* FROM t1 INNER JOIN t2 ON t1.id = t2.t1\_id WHERE t1.int\_col = 1;
show bindings for SELECT \* FROM t1 INNER JOIN t2 ON t1.id = t2.t1\_id WHERE t1.int\_col = 1;
show global bindings;
show session bindings;
SELECT @@SESSION.last\_plan\_from\_binding;
● 使用 explain format = ‘verbose’ 語句查看 SQL 的執行計劃
explain format = 'verbose';
drop binding for sql;
31 查看 regions
貢獻者:@我是咖啡哥
SHOW TABLE t\_its\_unload\_priority\_intermediate\_info regions;
SHOW TABLE t\_its\_unload\_priority\_intermediate\_info INDEX IDX\_UPII\_GROUP\_BY\_COMPOSITE regions;
32 統計讀寫熱點表
貢獻者:@我是咖啡哥
use INFORMATION\_SCHEMA;
SELECT
db\_name,
table\_name,
index\_name,
type,
sum( flow\_bytes ),
count( 1 ),
group\_concat( h.region\_id ),
count( DISTINCT p.store\_id ),
group\_concat( p.store\_id )
FROM
INFORMATION\_SCHEMA.tidb\_hot\_regions h
JOIN INFORMATION\_SCHEMA.tikv\_region\_peers p ON h.region\_id = p.region\_id
AND p.is\_leader = 1
GROUP BY
db\_name,
table\_name,
index\_name,
type;
SELECT
p.store\_id,
sum(flow\_bytes ),
count(1)
FROM
INFORMATION\_SCHEMA.tidb\_hot\_regions h
JOIN INFORMATION\_SCHEMA.tikv\_region\_peers p ON h.region\_id = p.region\_id
AND p.is\_leader = 1
GROUP BY
p.store\_id
ORDER BY
2 DESC;
select tidb\_decode\_plan();
33 TiFlash
貢獻者:@我是咖啡哥
ALTER TABLE t\_test\_time\_type SET TIFLASH REPLICA 1;
SELECT \* FROM information\_schema.tiflash\_replica;
select \* from information\_schema.CLUSTER\_HARDWARE where type='tiflash' and DEVICE\_TYPE='disk' and name='path';
34 admin 命令
貢獻者:@我是咖啡哥
admin show ddl jobs;
ADMIN CHECK TABLE t_test;
admin show slow
ADMIN SHOW TELEMETRY;
35 修改隔離參數
貢獻者:@我是咖啡哥
● session 級別修改
Engine 隔離:默認:[“tikv”, “tidb”, “tiflash”] 由於 TiDB Dashboard 等組件需要讀取一些存儲於 TiDB 內存表區的系統表,因此建議實例級別 engine 配置中始終加入 “tidb” engine。
set session tidb\_isolation\_read\_engines = 'tiflash,tidb';
set @@session.tidb\_isolation\_read\_engines = "tiflash,tidb";
● 手工 Hint
select /\*+ read\_from\_storage(tiflash\[table\_name]) */ ... from table\_name;
select /*+ read\_from\_storage(tiflash\[alias\_a,alias\_b]) \*/ ... from table\_name\_1 as alias\_a, table\_name\_2 as alias\_b where alias\_a.column\_1 = alias\_b.column\_2;
set @@tidb\_allow\_mpp=1;
show config where name like '%oom%' and type='tidb';
admin show ddl;
36 排錯-查看日誌
貢獻者:@我是咖啡哥
SELECT \* FROM INFORMATION\_SCHEMA.CLUSTER\_LOG t
WHERE time > '2022-08-09 00:00:00' AND time < '2022-08-10 00:00:00'
AND TYPE in ('tikv')
AND `LEVEL` = 'ERROR'
ORDER BY time desc;
37 查詢所有節點所在 OS 的 CPU 當前使用率
貢獻者:@人如其名
SELECT
b.time,
a.hostname,
a.ip,
a.types,
b.cpu_used_percent
FROM
(
SELECT
GROUP_CONCAT(TYPE) AS TYPES,
SUBSTRING_INDEX(instance, ':', 1) AS ip,
value AS hostname
FROM
information_schema.cluster_systeminfo
WHERE
name = 'kernel.hostname'
GROUP BY
ip,
hostname
) a,
(
SELECT
time,
SUBSTRING_INDEX(instance, ':', 1) AS ip,
(100 - value) AS cpu_used_percent
FROM
metrics_schema.node_cpu_usage
WHERE
MODE = 'idle'
AND time = NOW()
) b
WHERE
a.ip = b.ip
輸出示例:
+----------------------------+-----------------------+----------------+----------------------+--------------------+
| time | hostname | ip | types | cpu_used_percent |
+----------------------------+-----------------------+----------------+----------------------+--------------------+
| 2023-01-10 22:40:15.000000 | localhost.localdomain | 192.168.31.201 | tidb,pd,tikv,tiflash | 11.438079153798114 |
+----------------------------+-----------------------+----------------+----------------------+--------------------+
1 row in set (0.04 sec)
說明:我這裏所有類型組件只創建了有一個而且都在一個 os 上,所以只顯示了一行。
38 清理 tidb 大量數據的腳本,實現刪除百萬級別以上的數據,而且不影響 tidb 正常使用
貢獻者:@xingzhenxiang
date1=`date --date "7 days ago" +"%Y-%m-%d"`
delete_db_sql=“delete from mysql_table where create_date_time<‘$date1’ limit 10000”
i=0
while ((++i)); do
a=`/bin/mysql -uroot -p123456 -A mysql_database -h127.0.0.1 --comments -e "${delete_db_sql}" -vvv|grep "Query OK" |awk '{print $3}'`
if(($a<1)); then
break 1
fi
sleep 1
printf “%-4d” $((i))
感謝以上 TiDBer 們貢獻的 SQL 腳本~記得點贊收藏,可以隨時在你的個人收藏夾裏查看到~
未來我們將繼續發佈更多來自社區的精品內容,希望能爲大家提供更多有價值的信息和經驗。如果您有任何感興趣的話題,可以在下方留言,我們會整理相關的資料與大家分享哦!