本文檔将詳細介紹如何對 TiDB 進行全量備份與恢複。增量備份與恢複可使用 TiDB Binlog。
這裡我們假定 TiDB 服務資訊如下:
Name | Address | Port | User | Password |
---|---|---|---|---|
TiDB | 127.0.0.1 | 4000 | root | * |
在這個備份恢複過程中,我們會用到下面的工具:
- mydumper 從 TiDB 導出資料
- loader 導入資料到 TiDB
下載下傳 TiDB 工具集 (Linux)
# 下載下傳 tool 壓縮包wget http://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.tar.gzwget http://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.sha256# 檢查檔案完整性,傳回 ok 則正确sha256sum -c tidb-enterprise-tools-latest-linux-amd64.sha256# 解開壓縮包tar -xzf tidb-enterprise-tools-latest-linux-amd64.tar.gzcd tidb-enterprise-tools-latest-linux-amd64
複制
使用 mydumper
/ loader
全量備份恢複資料
mydumper
loader
mydumper
是一個強大的資料備份工具,具體可以參考 https://github.com/maxbube/mydumper。
可使用
mydumper
從 TiDB 導出資料進行備份,然後用
loader
将其導入到 TiDB 裡面進行恢複。
注意:
必須使用企業版工具集包的
,不要使用你的作業系統的包管理工具提供的
mydumper
。
mydumper
的上遊版本并不能對 TiDB 進行正确處理 (#155)。由于使用
mydumper
進行資料備份和恢複都要耗費許多時間,這裡也并不推薦。
mysqldump
mydumper
/ loader
全量備份恢複最佳實踐
mydumper
loader
為了快速的備份恢複資料 (特别是資料量巨大的庫), 可以參考以下建議:
- 使用 mydumper 導出來的資料檔案盡可能的小, 最好不要超過 64M, 可以設定參數 -F 64
- loader的
參數可以根據 tikv 的執行個體個數以及負載進行評估調整,例如 3個 tikv 的場景, 此值可以設為-t
;當 tikv 負載過高,loader 以及 tidb 日志中出現大量3 *(1 ~ n)
可以适當調小該值,當 tikv 負載不是太高的時候,可以适當調大該值。backoffer.maxSleep 15000ms is exceeded
資料恢複示例及相關的配置:
- mydumper 導出後總資料量 214G,單表 8 列,20 億行資料
- 叢集拓撲
- TIKV * 12
- TIDB * 4
- PD * 3
- mydumper -F 設定為 16, loader -t 參數 64
結果:導入時間 11 小時左右,19.4 G/小時
從 TiDB 備份資料
我們使用
mydumper
從 TiDB 備份資料,如下:
./bin/mydumper -h 127.0.0.1 -P 4000 -u root -t 16 -F 64 -B test -T t1,t2 --skip-tz-utc -o ./var/test
複制
上面,我們使用
-B test
表明是對
test
這個 database 操作,然後用
-T t1,t2
表明隻導出
t1
,
t2
兩張表。
-t 16
表明使用 16 個線程去導出資料。
-F 64
是将實際的 table 切分成多大的 chunk,這裡就是 64MB 一個 chunk。
--skip-tz-utc
添加這個參數忽略掉 TiDB 與導資料的機器之間時區設定不一緻的情況,禁止自動轉換。
向 TiDB 恢複資料
我們使用
loader
将之前導出的資料導入到 TiDB,完成恢複操作。Loader 的下載下傳和具體的使用方法見 Loader 使用文檔
./bin/loader -h 127.0.0.1 -u root -P 4000 -t 32 -d ./var/test
複制
導入成功之後,我們可以用 MySQL 官方用戶端進入 TiDB,檢視:
複制代碼mysql -h127.0.0.1 -P4000 -urootmysql> show tables;+-+| Tables_in_test |+-+| t1 || t2 |+-+mysql> select * from t1;+-++| id | age |+-++| 1 | 1 || 2 | 2 || 3 | 3 |+-++mysql> select * from t2;+-++| id | name |+-++| 1 | a || 2 | b || 3 | c |+-++
複制