备份与恢复概述
根据备份的方法不同可以将备份分为:
- Hot Backup(热备)
- Cold Backup(冷备)
- Warm Backup(温备)
Hot Backup是指数据库运行中直接备份,对正在运行的数据库操作没有任何影响。这种方式在mysql叫做Online Backup(在线备份)。Cold Backup是指备份操作是在数据库停止的情况下。这种方式在mysql叫做Offline Backup(离线备份)。Warm Backup备份同样是在数据库运行中进行的,但是会对当前数据库操作有影响,如加一个全局读锁以保证备份数据的一致性。
按照备份后文件的内容,备份又可以分为:
- 逻辑备份
- 裸文件备份
在mysql中逻辑备份是指备份出的文件内容是可读的,一般是文本文件。内容一般是由一条条sql语句或表内实际数据组成。这种备份的好处是可以观察导出文件的内容,一般适用于数据库的升级、迁移等工作。缺点是要花费的时间往往比较长。
裸文件备份是指复制数据库的物理文件,既可以是在数据库运行中的复制,也可以是在数据库停止运行时直接的数据文件复制。这类备份的恢复时间往往比较逻辑备份短很多。
按照备份数据库的内容,备份又可以分为:
- 完全备份
- 增量备份
- 日志备份
完全备份是指对数据库进行一个完整的备份。增量备份是在上次备份的基础上,对更改的数据进行备份。日志备份主要针对mysql二进制日志的备份,通过一个完全备份进行二进制日志的重做(replay)来完成数据库的point-in-time的恢复工作。
对于innodb的备份,务必加上–signle-transaction的选项。
冷备
冷备的优点:
- 备份简单,只要复制相关文件就可以了
- 备份文件易于在不同操作系统,不同mysql版本上恢复
- 恢复相当简单,只需把恢复文件复制到指定位置即可
- 恢复速度快,不需要执行任何sql语句,也不需要重建索引
冷备的缺点有:
- innodb冷备的文件通常比逻辑文件大很多,因为表空间中存放着很多其他数据,如undo段,插入缓冲等信息
- 冷备并不总是可以轻易地跨平台。操作系统、mysql版本、文件大小写敏感和浮点数格式都会成为问题。
逻辑备份
- mysqldump
mysqldump语法如下:shell>mysqldump [argument] > file_name
如果想要备份所有数据库,可以使用–all-database选项:shell>mysqldump --all-database > dump.sql
如果要备份指定数据库,可以使用–database选项:shell>mysqldump --database db1 db2 db3 > dump.sql
如果要备份一个架构,可以使用如下语句:mysqldump --single-transaction test > test_backup.sql
以下列举一些mysqldump比较重要的参数:- –single-transaction:备份开始时,先执行START TRANSACTION命令,以此获得备份一致性。当前该参数只对innodb有效。启用该备份时,确保没有其他任何DDL语句执行,一致性读不能隔离DDL操作。
- –lock-tables(-l):备份中,依次锁住每个架构下的所有表。对于innodb不需要该参数,使用–single-transaction即可。
- –lock-all-tables(-x):备份过程中,对所有架构中的所有表上锁。
- –add-drop-database:在CREATE DATABASE前先运行DROP DATABASE。这个参数要和–all-database或者–database一起使用。
- –master-data [=value]:通过该参数产生的备份转存文件主要用来建立一个replication。value=1时,转存文件中记录CHANGE MASTER语句。value=2时,CHANGE MASTER语句被写出sql注释。默认value为空。
- –master-data会自动忽略–lock-tables选项。没用–single-transaction选项,则会自动使用–lock-all-tables
- –events(-E):备份事件调度器。
- –routines(-R):备份存储过程和函数。
- –triggers:备份触发器
- –hex-blob:将BINARY、VARBINARY、BLOG和BIT列类型备份为十六进制的格式。
- –tab=path(-T path):产生TAB分割的数据文件。
- –where=’where_condition’ (-w ‘where_condition’):导出给定条件的数据。
- SELECT…INTO OUTFILE
SELECT…INTO语句也是一种逻辑备份方法,更准确地说是导出一张表中的数据。 - 逻辑备份的恢复
通过mysqldump可以恢复数据库,但是有一个问题,mysqldump不能导出视图。所以用户需要在mysqldump备份完成之后导出视图的定义或备份视图定义的frm文件,并在恢复时进行导入。 - LOAD DATA INFILE
通过mysqldump-tab或通过SELECT…INTO OUTFILE导出的数据需要恢复可以通过LOAD DATA INFILE来进行导入。 - myslimport
myslimport是mysql提供的一个命令程序,本质上是LOAD DATA INFILE的命令接口,大多数选项和LOAD DATA INFILE语法相同。
和LOAD DATA INFILE不同的是,myslimport可以用来导入多张表。并通过–user-thread参数并发地导入不同的文件。
二进制日志备份与恢复
备份二进制日志文件前,可以通过FLUSH LOGS命令来生成一个新的二进制日志文件,再备份之前的二进制日志。恢复的话,通过mysqlbinlog即可。
热备
ibbackup
对于innodb备份工作原理如下:
1)记录备份开始时,innodb重做日志文件检查点的LSN
2)复制共享表空间文件以及独立表空间文件
3)记录复制完表空间文件后,innodb重做日志文件检查点的LSN
4)复制在备份时产生的重做日志
ibbackup优点如下:- 在线备份,不阻塞任何的sql语句
- 备份性能好,备份的实质是复制数据库文件和重做日志文件
- 支持压缩备份,通过选项,可以支持不同级别的压缩
- 跨平台支持,ibbackup可以运行在Linux、Windows以及主流的UNIX系统平台上。
ibbackup对innodb恢复步骤为:
- 恢复表空间文件
- 应用重做日志文件
XtraBackup
XtraBackup是免费开源的热备工具,实现了所有ibbackup的功能,并且扩展支持了真正的增量备份功能。XtraBackup实现增量备份
XtraBackup工作原理如下:
1)首选完成一个全备,并记录下此时检查点的LSN
2)再进行增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是就备份该页,同时记录当前检查点的LSN。
快照备份
mysql本身不支持快照功能,快照备份是指通过文件系统支持的快照功能对数据库进行备份。备份的前提是将所有数据库文件放在同一文件分区中,然后对该分区进行快照操作。
复制
复制的工作原理
复制(replication)是mysql提供的一种高可用高性能的解决方案,一般用来建立大型的应用。replication工作原理分以下3个步骤:
1)主服务器(master)把数据更改记录到二进制日志(binlog)中
2)从服务器(slave)把主服务器的二进制日志复制到自己的中继日志(relay log)中
3)从服务器重做中继日志中的日志,把更改应用到自己的数据库上,以达到数据的最终一致性。
复制的工作原理并不复杂,本质就是一个完全备份加上二进制日志备份的还原。不同的是这个二进制日志的还原操作基本上实时在进行中。注意复制是异步实时的。快照+复制的备份架构
复制可以用来作为备份,但功能不仅限于备份,主要功能如下:- 数据分布。由于mysql提供的复制并不需要很大的带宽要求,因此可以在不同的数据中心之间实现数据的复制
- 读取的负载平衡。通过建立多个从服务器,可以读取平均地分布到这些从服务器中,并减少主服务器压力。
- 数据库备份。复制对备份很有帮助,但是从服务器不是备份,不能完全代替备份
- 高可用性和故障转移。通过复制建立的从服务器有助于故障转移,减少故障的停机时间和恢复时间
快照+复制的备份架构如图所示:
