mysql删库后恢复_记一次MySQL删库的数据恢复

d4f03c608cdf65c585abfe551a6f6a47.png

昨天因为不可描述的原因,数据库直接被 drop database删除。在第一时间停止数据库服务和Web服务,备份MySQL数据目录下的所有文件之后,开始走上数据恢复之路。

第一次干这种事,各种不得法。因为我们既没有备份,也没有开启binlog,连innodb_file_per_tabe_也没有。一番折腾后向万能的朋友圈求救,朋友给了两个链接,最终救了一下命。以下先按编号记下 URL,后续引用之。

其中URL1和URL3的内容基本上相同,是整个恢复工作的蓝本。URL2是URL1中引用的一个twindb团队开发的一个工具,现在他们官方已经删除了,URL2是该工具的一个fork,或者说是备份。

恢复过程以URL3为蓝本,先去URL2 git clone一份代码下来,然后按其说明编译,我们在ubuntu server 14.04 64bit 版本的情况下,成功编译完成,编译中需要安装各种依赖不表。

然后用 stream_parser 处理ibdata1 文件,接下来恢复SYS_TABLES 和 SYS_INDEXES,建议此过程中严格遵守参考资料,比如把这些资料恢复到dumps/default 目录中,而不是随意起名,以免横生枝节。

这里还有一个坑,就是URL3里用的c_parser -4f 是会出错的,而URL1里用的是c_parser -4Df ,就不会出错,所以大家做的时候一定要把这个D加上。感叹一下,如果不细心的人真的没法做这事!摔!

接下来按URL3的说明把数据字典导入 MySQL。这一步可以不做,按URL1里高票答案的方法来获取索引ID,比较麻烦。URL3的方法应该会出这样的错:

ERROR 1148 (42000) at line 2: The used command is not allowed with this MySQL version

这是因为MySQL默认不启用LOAD DATA LOCAL INFILE 导致的,需要给mysql 命令加上--local-infile 参数。这是参考文献的一个坑。趟过这个坑以后,我可以告诉你一个捷径,就是URL2里的代码里其实有一个文件recover_dictionary.sh ,它干的就是恢复数据字典的事情,所以你只要把这个shell脚本里的mysql 都替换成mysql --local-infile -uroot -pxxxxx 就行,其中xxxx是指你的root账号密码,不过前提是你很听话的用了前面说的dumps/default 目录,不然就再多一轮替换。

接下来的内容,大部分是参考文献里没有的了。

恢复数据字典后,就可以用URL3介绍的方式找出你对应的所有数据库和表的索引ID了。这个时候就遇到为 c_parser 提供数据表建表语句的问题了,这个问题难就难在先有鸡还是先有蛋,一般来说,数据库都被删掉了,哪还有办法去搞出CREATE TABLE 这种建表语句呢?好就好在我们用的是django,它对数据迁移的完美支持救了我一命。在这里讲一句题外话,使用类似django/ror/laravel等有数据迁移框架在此就看出多么重要了。只要在根据原有项目做一次migrate,数据表就建好了,这时候只要用mysqldump导出对应表的建表语句即可:

mysqldump --add-drop-table=0 --add-lock=0 -d DBNAME TABLENAME -uroot -p > xxxx.sql

因为c_parser 非常弱,只处理CREATE TABLE 语句,多一点干扰都不行,所以上面的参数都是必要的。

接下来就是参考URL1把某一个表的数据恢复出来,这里有一个坑,URL1里说把数据恢复到dump.tsv里,其实是不对的,这里应该用dumps/default/TABLENAME,别问我为什么知道,我不会告诉你我找这个原因找瞎了眼,好吧,跟你说,因为生成的load_cmd.sql 里直接引用 dumps/default/TABLENAME,无法设置。所以最后我们这里可用的命令是:

./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000000002410.page -t xxxx.sql > dumps/default/TABLENAME 2> load_cmd.sql

把数据恢复出来以后,执行

mysql --local-infile -uroot -p DBNAME < load_cmd.sql

就可以把数据导进去了,记得在数据库里查询一下有没有成功,如果没有数据恢复出来,应该是其中的某些环节出了问题。

