千家信息网

MySQL传输表空间小结(r12笔记第2天)

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,在MySQL中如果要迁移一个表导另外一个服务器/环境中,常规的做法就是使用备份工具备份,比如mysqldump,然后拷贝备份到目标服务器或者环境导入。如果某一个表数据量很大,导出dump文件很大的情况
千家信息网最后更新 2026年11月02日MySQL传输表空间小结(r12笔记第2天)

在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环境中。

我们选择一个表users作为测试所用,数据量在2万条左右。数据文件情况:

-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)

这个命令值得一提的是,保持当前的窗口,不要关闭,如果关闭,cfg文件就会自动删除,可以看到命令运行后生成了cfg文件。

-rw-rw---- 1 mysql mysql 599 Mar 13 08:17 users.cfg
-rw-rw---- 1 mysql mysql 8602 Feb 13 23:10 users.frm
-rw-rw---- 1 mysql mysql 11534336 Mar 12 22:55 users.ibd在flush table之后,这个表users就被锁定了,DML操作是阻塞的,也就意味着迁移的过程中,是无法直接写入数据的。

>insert into users values(20234312310,'aa');
ERROR 1099 (HY000): Table 'users' was locked with a READ lock and can't be updated表users的定义信息如下,可以使用show create table users或者mysqldump --no-date test users这种方式得到。

DROP TABLE IF EXISTS `users`;
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;而cfg文件的格式有一些明显的差别,可以通过strings一窥其中的概要信息。

# strings users.cfg
mbionline.test.com
test/users
userid
username
DB_ROW_ID
DB_TRX_ID
DB_ROLL_PTR
PRIMARY
userid
DB_TRX_ID
DB_ROLL_PTR
username
username
username
userid
idx_users
userid
username完成之后推出会话,设置unlock tables即可。

跨版本传输表空间-目标端操作

目标端的操作非常关键,目标端是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来进行数据文件挂载。

> alter table users import tablespace;
ERROR 1808 (HY000): Schema mismatch (Table flags don't match, server table has 0x5 and the meta-data file has 0x1)或者下面的错误:

> alter table users import tablespace;
ERROR 1808 (HY000): Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format.)通过错误信息可以发现和表的一个属性有关。我们先解决问题,添加属性row_format

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)可见整个过程是非常快的,执行完成之后,我们检查一下表的情况。[test]> check table users;
+------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------+-------+----------+----------+
| test.users | check | status | OK |
+------------+-------+----------+----------+
1 row in set (0.16 sec)查看表的数据进行验证。

[test]> select count(*)from users;
+----------+
| count(*) |
+----------+
| 20001 |
+----------+
1 row in set (0.00 sec)这样迁移的过程就告一段落,我们很顺利的把一个表从MySQL 5.6迁移到了5.7环境中。


回到刚刚碰到的问题,为什么在5.6迁移至5.7会有报错。

> alter table users import tablespace;
ERROR 1808 (HY000): Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format.)原因就是Innodb_file_format在5.6中是Antelope,在MySQL 5.7中是Barracuda,主要是在表压缩和行的动态格式上有所改变。更详细的内容可以参考:

https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-7.html
小结

其实这个特性在Oracle中已经有耳熟能详的的方案,TTS,支持跨平台,转换字节顺序,甚至可以支持基于增量备份的迁移方案,MySQL中的迁移方式和Oracle传统的TTS有些相似。当然上面的操作还可以使用Percona的工具innobackupex 来完成,我们下一篇来进行演示。

怎么能够形象的表达这种迁移的感觉呢,我连超市里看葡萄酒都能看成 read write。

数据 文件 环境 目标 拷贝 空间 信息 就是 备份 情况 工具 版本 过程 配置 传输 很大 可以通过 命令 属性 方式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技园 有格互联网科技 互联网科技图片 博彦科技互联网金融 新华互联网科技学校 深圳互联网科技公司 互联网科技公司电话 狮子座互联网科技有限公司 上海万想互联网科技 互联网科技创新企业排名 广西拼得多互联网科技有限公司 太原新华互联网科技学校怎么样 允成互联网科技有限公司融资 互联网硬科技公司 广州梦谷互联网科技有限公司领导 深圳互联网科技园地址 第三届互联网大会安防黑科技 重庆科技产业互联网有哪些 科技美学互联网 艺术 互联网科技快速发展优美句子 互联网科技工作委员会毛军 科技赋能下的互联网金融 互联网金融监管科技数据 西安互联网科技公司 互联网科技有限公司 翻译 山东吉时兔互联网科技有限公司 天速互联网络科技有限公司 互联网大会黑科技排名 互联网科技快讯热点 武汉亿视互联网科技有限公司
0