MySQL 备份恢复单个innodb表的教程

在实际环境中,时不时需要备份恢复单个或多个表(注意:这里除非明确指定,所说的表一律指InnoDB表),而对于innodb引擎恢复单个表需要整体的恢复,xtrabackup也可以单个表恢复,只不过是用的正则过滤的,不知最新版本是否支持表空间传输特性。本文将要说说怎么移动或复制部分或全部的表到另一台服务器上,而所要用到的技术点就是transportable tablespace特性,这就意味着MySQL5.6.6以及以上版本才支持。
表空间传输特性允许表空间从一个实例移动到另一个实例上。这在以前版本上,这对InnoDB表空间是不可能的,因为所有的表数据都是系统表空间的一部分。
在MySQL5.6.6以及更改版本,FLUSH TABLES ... FOR EXPORT 语法准备将InnoDB表复制到另一台服务器,然后在另一台服务器上执行ALTER TABLE ... DISCARD TABLESPACE 和 ALTER TABLE ... IMPORT TABLESPACE 将数据导入。将.cfg 和 .ibd 文件复制过去,用于在导入时更新表元数据,如空间ID。
使用限制和说明
innodb_file_per_table必须设置为on,在 MySQL5.6.6版本默认是开启的。居留在共享系统表空间的表不能静默。

当表静默时,只有只读事务被允许。

当导入表空间时,页面大小必须与导入实例的页面大小相符合。
DISCARD TABLESPACE 不支持分区表,也就意味着transportable tablespaces 也不支持分区表。如果在分区表上执行ALTER TABLE ... DISCARD TABLESPACE 将会返回下面的错误信息:ERROR 1031 (HY000): Table storage engine for 'part' doesn't have this option.
当foreign_key_checks=1时,DISCARD TABLESPACE 不支持主键外键约束关系。操作这些表时需要设置为foreign_key_checks。
ALTER TABLE ... IMPORT TABLESPACE 不强制外键约束。如果表之间有外键约束,所有的表应该在同一个时间点被导出。
ALTER TABLE ... IMPORT TABLESPACE 导入表空间不要求.cfg元数据文件。然而在导入时缺少了.cfg文件元数据检查就无法完成,或返回下面的信息:InnoDB: IO Read error: (2, No such file or directory) Error opening '.\test\t.cfg', will attempt to import without schema verification 1 row in set (0.00 sec) 。
当没有不匹配的表结构时,导入没有.cfg文件可能会更方便。此外,在元数据不能从.ibd文件中收集的故障恢复时,导入没有.cfg可能更有用的。
导出导入的MySQL版本需要相同。否则,文件必须要在导入的服务器上创建。
在复制架构中,主和从必须设置innodb_file_per_table=1。
在windows中,文件是不区分大小写的,而Linux和unix是区分大小写的,在跨平台导入导出时,需要设置lower_case_table_names=1。
将表空间复制到另一台上
此过程将演示如何从一个运行的MySQL服务器实例上将表空间复制到另一台上。假设源实例为server_A,目的实例为server_B。
在server_A上

mysql> use test;
mysql> CREATE TABLE ttlsa(id INT) engine=InnoDB;

在server_B上

mysql> use test;
mysql> CREATE TABLE ttlsa(id INT) engine=InnoDB;

在server_B上
放弃现有的表空间。在表空间导入前,InnoDB必须丢弃已连接到接受表的表空间。

mysql> ALTER TABLE ttlsa DISCARD TABLESPACE;

在server_A上
执行FLUSH TABLES ... FOR EXPORT语句静默表并生成.cfg元数据文件。FLUSH TABLES ... FOR EXPORT 这个执行之后,会话不能退出,否则cfg自动消失。

mysql> use test;
mysql> FLUSH TABLES ttlsa FOR EXPORT;

文件.cfg创建在InnoDB数据目录。
在server_A上
复制.ibd和.cfg文件到server_B上

shell> scp /path/to/datadir/test/ttlsa.{ibd,cfg} destination-server:/path/to/datadir/test

文件.ibd和.cfg必须在释放共享锁之前复制。
在server_A上
释放FLUSH TABLES ... FOR EXPORT语句锁

mysql> use test;
mysql> UNLOCK TABLES;

在server_B上

导入表空间

mysql> use test;
mysql> ALTER TABLE ttlsa IMPORT TABLESPACE;

Transportable Tablespace 内幕

以下说明在表空间传输过程中的内部和错误日志信息。
当在server_B上执行ALTER TABLE ... DISCARD TABLESPACE
该表锁定在X模式下
表空间从该表分离
当在server_A上执行FLUSH TABLES ... FOR EXPORT
表锁定在共享模式下
purge coordinator 线程停止
脏页被同步到磁盘上
表元数据写入到二进制.cfg文件中

日志信息如下:

 [Note] InnoDB: Sync to disk of '"test"."ttlsa"' started.
 [Note] InnoDB: Stopping purge
 [Note] InnoDB: Writing table metadata to './test/ttlsa.cfg'
 [Note] InnoDB: Table '"test"."ttlsa"' flushed to disk

当在server_A上执行UNLOCK TABLES
二进制.cfg文件将删除
共享锁将释放,purge coordinator 线程将重启
日志信息如下:

 [Note] InnoDB: Deleting the meta-data file './test/ttlsa.cfg'
 [Note] InnoDB: Resuming purge
当在server_B上执行ALTER TABLE ... IMPORT TABLESPACE

