MySQL数据库崩溃恢复

Posted 悟能的师兄

tags:

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

前置条件:重要的事情说三遍,免得误操作!

不是你删了数据,是系统断电或者硬盘坏点导致的启动失败!!!

不是你删了数据,是系统断电或者硬盘坏点导致的启动失败!!!

不是你删了数据,是系统断电或者硬盘坏点导致的启动失败!!!

mysql坏点恢复不了,ibdata1 文件损坏,数据库已经无法启动,并且你的数据库备份无法使用!

一:MySQL数据库恢复

因为我们既无法从备份恢复,也无法从ibdata1 启动恢复,这个时候我们需要将我们的数据库表以及数据库表数据恢复。

首先我们需要安装一个新的数据库哈,记住了新装一个数据库:

准备工作:

记住了,老的崩掉的数据库得任何文件都先别删除

在执行任何操作之前,请将老数据库“ \\bin\\mysql\\mysql5.6.12\\data”的完整副本复制备份

我们的恢复需要做的事:是将每个表以及每个表的数据恢复:
   
    你有文件夹 \\bin\\mysql\\mysql5.6.12\\data\\mydb
    在该文件夹中,您有
        mytable.frm
        mytable.ibd

.frm    表结构
.ibd    实际表数据

二:开始恢复数据库

1:新安装的数据库,新建管理员账号,新建数据需要导入的数据库

#创建数据库的用户信息
CREATE USER 'spllier'@'%' IDENTIFIED BY 'spllier_2021';
#创建一个新的数据库
CREATE DATABASE spllier_zjz DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
#把新增库的所有权限赋值给 :spllier 用户 
GRANT ALL ON spllier_zjz.* TO 'spllier'@'%' WITH GRANT OPTION;
#刷新新加入的数据信息
FLUSH privileges;

2:开始安装表结构识别的环境,这里是Linux操作方式

[root@izwz99z5o9dc90keftqhlrz ~]# cd /
[root@izwz99z5o9dc90keftqhlrz ~]# mkdir download
[root@izwz99z5o9dc90keftqhlrz ~]# cd /download
[root@izwz99z5o9dc90keftqhlrz ~]# wget https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5.tar.gz
[root@izwz99z5o9dc90keftqhlrz ~]# tar xvf mysql-utilities-1.6.5.tar.gz
[root@izwz99z5o9dc90keftqhlrz ~]# cd mysql-utilities-1.6.5
[root@izwz99z5o9dc90keftqhlrz ~]# python setup.py build
[root@izwz99z5o9dc90keftqhlrz ~]# python setup.py install
[root@izwz99z5o9dc90keftqhlrz ~]# mysqldiff --version

3:通过 .frm 文件识别表结构


把 .frm 文件上传至linux路径,识别表结构命令如下

[root@izwz99z5o9dc90keftqhlrz ~]# mysqlfrm --diagnostic /download/data/sys_menu.frm

4:开始创建新表,并且将老数据表数据导入

以下命令用MySQL数据库连接工具即可,Navicat 什么的都可以。

1:恢复表结构
CREATE TABLE `my_db`.`sys_menu` (
  `menu_id` bigint(20) NOT NULL AUTO_INCREMENT comment '菜单ID', 
  `menu_name` varchar(150) NOT NULL comment '菜单名称', 
  `parent_id` bigint(20) DEFAULT NULL comment '父菜单ID', 
  `order_num` int(4) DEFAULT NULL comment '显示顺序', 
  `path` varchar(600) DEFAULT NULL comment '路由地址', 
  `component` varchar(765) DEFAULT NULL comment '组件路径', 
  `is_frame` int(1) DEFAULT NULL comment '是否为外链(0是 1否)', 
  `is_cache` int(1) DEFAULT NULL comment '是否缓存(0缓存 1不缓存)', 
  `menu_type` char(3) DEFAULT NULL comment '菜单类型(M目录 C菜单 F按钮)', 
  `visible` char(3) DEFAULT NULL comment '菜单状态(0显示 1隐藏)', 
  `status` char(3) DEFAULT NULL comment '菜单状态(0正常 1停用)', 
  `perms` varchar(300) DEFAULT NULL comment '权限标识', 
  `icon` varchar(300) DEFAULT NULL comment '菜单图标', 
  `create_by` varchar(192) DEFAULT NULL comment '创建者', 
  `create_time` datetime DEFAULT NULL comment '创建时间', 
  `update_by` varchar(192) DEFAULT NULL comment '更新者', 
  `update_time` datetime DEFAULT NULL comment '更新时间', 
  `remark` varchar(1500) DEFAULT NULL comment '备注', 
PRIMARY KEY `PRIMARY` (`menu_id`) USING BTREE
) ENGINE=InnoDB ROW_FORMAT = 5, COMMENT '菜单权限表';

2:删除新表的表空间
ALTER TABLE my_db.sys_menu DISCARD TABLESPACE;

3:将崩溃数据库的表 sys_menu.ibd 文件挪到新数据库 \\data\\my_db\\ 里面
这一步是将崩溃数据库得表空间数据挪到新数据库,后面做表空间的新挂钩

4:将刚刚放入 my_db 里面的表空间导入到表:sys_menu 
ALTER TABLE my_db.sys_menu IMPORT TABLESPACE;

5:查一下我们的数据恢复了没有
SELECT * FROM my_db.sys_menu LIMIT 10;

 5:当你的表与数据都恢复了之后,你数据库就找回了,恭喜你!!!

三:数据库开启自动备份

数据库不开启备份就是害自己,我就是一个刚刚开发一个月的系统崩溃,没有管自动备份的问题,搞得恢复数据库用了一天,还是问BDA才找到的这个方式,大家如果开启了自动备份,什么问题都没有了,同志们。

CentOS7 MySQL定时自动备份实现https://blog.csdn.net/yexiaomodemo/article/details/103655159https://blog.csdn.net/yexiaomodemo/article/details/103655159

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

MySQL崩溃恢复过程常见错误分析

系统崩溃后,关于MYSQL恢复数据库的问题!求救啊!

MySQL 崩溃恢复过程分析

请教大神,mysql运行突然变特别慢

使用 Fragments 和 ViewPager 一段时间后,Android 应用程序崩溃

pc崩溃后Xampp mysql innodb恢复失败