1. 逻辑复制:mysqldump 方法
mysqldump 将数据导出为一组 INSERT 语句,这是最常用的逻辑迁移方式 。
操作步骤
- 导出数据:
bash
mysqldump -h$host -u$user --single-transaction --add-locks=0 --no-create-info --set-gtid-purged=OFF db1 t --where="a>900" --result-file=t.sql
--single-transaction:导出时不加表锁,利用事务保证数据一致 。--add-locks=0:生成的 SQL 不包含LOCK TABLES语句 。
- 导入数据:
sql
mysql -h$host -u$user db2 -e "source t.sql"
source命令会读取文件并逐条执行INSERT语句 。
优缺点
- 优点 :支持
WHERE过滤(如只导出a>900的行),操作简单 。 - 缺点:生成的 SQL 文件较大,导入速度相对较慢 。
2. 逻辑复制:CSV 文件导出导入
相比 mysqldump,直接操作 CSV 文件(SELECT INTO OUTFILE + LOAD DATA)效率更高,且支持所有 SQL 过滤写法 。
操作步骤
- 导出 CSV:
sql
SELECT * FROM db1.t WHERE a > 900 INTO OUTFILE '/tmp/t.csv';
- 限制 :文件生成在 MySQL 服务端 。路径必须符合
secure_file_priv参数的限制,且不能覆盖已有文件 。
- 导入数据:
sql
LOAD DATA INFILE '/tmp/t.csv' INTO TABLE db2.t;
- 主备同步 :在
binlog_format=statement时,主库会将 CSV 内容写进 binlog。备库接收后先写入本地临时目录,再执行LOAD DATA LOCAL导入,以保证主备数据一致 。
优缺点
- 优点 :最灵活(支持复杂 SQL),速度比
mysqldump快 。 - 缺点 :每次只能导出一张表,且表结构需要单独用
SHOW CREATE TABLE导出 。
3. 物理复制:传输表空间(Transportable Tablespace)
对于 TB 级别的大表,物理拷贝 .ibd 数据文件是 速度最快 的方案 。
核心术语
.ibd:InnoDB 的数据文件 。.cfg:导出的描述文件(Metadata),用于在导入时让目标库识别拷贝的数据 。
操作流程(以将 t 拷贝到 r 为例)
- 准备环境 :创建同结构空表
CREATE TABLE r LIKE t;。 - 移除旧空间 :
ALTER TABLE r DISCARD TABLESPACE;(删除r.ibd) 。 - 导出源表 :
FLUSH TABLE t FOR EXPORT;(源表t变为只读,并生成t.cfg) 。 - 搬运文件 :在操作系统层面执行
cp t.cfg r.cfg; cp t.ibd r.ibd;(需注意 MySQL 进程的读写权限) 。 - 释放源表 :
UNLOCK TABLES;(删除临时的t.cfg) 。 - 导入空间 :
ALTER TABLE r IMPORT TABLESPACE;(MySQL 会修改文件中的表空间 ID 以匹配目标库) 。
优缺点
- 优点:恢复速度最快,适合全表拷贝或从误删备份中恢复数据 。
- 缺点 :必须全表拷贝,无法过滤数据;需要有服务器操作系统的权限;仅限 InnoDB 引擎 。