MySQL数据库恢复(InnoDB)

MySQL数据库恢复(InnoDB),第1张

你会备份,不能恢复。真的服你了。

给你二个解决办法:

第一个办法:使用这个命令格式

shell>mysqladmin

create

数据库

-uroot

-p

(数据库已经存在就不用此步)

shell>mysql

-uroot

-p

数据库名

<

backup-file.sql

第二个办法:更详细的用法在mysql的在线手册中,已经给你找到备份恢复的页面了,打看学一下,你们问题就可以肯定搞定了。这是mysql官方中文手册。

备份恢复的页面链接:http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#disaster-prevention

- 恢复策略

前面说到未提交的事务和回滚了的事务也会记录Redo Log,因此在进行恢复时,这些事务要进行特殊的的处理.有2中不同的恢复策略:

A. 进行恢复时,只重做已经提交了的事务。

B. 进行恢复时,重做所有事务包括未提交的事务和回滚了的事务。然后通过Undo Log回滚那些未提交的事务。

- InnoDB存储引擎的恢复机制

MySQL数据库InnoDB存储引擎使用了B策略, InnoDB存储引擎中的恢复机制有几个特点:

A. 在重做Redo Log时,并不关心事务性。 恢复时,没有BEGIN,也没有COMMIT,ROLLBACK的行为。也不关心每个日志是哪个事务的。尽管事务ID等事务相关的内容会记入Redo Log,这些内容只是被当作要 *** 作的数据的一部分。

B. 使用B策略就必须要将Undo Log持久化,而且必须要在写Redo Log之前将对应的Undo Log写入磁盘。Undo和Redo Log的这种关联,使得持久化变得复杂起来。为了降低复杂度,InnoDB将Undo Log看作数据,因此记录Undo Log的 *** 作也会记录到redo log中。这样undo log就可以像数据一样缓存起来,而不用再redo log之前写入磁盘了。

包含Undo Log *** 作的Redo Log,看起来是这样的:

记录1: <trx1, Undo log insert <undo_insert …>>

记录2: <trx1, insert …>

记录3: <trx2, Undo log insert <undo_update …>>

记录4: <trx2, update …>

记录5: <trx3, Undo log insert <undo_delete …>>

记录6: <trx3, delete …>

C. 到这里,还有一个问题没有弄清楚。既然Redo没有事务性,那岂不是会重新执行被回滚了的事务?确实是这样。同时Innodb也会将事务回滚时的 *** 作也记录到redo log中。回滚 *** 作本质上也是对数据进行修改,因此回滚时对数据的 *** 作也会记录到Redo Log中。

一个回滚了的事务的Redo Log,看起来是这样的:

记录1: <trx1, Undo log insert <undo_insert …>>

记录2: <trx1, insert A…>

记录3: <trx1, Undo log insert <undo_update …>>

记录4: <trx1, update B…>

记录5: <trx1, Undo log insert <undo_delete …>>

记录6: <trx1, delete C…>

记录7: <trx1, insert C>

记录8: <trx1, update B to old value>

记录9: <trx1, delete A>

一个被回滚了的事务在恢复时的 *** 作就是先redo再undo,因此不会破坏数据的一致性.

- InnoDB存储引擎中相关的函数

Redo: recv_recovery_from_checkpoint_start()

Undo: recv_recovery_rollback_active()

Undo Log的Redo Log: trx_undof_page_add_undo_rec_log()

InnoDB拥有内部恢复机制,假如数据库崩溃了,InnoDB通过从最后一个时间戳开始运行日志文件,来尝试修复数据库。大多数情况下会修复成功,而且整个过程是透明的。

假如InnoDB自行修复失败,那么数据库将不能启动。无论怎样一次又一次的尝试启动MySQL,它都只是发出一条错误信息。这也是在使用 InnoDB时,需要运行master/master的原因,只有这样才能在一个master宕掉时,还有一台冗余master做后备。

在继续 *** 作前,先浏览下MySQL的日志文件,确定数据库是因为InnoDB表的损坏而崩溃。

有一种方法是更新InnoDB的日志文件计数器以跳过引起崩溃的查询,但是经验告诉我们这不是个好方法。这种情况下,将造成数据的不一致性而且会经常使主从复制中断。

一旦确定MySQL因为InnoDB表损坏无法启动时,就可以按照以下5步进行修复:

1.添加如下配置到/etc/my.cnf文件中

innodb_force_recovery = 4

2.这时就可以重新启动数据库了,在innodb_force_recovery配置的作用,所有的插入与更新 *** 作将被忽略

3.导出所有的数据表

4.关闭数据库并删除所有数据表文件及目录,再运行 mysql_install_db来创建MySQL默认数据表

5.在/etc/my.cnf中删除innodb_force_recovery这一行,再启动MySQL(这时MySQL正常启动)

6.从第3步备份的文件中恢复所有的数据。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6270160.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-19
下一篇 2023-03-19

发表评论

登录后才能评论

评论列表(0条)

保存