MySQL的备份和恢复


1、备份的概述


通常来说备份数据库的方法一般都是冷备和热备以及温备,那么下面来说说这三种备份的区别。


按备份时服务器是否在线来划分,备份可分为:

  1. 热备份:数据库在线同时服务正常运行,读写正常,此时进行的备份(非常不安全,容易造成数据不一致)

  2. 温备份:数据库服务正常运行,但数据只能读不能写,此时进行的备份(较安全)

  3. 冷备份:服务器关闭,读写关闭,此时进行的备份(最安全,但最不可行)

根据备份的内容来划分的话,备份可分为:

  1. 逻辑备份:支持跨平台,备份的是SQL语句,以文本的形式存储,比较占用空间,但是可以使用压缩的方式来存储。

  2. 物理备份:也就是通常说的直接拷贝数据文件,相对逻辑备份速度较快。

根据要备份的数据范围,可分为:

  1. 完全备份:备份整个数据库。

  2. 差异备份:自上次完全备份以来改变的所有内容。

  3. 增量备份:基于上次完全备份或者增量备份,所有改变的内容。

2、备份内容

  • 二进制日志

  • mysqld的主配置文件

  • OS相关的配置文件

  • 存储过程、存储函数、触发器等

  • 数据

备份策略:一般都是完全备份+增量或者差异备份,最后再加上二进制日志文件,所谓二进制日志,其记录了对整个数据库的操作,就算在没有备份的情况下,如果二进制日志是完整的,也可以完全恢复过来,所以备份二进制日志尤为重要,通常情况下二进制日志需要单独存放。

3、备份工具

  1. mysqldump:mysql数据库自带的备份工具,通常用于逻辑备份,InnoDB热备、MyISAM温备,备份和恢复较慢。

  2. 基于lvm快照:利用lvm的快照功能实现对mysql数据库进行物理备份,接近于热备的工具,备份和恢复较快。

  3. xtrabackup:能够对InnoDB和xtradb数据库进行热备,备份过程可靠,快速,能够基于压缩等功能,支持自动备份校验,还原速度快,功能非常强大。

  4. mysqlhotcopy:只能备份MyIsam引擎,是冷备份。

  5. 基于二进制日志

2、备份和恢复过程

下面将演示如何使用以上几种方法来备份和恢复数据库的。

  • 基于mysqldump工具

mysqldump是MySQL的一个客户端工具,通常可以备份整个服务器,单个或部分数据库,单个或部分表,表中某些行,存储过程,存储函数,触发器,而且还支持自动记录备份时的二进制日志文件及相应position。

常用于备份的几个选项:

-u:指定用户

-p:指定密码

-h:指定远程或本地主机

-B,--databases dbname dbname 指定需要备份的数据库

--lock-all-tables 备份时锁定数据库中的所有表

--lock-table 备份时锁定单张表(不太建议使用)

--master-data[=0,1,2]备份的时候同时导出二进制日志文件和位置;如果为1,则把信息保存为CHANGE MASTER语句;如果n为2,则把信息保存为注释掉的CHANGE MASTER语句。

-A,--all-databases 备份所有的数据库

--events 备份EVENT的相关信息

--routines 将存储过程和存储函数定义备份

--single-transaction: 基于此选项能实现热备InnoDB表;由此,不需要同时使用--lock-all-tables

-R, --routines: 备份存储过程和存储函数

备份过程

mysql的备份和恢复_数据库服务

mysql的备份和恢复_服务器_02

mysql的备份和恢复_配置文件_03

使用上述一条命令,直接完成对整个数据库的备份,可以使用cat命令打开备份文件,记录备份时候二进制日志文件结束的位置,如果二进制日志文件单独存放的话,需要单独备份。


还原过程

模拟数据库崩溃,删整个除数据库目录。

mysql的备份和恢复_配置文件_04

恢复数据库,首先需要初始化数据库,然后将备份的数据库导入到现在的数据库中。

