误删mysql8下ibdata1文件恢复数据

article/2025/10/8 4:41:19

一位小伙伴不小心误删了生产环境上mysql数据下/data/mysql/ibdata1和ib_logfile0、ib_logfile1文件,并且mysql服务停止了,造成mysql重启不了,吓得小伙伴以为要“被删库跑路”了,于是赶紧帮忙”救火”。像这种误删数据或者删库的情况,不能慌,更不能病急乱投医,冷静分析下具体原因,对症下药。

恢复数据方法1-binlog日志

处理生产环境下数据库问题,最首要问题就是要保证数据不能丢,在数据完整的前提下在保证应用的服务正常。所以,第一首要问题是恢复并备份数据,不幸的是数据库没有做数据备份,但万幸的是有binlog日志文件,这样可以通过它进行数据恢复。
在这里插入图片描述

我把binlog文件拷贝到本地,在本地导入到新的mysql库中。binlog日志文件里存的是二进制内容,所以需要用mysqlbinlog命令转化成mysql能够执行的语句,如下:

#通过binlog日志文件恢复数据
mysqlbinlog --no-defaults --database=testdatabase /home/devops/nankai/binlog.000001 | /usr/bin/mysql -uroot -proot -v testdatabase  
#通过start-position到stop-position
mysqlbinlog --no-defaults --start-position=40107 --stop-position=40489 --database=weijianwei /home/devops/binlog.000001 | /usr/bin/mysql -uroot -p123456 -v
#在执行上面脚本的时候总是报各种错误,于是我想着把转化后的内容存到一个TXT文件中,这样就能看懂
mysqlbinlog --no-defaults --database=testdatabase /home/devops/binlog.000002 >> /home/devops/testdblogs-bak.txt
#对于一些报错的语句或者不重要语句可以在TXT文件中删除了,然后再执行
cat /home/devops/nankaidblogs20210617.txt | /usr/bin/mysql -uroot -proot -v

在执行“cat /home/devops/nankaidblogs20210617.txt | /usr/bin/mysql -uroot -proot -v”时还出现报错:

ERROR 2006 (HY000) at line 1: MySQL server has gone away

这是由于脚本内容太大,造成连接超时了,需要在my.cnf配置中添加如下配置就能解决了:

max_allowed_packet = 64M
wait_timeout = 6000

恢复数据方法2-innodb_force_recovery参数

这个方法的前提是你的数据文件(.ibd数据文件)都还在,具体思路是:
1、从别的服务器数据库中拷贝一份ibdata1、ib_logfile0、ib_logfile1文件到原路径下
2、使用innodb_force_recovery参数,使mysqld跳过恢复步骤,启动mysqld,将数据导出然后重建数据库。
在/etc/my.cnf文件中添加以下配置:

innodb_force_recovery = 6 

添加该配置后重启:

# 启动
service mysqld start
service mysqld restart
service mysqld status

重启数据库成功,然后也能顺利登录,登录进行之后发现数据都还在,并且都还能正常访问,于是赶紧进行数据备份:

#登录
mysql -uroot -p
#进行数据备份
./mysqldump -hlocalhost -uroot -p --all-databases  > /data/mysql/alldata-bak20210617.db
./mysqldump -hlocalhost -uroot -p mydatabase> /data/mysql/mydatabase-bak.db

虽然数据库重启成功了,但是现在高兴还太早。因为此时的数据库只能进行查询操作,不能执行增删改的操作。查询了很多网上资料说把innodb_force_recovery 改回 0,然后删除mysql库中所有数据,且把/data/mysql/下ibdata1、ib_logfile文件也删除了,然后重启mysql就会重新生成新的ibdata1、ib_logfile文件,然后再重新导入备份数据即可,但是我按照此方式没有操作成功,于是有了我下面恢复数据库的方式。

