如何 根据ibdata和frm文件 恢复数据库

Posted

tags:

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

因为磁盘空间不足,我的一个虚拟机服务器崩溃了。结果数据库服务器进程无法启动,数据也就无法导出。只能想办法从数据库原始文件 ibdata 和 frm 文件中恢复数据库。

因为没有经验,好不容易才找到了恢复方法。特此记录,以备后用。

磁盘空间不足之后,mysqld 进程无法启动,提示“Can\'t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock\' (2)”。这真是让人无比头大,数据库根本连接不上。

目录 Contents
1. 保存原始数据库文件
2. 恢复方法
3. 参考资料:

1. 保存原始数据库文件¶

好在数据库原始文件还在。在我的系统环境和配置情况下,这些文件位于 /var/lib/mysql/ 文件夹下面。假设数据库名是 test,则这些文件表现为:
--mysql
|--test
|--1.frm
|--2.frm
|...
|--mysql
|...
|--ib_logfile0
|--ib_logfile1
|--ibdata1
|...

这些就是原始数据库文件,可以用来恢复数据库。将这些文件额外保存一份,以防万一。

2. 恢复方法¶

我的原始虚拟机完全没有磁盘空间而无法启动数据库服务器进程。虽然试着删除一些不需要的文件,但是数据库却始终无法连接。于是我新建了一个几乎一样的虚拟机(当然磁盘加大了),试图将这些数据库文件导入并恢复数据库。

在经历了很多错误之后,终于找到了正确的方法:

安装完成新服务器之后,通过命令行新建了与原来一样的数据库:数据库名称、用户名、密码都一样。如果有多个数据库需要恢复,就都给建好。(跟配置新服务器一样,参见安装和配置 MYSQL 数据库服务器。)
停止 mysqld 进程
service mysqld stop

将备份的原始数据库文件中的所有 .frm 文件(保持原来的目录结构)和 ibdata1 文件复制到新服务器的数据库文件目录中(如果新服务器操作系统和配置环境一样,那么目录结构也一样),其它文件不要。
使用 -innodb_force_recovery=6参数启动数据库服务器进程,这里是
/etc/init.d/mysqld start -defaults-file=/etc/my.cnf -standalone -console -innodb_force_recovery=6

OK,数据库恢复完成。
参考技术A

    创建已经丢失的表结构

    先要安装 mysql-utilities。

    // RedHatyum -y install mysql-server mysql-utilities// Debianapt install mysql-utilities

    使用 mysqlfrm 从 .frm 文件里面找回建表语句。

    // 分析一个 .frm 文件生成建表的语句mysqlfrm --diagnostic /var/lib/mysql/test/t1.frm// 分析一个目录下的全部.frm文件生成建表语句root@username:~# mysqlfrm --diagnostic /var/lib/mysql/my_db/bk/ >createtb.sqlroot@username:~# grep "^CREATE TABLE" createtb.sql |wc -l124

    可以看到一共生成了 124 个建表语句。

    有很多时候也可以从其它库里面生成建表语句,如同一个应用的其它数据库或不同的测试环境,采用下面的 mysqldump 生成建表语句:

    mysqldump --no-data --compact my_db>createtb.sql

    登录 MySQL 生成表。

    mysql> create database my_db;mysql> use my_dbDatabase changedmysql> source createtb.sqlQuery OK, 0 rows affected (0.07 sec)......

    导入旧的数据文件

    将新建的没有包括数据的 .ibd 文件抛弃

    root@username:/var/lib/mysql/my_db# ll *.ibd|wc12411167941root@username:/var/lib/mysql/my_db# mysql -e "show tables from my_db" \\| grep -v  Tables_in_my_db  \\| while read a; do mysql -e "ALTER TABLE my_db.$a DISCARD TABLESPACE"; doneroot@username:/var/lib/mysql/my_db# ll *.ibd|wcls: cannot access '*.ibd': No such file or directory000

    可以看到所有的 .idb 文件都已经被抛弃了。然后把旧的有数据的 .ibd 文件拷贝到这个 my_db 目录下面,别忘了把属主改过来:chown mysql. *,再把这些数据文件 import 到数据库中。

    root@username:/var/lib/mysql/my_db# mysql -e "show tables from my_db" \\| grep -v  Tables_in_my_db  \\| while read a; \\do mysql -e "ALTER TABLE my_db.$a import TABLESPACE"; done

    导入完成后检查表

    使用 mysqlcheck 对数据库 my_db 下的所有表进行检查:

    root@username:/var/lib/mysql/my_db# mysqlcheck -c my_dbmy_db.cdp_backup_point                             OK......

    所有的表都导入成功。

本回答被提问者采纳

转&参考MySQL利用frm和idb文件进行数据恢复

 

MySQL利用frm和idb文件进行数据恢复

源MySQL现状:
  版本:5.6.*
  存储引擎:innodb存储引擎
  要恢复数据库:skill
  重点要恢复表:slot_value

已有的文件:
  备份了所有物理文件(含ibdata1和数据库skill整个目录)

友情提示:最好找个自己的开发机,自己额外搭一套MySQL数据库,以免因为共用mysql数据库而影响其他人。
1. 搭建MySQL,如果这步骤有疑问,出门左转有yum搭建各种版本数据库的操作步骤:http://www.cnblogs.com/zhzhang/p/7765040.html
2. 备份刚搭建的MySQL的数据(因为新搭建的数据库,可以忽略此步骤)
3. 将之前备份了的物理文件ibdata1文件和skill文件夹放到刚搭建的这个MySQL数据目录中(数据目录位置在/etc/my.conf中的datadir=/var/lib/mysql)
4. 将ibdata1和skill整个目录,更改为所属主为mysql
5. 将skill目录chmod 760 skill
6. 将skill目录内部所有文件 chmod 660 *
7. service mysqld restart 重启数据库 【重启之前务必删除数据目录下的ib_logfile0等文件(数据库超大比如200G以上时,会出问题,不知道什么原因)8. 登录此数据库,找到skill数据库,找到slot_value表,数据恢复。
9. 大功告成

参考自:
  http://blog.csdn.net/hongchangfirst/article/details/51323965

注:

  拷贝文件的时候不仅拷贝skill文件夹及其中数据,还需要拷贝ibdata1文件

  注意文件和目录的所属主及权限;

 

未尽事宜,还请大侠们指点。

 

以上是关于如何 根据ibdata和frm文件 恢复数据库的主要内容,如果未能解决你的问题,请参考以下文章

从 .frm、ibdata 和 ib_logfile 恢复 MySQl 数据库

服务器(centos)意外损坏,mysql数据库.frm和.idb和ibdata1都在的情况下,怎么恢复数据

转&参考MySQL利用frm和idb文件进行数据恢复

Windows环境下Mysql如何快速导入或恢复表为innodb的数据

MySQL Innodb数据库误删ibdata1后MySQL数据库的恢复案例

Mysql 通过frm&ibd 恢复数据