mysql恢复数据

1、崩溃恢复:

突然断电、宕机,导致mysql无法正常启动:

(1) 关闭数据库。

(2) Vim /etc/my.cnf  添加:innodb_force_recovery=1   默认为0

1(SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。

2(SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash

3(SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。

4(SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。

5(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。

6(SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。

(3)  启动mysql,如果启动失败则依次按照1-6顺序配置innodb_force_recovery参数

(4)  做全量备份。

(5) 删除ib_logfile0ib_logfile1ibdata1

2、利用二进制日志恢复(前提是二进制日志都在):

(1)利用时间或position进行恢复:

mysqlbinlog --start-positon=  --stop-positon= mysql-bin.000022 | mysql -uroot -p

mysqlbinlog --start-datetime="2016-9-25 22:01:08" --stop-datetime="2019-9-25 22:09:46" | mysql -uroot -p

(2)利用二进制日志转换成为.sql文件恢复;

mysqlbinlog --base64-output=decode-rows -v mysql-bin.000012 > ~/bin.sql

mysql -uroot -p < ~/bin.sql

 3、利用历史备份+二进制日志还原:

(1)导入历史备份数据:

mysql -uroot -p123456 < all.sql

这时已经还原为备份时的数据库状态。

(2)找到历史备份数据的时间点,比如历史数据是昨晚0点备份的,那么就是0点。然后从二进制日志中找到昨晚0点的数据,利用mysqlbinlog命令进行还原。

mysqlbinlog --start-positon=  --stop-positon= mysql-bin.000022 | mysql -uroot -p

mysqlbinlog --start-datetime="2016-9-25 22:01:08" --stop-datetime="2019-9-25 22:09:46" | mysql -uroot -p

4、没有备份的历史数据的时候,可以只利用二进制日志恢复。前提是二进制日志必须都存在。

(1)做一个slave机,并启动服务。

(2)找到已经删除了或者清空了表的建表二进制日志名称。如:该表建表语句在mysql-bin.000009。找到删除操作前的position,也就是DROP或TRUNCATE语句前一个的position,如:语句在:mysql-bin.000061   position在73154

(3)在slave机上创建好数据库,然后change master to master_log_file='mysql-bin.000009',master_log_pos=107,master_port=3306;

START SLAVE UNTIL MASTER_LOG_FILE='mysql-bin.000061',MASTER_LOG_POS=73154;    开始启动slave并指定二进制日志的终点。

posted @ 2018-06-08 14:03  叶落千尘  阅读(360)  评论(0编辑  收藏  举报