
在使用MySQL数据库的时候,都碰到过因断电造成数据库损坏的情况,大家都知道,断电或非正常关机是导致MySQL数据库出现错误最常见的原因,如何恢复MySQL数据库是大家都非常头痛的问题。目前有方法可以帮助大家恢复损坏的MySQL数据库吗?
当用户出现断电造成的MySQL数据库丢失损坏时,如果能进入MySQL软件,但是提示错误信息,用户可以通过“系统维护”—“数据库压缩修复”,压缩下数据库(有些软件在“系统设置”—“系统维护”—“数据库备份\恢复”中),这种方法只适合一小部分的数据库故障修复,功能性并不高。
现在网络上有两种比较推荐使用的MySQL数据库恢复方法,一种方法使用MySQL(和PHP搭配之最佳组合)的check
table和repair
table
的sql语句,另一种方法是使用MySQL(和PHP搭配之最佳组合)提供的多个myisamchk,
isamchk数据检测恢复工具。在很多用户看来,这两个方法都比较复杂,并不适合大多数的用户使用。另外,这两种方法并不能有效的恢复MySQL数据库,可能还会造成数据库被进一步损坏,造成大家无法挽回的损失。根据以上几个原因,这两种MySQL数据库恢复方法并不建议大家使用。
。
数据库被损坏分以下几种情况:
1、严重损坏
2、轻度损坏
3、有些表被损坏或有些表的部分记录被损坏
Windows上安装了XMAPP-controller之后间歇性出现MySQL无法启动,查看日之后发现是innodb的报错,报错信息如下:
度娘上各种答案无法解决,后来直接看官方文档,直接上解决方案:
踩坑指南 - - *** 作配置前需要做这些 *** 作:
1、配置my.cnf 配置innodb_force_recovery = 1 到 6 试到正确为止,重启MySQL
2、导出数据脚本 mysqldump -uroot -p123456 test >test.sql 导出SQL脚本。或者用Navicat将所有数据库/表导入到其他服务器的数据库中。 注意:这里的数据一定要备份成功。然后删除原数据库中的数据。
3、删除ib_logfile0、ib_logfile1、ibdata1 备份MySQL数据目录下的ib_logfile0、ib_logfile1、ibdata1三个文件,然后将这三个文件删除
4、配置my.cnf 将my.cnf中innodb_force_recovery 这行配置删除或者配置为innodb_force_recovery = 0,重启MySQL服务
5、将数据导入MySQL数据库 mysql -uroot -p123456 test <test.sql
或者用Navicat将备份的数据导入到数据库中。 如果在导入数据过程中发生tablespace不存在的问题,请删除data目录相应database下的文件。
我们都知道,在mysql (这里只探讨innodb) 中delete数据,并非真实删除,而是在这行数据上打了一个del的标记,所以这行占用的空间也并不会释放,但是空间可以被复用,所以期望用delete数据来释放空间的同学可以醒醒了。这样就造成了空间上的碎片,那么如果干掉这些碎片呢。
这里先说结论,alter table语句可以触发表重建,消除碎片空间。
mysql中的数据存储结构大概是下面这个样子的
而delete掉的标记会记录在头信息中。
做个实验,看看空间是否真的没有释放;
创建一张表user,并插入很多数据
查看表的文件大小
再随便插入几条
ok这里看到文件大小增加了16k,这是因为mysql的一页就是16k,所以文件大小是16k、16k的增长的。
这时候我们删除大量的数据再次查看文件大小,仍然是272k,索命,数据虽然删除,但是空间没有释放。
这里我们对主键执行一个alter table语句
再次查看文件大小
ok 文件大小明显的减少,这里说明主键的alter语句会重建表,并且释放碎片空间;
这时候我们再删除大量的数据再次查看文件大小,这里我们对普通列执行一个alter table语句
再次查看文件大小
ok 文件大小明显的减少,这里说明普通列的alter语句会重建表,并且释放碎片空间;
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)