mysql的备份和恢复_服务器_05

启动数据库,还原数据库。

mysql的备份和恢复_数据库服务_06

注意:还原数据库之前,关闭记录二进制日志的功能,待还原操作之后,重新打开记录二进制日志的功能,backup目录必须mysql用户和组对其有读写的权限,要不然会报错。

验证数据库是否还原

mysql的备份和恢复_服务器_07

到此,数据库还原完成。



  • 基于LVM快照

使用lvm快照的功能对数据库进行备份,接近于热备的物理备份,备份和还原速度快。

备份过程

在LVM备份时,需要注意事物日志和数据文件必须要在同一个LV上。

数据库备份之前的状态

mysql的备份和恢复_配置文件_08

在执行备份之前,需要对数据库施加一个全局的读锁,待这个过程完成,并对当前的二进制日志进行滚动操作,而后立即对该数据库所在的lvm卷,进行快照功能。

mysql的备份和恢复_配置文件_09

lvm快照的创建,并且将快照中的数据库文件拷贝至一个目录。然后,释放数据库的全局读锁。

mysql的备份和恢复_二进制_10

mysql的备份和恢复_二进制_11

mysql的备份和恢复_服务器_12

至此备份过程就完成了。


恢复过程:

模拟数据库崩溃,删除整个数据库文件目录。

mysql的备份和恢复_服务器_13

将快照卷的数据拷贝到原数据库的目录,注意,此时不需要对mysql数据库进行初始化操作,但是拷贝过来的文件需要修改属组和属主的权限为mysql。

mysql的备份和恢复_二进制_14

mysql的备份和恢复_配置文件_15

至此数据恢复完毕。



  • 基于xtrabackup的备份

Xtrabackup特点:
  1. 备份过程快速、可靠。

  2. 支持innodb热和xtradb数据库热备

  3. 支持备份压缩

  4. 自动实现对备份的校验

一、安装Xtrabackup

其最新版的软件可从 http://www.percona.com/software/percona-xtrabackup/ 获得。本文基于Centos6.4的系统,

因此,直接下载相应版本的rpm包安装即可,这里不再演示其过程。

二、备份的实现

1、完全备份:

创建一个测试用的数据库zzc,并且创建了一张tb1表,表中有一条记录,过程就不演示了。

mysql的备份和恢复_配置文件_16

mysql的备份和恢复_二进制_17

mysql的备份和恢复_服务器_18

出现以上内容,表示备份成功,默认会在你所指定的目录下创建以当前时间为准的一个目录。

(1)xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和

LSN(日志序列号)范围信息;


(2)xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为

止二进制日志事件的位置。


(3)back—my.cnf——mysql备份时候使用的服务器参数


(4)xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position(此文件只有执行了准备操作后,才会出现,后面会说到)


mysql的备份和恢复_配置文件_19

mysql的备份和恢复_数据库服务_20


2、准备备份:

一般情况下,在完成完全备份后,数据尚不能用于恢复操作,因为备份数据中可能包含包含尚未提交的事务或已提交的事务还没有写入数据文件的事务,因为,此时数据文件仍处于不一致状态,此准备的操作,就是把尚未提交的事务回滚,将提交的事务同步至数据文件,使得数据文件处于一致状态。

在innobackupex命令中使用apply-log参数就能实现该过程。


mysql的备份和恢复_服务器_21

mysql的备份和恢复_服务器_22



在实现“准备”的过程中,innobackupex通常还可以使用--use-memory选项来指定其可以使用的内存的大小,默

认通常为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高其完成速度。


3、恢复数据

innobackupex命令的--copy-back选项用于执行恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。


模拟数据库崩溃,删除数据库目录文件,而后使用准备好的备份数据进行恢复操作。


mysql的备份和恢复_数据库服务_23

mysql的备份和恢复_数据库服务_24


最后修改文件的属组和属主,注意使用chown命令,一定需要加-R参数,要不然数据库启动会报错。