这样就成功恢复了某一个表,只要按这里最后三条命令(导出建表语句、恢复数据、导入数据)重复地做下去,你就能把基本上所有的数据都恢复出来了。之所以说是“基本上”,原因是我系统中使用了utf8mb4 编码(为了兼容emoji),结果是如果数据中有emoji的内容就会在导入数据的环节出错,暂时没有找到办法恢复这个数据。

以上就是整个恢复过程,枯燥、压力山大,这种事情我不想再经历了。如果你也遇到这样的数据恢复需求,希望这篇笔记能够帮到你。但也不要指望我能帮到你更多了,我的经验也仅止于此,天大地大,就此别过,不要找我。谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql中数据类型的长度

一、varchar&#xff08;n&#xff09;、char(n)中的n的含义 1&#xff09;varchar(m),char(n)里面的m或n代表的是字符的个数。 打开mysql手册&#xff0c;看到这样一句话 The CHAR and VARCHAR types are declared with a length that indicates the maximum number of char…

mysql数据库操作宠物表_mysql数据库之表的操作

语法&#xff1a;1. 修改表名ALTER TABLE 表名RENAME 新表名;2. 增加字段ALTER TABLE 表名ADD 字段名 数据类型 [完整性约束条件…],ADD 字段名 数据类型 [完整性约束条件…];ALTER TABLE 表名ADD 字段名 数据类型 [完整性约束条件…] FIRST;ALTER TABLE 表名ADD 字段名 数据类…

Mysql 中的Text字段的范围

Mysql 中的Text字段的范围 text&#xff1a;存储可变长度的非Unicode数据&#xff0c;最大长度为2^31-1个字符。text列不能有默认值&#xff0c;存储或检索过程中&#xff0c;不存在大小写转换&#xff0c;后面如果指定长度&#xff0c;不会报错误&#xff0c;但是这个长度是不…

python实现语义分割_语义分割算法之FCN论文阅读及源码实现

论文原文创新点提出了一种端到端的做语义分割的方法&#xff0c;在这里插入图片描述如图&#xff0c;直接拿分割的ground truth作为监督信息&#xff0c;训练一个端到端的网络&#xff0c;让网络做p像素级别的预测。如何设计网络结构如何做像素级别的预测在这里插入图片描述在V…

记住:永远不要在MySQL中使用“utf8”,请使用“utf8mb4” 程序员

记住&#xff1a;永远不要在MySQL中使用“utf8”&#xff0c;请使用“utf8mb4” 最近我遇到了一个bug&#xff0c;我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串&#xff0c;然后出现了一个离奇的错误&#xff1a; 我用的是UTF-8编码的客户端&#xff0c;服…

mysql——decimal类型与decimal长度

分为三种&#xff1a; float&#xff1a;浮点型&#xff0c;含字节数为4&#xff0c;32bit&#xff0c;数值范围为-3.4E38~3.4E38&#xff08;7个有效位&#xff09;double&#xff1a;双精度实型&#xff0c;含字节数为8&#xff0c;64bit&#xff0c;数值范围-1.7E308~1.7E3…

右上角的引用文献格式_论文要引用的小符号右上角怎么打?

上标是【现在】论【文的】书写【都会】【用到】引用【的小】符号&#xff0c;上标【一般】用【来对】所标的【文字】【或者】段落【进行】进【一步】【的解】释&#xff0c;【所以】常【用来】【解释】含义&#xff0c;【或者】出处&#xff0c;【而其】【解释】【一般】在书【…

java.util.function.Function的用法

JDK 1.8 API包含了很多内建的函数式接口&#xff0c;在老Java中常用到的比如Comparator或者Runnable接口&#xff0c;这些接口都增加了FunctionalInterface注解以便能用在lambda上。现如今&#xff0c;我们则从Function常用函数入口&#xff0c;真正了解一下。 nametypedescri…

mysql服务器程序_MySQL服务器

1、安装通常系统在成功安装之后就已经自带MySQL服务器以及客户端了。查询MySQL及其相关文件是否安装&#xff1a;rpm -qa | grep perlrpm -qa | grep mysql如果没有安装&#xff0c;则可以使用yum进行安装&#xff1a;yum -y install perl-DBIyum -y install perl-DBD-MySQLyum…

