BlogBlog
首页
  • Vue
  • TypeScript
  • React
  • Angular
  • Node.js
  • 小程序
  • Flutter
  • 数据产品
  • 大数据

    • Hadoop
    • Hive
    • Spark
  • MySQL
  • Redis
  • Java
  • Python
  • Golang
GitHub
首页
  • Vue
  • TypeScript
  • React
  • Angular
  • Node.js
  • 小程序
  • Flutter
  • 数据产品
  • 大数据

    • Hadoop
    • Hive
    • Spark
  • MySQL
  • Redis
  • Java
  • Python
  • Golang
GitHub

快速复制一张表

  • insert...select语句
  • 利用mysqldump工具
  • 利用mysqlimport工具
  • load data infile语句
  • 物理拷贝方法

准备

create database db1;
use db1;

create table t(id int primary key, a int, b int, index(a) ) engine=innodb;
delimiter ;;
  create procedure idata()
  begin
    declare i int;
    set i=1;
    while(i<=1000)do
      insert into t values(i,i,i);
      set i=i+1;
    end while;
  end;;
delimiter ;
call idata();

create database db2;
create table db2.t like db1.t

insert...select语句

如果可以控制对源表的扫描行数和加锁范围很小的话,我们简单地使用 insert … select 语句即可实现。

INSERT INTO new_table SELECT * FROM old_table;

这种方法的缺点是,如果源表数据量很大,那么复制过程会消耗大量的资源,甚至会导致数据库服务器的性能下降。

利用mysqldump工具

mysqldump 工具可以用来导出和导入数据库中的数据。我们可以利用 mysqldump 工具导出源表的数据,然后导入到新表中。

mysqldump -u root -p old_db old_table > old_table.sql

mysqldump -h$host -P$port -u$user --add-locks=0 --no-create-info --single-transaction  --set-gtid-purged=OFF db1 t --where="a>900" --result-file=/client_tmp/t.sql

然后导入到新表中:

mysql -u root -p new_db < old_table.sql

mysql -u root -p new_db < t.sql

利用mysqlimport工具

mysqlimport 工具可以用来导入数据到数据库中。我们可以利用 mysqlimport 工具导入源表的数据到新表中。

mysqlimport -u root -p new_db old_table.sql

load data infile语句

load data infile 语句可以用来导入数据到数据库中。我们可以利用 load data infile 语句导入源表的数据到新表中。

-- export data to csv file
select * from db1 where a > 900 into outfile '/client_tmp/old_table.csv' fields terminated by ',' lines terminated by '\n';


load data infile '/client_tmp/old_table.txt' into table new_db.t fields terminated by ',' lines terminated by '\n' (id, a, b);

物理拷贝方法

物理拷贝方法是指利用系统提供的拷贝功能,将源表的数据直接拷贝到新表中。

在 MySQL 5.6 版本引入了可传输表空间(transportable tablespace) 的方法,可以通过导出 + 导入表空间的方式,实现物理拷贝表的功能。

假设我们现在的目标是在 db1 库下,复制一个跟表 t 相同的表 r:

  1. 执行 create table r like t,创建一个相同表结构的空表;
  2. 执行 alter table r discard tablespace,这时候 r.ibd 文件会被删除;
  3. 执行 flush table t for export,这时候 db1 目录下会生成一个 t.cfg 文件;
  4. 在 db1 目录下执行 cp t.cfg r.cfg; cp t.ibd r.ibd;这两个命令;
  5. 执行 unlock tables,这时候 t.cfg 文件会被删除;
  6. 执行 alter table r import tablespace,将这个 r.ibd 文件作为表 r 的新的表空间,由1. 于这个文件的数据内容和 t.ibd 是相同的,所以表 r 中就有了和表 t 相同的数据。
最近更新:: 2025/5/3 17:34
Contributors: alice