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。

时间: 2024-09-13 12:31:56

MySQL传输表空间小结(r12笔记第2天)的相关文章

[20170623]利用传输表空间恢复部分数据.txt

[20170623]利用传输表空间恢复部分数据.txt --//昨天我测试使用传输表空间+dblink,上午补充测试发现表空间设置只读才能执行impdp导入原数据,这个也很好理解. --//这样的操作模式仅仅减少expdp生成原数据的过程. --//我想一下,rman也支持建立传输表空间的命令.我仔细看了以前的笔记,发现这样最大的有点不用设置只读,实际上它是通过建立辅组实 --//例来建立传输文件,理论讲可以恢复到特定的scn,这样可以利用它解决一些误操作的问题,还是通过例子来说明问题. 1.环

使用rman增量备份来更新传输表空间

要使用rman增量备份来更新传输表空间需要了解传输表空间与rman的增量备份.这里主要介绍使用增量备份来更新传输表空间,就不介绍传输表空间与rman增量备份.下面是使用rman增量备份来更新传输表空间的操作.目标主机是weblogic29,原主机是weblogic28. 1.在两台数据库服务器上配置NFS 配置/etc/exports nfs允许挂载的目录及权限需在文件/etc/exports中进行定义.例如,我们要将数据文件所在目录 /u01/app/oracle/oradata/jytest

Oracle可传输表空间的总结

传输表空间综述: 不论是数据字典管理的表空间还是本地管理的表空间,都可以使用传输表空间技术:从9i开始传输表空间不需要在源数据库和目标数据库之间具有同样的DB_BLOCK_SIZE块大小:使用传输表空间迁移数据比使用数据导入导出工具迁移数据的速度要快,这是因为传输表空间只是复制包含实际数据的数据文件到目标数据库的指定位置,而使用数据导入导出工具将传输表空间对象的元数据到目标数据库. 我们知道Oracle利用imp/impdp传输表空间transport_tablespace需要满足以下条件: 1

[20170623]利用传输表空间恢复数据库2.txt

[20170623]利用传输表空间恢复数据库2.txt --//继续上午的测试,测试truncate,是否可行,理论讲应该没有问题.我主要的目的测试是否要切换日志. --//参考链接 : http://blog.itpub.net/267265/viewspace-2141166/ 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER -------------------------

[20170623]传输表空间补充测试.txt

[20170623]传输表空间补充测试.txt --//昨天测试了使用dblink+传输表空间,链接如下:http://blog.itpub.net/267265/viewspace-2141115/ --//今天补充测试看看加参数SQLFILE生成的脚本是什么内容. impdp scott/book network_link=l_dbcn1 transport_tablespaces=users transport_datafiles=/home/oracle/backup/sugar01.d

[20130708]传输表空间与data_object_id.txt

[20130708]传输表空间与data_object_id.txt 传输表空间与scn.txt:http://space.itpub.net/267265/viewspace-750140 初学者经常搞混视图dba_objects中object_id和data_object_id,一般建立表两者是相等的,容易混淆.建立分区表的话,表仅仅有object_id,没有data_object_id,分区表才有data_object_id. 实际上有些对象比如view,sequence等仅仅有objec

[20121128]传输表空间与scn.txt

[20121128]传输表空间与scn.txt 今天测试如果使用传输表空间,数据文件的scn的变化.如果传输表空间的数据文件scn很大,传过来后数据库的scn是否同步到最大的情况. 测试机器A(10g) SQL> select * from v$version where rownum BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edi

【MOS】如何利用RMAN可传输表空间迁移数据库到不同字节序的平台(文档 ID 1983639.1)

如何利用 RMAN 可传输表空间迁移数据库到不同字节序的平台 (文档 ID 1983639.1) 适用于: Oracle Database - Enterprise Edition - 版本 10.1.0.2 到 12.1.0.1 [发行版 10.1 到 12.1]本文档所含信息适用于所有平台******************* 警告 ************* Document 1334152.1 Corrupt IOT when using Transportable Tablespace

【TTS】传输表空间Linux ->AIX 基于rman

[TTS]传输表空间Linux asm -> AIX asm 基于rman 一.1  BLOG文档结构图       一.2  前言部分   一.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 异构平台下传输表空间的实施 ② 传输表空间基于表空间的read only和rman2种方式 ③ 平台字节序.自包含概念 ④ expdp/impdp的应用     Tips:        ① 若文章代码格式有错乱,推