每个表空间页面将检查损坏
每个空间ID和日志序号(LSN)将更新
标志有效的和LSN更新头页
Btree页将更新
页面状态被设置为脏将被写入到磁盘
日志信息如下:

 [Note] InnoDB: Importing tablespace for table 'test/ttlsa' that was exported from host 'ubuntu'
 [Note] InnoDB: Phase I - Update all pages
 [Note] InnoDB: Sync to disk
 [Note] InnoDB: Sync to disk - done!
 [Note] InnoDB: Phase III - Flush changes to disk
 [Note] InnoDB: Phase IV - Flush complete

下文实际操作。理论弄清楚了,实际操作就知道是咋么一回事了。还是那句话,死磕手册

时间: 2024-08-30 14:11:12

MySQL 备份恢复单个innodb表的教程的相关文章

php实现mysql备份恢复分卷处理的方法_php技巧

本文实例讲述了php实现mysql备份恢复分卷处理的方法.分享给大家供大家参考.具体分析如下: 分卷处理就是把握们要处理的数据分成一个个小文件进行处理了,这里我来给大家介绍一个php mysql备份恢复分卷处理类,实现mysql数据库分卷备份,选择表进行备份,实现单个sql文件及分卷sql导入. 分卷导入类及思路详解 数据库导入导出是一个后台必要拥有的功能,网上一搜,有很多关于数据库导入导出的,但基本上一个大的系统,包含了许多我们并不需要的,而且他们都是自己的后台的形式,我并不喜欢的是拿人家的东

php mysql备份恢复分卷处理(数据库导入导出)

分卷导入类及思路详解 数据库导入导出是一个后台必要拥有的功能,网上一搜,有很多关于数据库导入导出的,但基本上一个大的系统,包含了许多我们并不需要的,而且他们都是自己的后台的形式,我并不喜欢的是拿人家的东西整合到自己的后台,我需要的是自己东西.于是参照了很多,自己写了一个关于分卷导入类.以方便调用.欢迎大家拍砖. 这里针对分卷文件是以'_v1.sql'为结尾,实现单个sql文件及分卷sql导入,分卷导入可选择是否当前分卷导入余下分卷,我们只需要直接调用类即可完成 //分别是主机,用户名,密码,数据

mysql备份恢复中的常见错误

从A主机备份到B主机 mysqldump -uroot  -p vw>vw.sql 现备份数据库文件,需要恢复到目标机B,B的数据库版本为5.5.23,A机器的mysql版本为5.0.22 mysql>source /root/vw.sql; -------------------- Query OK, 6748 rows affected (0.13 sec) Records: 6748 Duplicates: 0 Warnings: 0 Query OK, 6807 rows affect

原版MySQL中如何恢复单个InnoDB数据库表

Percona 中的 xtrabackup 真是个好工具, 简单的介绍的他的功能: 1.创建热备份(主要依靠innodb的 crash recovery 功能) 2.增量备份 3.直接对备份文件压缩打包 4.负载小 在测试最新版本2.0时,发现问题: importing  and   exporing  individual tables中这个工具对Oracle 原版的MySQL是不起作用的. 本栏目更多精彩内容:http://www.bianceng.cn/database/MySQL/ 解释

RDS中的MYSQL备份恢复

RDS使用mysqldump对 MySQL 数据库进行逻辑全量备份,使用开源软件Xtrabackup进行物理全量备份,是实例级别的备份. 用户登录RDS控制台,可以下载备份文件.按照 利用逻辑备份文件恢复到自建数据库-MySQL和利用物理备份文件恢复到自建数据库-MySQL中的操作步骤,实现数据的恢复. 本文主要从原理的角度来介绍MySQL数据库的备份和恢复,希望能让用户更加了解RDS的备份恢复机制.   一.备份类型介绍 1. 按备份操作方式:物理备份和逻辑备份 备份方式 优点 缺点 逻辑备份

windows/linux服务器下mysql备份恢复命令介绍

设mysql安装在c:盘,mysql数据库的用户名是root,密码是123456,数据库名是database_name,在d:盘根目录下面存放备份数据库,备份数据库名字为backup20070713.sql(20070713.sql为备份日期) 备份数据库: mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法.  代码如下 复制代码 mysqldump -uroot -p123456 data

使用xtrabackup对Mysql备份恢复

备份原理:XtraBackup基于InnoDB的crash-recovery功能.它会复制innodb的data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致.InnoDB维护了一个redo log,又称为transaction log,事务日志,它包含了innodb数据的所有改动情况.XtraBackup在备份的时候, 一页一页地复制innodb的数据,而且不锁定表,与此同时,XtraBackup还有另外一个线程监视着trans

MySQL备份恢复第一篇

今天学习了下MySQL的备份恢复内容,也算是对之前的 数据导入导出的一个细化内容.备份恢复的内容其实还是蛮复杂的,一般网站上提到的备份恢复也基本都是逻辑备份恢复的内容.对于更为高效的备份mysqlbackup和恢复的内容提到的很少,mysqlbackup是需要Licence,需要单独收费的,这也算是向oracle产品线的一个靠拢了. 首先我们还是走走老路,来看看最基本的逻辑备份恢复吧.我们模拟了3万多条的数据.然后尝试恢复回来. mysql> use test; Reading table in

MySQL备份恢复第二篇

MySQL中的数据恢复功能相比Oracle来说还是要单薄一些,而Oracle中的数据恢复相对来说自动化的程度要高一些.不过Mysql的二进制日志提供的信息很丰富,而日志信息在Oracle中式完全屏蔽的,对于数据的恢复可能MySQL也很灵活. 我们来模拟一下通过完整备份+增量备份(binlog)的方式来恢复. 首先我们来选择一个表new_test作为恢复的参考点. mysql> select count(*)from new_test; +----------+ | count(*) | +---