背景
TiDB 是一個分布式關系型數據庫,可以無縫對接 MySQL。考慮到產品數據量大的情況下,單機 MySQL 可能無法支撐,而無縫切換到 TiDB 集群也比較方便,所以領導讓我調研了一天遷移過程。
本文將記錄使用 mydumper 工具導出 MySQL 數據庫數據,并使用 TiDB Lightning 將數據遷移到 TiDB 集群的流程。對比以前部署測試 MyCat 時的經歷,發現 TiDB 遷移時不需要配置分庫分表規則,遷移過程更方便,對得起“無縫”二字!
第一步,部署 TiDB Lightning
TiDB Lightning 部署包是一個壓縮文件,解壓后可直接使用,部署流程非常簡單:
(一)確定 TiDB 版本
用 MySQL 客戶端連接到 TiDB 集群后,執行 select version() 語句得到版本號:
(二)下載工具包
根據版本號,確定下載連接:https://download.pingcap.org/tidb-toolkit-{version}-linux-amd64.tar.gz 替換為具體的版本號后的地址。
下載文件:
wget https://download.pingcap.org/tidb-toolkit-v4.0.0-linux-amd64.tar.gz
(三)解壓
進入部署包所在目錄,解壓:
tar -xzf tidb-toolkit-v4.0.0-linux-amd64.tar.gz
進入解壓后的 bin 目錄,查看它提供的工具:
mydumper 和 tidb-lightning 就是一對導出、導入工具,其中 mydumper 跟 MySQL 的 mysqldump 功能是一樣的。
但是據我測試導出 3.9G 的數據耗時來看,mydumper 比 mysqldump 快很多。
建議使用 mydumper,原因是用它導出的數據時,會自動創建 xxx-schema-create.sql 建庫文件,而且建表和插入 SQL 文件分開,不用額外操作,配套用 tidb-lightning 執行導入,不容易出錯。
如果用 mysqldumper 則需要注意導出建庫語句,是否需要添加 use database 之類的語句,用 MySQL 的 source 導入時容易出現的問題,都需要注意。不是配套的工具,這種方式沒有測試過。
第二步,導出 MySQL 數據
進入 bin 目錄,用 mydumper 工具,連接到目標數據庫上導出,命令如下:
./mydumper -h IP -P 3306 -u root -p 123456 -t 16 -F 128 -B targetDatabase -o /tidb-data/mydumpersql/
參數說明:
- -B, --database 需要備份的數據庫
- -t,–threads 備份執行的線程數,默認4個線程
- -F,–chunk-filesize 行塊分割表的文件大小,單位是MB
- -o,–outputdir 備份文件目錄
注意,最后一個 outputdir 的值,后面導入的時候需要使用。因為使用多線程,所以就不難理解為何它的效率會比 mysqldumper 高了。
第三步,導入 TiDB 集群
最后一步,利用 tidb-lightning 工具將第二步導出的數據,導入到 TiDB 集群中。
官網的操作流程不是很清楚,而且給出的 tidb-lightning 里面有一項配置對 4.0.0 版本來說會報錯,這里提供糾正后的完整配置。
(一)創建配置文件
在 bin 目錄下創建一個配置文件 tidb-lightning.toml【文件名稱任意】,并打開:
touch tidb-lightning.toml
vi tidb-lightning.toml
寫入如下配置信息:
[lightning]
# 轉換數據的并發數,默認為邏輯 CPU 數量,不需要配置。
# 混合部署的情況下可以配置為邏輯 CPU 的 75% 大小。
# region-concurrency =
# 日志
level = "info"
file = "tidb-lightning.log"
[tikv-importer]
# backend 設置為 local 模式
backend = "tidb"
# 設置本地臨時存儲路徑
# sorted-kv-dir = "/mnt/ssd/sorted-kv-dir"
[mydumper]
# Mydumper 源數據目錄。
data-source-dir = "/tidb-data/mydumpersql"
[tidb]
# 目標集群的信息。tidb-server 的監聽地址,填一個即可。
host = "192.168.xxx.xxx"
port = 4000
user = "root"
password = "root"
# 表架構信息在從 TiDB 的“狀態端口”獲取。
status-port = 10080
# pd-server 的地址,填一個即可
# pd-addr = "192.168.xxx.xxx:2379"
說明:
- data-source-dir 就是第二步導出時 -o 的參數值;
- host 是 TiDB 集群地址和端口;
- sorted-kv-dir 這個配置不支持,放開后會報錯:unknown configuration options: tikv-importer.sorted-kv-dir。
- pd-addr 這個配置沒啥用,去掉也不影響導入
(二)執行導入命令
由于數據庫全量導入,操作耗時較長,官方建議將導入命令封裝成腳本。
先在 bin 目錄下創建一個 loaddata.sh 文件,內容如下:
#!/bin/bash
nohup ./tidb-lightning -config ./tidb-lightning.toml > nohup.out &
執行腳本,然后查看 TiDB 的集群日志 tidb.log ,查看導入進度。
導入完成后,用 MySQL 客戶端連接到 TiDB 集群的一個主機,查看數據。
啟示錄
將 MySQL 數據遷移到 TiDB 的過程,直接參考官方文檔進行操作就可以了。但是,涉及到 tidb-lightning 工具的那一章節,內容跟數據遷移章節有一些看不懂,其中涉及到 tikv-importer,它和 tidb-lightning 的關系沒有詳細說明,還有一些配置項會導致導入報錯。
實踐證明,只用 tidb-lightning 工具就可以完成數據遷入過程。
去年 8 月份調研過 MyCat 集群,由于它的分片分庫規則比較復雜,而目前這個產品涉及的表比較多,而且很多都是動態創建的,所以只做了技術調研,一直沒有技術落地。
MyCat 和 TiDB 都不會對應用端代碼產生影響,JDBC 連接只需要修改 IP 和端口就好,幾乎沒有工作量。庫表遷移就不一樣了,TiDB 可以直接遷移。
MyCat 由于 Schema 和表創建涉及到分庫分表策略,需要自己設計數據分布規則,當初也只是簡單寫了一個生成配置的小程序,不敢保證能夠數據能夠無縫正確遷移。






