【TiDB 使用环境】生产环境
【TiDB 版本】V6.5.1
【问题描述】
在生产环境中,集群内的数据库中有业务表数量为10亿条,在同一集群内建立另外一个数据库,如何快速的将数据同步过去?
【更高要求】如果可以将老库表数据通过配置切换过去,也可以
使用rename最方便。不过这样操作后,A库就没有a表了,需要重建表。
rename table A库.a表 to B库.a表
https://docs.pingcap.com/zh/tidb/stable/sql-statement-rename-table/#rename-table
在 TiDB 集群内快速迁移或复制数据从一个库表到另一个库表,有几种高效的方法:
1. 使用 INSERT INTO ... SELECT 语句
这是最简单直接的方法,适合中小规模数据迁移:
sql
– 创建目标表(如果不存在) CREATE TABLE target_db.target_table LIKE source_db.source_table; – 复制数据 INSERT INTO target_db.target_table SELECT * FROM source_db.source_table;
优点:
- 简单易用
- 无需额外工具
缺点:
- 大表可能耗时较长
- 会占用大量内存和I/O资源
2. 使用 TiDB Lightning 的 Local 模式
对于大数据量迁移,TiDB Lightning 是更高效的选择:
- 导出源表数据:
bash
dumpling -h 127.0.0.1 -P 4000 -u root -t 16 -o /tmp/source_data \ –filetype sql --sql “SELECT * FROM source_db.source_table”
- 使用 TiDB Lightning 导入:
bash
tidb-lightning --config lightning.toml
配置示例 (lightning.toml):
toml
[tikv-importer] backend = “local” sorted-kv-dir = “/tmp/sorted-kv-dir” [mydumper] data-source-dir = “/tmp/source_data” [tidb] host = “127.0.0.1” port = 4000 user = “root” password = “” status-port = 10080
3. 使用 BR (Backup & Restore) 工具
对于超大表,可以使用 BR 工具:
bash
备份源表 br backup table \ –db source_db \ –table source_table \ -s local:///tmp/backup \ –pd 127.0.0.1:2379 # 恢复到目标表 br restore table \ –db target_db \ –table target_table \ -s local:///tmp/backup \ –pd 127.0.0.1:2379
4. 使用 CDC (TiCDC) 进行实时同步
如果需要持续同步或最小停机时间:
bash
创建同步任务 cdc cli changefeed create \ –pd=http://127.0.0.1:2379 \ –sink-uri=“mysql://root@127.0.0.1:4000/” \ –filter-rules=“filter.default-rules=["source_db.source_table"]” \ –target-db=“target_db” \ –target-table=“target_table”
注意事项
- 大表操作建议在业务低峰期进行
- 确保目标库表有足够的存储空间
- 对于有外键约束的表,需要注意迁移顺序
- 迁移后建议校验数据一致性
选择哪种方法取决于数据量大小、停机时间要求和集群资源状况。
转人工
真的笑喷了~~
试验过了,秒级的,很快
有没有快速复制的?
很遗憾,没有快速复制的。官方推荐的除了导出导入,就剩batch insert了。
https://docs.pingcap.com/zh/tidb/stable/sql-statement-batch/#batch
br 的方案不可行的,库名、表名不能改
此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。