`
romejiang
  • 浏览: 96522 次
  • 性别: Icon_minigender_1
  • 来自: ...
社区版块
存档分类
最新评论

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,例如:

[mysqld]
log-bin=mysql-bin
 

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

mysql-bin.index
mysql-bin.000001
mysql-bin.000002
...............
mysql-bin.00000X
 

 

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

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

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

 

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 的语法如下:

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
  或者这样:
mysqlbinlog  --set-charset="utf8" --database=phpcms   mysql-bin.[0-9]* > example.sql 
 
-H:Display a hex dump of the log in comments.
--set-charset:设置编码
--database :只导出某一个库的日志
--start-datatime:要转换的开始时间点
--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 即可。

sed -f replace.rules example.sql > final.sql
 

replace.rules文件的内容:

s/\(Query.*thread\)/#\1/g
s/\(###.*###\)//g
s/DELIMITER ;//g
s/Stop//g
s/DROP.*//g
 

上面几行的意义:

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

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

Query thread_id=227528 exec_time=- error_code=0
 

要改成:

#Query thread_id=227528 exec_time=- error_code=0
 
s/\(###.*###\)//g
 

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

### Bitfield: user.options ###
### SAVE ORDERED IDS TO SEARCH CACHE ###
 

........等等

s/DELIMITER ;//g

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


DELIMITER ;
s/Stop//g

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

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

分享到:
评论

相关推荐

    MySQL数据库备份和恢复

    ### MySQL数据库备份与恢复:深度解析与实践指南 在当今数据驱动的世界中,数据库的稳定性和数据的安全性显得尤为重要。MySQL作为全球最流行的开源关系型数据库管理系统之一,其备份和恢复策略是确保数据安全和系统...

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

    MySQL数据库的备份与恢复是确保数据安全性的重要环节。在本测试报告中,主要涉及了全量备份和增量备份的恢复过程,并对恢复后的数据进行了验证。以下是对这些知识点的详细说明: 1. **全量备份**:全量备份是数据库...

    记一次MySQL数据库恢复(附方案).zip

    记一次MySQL数据库恢复(附方案).zip记一次MySQL数据库恢复(附方案).zip记一次MySQL数据库恢复(附方案).zip记一次MySQL数据库恢复(附方案).zip记一次MySQL数据库恢复(附方案).zip记一次MySQL数据库恢复(附...

    MYSQL数据库修复大师7.12

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

    Mysql8.0 数据库恢复工具

    文件级别数据库恢复工具软件,本软件适合于操作系统崩溃后将mysql数据目录拷贝出进行恢复,在恢复前需要使用之前备份的数据库结构新建空库,然后将还原文件的数据恢复到新库,目前只能恢复InnoDB引擎、MyISAM引擎 表...

    C#编写的MYSQL数据库备份恢复工具(源代码)

    本篇将详细介绍由C#编写的MYSQL数据库备份恢复工具,以及其中涉及的关键技术和实现方式。 首先,C#是一种面向对象的编程语言,由微软公司推出,它具有丰富的类库和强大的.NET框架支持,适用于开发Windows桌面应用、...

    C#实现MySQL数据库的备份、还原和初始化

    在`btn_Import_Click`事件处理函数中,首先检查用户是否选择了要恢复的文件,然后构造`mysql`命令读取SQL文件并导入到数据库中。同样,通过`RunCmd`方法执行这个命令,成功则提示用户恢复成功。 `RunCmd`方法是一个...

    nbu&mysql备份恢复.docx

    * 高效的备份和恢复:NBU可以快速地备份和恢复mysql数据库,无需停机或中断数据库的正常运作。 * 完整的数据保护:NBU可以保护mysql数据库中的所有数据,包括结构、索引、视图、存储过程等。 *灵活的备份策略:NBU...

    MYSQL数据库修复程序

    MySQL数据库修复程序是一种技术密集型的过程,主要用于解决数据库在运行过程中遇到的各种问题,如数据丢失、表损坏、系统崩溃等。在本场景中,我们关注的是如何通过特定工具,如Navicat,来管理和修复MySQL数据库中...

    h2数据导入mysql数据库(看评论酌情下载)

    h2 数据库导入 MySQL 数据库 h2 数据库导入 MySQL 数据库是指将 h2 数据库中的数据导入到 MySQL 数据库中,以便更好地存储和管理数据。下面将详细介绍 h2 数据库导入 MySQL 数据库的步骤。 首先,需要创建一个 ...

    C#实现备份、还原MySql数据库

    对于使用MySQL数据库的系统,定期备份和恢复数据库可以防止数据丢失,确保业务连续性。本篇将详细讲解如何使用C#语言来实现MySQL数据库的备份与还原功能,并探讨如何通过线程设置定时自动备份。 首先,我们需要了解...

    MYSQL数据库大进级,是非常全面的MYSQL数据库进阶学习资料!

    MYSQL数据库大进级,是非常全面的MYSQL数据库进阶学习资料!

    Mysql数据库误删恢复方法.docx

    本文将详细介绍如何通过`.frm`和`.ibd`文件来恢复已删除的MySQL数据库,主要包括三个关键步骤:恢复数据库文件、恢复表结构和恢复表数据。 1. **恢复 mas2020 数据库文件** 当数据库被误删时,首先要通过文件恢复...

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

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

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

    备份是防止数据丢失的重要手段,包括全量备份和增量/差异备份,而恢复则涉及到如何在灾难性事件后恢复数据库。此外,理解如何设置用户权限、角色以及GRANT和REVOKE命令,有助于保护数据库的安全性。 通过这四个实验...

    mysql数据库备份与恢复

    本知识点将深入探讨如何在SpringBoot环境下对MySQL数据库进行备份与恢复,以确保数据的安全。 首先,`MysqlBackup.java` 文件很可能是实现备份和恢复功能的核心Java类。在SpringBoot中,我们可以利用JDBC(Java ...

Global site tag (gtag.js) - Google Analytics