在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-5.5.40版本 (下载地址:http://www.percona.com/downloads/Percona-Server-5.5/Percona-Server-5.5.40-36.1/binary/tarball/Percona-Server-5.5.40-rel36.1-707.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

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

方法一:

一、检查是否开启了独立表空间

  1. mysql> show global variables like '%innodb_file_pe%';
  2. +-----------------------+-------+
  3. | Variable_name | Value |
  4. +-----------------------+-------+
  5. | innodb_file_per_table | ON |
  6. +-----------------------+-------+
  7. 1 row in set (0.00 sec)

二、创建一个库,在库里创建一个test表,插入点数据,一会好验证。在实验中,我发现(虽然MySQL5.6版本默认已经开启innodb_file_per_table选项,但在percona5.6的版本,我查看的时候是ON状态,但创建表的时候,只生成.frm文件而没有.ibd文件,所以创建表时,要查看下是否成功开启独立表空间了):

  1. mysql> create database irfan;
  2. Query OK, 1 row affected (0.07 sec)
  3.  
  4. mysql> use irfan;
  5. Database changed
  6. mysql> CREATE TABLE `test` (
  7. -> `id` int(11) DEFAULT NULL,
  8. -> `name` char(15) DEFAULT NULL
  9. -> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  10. Query OK, 0 rows affected (0.11 sec)
  11.  
  12. mysql> insert into test select * from testdb.test;
  13. Query OK, 10 rows affected (0.05 sec)
  14. Records: 10 Duplicates: 0 Warnings: 0
  15.  
  16. mysql> select * from test;
  17. +------+------+
  18. | id | name |
  19. +------+------+
  20. | 1 | aa |
  21. | 2 | bb |
  22. | 3 | cc |
  23. | 4 | dd |
  24. | 5 | ee |
  25. | 6 | ff |
  26. | 7 | gg |
  27. | 8 | hh |
  28. | 9 | ii |
  29. | 10 | jj |
  30. +------+------+
  31. 10 rows in set (0.00 sec)
  32.  
  33. 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

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

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

四、我们用比较新版本的Percona xtrabackup,因为支持多种方式采取部分备份,我们用--tables-file选项备份特定的表。( /root/partial_backup/ 这目录不用创建,如果之前存在,会报错innobackupex: Error: Failed to create backup directory /root/partial_backup/: 文件已存在 at /usr/bin/innobackupex line 3949.)

  1. [root ~]$ xtrabackup --version
  2. xtrabackup version 2.2. based on MySQL server 5.6. Linux (x86_64) (revision id: )
  3. [root ~]$ innobackupex --defaults-file=/usr/local/percona-5.6/my.cnf --user=root --password= --port= --sock=/data/percona5./mysql.sock \
  4. > --no-timestamp --tables-file=/root/tables_to_backup.txt /root/partial_backup/ > /root/xtrabackup.log >&
  5. [root irfan]$ pwd
    /root/partial_backup/irfan
    [root irfan]$ ls
  6. test.frm test.ibd

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

  1. [root ~]$ cat xtrabackup.log
  2. ...
  3. .........
    innobackupex: Backup created in directory '/root/partial_backup'
  4. innobackupex: MySQL binlog position: filename 'mysql-bin.000003', position , GTID of the last change ''
  5. :: innobackupex: Connection to database server closed
  6. :: innobackupex: completed OK!

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

  1. [root ~]$ innobackupex --defaults-file=/usr/local/percona-5.6/my.cnf --user=root --password= --port= --sock=/data/percona5./mysql.sock \
  2. > -apply-log --export /root/partial_backup/ > /root/xtrabackup-prepare.log >&
  3. [root irfan]$ pwd
  4. /root/partial_backup/irfan
  5. [root irfan]$ ls
  6. test.cfg test.exp test.frm test.ibd

查看日志最后是否为completed OK

  1. [root ~]$ cat xtrabackup-prepare.log
  2. ...
  3. ........
  4. xtrabackup: starting shutdown with innodb_fast_shutdown =
  5. InnoDB: FTS optimize thread exiting.
  6. InnoDB: Starting shutdown...
  7. InnoDB: Shutdown completed; log sequence number
  8. :: innobackupex: completed OK!

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

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

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

执行丢弃表空间命令

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

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

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

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

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

(在还原机操作)执行导入表空间命令,然后查看表数据:

  1. mysql [localhost] {msandbox} (irfan) > ALTER TABLE test IMPORT TABLESPACE;
  2. Query OK, 0 rows affected (0.04 sec)
  3.  
  4. mysql [localhost] {msandbox} (irfan) > select * from test;
  5. +------+------+
  6. | id | name |
  7. +------+------+
  8. | 1 | aa |
  9. | 2 | bb |
  10. | 3 | cc |
  11. | 4 | dd |
  12. | 5 | ee |
  13. | 6 | ff |
  14. | 7 | gg |
  15. | 8 | hh |
  16. | 9 | ii |
  17. | 10 | jj |
  18. +------+------+
  19. 10 rows in set (0.00 sec)

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

  1. [root data]$ tail -f msandbox.err
  2. 2014-12-11 16:16:27 34035 [Note] InnoDB: Waiting for purge to start
  3. 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
  4. 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.
  5. 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.
  6. 2014-12-11 16:16:27 34035 [Note] Server hostname (bind-address): '127.0.0.1'; port: 5621
  7. 2014-12-11 16:16:27 34035 [Note] - '127.0.0.1' resolves to '127.0.0.1';
  8. 2014-12-11 16:16:27 34035 [Note] Server socket created on IP: '127.0.0.1'.
  9. 2014-12-11 16:16:27 34035 [Note] Event Scheduler: Loaded 0 events
  10. 2014-12-11 16:16:27 34035 [Note] /usr/local/src/5.6.21/bin/mysqld: ready for connections.
  11. Version: '5.6.21-70.1' socket: '/tmp/mysql_sandbox5621.sock' port: 5621 Percona Server (GPL), Release 70.1, Revision 698
  12. 2014-12-11 16:19:05 34035 [Note] InnoDB: Importing tablespace for table 'irfan/test' that was exported from host 'Hostname unknown'
  13. 2014-12-11 16:19:05 34035 [Note] InnoDB: Phase I - Update all pages
  14. 2014-12-11 16:19:05 34035 [Note] InnoDB: Sync to disk
  15. 2014-12-11 16:19:05 34035 [Note] InnoDB: Sync to disk - done!
  16. 2014-12-11 16:19:05 34035 [Note] InnoDB: Phase III - Flush changes to disk
  17. 2014-12-11 16:19:05 34035 [Note] InnoDB: Phase IV - Flush complete

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

方法二:从运行MySQL实例复制表到另一个运行MySQL服务器是在MySQL手册描述了另一种方法:

  1. mysql> show create table dummy;
  2. +-------+-------------------------------------------------------------------------------------------------------------------------------+
  3. | Table | Create Table |
  4. +-------+-------------------------------------------------------------------------------------------------------------------------------+
  5. | dummy | CREATE TABLE `dummy` (
  6. `id` int(11) DEFAULT NULL,
  7. `dummy` varchar(10) DEFAULT NULL
  8. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
  9. +-------+-------------------------------------------------------------------------------------------------------------------------------+
  10. 1 row in set (0.00 sec)
  11.  
  12. mysql> select * from dummy;
  13. +------+-------+
  14. | id | dummy |
  15. +------+-------+
  16. | 1 | aa |
  17. | 2 | bb |
  18. | 3 | cc |
  19. | 4 | dd |
  20. | 5 | ee |
  21. | 6 | ff |
  22. | 7 | gg |
  23. | 8 | hh |
  24. | 9 | ii |
  25. | 10 | jj |
  26. +------+-------+
  27. 10 rows in set (0.00 sec)
  28.  
  29. mysql>

FLUSH TABLES FOR EXPORT只适用于Oracle MySQL 5.6/Percona Server 5.6,FLUSH TABLES FOR EXPORT会产生表的元数据文件(.cfg)和表空间文件(.ibd)

  1. mysql> FLUSH TABLES dummy FOR EXPORT;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql>

进到数据目录下查看已经产生了dummy.cfg和dummy.idb文件了:

  1. [root irfan]$ pwd
  2. /data/percona5./irfan
  3. [root irfan]$ ls
  4. db.opt dummy.cfg dummy.frm dummy.ibd test.frm test.ibd

去到另一台服务器,创建表,表结构一定要和目标MySQL上的一样,再执行丢弃表空间命令:

  1. mysql [localhost] {msandbox} (irfan) > use irfan;
  2. Database changed
  3. mysql [localhost] {msandbox} (irfan) > CREATE TABLE `dummy` ( `id` int(11) DEFAULT NULL, `dummy` varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  4. Query OK, 0 rows affected (0.04 sec)
  5.  
  6. mysql [localhost] {msandbox} (irfan) > ALTER TABLE dummy DISCARD TABLESPACE;
  7. Query OK, 0 rows affected (0.03 sec)

回到目标服务器,把dummy.cfg和dummy.ibd远程拷备到另一台服务器上:

  1. [root irfan]$ scp dummy.cfg dummy.ibd 192.168.1.128:/root/sandboxes/msb_5_6_21/data/irfan

然后回到数据库执行解释操作,再查看,已经没有dummy.cfg文件了,所以一定确定scp完了后再解锁:

  1. mysql> UNLOCK TABLES;
  2. Query OK, rows affected (0.06 sec)
  3.  
  4. [root irfan]$ ls
  5. db.opt dummy.frm dummy.ibd test.frm test.ibd

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

  1. mysql [localhost] {msandbox} (irfan) > ALTER TABLE dummy IMPORT TABLESPACE;
  2. Query OK, rows affected (0.03 sec)
  3.  
  4. mysql [localhost] {msandbox} (irfan) > show tables;
  5. +-----------------+
  6. | Tables_in_irfan |
  7. +-----------------+
  8. | dummy |
  9. | test |
  10. +-----------------+
  11. rows in set (0.00 sec)
  12.  
  13. mysql [localhost] {msandbox} (irfan) > select * from dummy;
  14. +------+-------+
  15. | id | dummy |
  16. +------+-------+
  17. | | aa |
  18. | | bb |
  19. | | cc |
  20. | | dd |
  21. | | ee |
  22. | | ff |
  23. | | gg |
  24. | | hh |
  25. | | ii |
  26. | | jj |
  27. +------+-------+
  28. rows in set (0.00 sec)

查看日志,已经成功导入了^。^

  1. -- :: [Note] InnoDB: Importing tablespace for table 'irfan/dummy' that was exported from host 'Hostname unknown'
  2. -- :: [Note] InnoDB: Phase I - Update all pages
  3. -- :: [Note] InnoDB: Sync to disk
  4. -- :: [Note] InnoDB: Sync to disk - done!
  5. -- :: [Note] InnoDB: Phase III - Flush changes to disk
  6. -- :: [Note] InnoDB: Phase IV - Flush complete

总结:第一种方法步骤多一些,而且要借用开源的备份工具percona-xtrabackup,而且要是版本比较新的;

        第二种方法,步骤简单,操作起来方便,但是要进行锁表操作,而且FLUSH TABLES FOR EXPORT只适用于Oracle MySQL 5.6/Percona Server 5.6,对于一个繁忙的OLTP系统,如果表比较大,锁住的时间比较长,对业务影响比较大

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

作者:陆炫志

出处:xuanzhi的博客 http://www.cnblogs.com/xuanzhi201111

您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。

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

  1. MySQL 表空间传输

    聊到MySQL数据迁移的话题,表空间传输时一个很实用的方法. 在MySQL 5.6 Oracle引入了一个可移动表空间的特征(复制的表空间到另一个服务器)和Percona Server采用部分备份,这 ...

  2. Innodb 表空间传输迁移数据

    在mysql5.5之前,mysql实例中innodb引擎表的迁移是个头疼的问题,要么使用mysqldump导出,要么使用物理备份的方法,但是在mysql5.6之后的版本中,可以使用一个新特性,方便地迁 ...

  3. Oracle表空间传输测试

    源数据库平台:window 7 64bit Oracle 11g 64bit目标数据库平台:RHEL6 64bit Oracle 11g 64bit 1.查看数据集 select * from nls ...

  4. MySQL单独存放表空间Innodb_file_per_table

    在mysql中Innodb_file_per_table参数的作用是什么呢,其实许多的朋友是不知道的,今天我们来看这篇MySQL单独存放表空间Innodb_file_per_table参数详解之后你就 ...

  5. Oracle11gR2导入导出实战之表空间传输

    Oracle11gR2导入导出实战之使用Datapump进行表空间传输 表空间检查 [oracle@localhost database]$ ps -ef|grep smon oracle 8981 ...

  6. mysql之 表空间传输

    说明:MySQL(5.6.6及以上),innodb_file_per_table开启. 1.1. 操作步骤: 0. 目标服务器创建相同表结构1. 目的服务器: ALTER TABLE t DISCAR ...

  7. mysql表空间传输(ERROR 1808) row_format设置

    文章结构如下: 从MYSQL5.6版本开始,引入了传输表空间这个功能,可以把一张表从一个数据库移到另一个数据库或者机器上.迁移的时候很方便,尤其是大表. 由于本次达到测试使用版本5.6.38传到5.7 ...

  8. mysql tablespace(独立表空间)超速备份大数据

    前序 对于用户自主创建的表,会采用此种模式,每个表由一个独立的表空间进行管理备份(速度相当的猛) 首先介绍一下文件 .ibd就被称之为独立表空间的数据文件 .frm就是元数据文件 就是创建表后生成的 ...

  9. Mysql InnoDB 共享表空间和独立表空间

    前言:学习mysql的时候总是习惯性的和oracle数据库进行比较.在学习mysql InnoDB的存储结构的时候也免不了跟oracle进行比较.Oracle的数据存储有表空间.段.区.块.数据文件: ...

随机推荐

  1. postman 学习网址

    postman使用详解: http://gold.xitu.io/entry/57597a62a341310061337885 https://www.getpostman.com/docs/writ ...

  2. Js实现input上传图片并显示缩略图

    用这个方法就可以很方便快捷的实现上传图片并显示缩略图的效果: FileReader 的 readAsDataURL() 先创建一个img标签,再用 fileReader 把input文件的赋值到img ...

  3. Codeforces 600E Lomsat gelral(dsu on tree)

    dsu on tree板子题.这个trick保证均摊O(nlogn)的复杂度,要求资瓷O(1)将一个元素插入集合,清空集合时每个元素O(1)删除.(当然log的话就变成log^2了) 具体的,每次先遍 ...

  4. Django_重装系统后无法使用 sqlite 数据库报错:com.intellij.execution.ExecutionException: Exception in thread "main" java.lang.ClassNotFoundException: org.sqlite.JDBC

     重装系统后无法使用 sqlite 数据库报错 报错 : com.intellij.execution.ExecutionException: Exception in thread "ma ...

  5. hdwiki 部署

    1.安装wamp 集成环境(部署过程出现的环境问题请搜索我的另外一篇文章 <wamp安装失败原因大全>)2.到 http://kaiyuan.hudong.com/download/ 下载 ...

  6. 【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)

    原题戳我 Solution: (部分复制Navi_Aswon博客) 解释博客中的两个小地方: \[\sum_{\left(S是G中y→x的一条路径的点集\right))}\prod_{2≤j≤n,(j ...

  7. HGOI20180815 (NOIP 提高组模拟赛 day2)

    Day 2 rank 11 100+35+30=165 本题是一道数论题,求ax+by=c的正整数对(x,y) x>=0并且y>=0 先说下gcd: 求a,b公约数gcd(a,b) 如gc ...

  8. HGOI20180814 (NOIP 模拟Day1)

    100pts=40+60+0 rank 56 若串联那么显然是这样: 若并联那么显然是这样: 串联时C<1,并联时C>1,贪心策略<1时尽可能串联,>1时尽可能并联 考虑这样一 ...

  9. 错误日志收集sentry的安装与简单使用

    通过官方文档https://docs.sentry.io/可以得知,安装服务有两种方式,一种是使用Python,这种方式个人感觉比较麻烦.于是选择了第二种方式:使用docker. 我是在Windows ...

  10. Mask-RCNN数据集制作

    转自https://blog.csdn.net/pingushen2100/article/details/80513043 一.Mask-RCNN数据集 1.1 训练Mask-RCNN用的到的文件有 ...