数据库的备份与恢复对数据库的安全起着至关重要的作用,虽然MySQL数据库可以采用replication和Cluster的方式保证数据的安全,但备份与恢复仍然是一种常规的安全策略。备份意味着把数据拷贝到备份设备上;而恢复意味着在必要的时候(如故障发生时)把数据拷贝到原来的存储位置,使丢失的数据重新产生。

相对于Oracle数据库,MySQL数据库的备份恢复工具使用起来很繁琐,用户不容易掌握;而且MySQL的官方文档很粗略,大家很难理解备份恢复的原理,很难掌握备份恢复工具的用法。本文撰写的目的是详细介绍这些内容,以起到抛砖引玉的作用;在此基础上,大家可以参考官方文档,尽快掌握MySQL数据库备份恢复的精髓。

由于备份恢复的内容较多,为避免读者产生厌倦、畏难的情绪,作者分两篇文章来介绍这些内容。本篇文章介绍备份恢复的基本概念,以及对MySQL所进行的配置;下篇文章介绍备份恢复的实现方法。

备份的类型

数据库备份的基本要求是尽量减少对用户访问的影响。为此,MySQL提供了三种备份方式:

hotbackup:也称为热备份、不一致的备份、ONLINE备份,即数据库处于打开状态时所进行的备份。这种备份针对那些采用InnoDB存储引擎的表

warmbackup:数据库处于打开状态时所进行的备份,但数据库是只读的。这种备份针对那些采用MyISAM引擎和其他的非InnoDB表

coldbackup:也称为冷备份、一致的备份、OFFLINE备份,即数据库处于关闭状态时所进行的备份。这种备份可针对任何表

由于InnoDB存储引擎遵守事务的ACID属性,所以管理员针对这种表可以采用热备份,以减少对用户访问的影响。在这种情况下,备份结果中的数据是不一致的,但MySQL数据库通过日志来保证数据的一致性。在此基础上,可以对数据进行完全备份和增量备份,以减少备份的数据量,缩短备份所需要的时间。完全备份指的是备份数据库中的所有数据,而增量备份只针对一段时间内有变化的数据。增量备份进一步分为以下两种类型:

differentialbackup:以最近一次full为基础,自从full备份以来,那些有变化的数据就是此次备份的内容

Incrementalbackup:以上次备份为基础,它的基础可能是full备份或者增量备份,在此之后有变化的数据就是此次备份的内容

管理员可根据数据库的运行情况,制定完善的备份策略,选择合适的时间窗口,安排完全备份或增量备份。一方面尽量减少备份过程对用户访问的影响,另一方面减少备份的数据量,缩短备份所需时间,此外还能够保证数据库得到完全恢复。

利用备份恢复工具对数据库进行备份,产生备份结果,仍然是文件。根据文件格式的不同,MySQL数据库的备份结果有两种形式:

image文件: 这是一个二进制文件,包括数据库中所有必要文件的备份

datadir目录的拷贝: 这是对datadir目录所进行的拷贝,结果也是目录,与数据库文件的目录层次相同

数据库中的日志

日志是对数据库中事务的执行情况所做的记录,最终将被写入日志文件。MySQL数据库采用快速提交机制,当用户提交事务时,相关日志被写入日志文件,但相关数据并不是立刻被写入数据文件。MySQL数据库有多种类型的日志,其中两种日志与数据库的恢复有关,是由事务的执行产生的,它们是redo log和binary log。

redolog位于变量datadir所指定的目录下,默认为两个文件,即ib_logfile0和ib_logfile1,大小均为48MB。mysqld服务器以循环方式把redo log写入这两个文件,一旦写满一个文件,即发生日志切换,把日志写入另一个文件。

redolog的功能是对数据库进行crash恢复。如果数据库服务器遭遇突然断电这类事故,当mysqld服务重新启动时,就要对数据库进行crash恢复。在此阶段,那些没有提交的事务被回滚;那些已经提交,而且数据已经被写入数据文件的事务不需要进行任何处理;而那些已经提交,但是相关数据还没有被写入数据文件的事务,需要被重新执行,以保证相关数据被写入数据文件,此后数据库才能够正常打开。这种日志是不能被禁止的。

binarylog默认位于变量datadir所指定的目录下,在8.0版本之前的数据库中,这种日志默认是没有开启的;而在8.0版本的数据库中,这种日志默认是开启的。

binarylog与备份恢复的关系如图1所示。一方面,数据库的备份需要一段时间,在此期间,那些被备份的数据是一致的,不再变化的;而实际上,数据库中的数据是不断变化的。这段时间内新产生的数据并不在备份结果中,而以后在利用这个备份对数据库进行恢复时,恢复的终点却是“结束备份”的那个时间点。显然,这段时间内新产生的数据是利用binary log重新产生,并被写入数据文件的,所以这段时间的binary log文件需要被一起备份。另一方面,数据库的备份一般是每天进行一次,此后数据库中同样有新的数据不断产生。从备份结束到故障发生的这段时间内新产生的数据并没有被备份,这些数据的恢复同样依靠binary log。需要注意的是,这段时间所产生的binary log也不在备份之中,所以这段时间的binary log文件需要通过其他方法完整地保留下来。当数据库发生故障时,我们利用数据库的备份,以及最后这段时间的binary log文件,就能对数据库进行完全恢复。

图1 binary log与备份恢复的关系