Java中List的contains方法,你用对了吗?

Java语言中的List是我们处理集合时经常会用到的。而List定义了一个contains方法&#xff0c;用以判断一个集合中是否包含指定的一个对象。 大家应该有用到过吧&#xff0c;可是你真的会用&#xff0c;用对了吗&#xff1f; 看看下面的代码。 上图代码中&#xff0c;创建了两个…

mysql sql in or 替换_sql IN 的用法一例--替换 mysql longtext字段中某些内容的用法

之前给改版的一个学校里的站点突然提出要求&#xff0c;说需要将之前编辑的文章的字体大小全部改成默认值。字体的控制无非有两种&#xff0c;一是font-size 16 px&#xff1b;然后是。但是&#xff0c;之前发布的文章&#xff0c;文字的控制是由编辑器生成的&#xff0c;而根…

List的contains方法使用

List的contains方法用于判断对象是否存在于列表中。 举例说明&#xff1a; 这里简单的创建一个User类&#xff1a; public class User {private String id;private String name;private String phone;private String address;//忽略getters和setters }在main方法中创建3个User…

mysql初体验学习笔记_【MySQL】mycli初体验

早就听说mycli很好用&#xff0c;今天打算在本地测试机上装一下体验一把。安装方法很是简单&#xff1a;一、安装依赖&#xff1a;yum install python-pip python-devel二、安装myclipip install mycli这样就安装完了。三、使用方法[rootlocalhost .pip]# mycli --helpUsage: m…

ArrayList类contains方法实现原理

以ArrayList集合示例 思考&#xff1a;contains方法如何执行&#xff1f; public static void main(String [] args){List<String> listnew ArrayList<String>(); list.add("张三"); System.out.println(list.contains("张三"); }分析contai…

mysql索引结构优缺点_mysql索引优缺点及注意事项

优点有了索引.对于记录数量很多的表,可以提高查询速度.缺点索引是占用空间的.索引会影响update insert delete速度ALERT!!!1 索引要创建在where和join用到的字段上.2 以下操作符号可以应用索引&#xff1a;&#xff0c;>&#xff0c;BETWEEN&#xff0c;IN&#xff0c…

Mybatis源码分析之(五)mapper如何将数据库数据转换成java对象的

本篇对mybatis从取到数据库数据开始到映射成对象并返回的过程进行了详细的分析。 转换ResultSet成java对象 下面的代码是PreparedStatementHandler中的 Overridepublic <E> Cursor<E> queryCursor(Statement statement) throws SQLException {PreparedStatement …

Java Stream Collectors.groupingBy()实现分组(单字段分组,多字段分组)

1 User实体类 public class User {private Long userId;/*** 用户名(登录)*/private String username;/*** 年龄*/private int age;/*** 性别*/private int sex;/*** 密码*/private String password; }2 单字段分组 //根据年龄分组 List<User> userList new ArrayList…

怎么在mysql查询自己建的表格_oracle数据库中怎么查询自己建的表

select * from user_tables where table_nameABC;可以查询出ABC但前提得是知道表名是ABC 可以根据表建时间不同&#xff0c;来将你本人建的表和数据库自动建的表分开&#xff0c;虽然他们都是同一个用户建的。 在user_table表里没有建表时间这一字段&#xff0c;可以用user_obj…

设计模式总结篇(为什么要学习设计模式,学习设计模式的好处)

在学习完设计模式后&#xff0c;LZ想告诉大家&#xff1a; ​ 对于一名工作不久的程序员来说&#xff0c;学习设计模式是非常有必要的&#xff0c;设计模式可以让你知道在某些场景下如何来设计出适合场景的架子&#xff0c;对&#xff0c;因为经验不丰富&#xff0c;大部分程序…

Mybatis源码分析开篇

Mybatis的由来 iBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code&#xff0c;并且改名为MyBatis 。2013年11月迁移到Github。 iBATIS一词来源于“internet”和“abatis”的组合&#xff0c;是一个基于Java的持久层框架…