首页 > 数据库 >Mysql 系列 | 复制表数据

Mysql 系列 | 复制表数据

时间:2022-11-17 15:03:47浏览次数:38  
标签:文件 系列 -- 导出 t2 t1 复制 Mysql ibd

需要复制的数据较少的场合,可以控制源表扫描行数且加锁范围很小的情况下,直接用 insert...select 语句即可实现少量数据的复制。

数据量较大的情况,为了避免源表加读锁,需要先将数据放入外部文件,再写入目标表

mysqldump 导出

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=dbbk.sql
  • 用 mysqldump 命令将数据导出成 insert 语句

  • 可以通过添加 where 条件,实现导出部分数据

  • 文件保存在客户端机器,会自动覆盖之前的同名文件

  • -add-locks=0 表示输出的文件结果中没有 LOCK TABLES t WRITE;

  • -no-create-info 表示不导出表结果

  • -single-transaction 表示导出时不对表 db1.t 加锁,使用 START TRANSACTIONWITH CONSISTENTSNAPSHOT 的方法

  • -set-gtid-purged=off 表示不输出 gtid 相关的信息

  • -result-file 表示输出文件的路径

  • 将数据写入目标数据库 db2 中,mysql -h$host -P$port -u$user db2 -e "source dbbk.sql"

导出 CSV 文件

select * from db1.t where a>900 into outfile 'dbbk.csv';
  • 导出的 csv 文件保存在数据库服务端,且每次只能导出一张表的数据

  • into outfile 表示输出文件的位置,受参数 secure_file_priv 的限制

    • secure_file_priv=empty,表示不限制文件生成的位置,不建议!!

    • secure_file_priv=具体路径,表示生成的文件只能放在指定目录或子目录

    • secure_file_priv=NULL,表示禁止在 Mysql 实例中进行导出 csv 操作

  • 如果服务器存在同名文件会报错,不会自动覆盖

  • 这种方式只会导出数据,没有表结构

  • 将数据写入目标 db2.t 表中,以换行符为每一行数据的分隔符,load data infile 'dbbk.csv' into table db2.t;

物理拷贝

  • innodb 表都对应有 .frm.ibd 文件,但是直接拷贝这两文件不管用!!!除了物理文件外,还需要在数据字典中注册,否则系统不会识别

  • Mysql5.6 引入了可传输表空间(transportable tablespace)的方法,通过导出后导入表空间的方式实现

    • create table t2 like t1,创建一个相同表结构的空表 t2

    • alter table t2 discard tablespace,t2.ibd 文件会被删除

    • flush table t1 for export,生成 t1.cfg 文件,此时表 t1 只读,直到 unlock tables

    • cp t1.cfg t2.cfg cp t1.ibd t2.ibd,得到 t2.cfg 和 t2.ibd,注意文件权限,Mysql需要可读写

    • unlock tables,t1.cfg 文件会被删除

    • alter table t2 import tablespace,将 t2.ibd 作为表 t2 的新的表空间

  • 物理拷贝方式,比起前两种速度最快

  • 只能拷贝全表数据,而且需要登陆到服务器进行操作

  • 源表和目标表的引擎必须都是 innodb



三种方式各有利弊,选择合适的就是最好的

标签:文件,系列,--,导出,t2,t1,复制,Mysql,ibd
From: https://www.cnblogs.com/rendd/p/16899488.html

相关文章

  • Mysql去重获取最新的一条数据
    Mysql去重获取最新的一条数据select*fromyjzt_kindergartensrwhereidin(selectmax(id)fromyjzt_kindergartensgroupbyname) ......
  • 2.mysql-库表行管理
    1.数据库管理1.1SQL语句1.1.1 查看当前所有的数据库showdatabases;   1.1.2 创建数据库createdatabase数据库名;createdatabse数据库名defaultc......
  • docker inspect |mysql IPADRESS
    version:'3'services:db:#构建mysql镜像image:mysqlcontainer_name:mysql-db#容器名restart:alwaysenvironme......
  • mysql group by
    Error1140:InaggregatedquerywithoutGROUPBY,sql_mode=only_full_group_by MySQL5.5.27上跑没有问题,在MySQL5.7.24上就报了sql_mode=only_full_group_by的错误......
  • debian解决vim不能用鼠标进行复制粘贴
    1、获取root权限2、建立一个文件vimrc.local  在/etc/vim下。touch/etc/vim/vimrc.localvim/etc/vim/vimrc.local  添加如下内容,wq保存退出即可。其中注意每个vim版......
  • 1.mysql-简介及安装
    1.简介数据库管理系统可以帮助我们实现对数据进行管理,我们只要学习对应的指令即可,目前市面上有很多数据库管理系统产品MySqlOracleSQlitePostgreSQL.........
  • Redis中主从复制的原理详解
    主从复制的方式命令slaveof。优点:无需重启。缺点:不便于管理 //命令行使用slaveofipport//使用命令后自身数据会被清空,但取消slave只是停止复制,并不清空修改配置。优......
  • mysql获取当前月,当前年天数(包含上个月,上一年天数)
     1、获取当前月天数:selectday(last_day(NOW())); 2、获取上一月天数:SELECTday(LAST_DAY(date_sub(curdate(),interval1MONTH)));  3、获取当前年的总......
  • MySql类型转换函数cast
    这两天处理一个现网的MySQL慢查询工单,学到了一个好用的MySQL函数:cast。事情是这样的:我们有两张表t_user和t_rule表,需要关联这两张表去查询,关联字段是t_user表的主键......
  • MySQL8 常用命令
    初始化(初始化之后的密码需要记一下,首次登录的时候需要用到)mysqld--initialize--console安装(服务名称可选,默认为MySQL)mysqldinstall服务名称启动服务netstar......