MySQL学习笔记之七:数据的备份和恢复

  我们知道,数据是一个企业IT架构的核心,为了防止因某些意外原因造成数据遗失或其它一些特殊目的,在平时对数据做好备份尤其重要。


一、为什么要备份

  1、灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作等

  2、审计:有时需要知道数据在过去某个时间点是什么样的

  3、测试:一个最简单的其于实际数据来测试的方法是,定期用最新的生产环境数据更新测试服务器,只要把备份文件还原到测试服务器即可


二、备份和恢复需要注意的要点

  1、可容忍丢失多少数据

  2、恢复需要在多长时间内完成

  3、需要恢复什么


三、备份类型:

  1、完全备份和部分备份

      部分备份:仅备份其中的一张表或多张表;

  2、完全备份,增量备份,差异备份

      增量备份:针对任意类型的上次备份后所有修改做的备份

      差异备份:对上次完全备份后所有改变部分而做的备份

      例如,每周日做一次完全备份,周一对自周日以来的所有改变做一次备份,在周二,就有两种选择:备份自周日以来的所有改变(差异),或只备份自周一后的所有改变(增量)。

  3、热备份、温备份和冷备份

      热备份:在线备份,读写操作不受影响;【innodb MVCC】

      温备份:在线备份,读操作可继续进行,但写操作不允许;

      冷备份:离线备份,数据库服务器离线,备份期间不能为业务提供读写服务;

      InnoDB支持热备,MyISAM只能支持到温备

  4、物理备份和逻辑备份

      物理备份:直接复制原始文件的备份,其恢复速度比逻辑备份快很多

        优点:

      逻辑备份:从数据库中“导出”数据另存(为文本文件)而进行的备份;

        优点:

          ①与存储引擎无关,因为是从mysql服务器中提取数据而生成,所以消除了底层数据存储的不同

          ②可通过mysqldump实现灵活的备份定义

          ③可用文本处理工具(如sed,awk)对导出的文本文件进行二次加工;

          ④恢复过程简单,直接导入mysql程序即可

          ⑤可通过网络实现备份和恢复

        缺点:备份文件可能比原文件大,压缩可解决此问题;无法保证恢复后的数据与原来完全相同;从逻辑备份中恢复需要mysql加载和解释语句,转化为存储格式,并重建索引,所以这些都很慢


四、规则备份时需要考虑的因素:

     持锁的时长,备份过程时长,备份负载,恢复过程时长


五、备份什么

     数据、额外的数据(二进制日志和InnoDB的事务日志)、代码(存储过程和存储函数、触发器、事件调度器等)、服务器配置文件


六、设计备份方案:完全备份+增量备份;


七、备份工具

     mysqldump:逻辑备份工具,适用于所有存储引擎,温备;完全备份,部分备份;对InnoDB存储引擎支持热备(利用MVCC机制实现),但不实用;

     cp, tar,rsync等文件系统工具:物理备份工具,适用于所有存储引擎;冷备;完全备份,部分备份;

     lvm2的快照:几乎热备;借助于文件系统工具实现物理备份;

     Xtrabackup:由percona提供的mysql数据库备份工具,是一款开源的能够对innodb和xtradb数据库进行热备的工具     

     mysqlhotcopy:几乎冷备;仅适用于MyISAM存储引擎;


