`
porterzhang
  • 浏览: 7246 次
社区版块
存档分类
最新评论

MySQL数据库灾难恢复

阅读更多

当 MySQL Server 因为各种无法预期的原因而损坏(Crash)的时候,你就必须要进行灾难恢复。如果你有做好定期的数据库备份那么灾难还原的时候应该会轻松很多,只要将备 份起来的数据还原回去即可,但光是这样子还是会造成部份数据的遗失,例如 "现在" 至 "最后一次备份" 之间的数据,这时我们可以通过 MySQL 提供的 Binary Log 机制将可能遗失的数据降至最低。

 

  Binary Log 的运作原理很简单,它只是单纯的将所有会修改到数据库内容的操作记录在 Log 文件中,然后通过这个 Binary Log 你就可以重新执行所有会修改到数据库内容的操作。例如若你最后一次备份的时间是 1/1 AM 0:00 ,并且有启用 Binary Log 功能记录 1/1 AM 0:00 这个时间点以后所有会修改到数据库内容的操作,假设你的 MySQL Server 在 1/2 AM 10:00 故障,你就可以将 1/1 AM 0:00 备份的数据还原回去,然后利用 Binary Log 将 1/1 AM 0:00 ~ 1/2 AM 10:00 之间所有的操作重新执行一次,这样子一来你就可以将数据库还原到当机的那个时间点。

使用 Binary Log 进行灾难恢复的步骤:

 

1.启用 Binary Log
2.使用 mysqlbinlog 将 Binary Log 转换成可执行的 SQL 命令

 

在接下来的文章中会使用的范例与假设:
最后一次备份的时间点为 1/1 AM 0:00
MySQL Server 在 1/2 AM 10:00 故障

 

一、启用 Binary Log

 

修改 MySQL Server 的系统设置文件(eg. /etc/my.cnf),在 [mysqld] 区块中加上 log-bin=mysql-bin 选项,然后重新启动 MySQL Server,例如:

Java代码  收藏代码
  1. [mysqld]  
  2. log-bin=mysql-bin  
 

启用后你应该可以在 MySQL 的 Data Dir 里面发现如下的文件:

Java代码  收藏代码
  1. mysql-bin.index  
  2. mysql-bin.000001  
  3. mysql-bin.000002  
  4. ...............  
  5. mysql-bin.00000X  
 

 

MySQL 在以下几种情况会进行 lograrote:

  • 执行 Flush Logs 命令
  • MySQL Server 重新启动
  • 设置文件中有进行额外的设置

注:
请注意,当你使用 mysqldump 进行数据库备份时请记得加上 --flush-logs 选项,例如:

 

Java代码  收藏代码
  1. mysqldump --flush-logs -u root -p 数据库名称 > example.sql  
 
 

  这么做的目的是在备份时让 MySQL Server 进行 logrotate,这样子日后要辨别 "最后一次备份时间点" 之后的 Binary Log 会比较方便,因为若你没有主动(或通过设置)去删除 Binary Log,则只要你的硬盘空间够大,MySQL 会无限期的保存 Binary Log,也就是说你的 Binary Log 里面所记载的数据有可能包含 "最后一次备份时间点" 之前的数据。

 

二、使用 mysqlbinlog 将 Binary Log 转换成可执行的 SQL 命令

 

  Binary Log 是无法被 MySQL Server 直接执行、也无法直接以人眼去阅读的,必须要先使用 MySQL 所提供的 mysqlbinlog 程式,将 Binary Log 转换为 MySQL Server 可以执行的 SQL 命令。mysqlbinlog 的语法如下:

Java代码  收藏代码
  1. mysqlbinlog -H --set-charset="utf8" --start-datatime="2007-01-01 00:00:00" --stop-datatime="2007-01-02 10:00:00" mysql-bin.[0-9]* > example.sql  
  或者这样:
Java代码  收藏代码
  1. mysqlbinlog  --set-charset="utf8" --database=phpcms   mysql-bin.[0-9]* > example.sql   
 
Java代码  收藏代码
  1. -H:Display a hex dump of the log in comments.  
  2. --set-charset:设置编码  
  3. --database :只导出某一个库的日志  
  4. --start-datatime:要转换的开始时间点  
  5. --stop-datatime:要转换的结束时间点  
 

 

  mysql-bin.[0-9]*:这里要注意的是,要一次处理所有的 Binary Log,因为储存在 Binary Log 中的数据有可能会 "跨文件",例如从 mysql-bin.000001 的结尾接到 mysql-bin.000002 的开头。

example.sql:转换出来的文件名称,这个名称可以自已取。

需要加 -H 选项的原因如下:

写道
mysqlbinlog didn't escape the string content of user variables, and did not deal well when these variables were in non-ASCII character sets; this is now fixed by always printing the string content of user variables in hexadecimal. The character set and collation of the string is now also printed. (Bug #3875)
 

 

三, 实际执行转换后的 Binary Log


很简单,只要一行简单的命令:

 
mysql -uroot -p -f< final.sql
 
-f错误继续执行。
 

如果没有什么错误讯息发生,那么只要等它执行完就大功告成了。话又说回来,要是执行失败呢?这是有可能的。MySQL 在处理 Binary Log 时有一些 Bug 存在,它的 Bug Report 似乎是说在最新版本的 MySQL Server 中已修正此 Bug,我没有实际测试过所以不清楚,但若是你和我一样也遇到这个 Bug 的话,也不用太担心。这些问题其实不难解决,自己 Workaround 即可。

目前看到的情况有:
Comment 没有正确标示
Comment 语法错误
不正确的使用 DELIMITER
奇怪的 STOP 命令(不太确定这是做什么用的)

自己用 sed 去修改转换过后的 example.sql 即可。

Java代码  收藏代码
  1. sed -f replace.rules example.sql > final.sql  
 

replace.rules文件的内容:

Java代码  收藏代码
  1. s/\(Query.*thread\)/#\1/g  
  2. s/\(###.*###\)//g  
  3. s/DELIMITER ;//g  
  4. s/Stop//g  
  5. s/DROP.*//g  
 

上面几行的意义:

s/\(Query.*thread\)/#\1/g

MySQL 的 Binary Log 在处理 Comment 的时候,有的时候会漏加 "#" 符号在 Comment Line 的最前面。
例如本来是:

Sql代码  收藏代码
  1. Query thread_id=227528 exec_time=- error_code=0  
 

要改成:

Sql代码  收藏代码
  1. #Query thread_id=227528 exec_time=- error_code=0  
 
Java代码  收藏代码
  1. s/\(###.*###\)//g  
 

在某些 SQL statement(例如 REPLACE INTO search)的最后面会有一些 Comment 存在,但这些 Comment 的语法不正确反而会造成执行失败,故删除之。
类似以下的行都应该删除:

Java代码  收藏代码
  1. ### Bitfield: user.options ###  
  2. ### SAVE ORDERED IDS TO SEARCH CACHE ###  
 

........等等

s/DELIMITER ;//g

删除不正确的 DELIMITER 命令,像以下这样就是不正确的:

 
DELIMITER ;
s/Stop//g
 
s/DROP.*//g
去掉所有删除表或者库的命令
 

有的时候会在 Binary Log 中出现 Stop 这个命令而导致执行失败,故删除之。但我不太确定这个 Stop 命令实质上的用途是什么。

分享到:
评论

相关推荐

    数据库灾难性恢复(数据库技术;灾难性;恢复;数据备份)

    数据库灾难性恢复 1. 灾难类型 为了使数据库损失降低到最小程度,需要一个恢复策略,确保它起作用,并经常实行策略,一些灾难类型包括: 1. 系统故障。电源故障、硬件故障或软件故障都能够使数据库处于不一致状态。 ...

    MySQL数据库:数据库故障.pptx

    要备份得当,它们都不是灾难,都是可以被恢复的。 用户错误 语句故障 进程故障 介质故障;用户错误是指用户增加或删除数据库中的数据导致的错误,如用户意外地删除或者截断了一个表、删除了表中的所有数据等。;语句...

    嵌入式系统/ARM技术中的Linux EXT3下删除MySQL数据库的数据恢复

    本文主要研究服务器及非WINDOWS平台下的数据灾难恢复。  [数据恢复故障描述]  一台重要的MYSQL数据库服务器,146GB*2,RAID1,约130GB DATA卷,存储了大约200~300个数据库。平时管理员对每个数据库dump出以后,...

    MySQL5学习笔记

    MySQL基础 1 MySQL安装 1 下载安装MySQL 1 配置MySQL 1 下载安装mysql-gui-tools 2 数据库入门 3 ...MySQL灾难性复制恢复总结 16 MySQL授权管理 17 未解决及已解决问题 19 未解决问题 19 已解决问题 19

    高可用MySQL

    《高可用mysql:构建健壮的数据中心》是“mysql ...书中介绍一些关于复制、灾难恢复、系统监控及其他高可用性主题的背景信息。相关有用的背景知识请参考其他书籍的第1 章。对于相关专业的师生,本书也有很高的参考价值。

    数据库崩溃,利用备份和日志进行灾难恢复

    在实际的工作中,我们可能经常会遇到数据库宕机,数据丢失的情况,下面,我将演示一个模拟环境 1.数据库正常启动插入数据: [root@client103 ~]# mysql -uroot -pkongzhong mysql&gt; use test; mysql&gt; insert into a ...

    MySQL备份与恢复

    备份概述:备份的主要目的就是灾难恢复,保证数据的安全性,回滚数据修改,查询历史数据等等。 在企业当中数据是至关重要的,数据保证了企业业务的正常运行,因此,在企业当中备份数据库是必不可少的!!! 数据库备份...

    AWS 白皮书 — 产品.zip

    实施灾难恢复 使用AWS的备份和恢复方法pdf 使用 Amazon ElastiCache提高规模性能,pdf 使用 Amazon Elastic File Systen加密文件数据pdf 使用 Amazon Elasticsearch Service记录和监控(几乎)所有资源,pdf 使用 ...

    MySQL 自动备份与数据库被破坏后的恢复方法第1/2页

    灾难恢复的效率及全面性,也是系统的稳定性的一个准因素,尤其对于一个服务器系统。 这一节,介绍数据库自动备份以及数据库被破坏后的恢复的方法。在这里,我们使用mysqlhotcopy,并且定义一段Shell脚本来实现数据库...

    PHP和MySQL Web开发第4版pdf以及源码

    15.11.2 备份与恢复MySQL数据库 15.12 自然环境安全 15.13 下一章 第16章 Web应用的安全 16.1处理安全性问题的策略 16.1.1 以正确心态为开始 16.1.2 安全性和可用性之间的平衡 16.1.3 安全监视 16.1.4 基本方法 ...

    PHP和MySQL WEB开发(第4版)

    15.11.2 备份与恢复MySQL数据库 15.12 自然环境安全 15.13 下一章 第16章 Web应用的安全 16.1处理安全性问题的策略 16.1.1 以正确心态为开始 16.1.2 安全性和可用性之间的平衡 16.1.3 安全监视 16.1.4 基本方法 ...

    mysql备份的三种方式详解

    做灾难恢复:对损坏的数据进行恢复和还原需求改变:因需求改变而需要把数据还原到改变以前测试:测试新功能是否可用 二、备份需要考虑的问题 可以容忍丢失多长时间的数据;恢复数据要在多长时间内完; 恢复的时候...

    MySQL备份的持续验证:还原备份

    Facebook的MySQL数据库遍布在我们位于全球的数据中心内,我们必须能在任何时间内从任何位置发生的故障中恢复。在发生此类灾难事件后,不仅需要尽量快速可靠地恢复服务,而且需要确保整个过程不会丢失任何数据。为此...

    PHP和MySQL Web开发第4版

    15.11.2 备份与恢复MySQL数据库 15.12 自然环境安全 15.13 下一章 第16章 Web应用的安全 16.1处理安全性问题的策略 16.1.1 以正确心态为开始 16.1.2 安全性和可用性之间的平衡 16.1.3 安全监视 16.1.4 基本方法 ...

    2023年最新版-MySQL面试题( 附答案解析)

    3)可以从灾难中恢复(通过 bin-log 日志等)。 4)外键约束。只有他支持外键。 5)支持自动增加列属性 auto_increment。 2、TokuDB( Fractal Tree-节点带数据) TokuDB 底层存储结构为 Fractal Tree,Fractal Tree

    mysql备份.doc

    做灾难恢复:对损坏的数据进行恢复和还原 需求改变:因需求改变而需要把数据还原到改变以前 测试:测试新功能是否可用

    PHP学习mysql课件 高级篇第1/2页

    数据库管理员的职责 服务器的启动与关闭 用户帐户维护 日志文件维护 数据库的备份与拷贝 服务器的优化 数据库管理系统的软件更新 数据目录的安全性 服务器的安全性 灾难恢复 预防性维护 ““““““““““““...

Global site tag (gtag.js) - Google Analytics