mysql的备份和恢复_配置文件_25

到此数据库已经恢复完成。

4、使用xtrabackupex进行增量备份

每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB


表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。


要实现增量备份,可以使用--incremental参数来实现。


innobackupex --user= --password= --incremental /backup --incremental-basedir=BASEDIR


其中,BASEDIR指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的


以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备时,--incremental-


basedir应该指向上一次的增量备份所在的目录。


需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份

增量备份:

基于上一次的完全备份,对此数据库进行了一些修改,添加了一张tb2表,插入两行数据,并对其进行增量备份。

mysql的备份和恢复_二进制_26

mysql的备份和恢复_二进制_27

mysql的备份和恢复_服务器_28

准备增量备份

准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:
(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。

(2)在备份中所有没有提交的事务将回滚。

首先执行

innobackupex --apply-log --redo-only BASE-DIR

第一个增量执行

innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1

第二个增量执行

innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

其中BASE-DIR为完全备份的目录,INCREMENTAL-DIR-1为第一次增量备份的目录,INCREMENTAL-DIR-2为第二增量备份

的目录,依次类推,如果有多个增量备份,都需要进行以上操作。

(1)首先对完全备份进行准备。

mysql的备份和恢复_配置文件_29

mysql的备份和恢复_配置文件_30

(2)对增量备份进行准备

mysql的备份和恢复_配置文件_31

mysql的备份和恢复_数据库服务_32

(3)最后将得到的完全备份数据,进行还原。

模拟数据库崩溃,删除数据库目录文件,然后对其进行恢复。

mysql的备份和恢复_数据库服务_33

mysql的备份和恢复_配置文件_34

最后,修改数据库目录的权限,启动数据库,查看数据库中的数据是否还原。

mysql的备份和恢复_数据库服务_35

mysql的备份和恢复_配置文件_36

至此数据库恢复完成。

  • 基于二进制日志

MySQL的二进制日志记录了从数据库启动以来,对数据库的所有操作,所以二进制日志对于我们来说还是尤为重要的,二进日志默认保存在数据库的数据目录中,名字为mysql-bin.00000X,每次重新启动一次mysql服务,该日志就会滚动一次,当然也可以手动滚动,如果当数据库没有进行备份的话,还可以从二进制日志中恢复过来,前提是,二进制日志是完整的。通常来说,二进制日志都是单独存放的,可以在mysql的主配置文件中来定义相关参数的。

在MySQL上专门提供了一个用于查看二进制日志文件的命令mysqlbinlog,可以根据自己的需要,可以定义查看从某个位置到某个位置的对数据库的一些修改操作。

比较常用的有以下几个参数,具体的用法可以使用帮助文档。

--start-position=#
--stop-position=#

下面就来演示如何使用二进制日志来恢复数据的

1、查看当前数据库使用的二进制日志

mysql的备份和恢复_二进制_37

可以看出来,当前数据使用的是mysql-bin.0000001这个二进制日志,位置是107,记住这个数字,后面恢复时候需要用到。

2、修改一些数据,使得二进制日志的位置往前走一点。

mysql的备份和恢复_二进制_38

3、查看当前二进制日志的状态

mysql的备份和恢复_配置文件_39

如果在此时误将tb3这张表删除了,而又没有备份,那么该如何恢复呢?

我们可以这样做,只需在二进制日志中把删除表之前的那条操作语句过滤掉,把删除语句之前的内容全部备份出来,然后再恢复就可以了。

mysql的备份和恢复_二进制_40

mysql的备份和恢复_配置文件_41

mysql的备份和恢复_配置文件_42

mysql的备份和恢复_数据库服务_43

最后只需要将tb3.sql这个文件导入数据库就完成对表的恢复。

mysql的备份和恢复_二进制_44

mysql的备份和恢复_服务器_45

至此,基于二进制日志文件的恢复完成。



以上内容仅属于我个人观点和理解,如有什么不足之处,还望各位博友批评指点。