第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章 总结
这种情况,如果有历史备份,可以获取到原表的交表语句!才能用!如果连原表的建表语句都获取不到,是不行的
原文地址:https://www.cnblogs.com/yufenchi/p/12672860.html
时间: 2024-11-10 12:58:58