利用数据库文件恢复MySQL数据

来源:互联网 发布:逆战老是网络波动异常 编辑:程序博客网 时间:2024/06/05 20:17

这个题目看上去很奇怪,但是问题却不难描述,在服务器中原先的数据库版本是MySQL5.1,因为某些需求,数据库版本必须进行升级,但是升级之前,忘记将一个应用的数据库导出,而当数据库升级到MySQL5.6之后,并且还把原5.1数据库服务器覆盖之后,才意识到这个应用的数据没有导出。因此现在的问题,就是只有5.1数据库的文件(通过查找my.cnf中查找datadir的路径),如何导出数据库的sql文件。当导出sql文件之后,在5.6的数据库中,重做一遍即可。

在datadir的路径下,大约有如下结构:

|-    |-ibdata1    |-ib_logfile0    |-ib_logfile1    |-abcd(数据库名)        |-a.frm        |-b.frm        |-c.frm    |-efgh(数据库名)

为了不影响现有的应用,所以我们选择一台装有MySQL5.1版本的新机器来恢复。然后想当然的把abcd文件夹copy到新机器对应的datadir中。

当我们通过MySQL连接到mysql-server时,发现在show databases时可以查看到abcd的数据库,并且当选择abcd后,并利用show tables时,可以看到a,b,c三张表。

不过,很遗憾,当对表进行select请求时,却被告知,table name not exist; 郁闷。。

不过,想到datadir里面除了abcd和efgh对应的文件夹外,只剩下了ibdata之类的数据,因此猜想,ibdata这些数据是存放的数据库的数据,于是干脆,将ibdata1,和两个log文件全都都拷贝到新机器的datadir目录下,然后奇迹就发生了,可以select到数据了。自然的,就可以通过mysqldump将数据库导出为sql文件,然后再5.6的MySQL中重做数据库。Done!

不过,我还想到了一件很恐怖的事情,ibdata1,和两个log文件到底是啥?难道所有的数据库的数据都保存到一个文件里面???这个太可怕了,而且完全颠覆我的认识,如果主要的话,那分库的意义何在。所以这个问题一定要搞清楚。

根据.frm文件 的描述,我们知道frm只存储表的结构信息,包括元数据等,frm跟数据库存储引擎无关,这也就是说,他和表的索引、数据都无关,因为索引和数据都是存储引擎相关的。那么对MyISAM引擎很容易理解,.MYD为数据文件,MYI为索引文件。那么对于Innodb而言呢?我们知道其主键是聚簇索引,是直接与数据存储在一起的。那么去了哪里?

根据《MySQL技术内幕》一书的介绍,innodb存在表空间的概念,上面5.1的组织结构中,是以共享表空间的格式,将数据都存入到一个文件中,介绍ibdata1,ibdata1是与存储引擎相关的,只在innodb存储引擎下出现,而且是mysql-server中所有innodb存储引擎的表,不分数据库都存储到ibdata1中,当然这个文件中还会存储其他信息,如索引等。当在MySQL中开启innodb_file_per_table后,那么将会在每个数据库对应的文件夹下,每张表将有存在两个对应文件,一个是.frm,另外一个是.ibd文件。这种情况成为私有表空间。但是这个时候共享表空间ibdata1,仍然是存在的。【不过为什么要这样设计,还是不大懂。。】

ib_logfile0和ib_logfile1是相同的,都是innodb产生的重做日志。这两个文件一模一样,之所以存在两个是,为了避免一个文件损坏后,而且MySQL crash之后,innodb无法恢复数据。

原创粉丝点击