qinghui的技术专栏 CLOUD AND DATABASE

MySQL数据库灾难恢复

2020-01-30
qinghui.guo


本文模拟的灾难环境

  • 1、实例无法正常启动,数据文件都还存在。
  • 2、表delete部分数据或者被truncate
  • 3、表被drop或者database 被drop 相关工具介绍
  • 1、MySQL数据库实例。
  • 2、percona-data-recovery-tool-for-innodb [源码下载地址] https://launchpad.net/percona-data-recovery-tool-for-innodb/trunk/release-0.5/+download/percona-data-recovery-tool-for-innodb-0.5.tar.gz [相关文档] https://github.com/percona/innodb-data-recovery-tool-docs
  • 3 undrop-for-innodb 开源地址:https://github.com/twindb/undrop-for-innodb

    1实例无法正常启动

    环境:MySQL 5.7.21 模拟故障:实例无法启动,数据文件还在。 恢复前的表结构和数据

mysql> show create table t1 \G;
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

ERROR: 
No query specified


mysql> select * from t1;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  4 | c    |
|  7 | b    |
| 11 | e    |
| 20 | d    |
| 30 | b    |
+----+------+
6 rows in set (0.00 sec)

1.1约束条件

开启innodb_file_per_table=on。

该参数表示表有独立的表空间,5.6.6默认开启

1.2恢复*.frm文件

  • 1、新的实例
  • 2、创建新的数据库
    mysql> create database db1;
    mysql> use db1;
    
  • 3、创建同名表
    mysql> create table t1(col1 int);
    
  • 4、复制*.frm 覆盖当前实例的。t1.frm文件
  • 5、添加参数innodb_force_recovery=6到my.cnf文件 innodb_force_recovery默认值是0,6代表实例启动不校验idb文件
  • 6、重启实例
  • 7、从错误日志找出表的字段个数 InnoDB: Table db1/t1 contains 1 user defined columns in InnoDB, but 2 columns in MySQL

    1.3恢复表结构

    重复1.2的操作 注意:需要注释掉#innodb_force_recovery=6 第二次建表语句 create table t1(col1 int,col2 int); 获得建表语句

    Create Table: CREATE TABLE `t1` (
    `id` int(11) NOT NULL,
    `name` varchar(20) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    

    1.4创建新表

  • 1、注释参数)remove innodb_force_recovery=6
  • 2、重启实例
  • 3、删除旧表
  • 4、创建新表指定row_format=compact
CREATE TABLE `t1` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  row_format=compact

1.5恢复*.ibd文件

  • 1、alter table t1 discard tablespace;
  • 2、覆盖idb文件,重启实例
  • 3、alter table t1 import tablespace;

    2、表truancte或者delete

该情况下mysql被删除的数据页会很快被覆盖,所以先要把表的数据文件拷贝出来,保护现场,此种情况无法保证完全恢复,如果删除的数据被覆盖,只能恢复部分数据。

2.1安装恢复工具


tar -zxf percona-data-recovery-tool-for-innodb-0.5.tar.gz 
cd percona-data-recovery-tool-for-innodb-0.5/mysql-source/
./configure 
cd ..
make

2.2恢复数据


# cd /data/
# mkdir -p /data/mysql/recover
# cd /data/mysql/recover
# cd db3/
# cp t.* /data/mysql/recover

cd /usr/local/
cd percona-data-recovery-tool/

# ./page_parser -5 -f /data/db3/t.ibd
# cd pages-1517613235/

# ./create_defs.pl --user root --password mysql --db db3 --table t1 > include/table_defs.h
# cat include/table_defs.h

[root@node1 percona-data-recovery-tool]# make

[root@node1 percona-data-recovery-tool]# make

# ./constraints_parser -5 -f pages-1517613235/FIL_PAGE_INDEX/0-42/ > /data/mysql/recover/t1.sql

# cat /data/mysql/recover/t.sql | wc -l
# head -10 /data/mysql/recover/t1.sql

Comments

Content