目前对MySQL比较流行的备份方式有两种,一种上是使用自带的mysqldump,另一种是xtrabackup,对于数据时大的环境,普遍使用了xtrabackup+binlog进行全量或者增量备份,那么如何快速的从xtrabackup备份中恢复单张表呢?从mysql 5.6版本开始,支持可移动表空间(Transportable Tablespace),利用这个功能也可以实现单表的恢复,下面进行从备份中恢复单张innodb表进行演练。

1. 针对InnoDB表恢复

2. 开启了参数innodb_file_per_table

3. 安装工具:mysql-utilities,其中mysqlfrm可以读取表结构。

进行mysql-utilities安装:

yum install mysql-utilities -y

创建一个测试,往里面插入数据后进行备份:

<test>(root@localhost) [xuanzhi]> show create table tb1\G
*************************** 1. row ***************************
Table: tb1
Create Table: CREATE TABLE `tb1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec) <test>(root@localhost) [xuanzhi]> insert into tb1 (name) values ('aa'),('bb'),('cc'),('dd');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0 <test>(root@localhost) [xuanzhi]> select * from tb1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
| 4 | dd |
+----+------+
4 rows in set (0.00 sec) <test>(root@localhost) [xuanzhi]>

进行xtrabackup备份操作:

[root@localhost data]# innobackupex --defaults-file='/data/service/mysql-5.6.25/my.cnf' --user='root'  --password='123456' --sock='/data/mysql-5.6/mysql.sock'  /data

apply-log:

[root@localhost data]# innobackupex --defaults-file='/usr/local/mysql-5.6.25/my.cnf' --user='root'  --password='123456' --sock='/data/mysql-5.6/mysql.sock'  --apply-log   /data/2017-03-24_09-40-54/

进行完整备份后,我们继续往测试表tb1里插入数据,尽量模拟线上环境:

<test>(root@localhost) [xuanzhi]> insert into tb1 (name) values ('aa2'),('bb2'),('cc2'),('dd2');
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0 <test>(root@localhost) [xuanzhi]> select * from tb1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
| 4 | dd |
| 5 | aa2 |
| 6 | bb2 |
| 7 | cc2 |
| 8 | dd2 |
+----+------+
8 rows in set (0.00 sec) <test>(root@localhost) [xuanzhi]>

xtrabackup备份里只有四条数据,备份后的数据,我们一会使用binlog来进行恢复。

进行误操操作,把表drop了:

<test>(root@localhost) [xuanzhi]> drop table tb1;
Query OK, 0 rows affected (0.21 sec) <test>(root@localhost) [xuanzhi]> show tables;
Empty set (0.02 sec) <test>(root@localhost) [xuanzhi]>

使用mysqlfrm从备份中读取表结构:

[root@localhost data]# mysqlfrm --diagnostic  /data/2017-03-24_09-40-54/xuanzhi/tb1.frm
# WARNING: Cannot generate character set or collation names without the --server option.
# CAUTION: The diagnostic mode is a best-effort parse of the .frm file. As such, it may not identify all of the components of the table correctly. This is especially true for damaged files. It will also not read the default values for the columns and the resulting statement may not be syntactically correct.
# Reading .frm file for /data/2017-03-24_09-40-54/xuanzhi/tb1.frm:
# The .frm file is a TABLE.
# CREATE TABLE Statement: CREATE TABLE `xuanzhi`.`tb1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(30) DEFAULT NULL,
PRIMARY KEY `PRIMARY` (`id`)
) ENGINE=InnoDB; #...done.
[root@localhost data]#

登录数据库进行建表:

<test>(root@localhost) [xuanzhi]> CREATE TABLE `xuanzhi`.`tb1` (
-> `id` int(11) NOT NULL AUTO_INCREMENT,
-> `name` char(30) DEFAULT NULL,
-> PRIMARY KEY `PRIMARY` (`id`)
-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.05 sec) <test>(root@localhost) [xuanzhi]>

加一个写锁,确保安全:

<test>(root@localhost) [xuanzhi]> lock tables tb1 write;
Query OK, 0 rows affected (0.00 sec) <test>(root@localhost) [xuanzhi]>

丢弃表空间:

<test>(root@localhost) [xuanzhi]> alter table tb1 discard tablespace;
Query OK, 0 rows affected (0.01 sec)

从备份中拷贝ibd文件,并且修改权限:

[root@localhost data]# cp  /data/2017-03-24_09-40-54/xuanzhi/tb1.ibd /data/mysql-5.6/xuanzhi/
[root@localhost data]# chown -R mysql:mysql /data/mysql-5.6/xuanzhi/tb1.ibd

载入表空间:

