41 | 怎么最快地复制一张表?
41 | 怎么最快地复制一张表?
讲述:林晓斌
时长13:30大小12.33M
mysqldump 方法
导出 CSV 文件
物理拷贝方法
小结
上期问题时间
赞 37
提建议
精选留言(42)
- 长杰2019-02-17课后题答案 不加“local”,是读取服务端的文件,这个文件必须在 secure_file_priv 指定的目录或子目录下;而备库的apply线程执行时先讲csv内容读出生成tmp目录下的临时文件,这个目录容易受secure_file_priv的影响,如果备库改参数设置为Null或指定的目录,可能导致load操作失败,加local则不受这个影响。
作者回复: 👍
61 - poppy2019-02-15关于思考题,我理解是备库的同步线程其实相当于备库的一个客户端,由于备库的会把binlog中t.csv的内容写到/tmp/SQL_LOAD_MB-1-0中,如果load data命令不加'local'表示读取服务端的文件,文件必须在secure_file_priv指定的目录或子目录,此时可能找不到该文件,主备同步执行会失败。而加上local的话,表示读取客户端的文件,既然备份线程都能在该目录下创建临时文件/tmp/SQL_LOAD_MB-1-0,必然也有权限访问,把该文件传给服务端执行。展开
作者回复: 👍这是其中一个原因
25 - 尘封2019-02-15老师mysqldump导出的文件里,单条sql里的value值有什么限制吗默认情况下,假如一个表有几百万,那mysql会分为多少个sql导出? 问题:因为从库可能没有load的权限,所以local
作者回复: 好问题, 会控制单行不会超过参数net_buffer_length,这个参数是可以通过--net_buffer_length 传给mysqldump 工具的
共 2 条评论17 - ☆appleう2019-02-15通知对方更新数据的意思是: 针对事务内的3个操作:插入和更新两个都是本地操作,第三个操作是远程调用,这里远程调用其实是想把本地操作的那两条通知对方(对方:远程调用),让对方把数据更新,这样双方(我和远程调用方)的数据达到一致,如果对方操作失败,事务的前两个操作也会回滚,主要是想保证双方数据的一致性,因为远程调用可能会出现网络延迟超时等因素,极端情况会导致事务10s左右才能处理完毕,想问的是这样耗时的事务会带来哪些影响呢? 设计的初衷是想这三个操作能原子执行,只要有不成功就可以回滚,保证两方数据的一致性 耗时长的远程调用不放在事务中执行,会出现我这面数据完成了,而对方那面由于网络等问题,并没有更新,这样两方的数据就出现不一致了展开
作者回复: 嗯 了解了 这种设计我觉得就是会对并发性有比较大的影响。 一般如果网络状态不好的,会建议把这个更新操作放到消息队列。 就是说 1. 先本地提交事务。 2. 把通知这个动作放到消息队列,失败了可以重试; 3. 远端接收事件要设置成可重入的,就是即使同一个消息收到两次,也跟收到一次是相同的效果。 2 和3 配合起来保证最终一致性。 这种设计我见到得比较多,你评估下是否符合你们业务的需求哈
共 2 条评论14 - 库淘淘2019-02-15如果不加local 如secure_file_priv 设置为null 或者路径 可能就不能成功,这样加了之后可以保证执行成功率不受参数secure_file_priv影响。 还有发现物理拷贝文件后,权限所属用户还得改下,不然import tablespace 会报错找不到文件,老师是不是应该补充上去,不然容易踩坑。
作者回复: 嗯嗯,有同学已经踩了, 我加个说明进去,多谢提醒
11 - undifined2019-02-15老师,用物理导入的方式执行 alter table r import tablespace 时 提示ERROR 1812 (HY000): Tablespace is missing for table `db1`.`r`. 此时 db1/ 下面的文件有 db.opt r.cfg r.frm r.ibd t.frm t.ibd;这个该怎么处理 执行步骤: mysql> create table r like t; Query OK, 0 rows affected (0.01 sec) mysql> alter table r discard tablespace; Query OK, 0 rows affected (0.01 sec) mysql> flush table t for export; Query OK, 0 rows affected (0.00 sec) cp t.cfg r.cfg cp t.ibd r.ibd mysql> unlock tables; Query OK, 0 rows affected (0.01 sec) mysql> alter table r import tablespace; ERROR 1812 (HY000): Tablespace is missing for table `db1`.`r`.展开
作者回复: 应该就是评论区其他同学帮忙回复的权限问题了吧?
共 4 条评论9 - ☆appleう2019-02-15老师,我想问一个关于事务的问题,一个事务中有3个操作,插入一条数据(本地操作),更新一条数据(本地操作),然后远程调用,通知对方更新上面数据(如果远程调用失败会重试,最多3次,如果遇到网络等问题,远程调用时间会达到5s,极端情况3次会达到15s),那么极端情况事务将长达5-15s,这样会带来什么影响吗?
作者回复: “通知对方更新上面数据” 是啥概念,如果你这个事务没提交,其他线程也看不到前两个操作的结果的。 设计上不建议留这么长的事务哈,最好是可以先把事务提交了,再去做耗时的操作。
7 - 信信2019-02-15老师好,唯一索引的加next-key lock时,会退化会记录锁。这中间会先拿到间隙锁再释放,还是从一开始就不会获取间隙锁,直接只获取记录锁呢?
作者回复: 在我们这篇的例子里面,insert duplicate key后导致加锁这个,是不会退化的哦。 如果是说我们在21篇讲的加锁规则里面, 这个退化的效果就是直接不加间隙锁
共 2 条评论7 - skyoo2019-02-15mysql> select * from t; +----+------+ | id | name | +----+------+ | 1 | Bob | | 2 | Mary | | 3 | Jane | | 4 | Lisa | | 5 | Mary | | 6 | Jane | | 7 | Lisa | +----+------+ 7 rows in set (0.00 sec) mysql> create table tt like t; Query OK, 0 rows affected (0.03 sec) mysql> alter table tt discard tablespace; Query OK, 0 rows affected (0.01 sec) mysql> flush table t for export; Query OK, 0 rows affected (0.01 sec) mysql> unlock tables; Query OK, 0 rows affected (0.00 sec) mysql> alter table tt import tablespace; Query OK, 0 rows affected (0.03 sec) mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | t | | t2 | | tt | +----------------+ 3 rows in set (0.00 sec) mysql> select * from t; +----+------+ | id | name | +----+------+ | 1 | Bob | | 2 | Mary | | 3 | Jane | | 4 | Lisa | | 5 | Mary | | 6 | Jane | | 7 | Lisa | +----+------+ 7 rows in set (0.00 sec) mysql> select * from tt; +----+------+ | id | name | +----+------+ | 1 | Bob | | 2 | Mary | | 3 | Jane | | 4 | Lisa | | 5 | Mary | | 6 | Jane | | 7 | Lisa | +----+------+ 7 rows in set (0.00 sec) ll 后 查看 tt.cfg 文件没有自动删除 5.7mysql -rw-r-----. 1 mysql mysql 380 2月 15 09:51 tt.cfg -rw-r-----. 1 mysql mysql 8586 2月 15 09:49 tt.frm -rw-r-----. 1 mysql mysql 98304 2月 15 09:51 tt.ibd展开
作者回复: 你说得对,👍细致 import动作 不会自动删除cfg文件,我图改一下
6 - 夜空中最亮的星2019-02-15学习完老师的课都想做dba了4
- 小灰灰zyh2019-04-16老师您好,想问下如果是迁移5000W左右的一张表,使用导出CSV文件的方式效率高吗?
作者回复: 导出挺快的,但是导入就不好办了。~
3 - AstonPutting2019-02-22老师,mysqlpump能否在平时代替mysqldump的使用?
作者回复: 我觉得是
共 3 条评论3 - PengfeiWang2019-02-18老师,您好: 文中“–add-locks 设置为 0,表示在输出的文件结果里,不增加" LOCK TABLES t WRITE;" 是否是笔误,--add-locks应该是在insert语句前后添加锁,我的理解此处应该是--skip-add-locks,不知道是否是这样?
作者回复: 嗯嗯,命令中写错了,是--add-locks=0, 效果上跟--skip-add-locks是一样的哈 👍细致
3 - 千木2019-02-15老师您好,您在文章的物理拷贝里面写到的注意事项的第二点,说为了保持表空间的id和数据字典一致,会修改t.ibd的表空间id。 然后我理解从unlock tables;之后应该就不会对t表造成影响了,所以你的本意其实是会修改r.ibd的表空间id吗?
作者回复: 你说得对,我这里笔误了,修改的是r.ibd。 unlock tables以后就对表没有影响了
2 - 与狼共舞2020-03-02我们这边的运维使用 mysql 直接导出,这种和mysqldump有多大的区别?
作者回复: 原理类似,不过mysqldump本身会保留一些环境信息、字符集这些,自己导出的话要注意保留这些
共 2 条评论1 - 佳2019-03-14老师好,这个/tmp/SQL_LOAD_MB-1-0 是应该在主库上面,还是备库上面?为啥我执行完是在主库上面出现了这个文件呢?
作者回复: 就是在MySQL的运行进程所在的主机上
共 2 条评论1 - 小鬼2022-11-14 来自广东导出csv文件的时候会锁表吗?
- 君2022-05-13备库如何处理呢?
- 一步2021-11-02物理导入后,最后还有一个 r.cfg 文件,这个文件能删除吗? 导入成功后还有什么作用的?
- XXX2021-04-20关于复制表,如果在不跨库的情况下也可以通过pt-tools中的online DDL工具pt-online-schema-change,配合--no-swap-tables --no-drop-old-table --no-drop-triggers参数实现表拷贝,并依赖触发器保持这个两个表实时同步,在需要的时候删除触发器,结束同步