一、前言

现有表 db1.t(1000行数据)和表 db2.t

create database db1;
use db1;create table t(id int primary key, a int, b int, index(a))engine=innodb;
delimiter ;;create procedure idata()begindeclare i int;set i=1;while(i<=1000)doinsert 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

二、复制表数据的三种方式

2.1.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=/client_tmp/t.sql;

1)–single-transaction 的作用是,在导出数据的时候不需要对表 db1.t 加表锁,而是使用 START TRANSACTION WITH CONSISTENT SNAPSHOT 的方法;2)–add-locks 设置为 0,表示在输出的文件结果里,不增加" LOCK TABLES t WRITE;" ;3)–no-create-info 的意思是,不需要导出表结构;4)–set-gtid-purged=off 表示的是,不输出跟 GTID 相关的信息;5)–result-file 指定了输出文件的路径,其中 client 表示生成的文件是在客户端机器上的。

  • 客户端:mysql -h127.0.0.1 -P13000 -uroot db2 -e "source /client_tmp/t.sql"

1)打开文件,默认以分号为结尾读取一条条的 SQL 语句;2)将 SQL 语句发送到服务端执行。

2.2.导出CSV文件方式的命令是什么(不用记)?如果binlog_format=statement格式,备库如何执行?load data命令的有哪两种用法?

  • 服务端:select * from db1.t where a>900 into outfile '/server_tmp/t.csv';

1)into outfile 指定了文件的生成位置(/server_tmp/),这个位置必须受参数 secure_file_priv 的限制。2)这条命令生成的文本文件中,原则上一个数据行对应文本文件的一行。

  • 客户端:load data infile '/server_tmp/t.csv' into table db2.t;

这条语句的执行流程如下所示:

1)打开文件 /server_tmp/t.csv,以制表符 (\t) 作为字段间的分隔符,以换行符(\n)作为记录之间的分隔符,进行数据读取;2)启动事务;3)判断每一行的字段数与表 db2.t 是否相同:若不相同,则直接报错,事务回滚;相同则提交;4)重复3步骤,最后提交事务。

  • 1)主库执行完成后,将 /server_tmp/t.csv 文件的内容直接写到 binlog 文件中。2)往 binlog 文件中写入语句 load data local infile ‘/tmp/SQL_LOAD_MB-1-0’ INTO TABLE `db2`.`t`。3)把这个 binlog 日志传到备库。4)备库的 apply 线程在执行这个事务日志时:a. 先将 binlog 中 t.csv 文件的内容读出来,写入到本地临时目录 /tmp/SQL_LOAD_MB-1-0 中;b. 再执行 load data 语句,往备库的 db2.t 表中插入跟主库相同的数据。

  • 1)不加“local”,是读取服务端的文件,这个文件必须在 secure_file_priv 指定的目录或子目录下;2)加上“local”,读取的是客户端的文件,只要 mysql 客户端有访问这个文件的权限即可。这时候,MySQL 客户端会先把本地文件传给服务端,然后执行上述的 load data 流程。

2.3.可以直接把表的.frm 文件和.ibd 文件拷贝到一个库中?为什么不可以?如何进行物理拷贝?

  • 不可以

  • 一个 InnoDB 表,除了包含这两个物理文件外,还需要在数据字典中注册。直接拷贝这两个文件的话,因为数据字典中没有,所以无法识别。

  • 可传输表空间(transportable tablespace) 的方法

2.4.三种方式的优缺点对比

  • 物理:优点 = 速度最快,尤其对于大表拷贝来说是最快的方法。缺点 = 1)必须是全表拷贝,不能只拷贝部分数据。2)需要到服务器上拷贝数据,在用户无法登录数据库主机的场景下无法使用。3)由于是通过拷贝物理文件实现的,源表和目标表都是使用 InnoDB 引擎时才能使用。

  • dump:优点 = 1)可以在 where 参数增加过滤条件,来实现只导出部分数据;2)支持跨引擎。缺点 = 不能使用 join 这种比较复杂的 where 条件写法。

  • csv:优点 = 1)最灵活;2)支持跨引擎。缺点 = 每次只能导出一张表的数据,而且表结构也需要另外的语句单独备份

补充:

MySQL的数据库其相关文件都会存放在安装目录下data文件夹下的同命文件夹中,不同的存储引擎创建的表其文件也不一样,下面来认识下这些数据库文件。

db.opt

用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。

.frm

与表相关的元数据信息都存放在.frm文件中,主要是表结构的定义信息,不论什么存储引擎,每一个表都会有一个以表名命名的.frm文件。

.MYD和.MYI

.MYD:MY Data,是MyISAM存储引擎专用的用于存放MyISAM表的数据;

.MYI:MY Index,也是专属于MyISAM存储引擎的主要存放MyISAM表的索引相关信息。

.ibd和.ibdata

两者都是专属于InnoDB存储引擎的数据库文件。

当采用共享表空间时所有InnoDB表的数据均存放在.ibdata中,所以当表越来越多时,这个文件会变得很大;

相对应的.ibd就是采用独享表空间时InnoDB表的数据文件。