<test>(root@localhost) [xuanzhi]> alter table tb1 import tablespace;
Query OK, 0 rows affected, 1 warning (0.04 sec) <test>(root@localhost) [xuanzhi]> show warnings;
+---------+------+---------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------------------------------------------------------------------------------------------------------+
| Warning | 1810 | InnoDB: IO Read error: (2, No such file or directory) Error opening './xuanzhi/tb1.cfg', will attempt to import without schema verification |
+---------+------+---------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec) <test>(root@localhost) [xuanzhi]>

有报一个warning,但不影响恢复,详情可以看:https://yq.aliyun.com/articles/59271,我们查一下数据:

<test>(root@localhost) [xuanzhi]> select * from tb1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
| 4 | dd |
+----+------+
4 rows in set (0.02 sec) <test>(root@localhost) [xuanzhi]>

可以看到备份的数据已经恢复了,但是备份后插入的数据明显没有出现,这个时候我们只能通过binlog进行恢复了,所以binlog的备份也是非常重要的。

我们查看一下备份时的pos点和binlog的文件名:

[root@localhost data]# cd /data/2017-03-24_09-40-54/
[root@localhost 2017-03-24_09-40-54]# cat xtrabackup_binlog_info
mysql-bin.000002 1014

我们知道了备份后的起始POS点,还需要找出到误操前的一个POS点进行恢复,找到drop table 前的POS点:

