Skip to content

Latest commit

 

History

History
152 lines (127 loc) · 4.06 KB

MySQL数据库灾难恢复_20180904_郭庆慧.md

File metadata and controls

152 lines (127 loc) · 4.06 KB

#MySQL数据库灾难恢复 @(MySQL)[灾难恢复]

作者:郭庆慧

灾难恢复是意外情况造成数据丢失时,通过极端手段进行恢复的一种方式。 灾难恢复说明备份已经无效,或者没有备份,所以一定要做好备份,不要用到灾难恢复。

[toc]

本文模拟的灾难环境

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