由此可见,为了对数据库进行热备份、完全备份和增量备份,以及对数据库进行完全恢复,首先需要对数据库开启binary log。在这里并不介绍相关的配置方法,大家可以参考MySQL的官方文档。

关于备份策略的问题

备份策略对数据库的备份与恢复起到非常重要的作用。备份策略即备份计划,用于指导以后的备份。一个好的备份策略能够把备份所需要的存储空间减到最小,把所需时间减到最少,同时把数据的损失减到最小。出于不同的考虑,不同的管理员会制定不同的备份策略。

图2是一个full备份+ Incremental备份的例子。管理员在周日对数据库进行full备份(在图中用字母F表示),在以后的每个工作日对数据库进行Incremental备份(在图中用字母I表示),这样以一周为周期,周而复始地对数据库进行备份。如果数据库出现故障,则需要对其进行恢复。这样的恢复从最近的一个full备份开始,依次利用full备份,以及其后的各个Incremental备份,直到把数据库恢复到最后一次备份的时间点,而最后一次备份到故障点之间的数据则依靠binary log进行恢复。

图2 full备份+ Incremental备份

图3是一个full备份+differential备份的例子。管理员在周日对数据库进行full备份(在图中用字母F表示),在以后的每个工作日对数据库进行differential备份(在图中用字母D表示),这样以一周为周期,周而复始地对数据库进行备份。

图3 full备份+differential备份

按照这个备份策略,如果数据库出现故障,首先利用周日的full备份进行恢复,然后利用最后一次differential备份,就能够把数据库恢复到最后一次备份的时间点。在此基础上,再利用最后一段时间的binary log进行恢复,直到把数据库恢复到最后的故障点。

备份所需要的用户及权限

在对数据库进行备份时,备份工具需要连接mysqld服务器,为此需要一个数据库用户。如果使用数据库管理员进行登录,完全可以实现数据库的备份,因为这个账号对数据库具有所有权限。出于安全考虑,一般都需要单独创建一个普通用户,并指定所需要的最小权限。以下是创建用户,并指定权限的命令序列。这里假设用户名称为bk_user,口令为Qaz_1234。

mysql> create userbk_user@'localhost' identified by 'Qaz_1234';

mysql> grant reload on *.* to'bk_user'@'localhost';

mysql>grantcreate,insert,drop,update on  mysql.backup_progress

to 'bk_user'@'localhost';

mysql> grantcreate,insert,select,drop,update on mysql.backup_history

to 'bk_user'@'localhost';

mysql> grant create,drop onmysql.backup_history_old to 'bk_user'@'localhost';

mysql> grant create,drop onmysql.backup_history_new to 'bk_user'@'localhost';

mysql> grant replicationclient on *.* to 'bk_user'@'localhost';

mysql> grant super on *.* to'bk_user'@'localhost';

mysql> grant process on *.*to 'bk_user'@'localhost';

备份恢复工具的基本用法

MySQL提供的备份恢复工具为 MySQL EnterpriseBackup。这个软件需要单独安装,其中所包含的可执行文件只有一个,即mysqlbackup,利用这个命令即可完成MySQL数据库的备份和恢复任务。需要强调的是,这个软件的版本需要与数据库软件的版本相匹配,否则会产生不可预知的后果。

mysqlbackup命令的选项很多,总体分为两类:一类用于指定与mysqld服务器的连接信息,另一类用于指定与备份恢复有关的选项。其中第一类选项主要包括以下几个:

-u name, --user=name 指定数据库用户的名称,备份恢复的任务都以这个用户身份进行,默认与当前的操作系统登录用户相同

-p, --password 指定登录用户的口令,可以在命令行中指定,也可以根据命令执行的提示进行输入

--host=name 指定mysqld服务器所在系统的IP地址,默认为127.0.0.1

--port=# 指定mysqld服务器的端口,默认为3306

--protocol=name 指定mysqlbackup连接mysqld服务器时所使用的协议,如TCP,SOCKET等

--socket=name 指定SOCKET文件的名称。如果mysqlbackup通过SOCKET连接mysqld服务器,需要读写SOCKET文件

由于mysqlbackup命令的选项众多,命令行格式很复杂,为避免命令书写错误,可以通过mysql客户端工具连接mysqld服务。如果连接成功,观察所用选项,然后把这些选项运用到mysqlbackup命令中。需要注意的是,在mysqlbackup命令中,大部分选项只有长格式,而没有短格式。

在mysqlbackup命令中,真正复杂的选项是第二类,读者不仅需要掌握每个选项的含义,还需要理解选项之间的关系。在下篇文章中,作者将通过具体的例子来讲解这些选项的用法。遗憾的是,官方文档仅仅对选项的含义进行了简单的介绍,而很少解释选项之间的关系。

刘宪军,男,1997年毕业于西北大学计算机科学系,获工学硕士学位。目前主要从事小型机、中间件、数据库、大数据的技术支持和培训工作。

历年出版的专著有:

《Oracle数据库备份、恢复与迁移》 机械工业出版社  2017年1月

《Oracle RAC 11g实战指南》 机械工业出版社  2011年1月

《Oracle 11g 数据库管理员指南》 机械工业出版社  2010年8月

《软件过程管理》 水利水电出版社  2004年

《UNIX系统管理教程》清华大学出版社  2002年

《Windows/Linux/UNIX综合组网技术》清华大学出版社  2002年

编辑:小恒

猜你喜欢