石头的博客

关注flash,flex,asp,php的相关项目开发

« flash,p2p视频简单的应用as3的TLFTextField监听回车 »

MYSQL数据库的备份与恢复

[ At 2010-7-25 By stone   0 comments ]

1       相关准备工作
      MySQL数据库的备份与恢复与数据库日志有着紧密联系,特别是数据库的二进制日志(BINLOG),更是对于灾难恢复、增量备份起着重极其重要的作用。因此,开启和熟悉相关日志是十分必要的。

1、  二进制日志(BINLOG)。二进制日志记录了所有的DDL(数据定义语言)语句和DML(数据操作语言)语句,但是不包括数据查询语句。也就是说所有的数据库更改都被记录  在了二进制日志中(因此该文件可能会非常庞大)。设置方法为:在my.ini文件中[mysqld]选项后面添加如下语句:

log-bin=filename

例如:log-bin="D:/LOGBIN/data_logbin.log"

filename为存放二进制文件的路径,强烈建议与MySQL的数据目录分开存放。

 

 2、 错误日志。错误日志是MySQL中最重要的日志之一,它记录了MySQL启动和停止时,以及服务器在运行过程中发生的任何严重错误的相关信息。当数据库出现任何故障导致无法正常使用时,可以首先查看此日志。该日志黙认是开启的,但也可以指定,方法为在my.ini文件中[mysqld]选项后面添加如下语句:

     log-error=filename

     例如:log-error="D:/ERRORBIN/data_error.log"

     filename为存放错误文件的路径,建议也与MySQL的数据目录分开存放。

2       备份/恢复策略
MySQL数据库中的备份可以分为逻辑备份与物理备份,逻辑备份是将数据库中的数据备份为一个文本文件(即我们通常见到的SQL脚本文件),而物理备份则是基于对数据文件的处理(比如对于InnoDB的数据库表,其数据文件即为.ibd文件)。

2.1    逻辑备份与恢复
2.1.1   手工备份
逻辑备份使用mysqldump工具来完成备份。其使用方法为:

mysqldump [主机] [用户名] [密码] [数据库]>[备份路径]

例如:

mysqldump -h192.168.1.7 -uroot –phello data_test>d:\backup.sql

或者写成:

mysqldump --single-transaction -h192.168.1.7 -uroot phello data_test>d:\backup.sql

或者写成:

mysqldump --single-transaction -h192.168.1.7 -uroot -phello –F data_test>d:\backup.sql

第二种写法对于InnoDB存储引擎的表来说,是一个很好的办法,它可以使mysqldump得到数据库的一个快照,使得备份的数据能够保证一致。否则,备份时,用户就只能对表有读的权限了。第三种写法更好,它可以令数据库生成一个新的二进制日志文件,而该文件只记录了自备份开始以来所有的数据库操作,这样更方便。

2.1.2   定时备份
首先写一个批处理脚本,例如该脚本内容为:

mysqldump --single-transaction -h192.168.1.7 -uroot -phello data_test>d:\backup.sql

       然后将该脚本保存为bat格式文件,再在windows的“任务计划”里面设定一个定时执行该脚本的任务,比如说每周一的晚12:00执行该脚本(这个时间点最好设在用户量可能最少的时间),这样就能定时备份相应的数据库了。当然这种备份只是一种简单的全备份,建议不要大量使用,可以适时的使用。

 

2.1.3   增量备份
上述备份方法都属于全备份,这种备份优点是备份保持最新备份,恢复的时候可以花费更少的时间,但缺点是如果数据量大,将会花费很多的时间,并对系统造 成较长时间的压力。增量备份则恰好相反,只需备份每天的增量日志,备份时间少,对负载的压力也少,缺点是恢复的时候需要全备份加上上次的全备份,恢复时间长些。俱体方法如下:

首先将二进制日志文件复制到备份目录,这个因为是对文件进行CP操作,所以非常快。