注:innodb_force_recovery 可以设置为1-6,大的数字包含前面所有数字的影响

 1、(SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。2、(SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。3、(SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。4、(SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。5、(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。6、(SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。

恢复数据库

数据恢复了,心里就有底气了,后面可以放心大胆的折腾数据库了,大不了卸载了重装,当然尽量省时省事的原则来处理。
在尝试了广大网友的各种方法之后还是不能正常恢复启动mysql,但又不想重新装数据库,所以我想着干脆把mysql数据的数据全部初始化了,然后重新登录新建数据库表导入备份数据。步骤如下:
1、删除mysql下所有数据文件(警告:删除之前先备份一下原来的文件以防万一,等成功之后可以删除了),我的是在/data/mysql/路径下,具体可以查询/etc/my.cnf文件配置。
在这里插入图片描述
2、数据库初始化,在数据库安装路径下执行:

./mysqld --initialize-insecure

然后新生成了一个mysql数据文件,这时候数据库就跟刚安装好是一样的状态,需要修改root用户的密码。
先在my.cnf中添加免密码登录配置:skip-grant-tables,然后重启服务,就可以直接mysql回车免密登录了,然后修改密码。详细执行脚本如下:

FLUSH privileges;
update user set authentication_string='' where  user = 'root';
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
FLUSH privileges;

一开始我先是上面方式设置密码,但发现MySQL 连接出现 Authentication plugin ‘caching_sha2_password’ cannot be loaded报错,出现这个原因是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password, 解决问题方法有两种,一种是升级驱动,一种是把mysql用户登录密码加密规则还原成mysql_native_password,为了减少麻烦我是选择了第二种,执行脚本如下:

FLUSH privileges;
update user set authentication_string='' where  user = 'root';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456'; 
FLUSH privileges;

这样之后就能用root用户正常登录mysql了,登录之后就新建数据库,然后倒入之前备份的数据,一切就OK了。

CREATE DATABASE IF NOT EXISTS mydatabase DEFAULT CHARACTER SET utf8;
use mydatabase;
source /data/mydatabase-bak.db;

还好数据库恢复了,数据也保住了,但给我们一些警告:
1、做好定期数据备份
2、rm命令一定要慎用(尤其使用的root用户权限),使用之前最好先备份
3、谨记1/2条


http://chatgpt.dhexx.cn/article/4bMGTCjd.shtml

相关文章

MySQL ibdata1 文件“减肥”记

夏天来了,没想到连 ibdata1 文件也要开始“减肥”了~ 作者:杨彩琳 爱可生华东交付部 DBA,主要负责 MySQL 日常问题处理及 DMP 产品支持。爱好跳舞,追剧。 本文来源:原创投稿 有句话是这么说的:“在 InnoDB…

【无标题】1.[ERROR] InnoDB: The innodb_system data file ‘ibdata1‘ must be writable

问题原因: 文件的权限导致运行MySQL服务的用户无法对这些文件进行写入导致的报错. 解决方案: 方案一: 初始化MySQL服务时记得使用"–user"指定运行mysql服务的用户. 方案二: 直接进入到数据目录使用"chown"命令修改权限即可.

【MySQL】MySQL发生系统错误、The innodb_system data file ‘ibdata1‘ must be writable问题的解决

1. 启动mysql服务时:发生系统错误5 使用命令行 net start MySql 后报错:发生系统错误 5。 说明权限不够 ,需要使用管理员身份运行cmd。 但是每次都需要搜索后然后右键选择以管理员身份运行很麻烦,这里介绍一个一劳永逸的办法&am…

MySQL的ibdata1文件占用过大瘦身

处理MySQL的ibdata1文件过大问题 本人在对数据库进行大量的数据插入和删除的时候,发现ibdata1的占了将近一个T ibdata1文件是什么? ibdata1是一个用来构建innodb系统表空间的文件,这个文件包含了innodb表的元数据、撤销记录、修改buffer和双…

【数据库篇】MySQL InnoDB ibd 文件格式解析

mysql innodb的表由.frm .ibd 组成,frm:存了每个表的元数据,包括表结构的定义等;ibd:存了每个表的元数据,包括表结构的定义等; 1.0 ibd文件基本结构 ibd文件由Tablespaces,Segments,Extents,P…

mysql 里的 ibdata1 文件

为什么 mysql 里的 ibdata1 文件不断的增长? 转自:http://linux.cn/article-5829-rss.html ibdata1 file 我们在 Percona 支持栏目经常收到关于 MySQL 的 ibdata1 文件的这个问题。 当监控服务器发送一个关于 MySQL 服务器存储的报警时,恐慌…

mysql ibdata1

ibdata1是什么? Mysql ibdata1即Innodb data1缩写,是innodb引擎的表空间,用于存放 数据字典Data dictionary: 只读的表,存储对象的相关信息,如占用空间,列的缺省值,约束信息&…

MySQL 中的 ibdata1

系统表空间是InnoDB数据字典、双写缓冲区、更改缓冲区和撤消日志的存储区域 。如果表是在系统表空间中创建的,而不是在每个表文件或通用表空间中创建,则它还可能包含表和索引数据。 系统表空间可以有一个或多个数据文件。默认情况下,ibdata1…

分享篇 | MySQL的ibdata1是个啥,为啥越来越大,怎么缩小?

同事的一个问题: MySQL的ibdata1文件越来越大,这是为啥、 看着别扭,怎么搞小它? ibdata1文件是什么? ibdata1是一个用来构建innodb系统表空间的文件,这个文件包含了innodb表的元数据、undo日志、修改buffe…

js类型转换题

考察隐式类型转换: 1.号一侧出现了字符串,就用String()将不是字符串的变成字符串,最后拼接在一起 2.-号则会调用显示类型转换Number(),将非数字转换成数字,进行计算 true 0 和 true false 都是隐式调用Number()变成…

JS中的强制类型转换

概念 这里我们首先需要知道什么是值类型转换 值类型转换:将值从一种类型转换为另一种类型,就是类型转换,分显示转换和隐式转换 js类型转换出的值都是基本类型(number、boolean、string、null、undefined、string)&a…

JavaScript——数据类型的转换

目录 一、其他类型转化成字符串类型 1. 把数字型转换为字符串型 变量.toString() 2. 利用 String(变量) 3. 利用 拼接字符串的方法实现转换效果 隐式转换 二、其他类型转化成数字类型(重点) 1. parseInt(变量) 可以把 字符型的转换为数字型…

JavaScript类型转换规则

类型转换 先梳理一下es6之前有五种基本数据类型:Null、Undefined、String、Number 、Boolean 布尔类型转换规则 直观上为空的值(0、空字符串、null、undefined、和NaN)将变为false 注意 :包含"0" 为true console.log(Boolean("")); //falseconsole.log(…

JavaScript类型转换

javascript是一种弱类型的语言,变量和类型无关,所以有时需要我们进行类型转换 一、数字型转换(number) 两种方法: 1、number:类型转化走的是v8引擎最底层机制的转化规则: 先将引用类型转化为…

js类型转换

NaNi??? 一、显性类型转换 强制类型转换主要是指通过String、Number和Boolean等构造方法手动转换成对应的字符串、数字和布尔值。 1.1 转为字符串 1.1.1 原始类型转字符串 原始类型字符串string :‘str’“str”number : 123“123”Boolean“true”/“fals…

Axure 9.0.0.3701 授权码

产品经理主力工具 Axure 在2020年5月26日更新了最新的 3701 版本,具体更新如下: 很多小伙伴在更新后会出现之前的授权无法使用的情况,如果出现这种情况大家可以通过在产品栈查找相对应的版本进行获取最新的授权码。 获取地址:http…

Axure 8.0/9.0 注册码 激活码 授权码 License

先查版本号,根据版本号在下面的网址查找对应的授权密钥(没有的话,可以试试相近版本) https://7rp.cn/34

Axure 9.0.0.3704 授权码

产品经理常用工具软件 Axure 又更新啦,本次更新版本为 Axure RP 9.0.0.3704,具体更新如下: 如何查看版本号: 更新后效果: 很多小伙伴在更新到最新版本后之前的授权出现了失效的情况,下边栈长为大家准备了最…

全网超详细的【Axure】Axure RP 9的下载、安装、中文字体、授权

文章目录 1. 文章引言2. 下载Axure93. 安装Axure94. Axure9中文5. Axure9授权 1. 文章引言 最近在学习原型图,针对画原型图的工具,反复对比墨刀、Axure、xiaopiu后,最终选择了Axure。 接下来,我便从Axure RP 9的下载、安装、中文…

Axure 8授权码

转自:Axure 8.1.0.3372亲测可用授权码 只为记录下 被授权人: zdfans.com 授权密钥: gP5uuK2gHiIVO3YFZwoKyxAdHpXRGNnZWN8Obntqv7FF3pAz7dTu8B61ySxli