第八章 备份与恢复(学习笔记)
1. 备份
1.1 根据备份方法不同可以划分为:
- 热备(Hot Backup)
ibbackup是InnoDB存储引擎备份的首选方式,只不过是收费软件。其工作原理如下:
1) 记录备份开始时,InnoDB存储引擎重做日志文件检查点的LSN
2) 复制共享表空间文件以及独立表空间文件
3) 记录复制完表空间文件后,InnoDB存储引擎重做日志文件检查点的LSN
4) 复制在备份时产生的重做日志
ibbackup对InnoDB存储引擎表的恢复步骤为:
1) 恢复表空间文件
2) 应用重做日志文件
XtraBackup实现增量备份
XtraBackup是一款开源的备份工具,支持对于InnoDB存储引擎的增量备份,工作原理如下:
1) 完成一个全备,并记录下此时检查点的LSN
2) 在进行增量备份时,比较表空间中每个页的LSN是否大于上次备份的LSN,如果是则备份该页
- 冷备(Cold Backup)
需要备份MySQL数据库的frm文件,共享表空间文件,独立表空间文件(*.ibd),重做日志文件。定期备份MySQL数据库的配置文件my.cnf,这样有利于恢复的操作。
也需要做好远程异地备份,即容灾防范。
优点:
1. 备份简单,只需要复制相关文件即可
2. 备份文件易于在不同操作系统,不同MySQL版本上进行恢复
3. 恢复简单,只需要把文件恢复到指定位置即可
4. 恢复速度快,不需要执行SQL语句,也不需要重建索引
缺点:
1. InnoDB存储引擎冷备的文件通常比逻辑文件大很多,因为表空间中存放着很多其他数据,如undo段,插入缓冲等信息
2. 冷备不总是可以轻易跨平台。操作系统、MySQL版本、文件大小写敏感和浮点数格式都会成为问题
- 温备(Warm Backup)
备份同样在数据库运行中进行,但是会对当前数据库的操作有影响,如加一个全局读锁以保证备份数据的一致性
1.2 按照备份后文件的内容,可以分为:
- 逻辑备份
逻辑备份是指备份出来的文件内容是可读的,一般是文本文件。内容一般是由一条条SQL语句,或者表内实际数据组成。优点是可以观察导出文件的内容,一般适用于数据库的升级、迁移等工作。缺点是恢复所需要的时间往往较长。
1. mysqldump备份工具用来完成转存(dump)、数据库备份及不同数据库之间的移植,如从MySQL低版本数据库升级到MySQL高版本数据库,又或者从MySQL数据库移植到Oracle、Microsoft SQL Server数据库等。mysqldump语法如下:
mysqldump [arguments] >file_name
例如: mysqldump --all-databases > dump.sql / mysqldump --databases db1 db2 db3 > dump.sql / mysqldump --single-transaction(保证备份的一致性,仅对InnoDB存储引擎有效) --where='b>2' test a > a.sql (完成一张表的导出)
逻辑备份的恢复语句:
mysql -uroot -p <test_backup.sql
注: mysqldump不能导出视图,故而用mysqldump备份完数据库后,还需要导出视图的定义,或者备份视图定义的frm文件,并在恢复时进行导入,以保证mysqldump数据库的完全恢复
2. SELECT....INTO OUTFILE
该语句主要用于导出一张表中的数据。语法如下:
SELECT [column 1], [column 2] ...
INTO
OUTFILE 'file_name'
[{FIELDS | COLUMNS}
[TERMINATED BY 'string' ] //表示每个列的分隔符
[ [OPTIONALLY] ENCLOSED BY 'char' ] //表示字符串包含哪些字符
[ ESCAPED BY 'char'] // 转义符
]
[ LINES
[ STARTING BY 'string'] // 每行开始的字符
[ TERMINATED BY 'string' ] 每行的结束符
]
FROM TABLE WHERE....
没有指定任何FIELDS和LINES选项的默认设置如下:
FIELDS TERMINATED BY '\t' ENCLOSED BY ' ' ESCAPED '\\'
LINES TERMINATED BY '\n' STARTING BY ' '
对SELECT INTO OUTFILE 导出的数据进行恢复使用如下语句:
LOAD DATA INTO TABLE a IGNORE1 LINES INFILE '/home/mysql/a.txt/' (其他设置与导出类似)
- 裸文件备份
复制数据库的物理文件,既可以在数据库运行中复制(如ibbackup、xtrabackup这类工具),也可以在数据库停止运行时直接进行数据文件复制
1.3 按照备份数据库的内容来分,可以分为:
- 完全备份
对数据库进行完整的备份
- 增量备份
在上次完全备份的基础上,对更改的数据进行备份。(MySQL数据库没有实现基于LSN的增量备份功能,其通过二进制日志实现该功能,效率较低)
- 日志备份
对MySQL数据库二进制日志的备份,通过对一个完全备份进行二进制日志的重做(replay)来完成数据库的point-in-time的恢复工作。MySQL数据库复制(replication)的原理就是异步实时的将二进制日志重做传送并应用到从(slave/standby)数据库。推荐的二进制日志的服务器配置应该是:
[mysqld]
log-bin = mysql-bin
sync-binlog = 1
innodb_support_xa = 1
还原binlog.000001, 可以使用如下命令:
mysqlbinlog binlog.000001 | mysql -uroot -p test
1.4 快照备份
MySQL数据库本身并不支持快照功能,因此快照备份是指通过文件系统支持的快照功能对数据库进行备份。备份的前提是将所有数据库文件放在同一文件分区中,然后对该分区进行快照操作。支持快照功能的文件系统有GNU/Linux的逻辑管理器(Logical Volume Manager, LVM)。下图为LVM工作原理:

若干个磁盘分区连接为一个整块的卷组(Volume Group),形成一个存储池。管理员可以在卷组上任意创建逻辑卷,并进一步在逻辑卷上创建文件系统。
·LVM使用了写时复制(copy-on-write)技术来创建快照。当创建一个快照时,仅复制原始卷中数据的元数据(meta data),并不会有数据的物理操作,因此快照的创建过程是非常快的。
当快照创建完成,原始卷上有写操作时,快照会跟踪原始卷块的改变,将要改变的数据在改变之前复制到快照预留的空间里,即写时复制。对于快照的读取操作,如果读取的数据块是创建快照后没有修改过的,那么会将读操作直接重定向到原始卷上,如果要读取的是已经修改过的块,则将读取保存在快照中该块在原始卷上改变之前的数据。采用写时复制机制保证了读取快照时得到的数据与快照创建时一致。
2. 复制
2.1 复制
复制(replication)是MySQL数据库提供的一种高可用高性能的解决方案,一般用来建立大型的应用。工作原理分为三个步骤:
1)主服务器(master)把数据更改记录到二进制日志(binlog)中。
2)从服务器(slave)把主服务器的二进制日志复制到自己的中继日志(relay log)中。
3)从服务器重做中继日志中的日志,把更改应用到自己的数据库中,以达到数据的最终一致性。

2.2 快照+复制的备份架构
复制除了可以作为备份,还有如下主要功能:
- 数据分布 由于MySQL数据库提供的复制并不需要很大的带宽需求,因此可以在不同的数据中心之间实现数据的复制
- 读取的负载平衡 通过建立多个从服务器,可将读取平均地分布到这些从服务器中,并且减少了主服务器的压力。
- 数据库备份 复制对备份很有帮助,但是从服务器不是备份,不能完全替代备份
- 高可用性和故障转移 通过复制建立的从服务器有助于故障转移,减少故障的停机时间和恢复时间
通过对从服务器上的数据库所在分区进行快照,可以避免误操作对复制的影响。当发生主服务器上的误操作时,只需要将从服务器上的快照进行恢复,然后再根据二进制日志进行point-in-time的恢复即可


浙公网安备 33010602011771号