然后,利用mydqlbinlog工具将该日志文件中对应当天的SQL语句抽出来形成SQL脚本文件,比如说要得到2009年6月22日的数据:

mysqlbinlog --start-date=”2009-06-22 00:00:00”--stop-date=”2009-06-22 24:00:00” D:\LOGBIN\data_logbin.0000002>d:\logback20090622.sql

          最后将备份目录下的二进制日志文件删除即可(想保留也无所谓,只不过占空间)。

2.1.4   恢复
用mysqldump的完全恢复很简单,如下所示例子:

1)        上午9点开始备份数据库(可以是手工,也可以是定时备份):

mysqldump --single-transaction -h192.168.1.7 -uroot -phello data_test>d:\backup.sql

2)        9点半备份完毕

3)        到了10点,数据库故障,数据无法访问,需要恢复备份

4)        使用mysqlbinlog得到9点到10点间的日志数据,如下所示:

mysqlbinlog –start-date=”2009-06-22 10:00:00”—stop-date=”2009-06-22 10:30:00” D:\LOGBIN\data_logbin.0000002>d:\logback.sql

5)        还原之前备份的数据:

mysql –uroot –psinojp database<d:\backup.sql

6)        还原从日志文件中得到的相关时间段的数据:

mysql –uroot –psinojp database<d:\logback.sql

7)        完成恢复

以上恢复时用到了二进制文件LOGBIN,且是基于时间点恢复LOGBIN里的数据,其实,更精确一点,我们还可以根据位置来恢复二进制文件里的数据。因为由于误操作,比如误删除了一张表,这时使用基于时间点的恢复是有误差的,因为日志里面还存在误操作的语句,我们需要的是恢复到误操作以前的状态,然后跳过误操作语句,再恢复后面执行的语句,完成我们的恢复。这样的要求下,我们就要用到基于位置的恢复了。如下所示:

mysqlbinlog –stop-position=”1000” d:\logbin.0000005>d:\time1.sql

mysqlbinlog –start-position=”1050” d:\logbin.0000005>d:\time2.sql

这样一来,位置1000到1050之间的语句咱就不执行了(这个要求自己去查看日志文件,确认误操作语句的序号)。

 

2.2    物理备份与恢复
         物理备份又分为冷备份与热备份,和逻辑备份相比,它的最大的优点是备份和恢复的速度更快,因为物理备份的原理就是基于文件的CP。

2.2.1   冷备份
冷备份其实就是停掉数据库服务,CP数据文件的方法。这种方法一般很少用,因为很多应用是不允许长时间停机的。方法如下:

备份:首先停掉MySQL服务,在操作系统级别备份数据文件和日志文件到备份目录。

恢复:首先停掉MySQL服务,在操作系统级别恢复数据文件(直接将备份的数据文件复制到数据目录即可),然后重启服务,再使用mysqlbinlog工具恢复自备份以来的所有BINLOG。

2.2.2   热备份
热备份一般由专门的备份工具来完成,优点是速度快,生成的备份文件小,对用户的影响也小,缺点是目前还没有免费的热备份工具。现在较流行的是ibbackup这款热备份工具,可以免费试用一个月,效果不错。

2.2.3   其它方式
实际上,除了上述备份方法外,如果数据库系统进行了主从复制设置,则也可以使用一个从服务器执行备份,这样就不会干扰主服务器,使得在备份过程中主服务器可以继续处理更新。但这种备份方式存在一定的数据差异,所以不提倡大力使用。

同时,可以将全备份与增量备份结合起来使用。但要注意的是,要经常做备份恢复测试,确保备份是有效的,并且是可以恢复的。

3       备份数据的物理存放
由于备份的数据库文件通常会非常大(T级),并且从安全角度来考虑,都应该将备份数据与原数据进行隔离。可以采用专门的备份服务器,定时将数据备份到该备份服务器上来,并且定期将之前备份数据刻录成光盘,以防万一。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Walle Build 100427 Code detection by Codefense

@2010 stonemx.com