修改为独享表空间的方法是在my.ini配置文件中添加/修改此条:

Innodb_file_per_table=1

转载自:https://blog.csdn.net/weixin_35728532/article/details/113428046

41 | MySQL快速复制数据到一张表中(本篇躺平一下,了解即可)相关推荐

  1. mysql 去重主表数据,两张表结构相同数据(百万级别)

    这里写自定义目录标题 mysql 去重主表数据,两张表结构相同数据(百万级别) 得到两张表的并集,查出主表在并集中出现的主键id 删除主表中重复的id,根据上面sql查出的数据 2.一部删除到位 my ...

  2. EXCEL中两列合并成一列以及根据相同列的值将表中一列的值复制到另一张表中?

    今在做EXCEL时遇两问题,现和大家分享如下: 1.如何将表中两列值合并到一列,并按照一定的分隔符进行分割,公式如下: 假如:要将F和G的值 合并到H列并按逗号","隔开:  H1 ...

  3. PLSQL如何将千万数据快速插入到另一张表中_数据库设计中的 9 大常见错误

    作为数据库设计人员,当我们负责数据库项目时,在数据库设计以及把数据库部署到生产环境的过程中可能会遇到一些挑战. 其中一些问题不可避免,也无法控制.但是,其中相当一部分可以追溯到数据库设计本身的质量.我 ...

  4. mysql复制数据到同一张表

    最近做数据新增时,发现一个表新增的数据依据表内之前的数据,只是第一个字符变动了下,想到写原型Sql来处理问题,现在数据量不多,用手改动也可以,但是不想这样做.主要用到了insert into A(A. ...

  5. SQL 将一张表的数据复制到另一张表

    destTable 需复制的表 srcTable 来源表 最基础的复制 INSERT INTO destTable SELECT * FROM srcTable 如果两个表的字段不对应,select后 ...

  6. mysql 把一个字段的值_mysql把一个表某个字段的内容复制到另一张表的某个字段的SQL语句写法...

    需求:把一个表某个字段内容复制到另一张表的某个字段. 实现sql语句1: UPDATE file_manager_folder f1 LEFT OUTER JOIN file_manager_fold ...

  7. mysql导入库排除某个表_mysql导入数据排除表-mysql导入数据排除某张表或多张表-吾爱编程网...

    mysql在导出数据的时候可以使用--ignore-table参数来排除某张或者多张表,在数据库导入同样也可以使用,接下来吾爱编程就为大家介绍一下关于mysql导入数据排除某张表或多张表的方法,有需要 ...

  8. mysql 查询一张表在另一张表中不存在的数据

    mysql数据库中一张表与另一张表有相同的一个字段,需要过滤出 表t_camera 中在 t_sys_role_camera表中不存在的数据,利用关键字 NOT EXISTS来实现. 同理可以使用EX ...

  9. MySQL快速复制数据库的方法

    http://blog.csdn.net/ssyan/article/details/9292099 MySQL快速复制数据库的方法 2013-07-10 16:0447162人阅读评论(2)收藏举报 ...

最新文章

  1. InnoDB purge原理--哪些undo log可purge
  2. 你以为A10 Networks只做应用交付?
  3. GDCM:gdcm::Anonymizer的测试程序
  4. yarn timeline1,timeline2官网解释
  5. 5-1 逻辑回归代码(含warning解释)
  6. cacti及其相关插件的安装
  7. LeetCode 112. 路径总和 、113. 路径总和 II 思考分析
  8. tf2: Gradients do not exist for variables when minimizing the loss.
  9. 学习Spring Boot:(十一) 自定义装配参数
  10. 在URL中使用另一个url作为参数时会被``截断的问题
  11. 拿来就用:11款不容错过的 Node.js 框架
  12. CAT - 监控平台之装配篇
  13. mysql nginx 无法访问_nginx可以启动成功却无法访问
  14. 【珍藏】 2012Android开发热门资料(110个)
  15. Java代码页面显示报表_Web报表开发中使用快逸报表分页标签:显示第几页和共几页...
  16. 计算机显卡怎样安装方法,电脑装机小知识,新手如何正确安装好独立显卡
  17. Android 实现自动点击屏幕的方法
  18. Python数据分析实例,利用Pandas建立流域三层蒸发和蓄满产流模型
  19. oracle 11g 导入\导出(expdp impdp)详解之导入
  20. 帆软finereport导出excel的数字过长变成科学计数法的解决方法

热门文章

  1. python制作小程序商城_python 实现(简单的一个购物商城小程序)
  2. 目视管理的优点浅谈(zt)
  3. js-OOP-对象字面量
  4. 浪潮SA5224M4上市 这个服务器“不太冷”
  5. 历届真题 小朋友崇拜圈【第九届】【省赛】【C组】——【C++】【C】【Java】【Python】四种语言解法
  6. 厦门大学830高分子化学与物理考研参考书目
  7. sw运行很卡怎么办_solidworks2016在win10下运行很卡怎么办_solidworks在win10中打开缓慢如何解决...
  8. 心理咨询微信小程序(实现聊天、预约功能)
  9. Widgets基础篇(上)
  10. 常用序列比对算法总结