TIDB運維文檔(下)
點擊上方“IT那活兒”公眾號,關注后了解更多內容,不管IT什么活兒,干就完了?。?!
接上篇《TiDB運維文檔(上)》,我們今天講一下TIDB數據庫的日常運維。
1.1 升級 TiUP 或更新 TiUP 離線鏡像
1.2 檢查當前集群的健康狀況
執行結束后,最后會輸出 region status 檢查結果。
如果結果為 "All regions are healthy",則說明當前集群中所有 region 均為健康狀態,可以繼續執行升級;
如果結果為 "Regions are not fully healthy: m miss-peer, n pending-peer" 并提示 "Please fix unhealthy regions before other operations.",則說明當前集群中有 region 處在異常狀態,應先排除相應異常狀態,并再次檢查結果為 "All regions are healthy" 后再繼續升級。
1.3 升級 TiDB 集群
TiUP Cluster 默認的升級 TiDB 集群的方式是不停機升級,即升級過程中集群仍然可以對外提供服務。升級時會對各節點逐個遷移 leader 后再升級和重啟,因此對于大規模集群需要較長時間才能完成整個升級操作。如果業務有維護窗口可供數據庫停機維護,則可以使用停機升級的方式快速進行升級操作。tiup cluster upgrade <cluster-name> v5.1.2
注意:
2.1 擴容 TiDB/PD/TiKV 節點
2.1.1 在 scale-out.yaml 文件添加擴容拓撲配置
tidb_servers:
- host: 10.0.1.5
ssh_port: 22
port: 4000
status_port: 10080
deploy_dir: /data/deploy/install/deploy/tidb-4000
log_dir: /data/deploy/install/log/tidb-4000
tikv_servers:
- host: 10.0.1.5
ssh_port: 22
port: 20160
status_port: 20180
deploy_dir: /data/deploy/install/deploy/tikv-20160
data_dir: /data/deploy/install/data/tikv-20160
log_dir: /data/deploy/install/log/tikv-20160
pd_servers:
- host: 10.0.1.5
ssh_port: 22
name: pd-1
client_port: 2379
peer_port: 2380
deploy_dir: /data/deploy/install/deploy/pd-2379
data_dir: /data/deploy/install/data/pd-2379
log_dir: /data/deploy/install/log/pd-2379
可以使用 tiup cluster edit-config 查看當前集群的配置信息,因為其中的 global 和 server_configs 參數配置默認會被 scale-out.yaml 繼承,因此也會在 scale-out.yaml 中生效。2.1.2 執行擴容命令
tiup cluster scale-out scale-out.yaml
預期輸出 Scaled cluster out successfully 信息,表示擴容操作成功。2.2 擴容 TiFlash 節點
2.2.1 添加節點信息到 scale-out.yaml 文件
編寫 scale-out.yaml 文件,添加該 TiFlash 節點信息(目前只支持 ip,不支持域名):tiflash_servers:
- host: 10.0.1.4
2.2.2 運行擴容命令
tiup cluster scaltiup cluster scale-out
scale-out.yamle-out scale-out.yaml
2.3 擴容 TiCDC 節點
2.3.1 添加節點信息到 scale-out.yaml 文件
cdc_servers:
- host: 10.0.1.3
- host: 10.0.1.4
2.3.2 運行擴容命令
tiup cluster scale-out scale-out.yaml
2.4 縮容 TiDB/PD/TiKV 節點
2.4.1 查看節點 ID 信息
2.4.2 執行縮容操作
tiup cluster scale-in <cluster-name> --node 10.0.1.5:20160
預期輸出 Scaled cluster in successfully 信息,表示縮容操作成功。2.4.3 檢查集群狀態
下線需要一定時間,下線節點的狀態變為 Tombstone 就說明下線成功。2.5.1 根據 TiFlash 剩余節點數調整數據表的副本數
在下線節點之前,確保 TiFlash 集群剩余節點數大于等于所有數據表的最大副本數,否則需要修改相關表的 TiFlash 副本數。在 TiDB 客戶端中針對所有副本數大于集群剩余 TiFlash 節點數的表執行:alter table name>.<table-name> set tiflash replica 0;
等待相關表的 TiFlash 副本被刪除(按照查看表同步進度一節操作,查不到相關表的同步信息時即為副本被刪除)。2.5.2 執行縮容操作
執行 scale-in 命令來下線節點,假設步驟 1 中獲得該節點名為 10.0.1.4:9000tiup cluster scale-in <cluster-name> --node 10.0.1.4:9000
2.6 縮容 TiCDC 節點
tiup cluster scale-in <cluster-name> --node 10.0.1.4:8300
3.1 BR備份恢復
BR 全稱為 Backup & Restore,是 TiDB 分布式備份恢復的命令行工具,用于對 TiDB 集群進行數據備份和恢復。BR 只支持在 TiDB v3.1 及以上版本使用。 BR 將備份或恢復操作命令下發到各個 TiKV 節點。TiKV 收到命令后執行相應的備份或恢復操作。此備份只備份各節點的leader副本。 在一次備份或恢復中,各個 TiKV 節點都會有一個對應的備份路徑,TiKV 備份時產生的備份文件將會保存在該路徑下,恢復時也會從該路徑讀取相應的備份文件。備份路徑下會生成以下幾種類型文件:
- SST 文件:存儲 TiKV 備份下來的數據信息。
- backupmeta 文件:存儲本次備份的元信息,包括備份文件數、備份文件的 Key 區間、備份文件大小和備份文件 Hash (sha256) 值。
- backup.lock 文件:用于防止多次備份到同一目錄。
1) 推薦部署配置
推薦使用一塊高性能 SSD 網盤,掛載到 BR 節點和所有 TiKV 節點上,網盤推薦萬兆網卡,否則帶寬有可能成為備份恢復時的性能瓶頸。2) 備份數據
br backup full
--pd "${PDIP}:2379"
--storage "local:///tmp/backup"
--ratelimit 128
--log-file backupfull.log
以上命令中,--ratelimit 選項限制了每個 TiKV 執行備份任務的速度上限(單位 MiB/s)。--log-file 選項指定把 BR 的 log 寫到 backupfull.log 文件中。br backup db
--pd "${PDIP}:2379"
--db test
--storage "local:///tmp/backup"
--ratelimit 128
--log-file backuptable.log
db 子命令的選項為 --db,用來指定數據庫名。其他選項的含義與備份全部集群數據相同。br backup table
--pd "${PDIP}:2379"
--db test
--table usertable
--storage "local:///tmp/backup"
--ratelimit 128
--log-file backuptable.log
table 子命令有 --db 和 --table 兩個選項,分別用來指定數據庫名和表名。其他選項的含義與備份全部集群數據相同。如果你需要以更復雜的過濾條件來備份多個表,執行 br backup full 命令,并使用 --filter 或 -f 來指定表庫過濾規則。用例:以下命令將所有 db*.tbl* 形式的表格數據備份到每個 TiKV 節點上的 /tmp/backup 路徑,并將 backupmeta 文件寫入該路徑。br backup full
--pd "${PDIP}:2379"
--filter db*.tbl*
--storage "local:///tmp/backup"
--ratelimit 128
--log-file backupfull.log
3) 恢復數據
要將全部備份數據恢復到集群中來,可使用 br restore full 命令。該命令的使用幫助可以通過 br restore full -h 或 br restore full --help 來獲取。用例:將 /tmp/backup 路徑中的全部備份數據恢復到集群中。br restore full
--pd "${PDIP}:2379"
--storage "local:///tmp/backup"
--ratelimit 128
--log-file restorefull.log
以上命令中,--ratelimit 選項限制了每個 TiKV 執行恢復任務的速度上限(單位 MiB/s)。--log-file 選項指定把 BR 的 log 寫到 restorefull.log 文件中。要將備份數據中的某個數據庫恢復到集群中,可以使用 br restore db 命令。該命令的使用幫助可以通過 br restore db -h 或 br restore db --help 來獲取。用例:將 /tmp/backup 路徑中備份數據中的某個數據庫恢復到集群中。br restore db
--pd "${PDIP}:2379"
--db "test"
--ratelimit 128
--storage "local:///tmp/backup"
--log-file restorefull.log
以上命令中 --db 選項指定了需要恢復的數據庫名字。其余選項的含義與恢復全部備份數據相同。要將備份數據中的某張數據表恢復到集群中,可以使用 br restore table 命令。該命令的使用幫助可通過 br restore table -h 或 br restore table --help 來獲取。用例:將 /tmp/backup 路徑下的備份數據中的某個數據表恢復到集群中。br restore table
--pd "${PDIP}:2379"
--db "test"
--table "usertable"
--ratelimit 128
--storage "local:///tmp/backup"
--log-file restorefull.log
如果你需要用復雜的過濾條件來恢復多個表,執行 br restore full 命令,并用 --filter 或 -f 指定使用表庫過濾。用例:以下命令將備份在 /tmp/backup 路徑的表的子集恢復到集群中。br restore full
--pd "${PDIP}:2379"
--filter db*.tbl*
--storage "local:///tmp/backup"
--log-file restorefull.log
3.2 TiCDC異地庫備份
B集群作為備份集群,GC time設置為 1天,生產A集群需要恢復數據時,可通過Dumpling工具導出指定時間點之前數據,進行數據恢復。3.3 DumplingTiDB Lightning備份恢復
輸出文件格式:
- metadata:此文件包含導出的起始時間,以及 master binary log 的位置。
Started dump at: 2020-11-10 10:40:19
SHOW MASTER STATUS:
Log: tidb-binlog
Pos: 420747102018863124
Finished dump at: 2020-11-10 10:40:20
- {schema}-schema-create.sql:創建 schema 的 SQL 文件。
CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
- {schema}.{table}-schema.sql:創建 table 的 SQL 文件。
CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
- {schema}.{table}.{0001}.{sql|csv}:數據源文件。
/*!40101 SET NAMES binary*/;
INSERT INTO `t1` VALUES
(1);
1) 備份工具Dumpling
該工具可以把存儲在 TiDB/MySQL 中的數據導出為 SQL 或者 CSV 格式,可以用于完成邏輯上的全量備份或者導出。./dumpling
-u root
-P 4000
-h 127.0.0.1
--filetype sql
-o /tmp/test
-t 8
-r 200000
-F 256MiB
- --filetype:導出文件類型,sql|csv。
- -t:用于指定導出的線程數。增加線程數會增加 Dumpling 并發度提高導出速度,但也會加大數據庫內存消耗,因此不宜設置過大。
- -r:用于指定單個文件的最大行數,指定該參數后 Dumpling 會開啟表內并發加速導出,同時減少內存使用。
- -F:選項用于指定單個文件的最大大小(單位為 MiB,可接受類似 5GiB 或 8KB 的輸入)。
例: --filter "employees.*" 例: --sql select * from `test`.`sbtest1` where id < 100參數列表:
| | |
| | |
| | |
| | |
| 導出能匹配模式的表,語法可參考 filter.txt | |
| | |
| | |
| | |
| 將 table 劃分成 row 行數據,一般針對大表操作并發生成多個文件。 | |
| | |
| 日志級別 {debug,info,warn,error,dpanic,panic,fatal} | |
| | |
| | |
| 導出 csv 格式的 table 數據,不生成 header | |
| | |
| | |
| 控制 INSERT SQL 語句的大小,單位 bytes | |
| 將 table 數據劃分出來的文件大小,需指明單位(如 128B, 64KiB, 32MiB, 1.5GiB) | |
| | |
| | |
| 根據指定的 sql 導出數據,該選項不支持并發導出 | |
| | |
snapshot: 通過 TSO 來指定 dump 某個快照時間點的 TiDB 數據 |
lock: 對需要 dump 的所有表執行 lock tables read 命令 |
|
auto: MySQL 默認用 flush, TiDB 默認用 snapshot |
| snapshot tso,只在 consistency=snapshot 下生效 | |
| | |
| | |
| | |
| | |
| | |
| 用于 TLS 連接的 certificate authority 文件的地址 | |
| 用于 TLS 連接的 client certificate 文件的地址 | |
| 用于 TLS 連接的 client private key 文件的地址 | |
| | |
| | |
| | |
| | |
--output-filename-template | 以 golang template 格式表示的數據文件名格式 | {{.DB}}.{{.Table}}.{{.Index}} |
支持 {{.DB}}、{{.Table}}、{{.Index}} 三個參數 |
|
| Dumpling 的服務地址,包含了 Prometheus 拉取 metrics 信息及 pprof 調試的地址 | |
| 單條 dumpling 命令導出 SQL 語句的內存限制,單位為 byte,默認為 32 GB | |
2) 恢復工具Tidb Lightning
TiDB Lightning 是一個將全量數據高速導入到 TiDB 集群的工具。tidb-lightning --config cfg.toml --backend tidb -tidb-
host 127.0.0.1 -tidb-user root --tidb-password passwd -
tidb-port 4000 -d /home/tidb/bakfile/9
Local-backend 工作原理:
TiDB Lightning 整體工作原理如下:
- i) 在導入數據之前,tidb-lightning 會自動將 TiKV 集群切換為“導入模式” (import mode),優化寫入效率并停止自動壓縮。
- ii) tidb-lightning 會在目標數據庫建立架構和表,并獲取其元數據。
- iii) 每張表都會被分割為多個連續的區塊,這樣來自大表 (200 GB+) 的數據就可以用增量方式并行導入。
- iv) tidb-lightning 會為每一個區塊準備一個“引擎文件 (engine file)”來處理鍵值對。tidb-lightning 會并發讀取 SQL dump,將數據源轉換成與 TiDB 相同編碼的鍵值對,然后將這些鍵值對排序寫入本地臨時存儲文件中。
- v) 當一個引擎文件數據寫入完畢時,tidb-lightning 便開始對目標 TiKV 集群數據進行分裂和調度,然后導入數據到 TiKV 集群。
- vi) 引擎文件包含兩種:數據引擎與索引引擎,各自又對應兩種鍵值對:行數據和次級索引。通常行數據在數據源里是完全有序的,而次級索引是無序的。因此,數據引擎文件在對應區塊寫入完成后會被立即上傳,而所有的索引引擎文件只有在整張表所有區塊編碼完成后才會執行導入。
- vii) 整張表相關聯的所有引擎文件完成導入后,tidb-lightning 會對比本地數據源及下游集群的校驗和 (checksum),確保導入的數據無損,然后讓 TiDB 分析 (ANALYZE) 這些新增的數據,以優化日后的操作。同時,tidb-lightning 調整 AUTO_INCREMENT 值防止之后新增數據時發生沖突。
- viii) 表的自增 ID 是通過行數的上界估計值得到的,與表的數據文件總大小成正比。因此,最后的自增 ID 通常比實際行數大得多。這屬于正?,F象,因為在 TiDB 中自增 ID 不一定是連續分配的。
- viiii) 在所有步驟完畢后,tidb-lightning 自動將 TiKV 切換回“普通模式” (normal mode),此后 TiDB 集群可以正常對外提供服務。
參數列表:
| | |
| 從 file 讀取全局設置。如果沒有指定則使用默認設置。 | |
| | |
| | |
| 日志的等級:debug、info、warn、error 或 fatal (默認為 info) | |
| | |
| 選擇后端的模式:importer、local 或 tidb | |
| | |
| | |
| | |
| | |
| | |
| TiDB Server 的端口(默認為 4000) | |
| TiDB Server 的狀態端口的(默認為 10080) | |
| | |
| | |
| 忽略表結構文件,直接從 TiDB 中獲取表結構信息 | |
| | |
| | |
| | |
--check-requirements bool | | lightning.check-requirements |
| | |
| | |
| | |
| | |
backend各模式區別:
參考: https://asktug.com/t/topic/636754.1 誤drop庫
1) 確認刪除時間
刪庫這種操作權限一般只有管理員才會有,當然也不排除有部分開發人員申請了超級權限,如果這個事情發生了那么我們肯定是希望能精確找到刪庫的時間點這樣可以減少數據丟失,好在Tidb記錄了所以DDL操作,可以通過adminshowddljobs;查看,找到刪庫的具體時間點。2) 確認數據的有效性
通過上面方法我們可以確認drop 庫的操作是在 2020-11-17 08:26:36 ,那么我們需要這個時間點的前幾秒的快照應該就有被我們刪除的庫,通過 set @@tidb_snapshot="xx-xx-xx xx:xx:xx"; 設置當前session查詢該歷史快照數據。3) 備份數據
dumpling -h 172.21.xx.xx -P 4000 -uroot -p xxx -t 32 -F 64MiB -B xxx_ods --snapshot "2020-11-17 08:26:35" -o ./da
4) 恢復數據
myloader -h 172.21.xx.xx -u root -P 4000 -t 32 -d ./da -p xxx
1) 確認操作時間
通過 admin show ddl jobs 確認truncate的操作的開始時間。2) 將數據寫入到臨時表
通過 set @@tidb_snapshot="xx-xx-xx xx:xx:xx"; 設置當前session查詢該歷史快照數據。FLASHBACK TABLE xxx_comment TO xxx_comment_bak_20201117;
如果線上的這張表沒有新數據寫入或者新數據可以不要,那么可以這樣操作:drop table xxx_comment ;
rename table xxx_comment_bak_20201117 to xxx_comment;
如果線上的表還在繼續有新數據寫入并且不能破壞,那么可以把恢復出來的臨時表的數據在寫會到線上表。insert into xxx_comment select * from xxx_comment_bak_20201117;
1) 確認操作時間
通過 admin show ddl jobs 確認truncate的操作的開始時間。2) 恢復表
RECOVER TABLE xxx_comment ;
最近 DDL JOB 歷史中找到的第一個 DROP TABLE 操作,且 DROP TABLE 所刪除的表的名稱與 RECOVER TABLE 語句指定表名相同 ,如果這個表執行過多次刪除再建的操作,你想恢復到第一次的刪除操作之前的數據,可以通過 RECOVER TABLE BY JOB 827; 恢復,其中827是通過 admin show ddl jobs ; 確認的job id。4.4 誤 delete、update表
1) 確認操作時間
對于DML的誤操作,如圖Tidb集群沒開啟全日志,基本沒辦法從集群層面確認誤操作時間了,需要從誤操作發起端介入排查了。如果是管理員命令行誤操作,可以通過堡壘機的操作記錄去人;如果是程序bug可以通過排查程序的日志確認執行誤操作的時間。2) 確認數據的有效性
通過上面方法我們可以確認誤操作是在 2020-11-17 10:28:25 ,那么我們需要這個時間點的前幾秒的快照應該就有被我們刪除的庫,通過set @@tidb_snapshot=“xx-xx-xx xx:xx:xx”; 設置當前session查詢該歷史快照數據。3) 備份數據
通過dumpling把上面確定的時間點的快照數據備份出來:dumpling -h 172.21.xx.xx -P 4000 -uroot -p xxx -t 32 -F
64MiB -B xxx_ods -T xxx_ods.xxx_comment --snapshot "2020-
11-17 09:55:00" -o ./da
4) 恢復數據
把上面備份的數據導入到一個臨時實例里面,確認下數據沒問題可以在臨時實例里面把這個表重命名,然后導入到線上庫,最后把數據合并到線上的表里面。myloader -h 172.21.xx.xx -u root -P 4001 -t 32 -d ./da -p xxx
5.1 中控有備份
中控有備份,那么我們可以直接通過中控的備份進行恢復;1) 中控備份
TiUP 相關的數據都存儲在用戶home目錄的 .tiup 目錄下,若要遷移中控機只需要拷貝 .tiup 目錄到對應目標機器即可。中控備份:tar czvf tiup.tar.gz .tiup。為了避免中控機磁盤損壞或異常宕機等情況導致TiUP數據丟失,建議線上環境定時備份.tiup 目錄,寫一個簡單的腳本就可以搞定。2) 恢復方法
- i) 把 tiup.tar.gz 拷貝到目標機器home目錄。
- ii) 在目標機器 home 目錄下執行 tar xzvf tiup.tar.gz。
- iii) 添加 .tiup 目錄到 PATH 環境變量。
如使用 bash 并且是 tidb 用戶,在 ~/.bashrc 中添加 export PATH=/home/tidb/.tiup/bin:$PATH 后執行 source ~/.bashrc,根據使用的 shell 與用戶做相應調整。5.2 中控沒有備份
針對中控沒有備份,那么其實恢復方案也相對比較簡單。恢復方法:
- ii) 根據運行的集群組件,重新配置一個集群的拓撲文件。
- iii) 執行deploy命令:tiup cluster deploy tidb-xxx ./topology.yaml。
- iv) 執行完成之后,不需要start集群,因為集群本身是在運行的,執行display查看一下集群的節點狀態即可。
5.3 注意事項
6.1 集群狀態
1) 實例
2) 主機
3) 磁盤
4) 存儲拓撲
5) 監控告警
6.2 Sql語句
6.3 慢查詢
6.4 流量可視化
6.5 集群診斷報告
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129138.html