利用数据库文件恢复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无法恢复数据。
- 利用数据库文件恢复MySQL数据
- MySQL从数据库文件恢复数据的方法
- 利用Mysql日志恢复Mysql数据
- [MySQL] 利用 MySql日志文件 恢复数据
- 利用mysql的binlog恢复数据
- 利用 MySql日志文件 恢复数据
- 利用mysql的binlog恢复数据
- 利用mysql的binlog恢复数据
- 利用mysql的binlog恢复数据
- 利用mysql的binlog恢复数据
- MYSQL利用二进制日志恢复数据
- MySQL利用binlog恢复误操作数据
- MySQL数据库文件及数据库恢复介绍
- 系统重装后恢复MySQL数据库文件
- ubuntu中利用mysql命令做数据备份,恢复
- MySQL利用frm和idb文件进行数据恢复
- 利用MYSQL 日志恢复
- 利用MYSQL 日志恢复
- Codeforces 808B Average Sleep Time
- c++实验6
- linux安装上vmware无法启动问题
- 究竟是用 Go 还是 Node.js 去做中间件?
- mysql NULL值
- 利用数据库文件恢复MySQL数据
- c++作业6
- 教程学习 03-Consuming a RESTful Web Service 学习笔记
- 树莓派学习笔记:MQTT协议的简单应用
- rand()与srand()的简单应用(随机数)
- 初识虚拟DOM
- linux内核kprobe分析
- Android中ImageView.ScaleType属性值
- 程序员,请写健康的代码