[root@localhost 2017-03-24_09-40-54]# mysqlbinlog  -v --base64-output=DECODE-ROWS /data/mysql-5.6/mysql-bin.000002 | grep -C 10 -i  "DROP"
### SET
### @1=8
### @2='dd2'
# at 1292
#170324 9:43:00 server id 1313306 end_log_pos 1323 CRC32 0x9f776b03 Xid = 198
COMMIT/*!*/;
# at 1323
#170324 9:46:55 server id 1313306 end_log_pos 1445 CRC32 0x3fa6b448 Query thread_id=27 exec_time=0 error_code=0
use `xuanzhi`/*!*/;
SET TIMESTAMP=1490320015/*!*/;
DROP TABLE `tb1` /* generated by server */
/*!*/;
# at 1445
#170324 9:51:52 server id 1313306 end_log_pos 1674 CRC32 0xdd5e1448 Query thread_id=27 exec_time=0 error_code=0
SET TIMESTAMP=1490320312/*!*/;
CREATE TABLE `xuanzhi`.`tb1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(30) DEFAULT NULL,
PRIMARY KEY `PRIMARY` (`id`)
) ENGINE=InnoDB
/*!*/;

可以看到DROP TABLE 前的POS点是1323,那我们可以通过binlog2sql进行标准SQL的生成,binlog2sql的使用的和安装请看之前我写的博客:http://www.cnblogs.com/xuanzhi201111/p/6602489.html,再次为开源数据闪回工具的大神们点赞。

[root@localhost binlog2sql]# python binlog2sql.py  -uroot -p123456 -dxuanzhi -ttb1 --start-position=1014 --stop-position=1323 --start-file='mysql-bin.000002'  > recovery_tb1.sql
[root@localhost binlog2sql]# cat recovery_tb1.sql
FLUSH ENGINE LOGS;
INSERT INTO `xuanzhi`.`tb1`(`id`, `name`) VALUES (5, 'aa2'); #start 1094 end 1292 time 2017-03-24 09:43:00
INSERT INTO `xuanzhi`.`tb1`(`id`, `name`) VALUES (6, 'bb2'); #start 1094 end 1292 time 2017-03-24 09:43:00
INSERT INTO `xuanzhi`.`tb1`(`id`, `name`) VALUES (7, 'cc2'); #start 1094 end 1292 time 2017-03-24 09:43:00
INSERT INTO `xuanzhi`.`tb1`(`id`, `name`) VALUES (8, 'dd2'); #start 1094 end 1292 time 2017-03-24 09:43:00
[root@pm2 binlog2sql]#

把这sql文件进入导入即可进行备份后的数据恢复,导入数据前先进行解锁:

<test>(root@localhost) [xuanzhi]> unlock tables;
Query OK, 0 rows affected (0.01 sec)
[root@localhost binlog2sql]# mysql -uroot -p123456  <./recovery_tb1.sql
Warning: Using a password on the command line interface can be insecure.
[root@localhost binlog2sql]#

查看数据:

test>(root@localhost) [xuanzhi]> select * from tb1;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
| 4 | dd |
| 5 | aa2 |
| 6 | bb2 |
| 7 | cc2 |
| 8 | dd2 |
+----+------+
8 rows in set (0.02 sec) <test>(root@localhost) [xuanzhi]>

可以看到数据成功的恢复了,大家可以多加测试。

转自

从xtrabackup备份恢复单表 - GoogSQL - 博客园
http://www.cnblogs.com/xuanzhi201111/p/6609867.html

从xtrabackup备份恢复单表【转】的更多相关文章

  1. 从xtrabackup备份恢复单表

    目前对MySQL比较流行的备份方式有两种,一种上是使用自带的mysqldump,另一种是xtrabackup,对于数据时大的环境,普遍使用了xtrabackup+binlog进行全量或者增量备份,那么 ...

  2. Oracle 备份、恢复单表或多表数据步骤

    Oracle 备份.恢复单表或多表数据步骤,适用于 Oracle 8.9.10.        *备份单表或多表数据: exp user/password@server file=filefullpa ...

  3. 【理论篇】Percona XtraBackup 恢复单表

    小明在某次操作中,误操作导致误删除了某个表,需要立即进行数据恢复. 如果是数据量较小的实例,并且有备份,即便是全备,做一次全量恢复,然后单表导出导入,虽然麻烦一点,却也花不了多少时间:如果是数据量大的 ...

  4. 万答#14,xtrabackup8.0怎么恢复单表

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 实 ...

  5. mysql xtrabackup 备份恢复实现,mysql命令备份数据库,打包压缩数据库

    简介 Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具.特点: (1)备份过程快速.可靠 ...

  6. 利用binlogserver恢复单表实验【转】

    使用场景 每次开启binlogserver 指定了mysql-bin.0000XX 后都会从该点从头进行传输一次 创建binlogserver [root@mysql-zst3 binlogserve ...

  7. MySQL用全库备份数据恢复单表数据

    备份数据库时,采用了全库备份,但是因为某些原因需要回滚一个表的数据到备份数据库上,如果回滚整个库就比较费时间,因为可能这个表只有几十M,但是其它表可能有十几上百G,这时候就需要将需要恢复的表提取出来了 ...

  8. 从mysqldump整库备份文件中恢复单表

    最近,系统更新出现了问题,比较紧急,需要对三张表进行回档.由于我们都是采用mysqldump进行每天全备整库,数据量比较大,一个备份文件大概有70G,需要从这个70G文件中恢复三张表,真是蛋疼至极啊, ...

  9. MYSQL数据库根据data文件中的.frm和ibd文件恢复单表数据

    数据库误操作,把表的字段删除了,关键是被删除的字段的数据很重要,现在想要恢复数据,下面说说是怎么操作的. 数据库只剩.frm和.ibd文件了,按照网上的做法分如下两步来进行:一.找回表结构,二.找回数 ...

随机推荐

  1. [福大软工] Z班 个人项目自动测试结果

    个人项目第二次测试结果[9.16] 注:下表中的成绩满分为25分,正确性测试 共5个,每个3分.效率测试共 2个,每个5分. 根据数据统计分档如下, // 前为档级,后为分数. 参数为50000 0- ...

  2. Beta版本冲刺(六)

    目录 组员情况 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团队签入记 ...

  3. CMake系列之一:概念

    不同的make工具遵循不同的规范和标准,因此针对不同的标准需要不同的Makefile文件.CMake利用一种平台无关的CMakeList.txt文件定制编译流程,根据目标用户的平台生成本地化的Make ...

  4. HTML5之HTTP协议

    ---恢复内容开始--- 99%的人都理解错了HTTP中GET与POST的区别 2016.10.11 13:23:22来源: 51cto作者:51cto   (转)   GET和POST是HTTP请求 ...

  5. Linux基础三(软件安装管理)

    目录: 一.Linux 中软件包的分类 1.源码包 2.二进制包 3.源码包 4.软件安装的选择 二.软件安装之 RPM 1.背景知识 2.准备知识 3.安装升级与卸载 4.查询校验与提取 三.软件安 ...

  6. 用javaScript将页面滚动条到底部

    ((JavascriptExecutor) driver).executeScript("document.body.scrollTop=500000"); 通过该方法可以将有滚动 ...

  7. CentOS 简单学习 firewalld的使用

    1. centos7 开始 使用firewalld 代替了 iptables 命令工具为 firewall-cmd 帮助信息非常长,简单放到文末 2. 简单使用 首先开启 httpd 一般都自带安装了 ...

  8. [代码]--IIS发布网站浏览之后看到的是文件目录 & Internal Server Error 处理程序“ExtensionlessUrlHandler-ISAPI-4.0_64bit”在其模块列表中有一个错误模块“IsapiModule” 解决方法 & App_global.asax.pduxejp_.dll”--“拒绝访问。 ”

    Q:IIS发布网站浏览之后看到的是文件目录 A:它出现了一个说到.NET4.0 更高框架什么的错误,所以我将 .NTE CRL版本由4.0改为2.0了,改为2.0后就出现了只能浏览文件目录了.改为4. ...

  9. native2ascii -reverse -encoding UTF-8 validation_msg.properties > validation_msg_src.properties

    native2ascii -reverse -encoding UTF-8 validation_msg.properties > validation_msg_src.properties

  10. 【字符串算法1】 再谈字符串Hash(优雅的暴力)

    [字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述  [字符串算法1] 字符串Hash 老版原文: RK哈希(Rabin_Ka ...