八、备份方式及备份工具的选择:

 1、逻辑备份

   ⑴逻辑备份工具:mysqldump(常用), mydumper, phpMyAdmin       

   ⑵常用备份方式:mysqldump+binlog

       用mysqldump做完全备份,通过mysqlbinlog导出增加的二进制日志实现增量备份;

       例如:

         mysqldump --lock-all-tables --all-dabases --flush logs -u bkpuser -h 192.168.30.10 > /backup/allbac-`date +%F`.sql  #完全备份

         mysqlbinlog /mydata/data/mysql-bin.000003 > /backup/incre-`date +%F`.sql  #增量备份

   ⑶mysqldump:逻辑备份工具,适用于所有存储引擎,温备;完全备份,部分备份;对InnoDB存储引擎支持热备(利用MVCC机制实现),但不实用;

    mysqldump将MySQL服务器中的数据库以标准的sql语言的方式导出,并保存到文件中。它是一个客户端工具,通过mysql协议连接至mysqld.

    ①三种用法:

       mysqldump [options] db_name [tbl_name ...]:备份单个库,或库中的一个或多个表

       mysqldump [options] --databases db_name ...:备份一个或多个库

       mysqldump [options] --all-databases:备份所有库

    ②mysqldump db_name和mysqldump --databases db_name这两种用法的区别:

       后者会在每个新数据库前的输出中插入CREATE DATABASE IF NOT EXISTS db_name和USE db_name,而前者不会,因此,如果是用前一种方式备份的,在恢复之前需要手动创建库

    ③常用选项:

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

       -B, --databases db_name1 db_name2 ...:备份指定的数据库       

       -x, --lock-all-tables:锁定所有表

       -l, --lock-tables:当备份多个数据库时,--lock-tables分别为每个数据库锁定表。因此,该选项不能保证备份文件中的表在数据库之间的逻辑一致性。只建议在备份单张表时使用

       --single-transaction:启动一个大的单一事务实现备份;要备份的表的存储引擎必须都是innodb,该选项才有效。热备,通过innodb的MVCC机制实现

       --tables:覆盖---database或-B选项。选项后面的所有参量被看作表名

         例:mysqldump --lock-all-tables --databases testdb --tables students

       -C, --compress:压缩传输,会增加CPU负载

       -u,--user:缺省为root

       -h, --host:缺省为localhost

       -p, --password

    ④其它选项:

       -F, --flush-logs:锁定表之后滚动日志,此选项要求RELOAD权限;建议使用该选项,方便做增量备份。

       -E, --events:备份指定库的事件调度器;

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

       --triggers:备份触发器

       --master-data[=#]: 将备份那刻的二进制文件事件所处的位置记录于备份文件中

          1:记录CHANGE MASTER TO语句;此语句未被注释;

          2:记录为注释语句;


 2、物理备份

   ⑴xtrabackup:对InnoDB支持热备,完全备份和增量备份;对MyISAM引擎支持温备,完全备份

   ⑵使用cp, tar,rsync等文件系统工具直接复制文件:适用于所有存储引擎;冷备;完全备份,部分备份;

   ⑶lvm2快照:几乎热备,借助于文件系统工具实现物理备份;前提是原始数据要位于逻辑卷上

      完全备份:

        ①请求锁定所有表:

           mysql> FLUSH TABLES WITH READ LOCK;

        ②记录二进制日志文件及事件位置或者滚动日志

           mysql> SHOW MASTER STATUS;

           或mysql -e 'show master status' > /backup/pos

           或mysql > FLUSH LOGS;

        ③创建快照:

           lvcreate -L SIZE -s -p r -n NAME /dev/VG_NAME/LV_NAME

        ④释放锁:

           mysql> UNLOCK TABLES;

        ⑤挂载快照卷,复制数据进行备份;

           cp, rsync, tar等命令复制数据

        ⑥备份完成之后删除快照卷

      增量备份:使用mysqlbinlog导出增加的二进制日志


九、Xtrabackup

  xtrabackup是由percona提供的mysql数据库备份工具,是一款开源的能够对innodb和xtradb数据库进行热备的工具。

 1、特点:

   ①备份过程快速、可靠;

   ②备份过程不会打断正在执行的事务;

   ③能够基于压缩等功能节约磁盘空间和流量;

   ④自动实现备份检验;

   ④还原速度快;

 2、安装:其最新版的软件可从 http://www.percona.com/software/percona-xtrabackup/ 获取

 3、备份的实现

   ⑴完全备份(注意:xtrabackup不会备份二进制文件)

       innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR

       使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中。

       在备份的同时,innobackupex还会在备份目录中创建如下文件:

         (1)xtrabackup_checkpoints ―― 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;


每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。


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


【(3)xtrabackup_binlog_pos_innodb ―― 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。】


【(4)xtrabackup_binary ―― 备份中用到的xtrabackup的可执行文件;】


(5)backup-my.cnf ―― 备份命令用到的配置选项信息;


在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。


   ⑵准备(prepare)一个完全备份

      一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

      innobakupex命令的--apply-log选项可用于实现上述功能。如下面的命令:

        # innobackupex --apply-log  /path/to/BACKUP-DIR

如果执行正确,其最后输出的几行信息通常如下:

xtrabackup: starting shutdown with innodb_fast_shutdown = 1

120407  9:01:36  InnoDB: Starting shutdown...

120407  9:01:40  InnoDB: Shutdown completed; log sequence number 92036620

120407 09:01:40  innobackupex: completed OK!


在实现“准备”的过程中,innobackupex通常还可以使用--use-memory选项来指定其可以使用的内存的大小,默认通常为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高其完成速度。



3、从一个完全备份中恢复数据    【注意:数据恢复完毕后要做一次完全备份】


注意:恢复不用启动MySQL


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


# innobackupex --copy-back  /path/to/BACKUP-DIR

如果执行正确,其输出信息的最后几行通常如下:

innobackupex: Starting to copy InnoDB log files

innobackupex: in '/backup/2012-04-07_08-17-03'

innobackupex: back to original InnoDB log directory '/mydata/data'

innobackupex: Finished copying back files.


120407 09:36:10  innobackupex: completed OK!


请确保如上信息的最行一行出现“innobackupex: completed OK!”。


当数据恢复至DATADIR目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysqld之前还需要事先修改数据文件的属主和属组。如:


# chown -R  mysql:mysql  /mydata/data/



   ⑵使用innobackupex进行增量备份   【不支持对myisam做热备和增量备份,只能支持到温备和完全备份级别】

      每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。

      # innobackupex --incremental /backup --incremental-basedir=DIR

     --incremental-basedir表示基于哪个备份目录做增量备份,第一次增量备份应指向完全备份目录,后续增量备份应指向上一次的增量备份目录

     此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据



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


“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:

(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。

(2)基于所有的备份将未提交的事务进行“回滚”。


于是,操作就变成了:

# innobackupex --apply-log --redo-only BASE-DIR   【-redo-only表示只准提交】


接着执行:

# 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指的是第二次增量备份的目录,其它依次类推,即如果有多次增量备份,每一次都要执行如上操作;


5、Xtrabackup的“流”及“备份压缩”功能


Xtrabackup对备份的数据文件支持“流”功能,即可以将备份的数据通过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。要使用此功能,仅需要使用--stream选项即可。如:


# innobackupex --stream=tar  /backup | gzip > /backup/`date +%F_%H-%M-%S`.tar.gz


甚至也可以使用类似如下命令将数据备份至其它服务器:

# innobackupex --stream=tar  /backup | ssh [email protected]  "cat -  > /backups/`date +%F_%H-%M-%S`.tar" 


此外,在执行本地备份时,还可以使用--parallel选项对多个文件进行并行复制。此选项用于指定在复制时启动的线程数目。当然,在实际进行备份时要利用此功能的便利性,也需要启用innodb_file_per_table选项或共享的表空间通过innodb_data_file_path选项存储在多个ibdata文件中。对某一数据库的多个文件的复制无法利用到此功能。其简单使用方法如下:

# innobackupex --parallel  /path/to/backup


同时,innobackupex备份的数据文件也可以存储至远程主机,这可以使用--remote-host选项来实现:

# innobackupex [email protected]  /path/IN/REMOTE/HOST/to/backup

 



6、导入或导出单张表


默认情况下,InnoDB表不能通过直接复制表文件的方式在mysql服务器之间进行移植,即便使用了innodb_file_per_table选项。而使用Xtrabackup工具可以实现此种功能,不过,此时需要“导出”表的mysql服务器启用了innodb_file_per_table选项(严格来说,是要“导出”的表在其创建之前,mysql服务器就启用了innodb_file_per_table选项),并且“导入”表的服务器同时启用了innodb_file_per_table和innodb_expand_import选项。


(1)“导出”表

导出表是在备份的prepare阶段进行的,因此,一旦完全备份完成,就可以在prepare过程中通过--export选项将某表导出了:

# innobackupex --apply-log --export /path/to/backup


此命令会为每个innodb表的表空间创建一个以.exp结尾的文件,这些以.exp结尾的文件则可以用于导入至其它服务器。


(2)“导入”表

要在mysql服务器上导入来自于其它服务器的某innodb表,需要先在当前服务器上创建一个跟原表表结构一致的表,而后才能实现将表导入:

mysql> CREATE TABLE mytable (...)  ENGINE=InnoDB;


然后将此表的表空间删除:

mysql> ALTER TABLE mydatabase.mytable  DISCARD TABLESPACE;


接下来,将来自于“导出”表的服务器的mytable表的mytable.ibd和mytable.exp文件复制到当前服务器的数据目录,然后使用如下命令将其“导入”:

【chown mysql.mysql mytable.ibd mytable.exp】

mysql> ALTER TABLE mydatabase.mytable  IMPORT TABLESPACE;





7、使用Xtrabackup对数据库进行部分备份


Xtrabackup也可以实现部分备份,即只备份某个或某些指定的数据库或某数据库中的某个或某些表。但要使用此功能,必须启用innodb_file_per_table选项,即每张表保存为一个独立的文件。同时,其也不支持--stream选项,即不支持将数据通过管道传输给其它程序进行处理。


此外,还原部分备份跟还原全部数据的备份也有所不同,即你不能通过简单地将prepared的部分备份使用--copy-back选项直接复制回数据目录,而是要通过导入表的方向来实现还原。当然,有些情况下,部分备份也可以直接通过--copy-back进行还原,但这种方式还原而来的数据多数会产生数据不一致的问题,因此,无论如何不推荐使用这种方式。


(1)创建部分备份


创建部分备份的方式有三种:正则表达式(--include), 枚举表文件(--tables-file)和列出要备份的数据库(--databases)。


(a)使用--include

使用--include时,要求为其指定要备份的表的完整名称,即形如databasename.tablename,如:

# innobackupex --include='^mageedu[.]tb1'  /path/to/backup


(b)使用--tables-file

此选项的参数需要是一个文件名,此文件中每行包含一个要备份的表的完整名称;如:

# echo -e 'mageedu.tb1\nmageedu.tb2' > /tmp/tables.txt

# innobackupex --tables-file=/tmp/tables.txt  /path/to/backup


(c)使用--databases

此选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;同时,在指定某数据库时,也可以只指定其中的某张表。此外,此选项也可以接受一个文件为参数,文件中每一行为一个要备份的对象。如:

# innobackupex --databases="mageedu testdb"  /path/to/backup


(2)整理(preparing)部分备份

prepare部分备份的过程类似于导出表的过程,要使用--export选项进行:

# innobackupex --apply-log --export  /pat/to/partial/backup


此命令执行过程中,innobackupex会调用xtrabackup命令从数据字典中移除缺失的表,因此,会显示出许多关于“表不存在”类的警告信息。同时,也会显示出为备份文件中存在的表创建.exp文件的相关信息。


(3)还原部分备份

还原部分备份的过程跟导入表的过程相同。当然,也可以通过直接复制prepared状态的备份直接至数据目录中实现还原,不要此时要求数据目录处于一致状态。




十二、注意事项

  ⑴将数据和二进制文件放置于不同的设备;二进制日志也应该周期性地备份;

  ⑵将数据和备份分开存放,建议不在同一设备、同一主机、同一机房、同一地域;

  ⑶每次灾难恢复后都应该立即做一次完全备份;

  ⑷备份后的数据应该周期性地做还原测试;


十三、从备份中恢复应该遵循的步骤

  ①停止MySQL服务器;

  ②记录服务器配置和文件权限;

  ③将备份恢复到MySQL数据目录;此步骤依赖具体的备份工具;

  ④改变配置和文件权限;

  ⑤以限制方式启动MySQL服务器:比如通过网络访问;

      [mysqld]

      skip-networking 

      socket=/tmp/mysql-recovery.sock

  ⑥载入额外的逻辑备份;而检查和重放二进制日志;

  ⑦检查已经还原的数据;

  ⑧以完全访问模式重启服务器;


你可能感兴趣的:(mysql)