首页 > 代码库 > MySQL备份和恢复

MySQL备份和恢复

在实际生产环境中,数据是至关重要的。如何将数据实现安全冗余,在出现意外或灾害时快速恢复数据是挽救一个公司的关键所在。那么,定期备份数据是一个基本的工作。

备份的类型:

  根据备份的数据量可分为:

    完全备份:备份整个数据集

    部分备份:备份部分数据集

    增量备份:仅备份最近一次完全备份或增量备份(如果存在的话)以来变化的数据

      缺点:由于可能存在多个增量,恢复时较麻烦

    差异备份:仅备份最近一次完全备份以来变化的数据

      缺点:数据量大的话,比较浪费磁盘空间

  根据备份的方式可分为:

    物理备份:直接复制数据文件进行备份

    逻辑备份:与存储引擎无关,从数据库中“导出”数据另存而进行的备份

  根据备份时数据的可用状态可分为:

    热备:备份时,数据可读可写

    温备:备份时,数据仅可读

    冷备:备份时,数据不可读写

备份时需要考虑的要点:

  ①能容忍最多丢失多少数据

  ②恢复数据需要的时长

  ③需要恢复哪些数据

  ④根据备份的数据量选择合适的工具

  ⑤mysql的二进制日志至关重要,一定要留存好以便实现基于时间点的还原

接下来将陈述一下基于mysqldump,xtrabackup进行数据备份和恢复。

  一、mysqldump

  是MySQL自带的适合所有存储引擎的逻辑备份工具,支持完全和部分备份,支持温备,对InnoDB支持热备

mysqldump [options] db_name [tb1_name,...] (不会自动创建数据库)
mysqldump [options] --databases db_name ...
mysqldump [options] --all-databases

  常用的选项:

-uUSERNAME  //备份时的用户
-pPASSWORD  //备份时用户的密码
-E,--events  //备份指定数据库相关的所有事件调度器
-R,--routines  //备份指定数据库相关的存储过程和存储函数
--[skip-]triggers  //(不)备份相关的触发器
--master-data[=#]
    1:记录为不被注释的CHANGE MASTER TO语句;
    2.记录为注释的CHANGE MASTER TO语句;(一般用2)
--flush-logs  //锁定表完成后,执行flush logs命令;

//温备的选项,先锁定备份库,再启动备份操作(MyISAM和InnoDB)
    --lock-all-tables  //锁定所有库的所有表(生产环境慎用)
    --lock-tables  //对某个单独数据库的所有表进行锁定
热备的选项
    --single-transaction  //启动一个巨大的事务

  二、xtrabackup

  是由Percona提供的支持对InnoDB做热备(物理备份)的工具,可实现完全备份、增量备份。  

  备份命令:xtrabackup

  推荐使用:innobackupex(对xtrabackup做了二次封装的perl script),相对简洁轻量;

  创建备份恢复的用户(基于最小权限)

MariaDB [(none)]> CREATE USER ‘backupuser‘@‘192.168.1.102‘ IDENTIFIED BY ‘backuppass‘;

MariaDB [(none)]> GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT ON *.* TO ‘backupuser‘@‘192.168.1.102‘;

MariaDB [(none)]> FLUSH PRIVILIGES;

  ①完全备份

innobackupex --user=DBUSE --password=DBUSEPASS /path/to/BACKUP-DIR/

  基于完全备份恢复前的整理操作:

innobackupex --apply-log /path/to/Backup-Dir(备份文件所在的目录)
//整理无误出现“Completed OK”后,可执行完全备份的恢复操作:
innobackupex --copy-back /path/to/Backup-Dir(整理后的备份文件目录)
//注意:执行innobackupex --copy-back命令时不需要启动mysql服务,停止之前配置好mysql的数据目录即可。恢复数据成功后不要忘记将数据文件的属主属组改为mysql

  ②增量备份

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

/*其中,BASEDIR指的是完全备份所在的目录。
    此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录已存放所有的增量备份数据。
    另外,执行过增量备份后再次执行时,其--incremental-basedir应该指向上一次的增量备份所在的目录

注意:增量备份仅能应用于InnoDB和XtraDB为存储引擎的表;对于MyISAM表而言,执行增量备份其实进行的是完全备份*/

  基于完全备份和增量备份恢复前的整理操作:

/*与完全备份恢复时整理操作的不同:
(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指的是第二次增量备份的目录,依此类推,如果有多个增量备份,每一次都要执行如上操作。

//整理无误后,执行恢复数据操作:
innobackupex --copy-back /path/to/Backup-Dir(整理后的备份文件目录)

 

    

  

MySQL备份和恢复