前言mysql
操做系统崩溃、电源故障、文件系统崩溃和硬件故障等异常情况均可能致使咱们正在使用的数据库出现故障而产生数据库中数据不一致的状况。为了保证数据库使用安全,必须按期备份数据库;数据库备份能够分为:彻底备份、日志备份、增量备份和文件备份。对于一个大型数据库,频繁执行彻底备份可能会须要太多的时间,并且彻底备份常常会屡次备份一些没有更新过的数据,会形成资源浪费。如今最经常使用的数据库备份策略是在彻底备份的基础上进行较频繁的增量备份。例如,咱们能够在数据库使用较少的时段每周进行一次彻底备份,而后天天进行一次增量备份,备份下这段时间中可能修改数据库内容的操做,以便在发生文件系统故障、硬件问题等问题致使数据库发生灾难性崩溃的时候利用备份数据进行数据库的恢复。sql
u 技术分析数据库
MySQL数据库对上述几种致使数据库崩溃的故障都给出了很好的解决办法以保证数据的一致性。安全
对于操做系统崩溃和电源故障致使的MySQL数据库崩溃,使用MySQL提供的内置方法,在大多数状况下均可以很是有效的恢复:若是咱们使用的是MyISAM数据库,可使用REPAIR TABLE
或者myisamchk –r 对可能损毁的数据库表进行修补;若是咱们使用的是InnoDB,则InnoDB会自动找到挂起的提交了的或未提交的事务列表,并自动回滚未提交的事务和刷新已提交的事务。服务器
若是咱们使用前面的方面未能正确恢复被损害的数据,或者对于文件系统崩溃和硬件故障致使的数据库严重毁坏的状况,咱们就须要从其余安全备份恢复。这种恢复方法基于前面提到的彻底备份和增量备份。spa
在MySQL中,咱们可使用mysqldump方法将数据库导出为一个.sql文件,这个方法能够将咱们正在使用的整个数据库或者多个数据库彻底拷备到一个文件中从而实现对数据库的彻底备份。咱们再把这个文件保存到其余安全的地方,就能够在须要的时候使用该彻底备份进行数据库恢复。操作系统
虽然MySQL没有提供直接的增量备份方法,但咱们能够经过MySQL提供的二进制日志(binary logs)间接实现增量备份。二进制日志保存了全部更新或者可能更新数据库的操做(例如,当一个没有匹配行的delete操做也会被记录在二进制日志中),二进制日志在启动MySQL服务器后开始记录,并在文件达到max_binlog_size
或者接收到flush logs命令后从新建立新的日志文件进行记录。基于二进制日志以上特性,咱们使用二进制日志进行增量备份是很是方便和有效的。咱们只需定时执行flush logs方法从新建立新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份。
日志
在按期彻底备份和及时增量备份的策略中进行数据库备份须要两步:首先经过执行彻底备份的.sql文件恢复数据库,而后用mysqlbinlog恢复上次彻底备份至数据库崩溃时的二进制日志文件序列恢复此时间段内对数据库的更新。
code
通常来讲,咱们采用的彻底+增量备份的频率为每周进行一次彻底备份,每日进行增量备份。根据实际应用的不一样,能够适当调整。
orm
u 实现步骤
经过上一节的分析,咱们能够总结出MySQL的彻底+增量备份策略主要包括如下几个步骤:
Ø 首先,咱们须要开启MySQL服务器的二进制日志功能,其实现方法有不少种,最经常使用的是在MySQL的配置文件的mysqld项中加入log-bin=[filepath]项;也可使用mysqld –log-bin=[filepath]从新启动MySQL服务器。
Ø 其次,使用mysqldump对数据库进行彻底备份,它能够实现对数据据的联机,非阻塞的热备份,不会影响其余进程对数据库的读写操做。(参考指令:mysqldump -uroot --password=123 --single-transaction --flush-logs --master-data=2 --all-databases --delete-master-logs > d:/mysql5.0/full_%date:~0,10%_1500_PM.sql)
Ø 第三,使用flush logs指令刷新建立新的二进制日志。能够经过mysqladmin flush logs或者flush logs语句实现。最方便有效的方法是将它作成批处理文件,而后让操做系统按期执行。
Ø
使用mysql < *.sql
进行彻底备份的恢复。
Ø 使用mysqlbinlog logs-bin.[0-9]* | mysql进行增量备份的恢复。通常的,假设咱们周日下午三点进行了彻底备份并生成备份文件full_backup_20100415_3_PM.sql,周一周二中午一点进行了两次增量备份,分别生成增量备份文件inc_backup_1_PM.0007和inc_backup_1_PM.0008,周三上午10:00数据库发生崩溃,须要进行数据库恢复,此时正在记录的二进制日志为inc_backup_1_PM.0009,咱们还须要恢复其中记录的操做。具体的恢复操做为:
mysql < full_backup_20100415_3_PM.sql
mysqlbinlog inc_backup_1_PM.0007 inc_backup_1_PM.0008 inc_backup_1_PM.0009
u 具体应用(结合T8项目)
根据上述分析,咱们在T8项目使用MySQL增量备份,也须要三个步骤:
Ø 首选修改MySQL启动配置文件my.cnf,在其中的mysqld项中增长log-bin选项,从新启动MySQL 服务器以开启二进制日志功能,在生成文件/usr/data/mysql/ t8server-bin.index和t8server-bin..000001。如图所示:
Ø 编写彻底备份可执行文件脚本:
Ø 编写增量备份可执行文件脚本:
Ø 执行full_backup_20100417_1_pm,生成/usr/data/mysql/full_backup_20100417_1_pm. sql文件。
Ø 执行inc_backup_1_pm,生成/usr/data/mysql/t8server-bin..000002。
其中full_backup_20100417_1_pm. sql和t8server-bin..000002分别是彻底备份和增量备份文件。
要进行备份文件的恢复,只需执行命令:
u 总结
MySQL提供了很方便的彻底+增量备份实现方法,咱们只需调用系统内置的方法或者做出一些细微的配置就能够对MySQL数据库进行备份和恢复。对于MyISAM数据库和InnoDB数据库,均可以经过mysqldump实现数据库的彻底逻辑备份,经过启动二进制日志(binary logs),能够记录一个时间段内对数据库的全部可能更新的操做,从而经过flush logs建立新的日志而实现增量备份。
MySQL也提供了很是方便的恢复方法,因为mysqldump的输出结果为可执行的.sql文件,咱们能够直接运行该文件实现对彻底备份的恢复。而后经过mysqlbinlog命令恢复崩溃以前的二进制日志序列,就能够将数据库恢复至崩溃前的状态。