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

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 命令实质上的用途是什么。

分享到:
评论

相关推荐

    MYSQL数据库修复大师7.12

    总的来说,MySQL数据库修复大师7.12版是应对MySQL数据库灾难性故障的有力工具,其全面的功能和对最新MySQL版本的支持,使得数据恢复变得更加便捷和可靠。在遭遇数据丢失的情况下,用户可以快速有效地利用这款软件...

    MySQL数据库原理及应用(第2版)(微课版)-教学用数据库(Mysql数据库备份文件).zip

    5. **备份与恢复**:备份文件如"50183 MySQL数据库原理及应用(第2版)(微课版)-教学用数据库(Mysql数据库备份文件)",提供了数据库灾难恢复的能力。通过mysqldump工具,我们可以创建数据库的完整或增量备份,并...

    MySQL数据库应用形考实验1-4全答案.zip

    MySQL数据库是一种广泛应用于Web开发和企业级数据存储的开源关系型数据库管理系统。在这个"MySQL数据库应用形考实验1-4全答案.zip"压缩包中,包含了四个关于MySQL基础操作的实验训练,涵盖了从数据库和表的创建,到...

    MySQL数据库运维.pdf

    总之,这门课程涵盖了MySQL数据库运维的各个方面,从基础的系统规划和安装,到复杂的性能优化和安全控制,再到关键的备份与恢复策略,旨在培养出具备全面MySQL运维能力的专业人士。通过深入学习,学员将能够应对各种...

    MySQL数据库备份与恢复详解天盾数据恢复中心PPT学习教案.pptx

    备份的主要目的是灾难恢复,也就是在数据库数据删除、数据库崩溃时对损坏的数据进行恢复和还原。 MySQL数据库备份分类可以分为三种类型: 1. 根据是否需要数据库离线,分为冷备份、温备份和热备份。 2. 根据要备份...

    mysql数据库备份和恢复工具

    本文将深入探讨MySQL数据库的备份与恢复策略,并提供相关工具的使用指南。 一、MySQL备份的重要性 数据库备份是防止数据丢失的关键步骤。无论是系统故障、硬件损坏、恶意攻击还是人为错误,都有可能导致数据丢失。...

    浅析MYSQL数据库的备份与恢复.pdf

    浅析MYSQL数据库的备份与恢复 本文主要讨论MYSQL数据库的备份与恢复,旨在...本文向信息管理人员提供了MYSQL数据库备份与恢复的方法和技巧,旨在帮助他们更好地管理和维护MYSQL数据库,避免数据丢失和灾难性的损失。

    mysql数据库恢复 binlog2sql数据库恢复

    它主要用于数据复制和灾难恢复,因为binlog包含了自上次备份以来所有对数据库的修改。 在数据库恢复过程中,首先需要确保MySQL服务已经正确配置并运行。这通常涉及到设置my.cnf配置文件,开启binlog功能,并设定...

    Mysql数据库备份恢复测试报告-mysqldump.docx

    通过这次测试,我们验证了MySQL数据库备份的有效性和恢复过程的可行性,这为数据库管理和灾难恢复提供了重要的参考。对于任何数据库系统,制定并执行可靠的备份计划都是保障业务连续性和数据完整性不可或缺的部分。

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

    数据库灾难性恢复是确保业务连续性和数据安全性的重要环节。在当今信息化社会,数据库技术的广泛应用使得数据成为企业的核心资产。然而,系统故障、事务错误、介质损坏和自然灾害等可能导致数据丢失,对企业造成巨大...

    mysql数据库数据备份与还原源代码

    在实际应用中,除了备份和恢复功能,我们还需要考虑其他因素,比如备份策略(何时进行备份,多久备份一次)、备份存储(本地、网络存储、云存储等)、安全性(加密备份,防止未经授权的访问)以及灾难恢复计划等。...

    使用binlog日志恢复MySQL数据库删除数据的方法

    MySQL数据库的binlog日志是数据安全的重要保障,它记录了所有的DDL(Data Definition Language,如CREATE、ALTER、DROP等)和DML(Data Manipulation Language,如INSERT、UPDATE、DELETE等)语句,但不包括SELECT...

    MySQL数据库中文参考手册(CHM)

    8. 复制和备份:MySQL支持主从复制,可以实现数据的实时同步,提高可用性和灾难恢复能力。同时,定期备份数据库是防止数据丢失的重要措施。 9. 性能调优:通过监控和分析查询性能,可以优化查询语句,调整配置参数...

    Mysql数据库备份方案研究.pdf

    "Mysql数据库备份方案研究" 在当今社会中,数据库中的数据是一个...MySQL数据库备份的优点有很多,包括降低代价、灾难恢复和稳定运行等。但是,MySQL数据库备份的缺点也有很多,包括时间久、空间占用大和恢复慢等。

    mysql数据库的备份命令详解

    无论是对于日常的数据保护还是灾难恢复计划,熟练掌握这些命令都将为数据库管理带来极大的便利。希望本文能帮助广大数据库管理员和开发者更好地理解和运用MySQL数据库的备份与恢复机制,确保数据安全无虞。

    MySQL数据库:数据库的备份与恢复.pptx

    MySQL提供了三种恢复模式:完整恢复模式,适用于大多数情况,特别是大型数据库,可以实现任意时间点的恢复;简单恢复模式,主要适用于小型数据库和更改较少的情况,只能恢复到最近的数据备份时间;大容量日志恢复...

    MySQL数据库简介.doc

    MySQL数据库备份容灾是指对MySQL数据库进行备份和恢复,以防止数据丢失和灾难。 MySQL数据库备份方法有很多,如mysqldump命令、mysqldump快速备份、mysqldump Incremental备份等。 MySQL数据库复制和读写分离 ...

Global site tag (gtag.js) - Google Analytics