MySQL传输表空间总结
发布时间:2022-03-30 11:24:42 所属栏目:搜索优化 来源:互联网
导读:在MySQL中如果要迁移一个表导另外一个服务器/环境中,常规的做法就是使用备份工具备份,比如mysqldump,然后拷贝备份到目标服务器或者环境导入。如果某一个表数据量很大,导出dump文件很大的情况下,使用导出导入工具其实会花费不少的时间. 怎么样提高效率
在MySQL中如果要迁移一个表导另外一个服务器/环境中,常规的做法就是使用备份工具备份,比如mysqldump,然后拷贝备份到目标服务器或者环境导入。如果某一个表数据量很大,导出dump文件很大的情况下,使用导出导入工具其实会花费不少的时间. 怎么样提高效率呢,可以有一种想法就是直接拷贝数据文件到目标环境,当然在早期版本中这么做是不可取的,因为会有很多关联数据在ibdata中,InnoDB的数据存在对应的数据字典信息,是存放在共享表空间中,无法直接剥离出来,而在5.6/5.7中,就推出了一个很不错的特性,就是迁移表空间,可以把这个配置信息剥离出来,简单来说就是把数据文件直接拷贝到目标环境,在目标端挂载即可。 这样一个操作的一个基本前提是使用了独立表空间,开启innodb_file_per_table. >show variables like '%per_table%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+ 1 row in set (0.00 sec) 跨版本传输表空间-源端操作 我们做一个有代表意义的测试,比如把某一个表从MySQL 5.6环境迁移到MySQL 5.7环境中。 -rw-rw---- 1 mysql mysql 8602 Feb 13 23:10 users.frm -rw-rw---- 1 mysql mysql 11534336 Mar 12 22:55 users.ibd数据情况: > select count(*) from users; +----------+ | count(*) | +----------+ | 20001 | +----------+ 1 row in set (0.01 sec)我们开始迁移数据,首先要生成一个cfg文件,导出配置信息。 >flush tables users for export; Query OK, 0 rows affected (0.00 sec) 跨版本传输表空间-目标端操作 目标端的操作非常关键,目标端是MySQL 5.7的环境。 首先需要在目标端创建相应的空表。然后使用如下的语句把数据文件截断。 > alter table users discard tablespace; Query OK, 0 rows affected (0.02 sec)手工拷贝数据文件.ibd和配置文件.cfg,拷贝到指定的目录下即可。 cp /tmp/users.cfg /home/mysql/test cp /tmp/users.ibd /home/mysql/test这个时候尤其需要注意文件的权限,拷贝完成,我们就可以通过import tablespace来进行数据文件挂载。 CREATE TABLE `users` ( `userid` int(11) unsigned NOT NULL, `username` varchar(64) DEFAULT NULL, PRIMARY KEY (`userid`), KEY `username` (`username`), KEY `idx_users` (`userid`,`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 row_format=compact;然后继续尝试Import tablespace操作。 > alter table users discard tablespace; Query OK, 0 rows affected (0.00 sec)可见整个过程是非常快的,执行完成之后,我们检查一下表的情况。 ![]() (编辑:包头站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