MySQL数据库崩溃恢复

比眉伴天荒 2022-09-15 11:47 295阅读 0赞

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

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

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

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

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

一:MySQL数据库恢复

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

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

准备工作:

  1. 记住了,老的崩掉的数据库得任何文件都先别删除
  2. 在执行任何操作之前,请将老数据库“ \bin\mysql\mysql5.6.12\data”的完整副本复制备份
  3. 我们的恢复需要做的事:是将每个表以及每个表的数据恢复:
  4. 你有文件夹 \bin\mysql\mysql5.6.12\data\mydb
  5. 在该文件夹中,您有
  6. mytable.frm
  7. mytable.ibd
  8. .frm 表结构
  9. .ibd 实际表数据

二:开始恢复数据库

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

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

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

  1. [root@izwz99z5o9dc90keftqhlrz ~]# cd /
  2. [root@izwz99z5o9dc90keftqhlrz ~]# mkdir download
  3. [root@izwz99z5o9dc90keftqhlrz ~]# cd /download
  4. [root@izwz99z5o9dc90keftqhlrz ~]# wget https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5.tar.gz
  5. [root@izwz99z5o9dc90keftqhlrz ~]# tar xvf mysql-utilities-1.6.5.tar.gz
  6. [root@izwz99z5o9dc90keftqhlrz ~]# cd mysql-utilities-1.6.5
  7. [root@izwz99z5o9dc90keftqhlrz ~]# python setup.py build
  8. [root@izwz99z5o9dc90keftqhlrz ~]# python setup.py install
  9. [root@izwz99z5o9dc90keftqhlrz ~]# mysqldiff --version

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

  1. .frm 文件上传至linux路径,识别表结构命令如下
  2. [root@izwz99z5o9dc90keftqhlrz ~]# mysqlfrm --diagnostic /download/data/sys_menu.frm

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5oKf6IO955qE5biI5YWE_size_20_color_FFFFFF_t_70_g_se_x_16

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

  1. 以下命令用MySQL数据库连接工具即可,Navicat 什么的都可以。
  2. 1:恢复表结构
  3. CREATE TABLE `my_db`.`sys_menu` (
  4. `menu_id` bigint(20) NOT NULL AUTO_INCREMENT comment '菜单ID',
  5. `menu_name` varchar(150) NOT NULL comment '菜单名称',
  6. `parent_id` bigint(20) DEFAULT NULL comment '父菜单ID',
  7. `order_num` int(4) DEFAULT NULL comment '显示顺序',
  8. `path` varchar(600) DEFAULT NULL comment '路由地址',
  9. `component` varchar(765) DEFAULT NULL comment '组件路径',
  10. `is_frame` int(1) DEFAULT NULL comment '是否为外链(0是 1否)',
  11. `is_cache` int(1) DEFAULT NULL comment '是否缓存(0缓存 1不缓存)',
  12. `menu_type` char(3) DEFAULT NULL comment '菜单类型(M目录 C菜单 F按钮)',
  13. `visible` char(3) DEFAULT NULL comment '菜单状态(0显示 1隐藏)',
  14. `status` char(3) DEFAULT NULL comment '菜单状态(0正常 1停用)',
  15. `perms` varchar(300) DEFAULT NULL comment '权限标识',
  16. `icon` varchar(300) DEFAULT NULL comment '菜单图标',
  17. `create_by` varchar(192) DEFAULT NULL comment '创建者',
  18. `create_time` datetime DEFAULT NULL comment '创建时间',
  19. `update_by` varchar(192) DEFAULT NULL comment '更新者',
  20. `update_time` datetime DEFAULT NULL comment '更新时间',
  21. `remark` varchar(1500) DEFAULT NULL comment '备注',
  22. PRIMARY KEY `PRIMARY` (`menu_id`) USING BTREE
  23. ) ENGINE=InnoDB ROW_FORMAT = 5, COMMENT '菜单权限表';
  24. 2:删除新表的表空间
  25. ALTER TABLE my_db.sys_menu DISCARD TABLESPACE;
  26. 3:将崩溃数据库的表 sys_menu.ibd 文件挪到新数据库 \data\my_db\ 里面
  27. 这一步是将崩溃数据库得表空间数据挪到新数据库,后面做表空间的新挂钩
  28. 4:将刚刚放入 my_db 里面的表空间导入到表:sys_menu
  29. ALTER TABLE my_db.sys_menu IMPORT TABLESPACE;
  30. 5:查一下我们的数据恢复了没有
  31. SELECT * FROM my_db.sys_menu LIMIT 10;

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

三:数据库开启自动备份

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

CentOS7 MySQL定时自动备份实现/images/20220828/65049ad5ef1c427bb35eb97a9a81ed05.pngicon-default.png?t=L892/images/20220828/65049ad5ef1c427bb35eb97a9a81ed05.png

发表评论

表情:
评论列表 (有 0 条评论,295人围观)

还没有评论,来说两句吧...

相关阅读