MySQL 5.6传输表空间

在MySQL 5.6 Oracle引入了一个可移动表空间的特征(复制的表空间到另一个服务器)和Percona Server采用部分备份,这意味着你现在可以备份单个数据库或表;由于Percona Server 5.6的出现,innodb_import_table_from_xtrabackup是过时的Percona Server实现Oracle MySQL的可移动表空间的功能,就是在服务器之间复制的表空间的能力(table.ibd)。让我展示通过一个例子,我将采取选择性表部分备份而不是一个完整的MySQL服务器并且在线恢复它,而不需要关闭MySQL服务器

该实验用到一个备份工具percona xtrabackup,是一个开源且免费的MySQL数据库热备份软件,执行非阻塞InnoDB和xtradb数据库备份,想当好用, 最重要Percona支持部分备份模式,对应于特定的数据库或表格备份。

本实验环境:

服务器端版本:percona-5.6.21版本(下载地址:http://www.percona.com/downloads/Percona-Server-5.6/Percona-Server-5.6.21-70.1/binary/tarball/Percona-Server-5.6.21-rel70.1-698.Linux.x86_64.tar.gz

备份工具版本:percona-xtrabackup-2.2.5(下载地址:http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.5/binary/tarball/percona-xtrabackup-2.2.5-5027-Linux-x86_64.tar.gz

安装过程非常简单,这里不作说明

二、检查是否开启了独立表空间,在实验中,我发现(虽然MySQL5.6版本默认已经开启innodb_file_per_table选项,但在percona5.6的版本,我查看的时候是ON状态,但创建表的时候,只生成.frm文件而没有.ibd文件,所以创建表时,要查看下是独立表空间是否生效了:)

mysql> show global variables like ‘%innodb_file_pe%‘;
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)
mysql> system ls -l /data/percona5.6/irfan/
总用量 112
-rw-rw---- 1 percona5.6 percona5.6    65 12月  5 21:36 db.opt
-rw-rw---- 1 percona5.6 percona5.6  8586 12月  5 21:37 test.frm
-rw-rw---- 1 percona5.6 percona5.6 98304 12月  5 21:38 test.ibd

二、创建一个库,在库里创建一个test表,插入点数据,一会好验证。

mysql> create database irfan;
Query OK, 1 row affected (0.07 sec)

mysql> use irfan;
Database changed
mysql> CREATE TABLE `test` (
    ->   `id` int(11) DEFAULT NULL,
    ->   `name` char(15) DEFAULT NULL
    -> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.11 sec)

mysql> insert into test select * from testdb.test;
Query OK, 10 rows affected (0.05 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | aa   |
|    2 | bb   |
|    3 | cc   |
|    4 | dd   |
|    5 | ee   |
|    6 | ff   |
|    7 | gg   |
|    8 | hh   |
|    9 | ii   |
|   10 | jj   |
+------+------+
10 rows in set (0.00 sec)

三、把table_schema为irfan(就是刚刚创建的库)下的表test导出,保存为.txt的格式

[root ~]$ /usr/local/percona-5.6/bin/mysql -uroot -p123456 -S /data/percona5.6/mysql.sock --skip-column-names > -e "SELECT CONCAT(table_schema,‘.‘,table_name) FROM   information_schema.tables tables \
> WHERE table_schema IN (‘irfan‘) AND TABLE_NAME = ‘test‘;" > /root/tables_to_backup.txt
[root ~]$ cat  /root/tables_to_backup.txt
irfan.test

四、我们用比较新版本的Percona xtrabackup,因为支持多种方式采取部分备份,我们用--tables-file选项备份特定的表。

[root ~]$ xtrabackup --version
xtrabackup version 2.2.5 based on MySQL server 5.6.21 Linux (x86_64) (revision id: )
[root ~]$ innobackupex --defaults-file=/usr/local/percona-5.6/my.cnf --user=root --password=123456 --port=3310 --sock=/data/percona5.6/mysql.sock > --no-timestamp --tables-file=/root/tables_to_backup.txt /root/partial_backup/ > /root/xtrabackup.log 2>&1

查看一下备份成功了没,若completed OK,那就OK了:

[root ~]$ cat xtrabackup.log
...
.........innobackupex: Backup created in directory ‘/root/partial_backup‘
innobackupex: MySQL binlog position: filename ‘mysql-bin.000003‘, position 3398, GTID of the last change ‘‘
141205 21:41:50  innobackupex: Connection to database server closed
141205 21:41:50  innobackupex: completed OK!

下一步,我们需要准备备份,因为可能会有uncomitted事务需要回滚或事务日志重播备份, --export选项是为了创建 table.exp and table.cfg

[root ~]$ innobackupex --defaults-file=/usr/local/percona-5.6/my.cnf --user=root --password=123456 --port=3310 --sock=/data/percona5.6/mysql.sock > -apply-log --export /root/partial_backup/ > /root/xtrabackup-prepare.log 2>&1

查看最后是否是completed OK

[root ~]$ cat xtrabackup-prepare.log
...
........
xtrabackup: starting shutdown with innodb_fast_shutdown = 0
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 1659926
141205 21:42:35  innobackupex: completed OK!

五、在另一台服务器进行还原操作:(我用的是percona5.6的沙箱环境,有关沙箱的安装,请查看我的博客:http://www.cnblogs.com/xuanzhi201111/p/3998604.html

同样要确定独立表空间已经开启了,然后创建表,表结构要和原来备份的一致:

mysql [localhost] {msandbox} (none) > show variables like ‘innodb_file_per_table‘;
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)
mysql [localhost] {msandbox} ((none)) > create database irfan;
Query OK, 1 row affected (0.02 sec)
mysql [localhost] {msandbox} ((none)) > use irfan;
Database changed
mysql [localhost] {msandbox} (irfan) > CREATE TABLE `test` ( `id` int(11) DEFAULT NULL, `name` char(15) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.12 sec)

执行丢弃表空间命令

mysql [localhost] {msandbox} (irfan) > ALTER TABLE test DISCARD TABLESPACE;
Query OK, 0 rows affected (0.02 sec)

查看发现.ibd表空间文件没了:

[root irfan]$ ls
db.opt  test.frm

在备份的服务器上,把备份的表空间文件scp过来,注意:(要查看test.cfg文件和test.ibd文件权限是否给对)

[root irfan]$ pwd
/root/partial_backup/irfan
[root irfan]$ scp  test.cfg test.ibd
192.168.1.128:/root/sandboxes/msb_5_6_21/data/irfan

执行导入表空间命令,然后查看表数据:

mysql [localhost] {msandbox} (irfan) > ALTER TABLE test IMPORT TABLESPACE;
Query OK, 0 rows affected (0.04 sec)

mysql [localhost] {msandbox} (irfan) > select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | aa   |
|    2 | bb   |
|    3 | cc   |
|    4 | dd   |
|    5 | ee   |
|    6 | ff   |
|    7 | gg   |
|    8 | hh   |
|    9 | ii   |
|   10 | jj   |
+------+------+
10 rows in set (0.00 sec)

数据已经导回来,但为了安全起见,最好看看错误日志是否有报错,正常的应该没warning和error字眼的:

[root data]$ tail -f msandbox.err
2014-12-11 16:16:27 34035 [Note] InnoDB: Waiting for purge to start
2014-12-11 16:16:27 34035 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.21-rel70.1 started; log sequence number 1752156
2014-12-11 16:16:27 34035 [Note] RSA private key file not found: /root/sandboxes/msb_5_6_21/data//private_key.pem. Some authentication plugins will not work.
2014-12-11 16:16:27 34035 [Note] RSA public key file not found: /root/sandboxes/msb_5_6_21/data//public_key.pem. Some authentication plugins will not work.
2014-12-11 16:16:27 34035 [Note] Server hostname (bind-address): ‘127.0.0.1‘; port: 5621
2014-12-11 16:16:27 34035 [Note]   - ‘127.0.0.1‘ resolves to ‘127.0.0.1‘;
2014-12-11 16:16:27 34035 [Note] Server socket created on IP: ‘127.0.0.1‘.
2014-12-11 16:16:27 34035 [Note] Event Scheduler: Loaded 0 events
2014-12-11 16:16:27 34035 [Note] /usr/local/src/5.6.21/bin/mysqld: ready for connections.
Version: ‘5.6.21-70.1‘  socket: ‘/tmp/mysql_sandbox5621.sock‘  port: 5621  Percona Server (GPL), Release 70.1, Revision 698
2014-12-11 16:19:05 34035 [Note] InnoDB: Importing tablespace for table ‘irfan/test‘ that was exported from host ‘Hostname unknown‘
2014-12-11 16:19:05 34035 [Note] InnoDB: Phase I - Update all pages
2014-12-11 16:19:05 34035 [Note] InnoDB: Sync to disk
2014-12-11 16:19:05 34035 [Note] InnoDB: Sync to disk - done!
2014-12-11 16:19:05 34035 [Note] InnoDB: Phase III - Flush changes to disk
2014-12-11 16:19:05 34035 [Note] InnoDB: Phase IV - Flush complete

哈哈,已经成功还原表数据了^.^

参考资料:http://www.percona.com/blog/2014/12/09/mysql-5-6-transportable-tablespaces-best-practices/

时间: 2024-10-26 15:27:48

MySQL 5.6传输表空间的相关文章

mysql 5.6 使用传输表空间迁移表或恢复误删除的表

mysql 5.6 使用传输表空间迁移表或恢复误删除的表 http://blog.csdn.net/lidan3959/article/details/25152623 以前在网上也看过一些对5.6传输表空间的介绍,不过都写的不够具体详细,今天有空就具体操作了一把,并详细记录了一下算留个档 一,简单说明:1),传输表空间的限制:   1,mysql 版本 5.6.6 及其以上,并且版本建议源和目标版本建议都是GA版并且大版本一样   2,表引擎为innodb并且开启独立表空间  innodb_f

mysql5.6之 传输表空间迁移表或恢复误删除的表

一,简单说明: 1),传输表空间的限制:  1,mysql 版本 5.6.6 及其以上,并且版本建议源和目标版本建议都是GA版并且大版本一样  2,表引擎为innodb并且开启独立表空间  innodb_file_per_table  3,处于导出状态的表只允许读也即是"read_only"状态  4,DISCARD TABLESPACE不支持分区表[5.6.17才支持] 并且当表上具有外键关系的时候需要将 foreign_key_check设置为0  5,源和目标实例的page si

MySQL5.7传输表空间——迁移分区表

Mysql 传输表空间--将InnoDB分区表复制到另一个实例(二) 实验环境:(都是mysql5.7) 源库:192.168.2.200      mysql5.7.16    zhangdb下的emp_2分区表的 目标库:192.168.2.100    mysql5.7.18    test下  (将zhangdb的emp表,导入到目标库的test schema下) --:在源数据库中创建测试分区表emp_2,然后导入数据 MySQL [zhangdb]> CREATE TABLE emp

Oracle Study之案例--异构平台传输表空间(Linux至AIX)

Oracle Study之案例--异构平台传输表空间(Linux至AIX) 系统架构: 可                   源    库               目标库 操作系统 Linux RH6    AIX 5.3-09 主机名 rh6(192.168.8.245) aix211(192.168.8.211) 数据版本 Oracle 11gR2 Oracle 11gR2 数据库名 prod orcl 表空间 test1 test1    可传输表空间概述 Oracle 的可传输表空

Oracle传输表空间迁移数据库

本文是通过exp/imp方式实现,需要将数据库表空间处于只读模式,对于实时应用的生产数据库,可以采用rman方式进行传输表空间.   执行表空间传输有以下限制条件:    (1)源数据库和目标数据库必须处于相同的平台,10g以后可以用RMAN命令修改数据文件实现跨平台移动表空间.    (2)对于源数据库和目标数据库版本不同时,源数据库的版本必须低于目标数据库.    (3)两边数据库字符集和国家字符集必须一致.    (4)目标数据库不能存在同名的表空间. 1. 查询oracle支持的平台转换

【TTS】传输表空间AIX asm -> linux asm

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

【TTS】传输表空间Linux asm -> AIX asm

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

可传输表空间

oracle2271 对于可传输表空间有一个重要概念:自包含(Self-Contained). 在表空间传输的中,要求表空间集为自包含的,自包含表示用于传输的内部表空间集没有引用指向外部表空间集.自包含分为两种:一般自包含表空间集和完全(严格)自包含表空间集. 常见的以下情况是违反自包含原则的:  索引在内部表空间集,而表在外部表空间集(相反地,如果表在内部表空间集,而索引在外部表空间集,则不违反自包含原则).  分区表一部分区在内部表空间集,一部分在外部表空间集(对于分区表,要么全部包含在

使用传输表空间迁移数据

一.检查是否满足传输表空间的条件1.检查源库与目标库的平台支持 源库: SQL> select d.name,i.version,d.platform_name,endian_format from v$transportable_platform tp,v$database d,v$instance i 2 where tp.PLATFORM_NAME=d.platform_name; NAME VERSION PLATFORM_NAME ENDIAN_FORMAT --------- ---