表空间恢复数据库

Posted yufenchi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表空间恢复数据库相关的知识,希望对你有一定的参考价值。

第1章 故障背景

1.1 环境

硬件及软件环境:
联想服务器(IBM) 
磁盘500G 没有raid
centos 6.8
mysql 5.6.33  innodb引擎  独立表空间
备份没有,日志也没开
为什么没有备份和日志没有开?
因为是开发用户专用库(由开发人员自己维护)
jira(bug追踪),confluence(内部知识库)

1.2 故障现象

因为是开发库,所以开发人员自己在维护,有一天,突然断电了,数据库起不来,开发人员处理了2天还没有处理好,最后就把这个问题丢给我了
我接手以后,已经是下面这种情况了
1.断电了,第二天启动,"根文件系统只读,建议使用fsck命令修复文件系统"
2.拿到手的操作系统起来了,但是数据库启动不了
3.检查问题,jira库目录丢失,只剩下confluence

1.3 处理思路

confulence库中一共有107张表。
1、创建107张和原来一模一样的表。
他有2016年的历史库,我让他去他同时电脑上 mysqldump备份confulence库
mysqldump -uroot -ppassw0rd -B  confulence --no-data >test.sql
拿到你的测试库,进行恢复
到这步为止,表结构有了。
2、批量表空间删除并导出
select concat(‘alter table ‘,table_schema,‘.‘table_name,‘ discard tablespace;‘) from information_schema.tables where table_schema=‘confluence‘ into outfile ‘/tmp/discad.sql‘;
source /tmp/discard.sql
执行过程中发现,有20-30个表无法成功。主外键关系
set foreign_key_checks=0 跳过外键检查。
把有问题的表表空间也删掉了。
3、批量拷贝生产中confulence库下的所有表的ibd文件拷贝到准备好的环境中
select concat(‘alter table ‘,table_schema,‘.‘table_name,‘ import tablespace;‘) from information_schema.tables where table_schema=‘confluence‘ into outfile ‘/tmp/import.sql‘;
4、1.4 验证数据
表都可以访问了,数据挽回到了出现问题时刻的状态

第2章 故障模拟

1.1 数据模拟

mysql>create database kk charset utf8mb4;
mysql>use kk
mysql>create table t1 (id int primary key);
mysql>insert into t1 values(1),(2),(3);
mysql>commit;
#假设此时数据库宕机起不来了!

1.2 恢复里程

第一个里程: 先在db02服务器创建一个库kk

mysql>create database kk charset utf8mb4;

第二个里程: 在db01上获取,建表语句

mysql>use kk
mysql> show create table t1;
+-------+-----------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                              |
+-------+-----------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-----------------------------------------------------------------------------------------------------------+

第三个里程: 在db02上用拿到的建表语句,创建表

mysql>use kk
mysql>CREATE TABLE t1 (id int(11) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

第四个里程: 在db02上用数据库专用的命令,删除掉新建表的ibd

mysql>alter table t1 discard tablespace;

第五个里程: 把db01上KK库下t1表的ibd拷贝到db02的KK库下

scp -rp /data/mysql/data/t1/t1.bid 192.168.114.51:/data/mysql/data/kk/

第六个里程: 在db02上给予拷贝古来的IBD权限

chown -R mysql:mysql /data/mysql/data/kk/

第七个里程: 用数据库专用的命令把拷贝过来的ibd导入表中

alter table t1 import tablespace;

第八个里程: 检查数据


第3章 总结

这种情况,如果有历史备份,可以获取到原表的交表语句!才能用!如果连原表的建表语句都获取不到,是不行的

以上是关于表空间恢复数据库的主要内容,如果未能解决你的问题,请参考以下文章

Oracle备份恢复之无备份情况下恢复undo表空间

oracle怎样恢复删除的数据文件

如何恢复 sysaux 表空间?

[20170623]利用传输表空间恢复部分数据.txt

SYSTEM 表空间管理及备份恢复

oracle undo表空间被删除,数据库无法启动,请问如何恢复