本文将介绍使用物理备份恢复Innodb单表数据的方法
前言:
随着innodb的普及,innobackup也成为了主流备份方式。物理备份对于新建slave,全库恢复的需求都能从容应对。
但当面临单表数据误删,或者单表误drop的情况,如果使用物理全备进行恢复呢?
下文将进行详细分析。
恢复过程中需要用到的工具,percona data recover tool
PS:以下所有方案仅支持 innodb-file-per-table = 1
的情况
注意: 以下操作非文档推荐,切勿在没有测试的情况下直接在production环境使用!!!
情况一:逻辑误操作,误删部分数据
这种情况可以用来自同一台机器的的最近一次物理备份中的ibd恢复覆盖,且备份后table没有被recreate过。
这种情况是最简单的,备份时的ibd文件(后称老ibd)中的space id和index id 与 新ibd的space id 和index id一致。
且和ibdata文件中的space id和index id一致。因此,物理文件可以直接覆盖做恢复。
以下是详细步骤
准备阶段
Step pre 1: 物理备份
Step pre 2 : 停止数据库对外服务
或者 停止所有业务连接并且set global innodb_max_dirty_pages_pct =0
操作阶段
Step 0 : apply log
Step 1 : 备份现在的ibd文件(可选)
Step 2 : 舍弃现在ibd文件
Step 3 : 复制备份ibd文件
Step 4 : 导入ibd文件
情况二:误删 table,表结构已经被drop了
这种情况稍复杂,不过恢复过程还是比较容易操作的。由于table被drop后的space id会留空因此备份文件的space id不会被占用。
我们只需要重建表结构,然后把ibdata中该表的space id还原,物理文件可以直接覆盖做恢复了。
Step 1 : 重建表
mysql> create table testibd (UserID int);
Step 2 : 关闭mysql服务(必须)
Step 3: 准备ibd文件 apply log
Step 4 : 备份现在的ibd文件(可选)
Step 5 : 复制备份ibd文件
Step 6 : 使用percona recovery tool 修改ibdata
输出结果
Step 7 : 使用percona recovery tool 重新checksum ibdata
重复执行以下命令,直到程序没有输出为止。
输出结果
Step 8 : 启动mysql服务
参考文档:
http://www.chriscalender.com/?p=28
http://www.mysqlperformanceblog.com/2011/05/13/connecting-orphaned-ibd-files/
http://blogs.innodb.com/wp/2012/04/innodb-transportable-tablespaces/
http://www.mysqlperformanceblog.com/2012/01/25/how-to-recover-a-single-innodb-table-from-a-full-backup/