MySQL数据库灾难恢复

雪域幽狐 2010-12-22 15:50 阅读:5515


当 MySQL Server 因为各种无法预期的原因而损坏(Crash)的时候,你就必须要进行灾难恢复。如果你有做好定期的数据库备份那么灾难还原的时候应该会轻松很多,只要将备份起来的数据还原回去即可,但光是这样子还是会造成部份数据的遗失。假如每天凌晨1:00备份,那么如果我们在12:00,进行了误操作,比如把库删除了,使用备份恢复时,能恢复到凌晨1:00的数据,但是1:00到12:00的数据却丢了。这时我们可以通过 MySQL 提供的 Binary Log 机制将可能遗失的数据降至最低。

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

使用 Binary Log 进行灾难恢复的步骤:
启用 Binary Log
使用 mysqlbinlog 将 Binary Log 转换成可执行的 SQL 命令

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

[b]一、启用 Binary Log[/b]
修改 MySQL Server 的系统设置文件(eg. /etc/my.cnf,window下是my.inf),在 [mysqld] 区块中加上 log-bin=E:/data/mysql-bin 选项,然后重新启动 MySQL Server,例如:
[code][mysqld]
log-bin=E:/data/mysql-bin
expire_logs_days=3[/code]
下面的行的意思是只保留3天的,这个日志增长较快,根据自己情况设定

启用后你应该可以在 MySQL 的 Data Dir 里面发现如下的文件:
mysql-bin.index
mysql-bin.000001
mysql-bin.000002
...............
mysql-bin.00000X

[b]二、使用 mysqlbinlog 将 Binary Log 转换成可执行的 SQL 命令[/b]
Binary Log 是无法被 MySQL Server 直接执行、也无法直接以人眼去阅读的,必须要先使用 MySQL 所提供的 mysqlbinlog ,将 Binary Log 转换为 MySQL Server 可以执行的 SQL 命令。mysqlbinlog 的语法如下
mysqlbinlog -H --start-datetime="2010-12-22 01:00:00" --stop-datetime="2010-12-22 12:00:00" mysql-bin.000001 >log.sql
这里要注意的是,要一次处理所有的 Binary Log,因为储存在 Binary Log 中的数据有可能会 "跨文件",例如从 mysql-bin.000001 的结尾接到 mysql-bin.000002 的开头。
可以这样
mysqlbinlog -H --start-datetime="2010-12-22 01:00:00" --stop-datetime="2010-12-22 12:00:00" mysql-bin.000002 >>log.sql

-H:Display a hex dump of the log in comments.
--set-charset:设置编码
--start-datatime:要转换的开始时间点
--stop-datatime:要转换的结束时间点

需要加 -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)

[b]三, 实际执行转换后的 Binary Log[/b]
很简单,只要一行简单的命令:
mysql -h127.0.0.1 -uroot -p123456
InnoDB和MyISAM都OK。

3条评论

epo5289 2010-12-25 15:56
问下你平时的数据怎么备份啊  保存到光盘  光盘质量现在听说也垃圾的很  2年就坏 几十年那是假的  有的一年  保存在移动硬盘上吧  万一摔坏了怎么办?  本来我想保存到光盘上  可是现在听说光盘特别是DVD盘  特别容易坏   哎  你说该杂办  我都担心我以前保存的数据都坏掉了  我现在移动硬盘里一大堆资料整天提心那个吊胆

雪域幽狐 2010-12-25 19:53
买个硬盘吧,现在2T的也就几百块,很便宜的

epo5289 2010-12-29 08:44
晕死   这么便宜啊???太落后了 我这都不知道   我用的还是几年前三星160G的  加上好的外壳都快1000了  

不过2T这么大的硬盘稳定不啊  别不耐用  便宜也白搭

登陆后可评论