MySQL数据备份与恢复之Percona XtraBackup

一、Xtrabackup是什么?

   官方文档:https://www.percona.com/doc/percona-xtrabackup/2.4/intro.html

   Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。

   Xtrabackup有两个主要的工具:xtrabackup、innobackupex

    1、xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表

   2、innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的.innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的 同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢 复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。

 

二、Xtrabackup可以做什么?

   1、在线(热)备份整个库的InnoDB、 XtraDB表

   2、在xtrabackup的上一次整库备份基础上做增量备份(innodb only)以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)

   3、MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。

   4、Xtrabackup工具支持对InnoDB存储引擎的增量备份。

 

三、Xtrabackup版本及下载地址

最新版本:2.4.12

版本之间的区别:

   2.4专针对5.7开发,兼容5.6,5.5

   2.3针对5.6开发,兼容5.5

   2.2针对5.5开发

官网地址:https://www.percona.com/doc/percona-xtrabackup/2.4/index.html

 

四、Percona XtraBackup工作流程

官网地址https://www.percona.com/doc/percona-xtrabackup/2.4/how_xtrabackup_works.html

 

五、Xtrabackup 使用说明文档

Xtrabackup下载与安装

https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html

Xtrabackup增量备份与恢复

https://www.percona.com/doc/percona-xtrabackup/2.4/backup_scenarios/incremental_backup.html

Xtrabackup全量备份与恢复

https://www.percona.com/doc/percona-xtrabackup/2.4/backup_scenarios/full_backup.html

Xtrabackup参数选项及使用说明

https://www.percona.com/doc/percona-xtrabackup/LATEST/xtrabackup_bin/xbk_option_reference.html

 

六、Xtrabackup 安装与使用

  6.1、安装Xtrabackup      

  安装页面官网地址:https://www.percona.com/doc/percona-xtrabackup/LATEST/installation/yum_repo.html

  方式1、通过安装Percona存储库,安装Xtrabackup


   
   
   
   
  1. yum install http://www.percona.com/downloads/percona- release/redhat/ 0.1 -6/percona- release -0.1 -6.noarch.rpm
  2. #为了成功安装Percona XtraBackup libev包需要先安装。libev包可以从EPEL存储库安装 。
  3. yum install https://dl.fedoraproject.org/pub/epel/epel- release-latest -6.noarch.rpm
  4. yum install percona-xtrabackup -24
  5. #安装完毕后检测
  6. innobackupex --help

  方式2、使用下载的rpm软件包,安装XtraBackup


   
   
   
   
  1. 1、从下载页面下载适用于您的体系结构的所需系列的软件包,下载页面: https:/ /www.percona.com/downloads /XtraBackup/
  2. wget https:/ /www.percona.com/downloads /XtraBackup/Percona-XtraBackup- 2.4. 12/binary/redhat/ 6/x86_64/percona-xtrabackup- 24- 2.4. 12- 1.el6.x86_64.rpm
  3. #为了成功安装Percona XtraBackup libev包需要先安装。libev包可以从EPEL存储库安装 。
  4. yum install https:/ /dl.fedoraproject.org/pub /epel/epel-release-latest- 6.noarch.rpm
  5. yum localinstall percona-xtrabackup- 24- 2.4. 12- 1.el6.x86_64.rpm
  6. #安装完毕后检测
  7. innobackupex --help

 

  6.2、安装完毕后开始使用

  innobackupex详细参数: https://www.percona.com/doc/percona-xtrabackup/LATEST/innobackupex/innobackupex_option_reference.html

  使用前对 innobackupex一些关键参数做介绍:  


   
   
   
   
  1. --defaults-file #指定MySQL配置文件 ,如果不指定–defaults-file,默认值为/etc/my.cnf
  2. --user=root #备份操作用户名,一般都是root用户
  3. /mnt/backup/ #备份路径
  4. --socket=/tmp/mysql.sock #指定mysql.sock登录(可通过innobackupex --help查看)
  5. --parallel= 2 --throttle= 200 #并行个数,根据主机配置选择合适的,默认是1个,多个可以加快备份速度。
  6. 2>/mnt/backup/bak.log #备份日志,将备份过程中的输出信息重定向到bak.log
  7. --apply-log #在备份目录下生成一个xtrabackup_logfile事务日志文件, 此外,创建新的事务日志。 InnoDB配置从文件“backup-my.cnf”中读取。
  8. --redo-only #全备数据后对DB有增量更改,则必须执行此操作,在准备基本完全备份和合并除最后一个之外的所有增量备份时,应使用此选项

 

6.3、XtraBackup备份原理

       XtraBackup基于InnoDB的crash-recovery功能。它会复制innodb 的data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致。

      InnoDB维护了一个redo log,又称为 transaction log,事务日志,它包含了innodb数据的所有改动情况。当InnoDB启动的时候,它会先去检查data file和transaction log,并且会做二步操作:
      1.It applies committed transaction log entries to the data files
      2.it performs an undo operation on any transactions that modified data but did not commit.

    XtraBackup在备份的时候, 一页一页地复制innodb的数据,而且不锁定表,与此同时,XtraBackup还有另外一个线程监视着transactions log,一旦log发生变化,就把变化过的log pages复制走。为什么要急着复制走呢? 前几章的时候就提过这个问题,因为transactions log文件大小有限,写满之后,就会从头再开始写,所以新数据可能会覆盖到旧的数据。

    在prepare过程中,XtraBackup使用复制到的transactions log 对备份出来的innodb data file 进行crash recovery。

 

    6.3、使用XtraBackup备份数据时,关于文件权限的说明

       xtrabackup以read-write模式打开innodb的数据文件,然后对其进行复制。其实它不会修改此文件。也就是说,运行xtrabackup的用户,必须对innodb的数据文件具有读写权限。

       为什么要用rw模式呢?直接read模式不好么?因为xtrabackup采用了其内置的innodb库来打开文件,而innodb库打开文件的时候就是rw的。

 

七、Xtrabackup 全量备份与全量恢复

 备份单个或者多个库 --databases 用于指定要备份的数据库, 备份多个库使用方法: --databases="db_zone_9033 db_zone_9034" 用空格分开。


   
   
   
   
  1. innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --databases= "db_zone_9033 db_zone_9034" --parallel= 2 --throttle= 200 /data/tmp/ --socket=/tmp/mysql.sock
  2. # 查看备份后的数据
  3. [root@ 10.11 .11 .111 /data/tmp]$ ll 2018 -10 -25_23 -59 -39
  4. total 96136
  5. -rw-r-----. 1 root root 481 Oct 26 00: 00 backup-my.cnf
  6. drwxr-x---. 2 root root 4096 Oct 26 00: 00 db_zone_9033
  7. drwxr-x---. 2 root root 4096 Oct 26 00: 00 db_zone_9034
  8. -rw-r-----. 1 root root 79691776 Oct 25 23: 59 ibdata1
  9. -rw-r-----. 1 root root 77 Oct 26 00: 00 xtrabackup_binlog_info
  10. -rw-r-----. 1 root root 125 Oct 26 00: 00 xtrabackup_checkpoints
  11. -rw-r-----. 1 root root 673 Oct 26 00: 00 xtrabackup_info
  12. -rw-r-----. 1 root root 18716160 Oct 26 00: 00 xtrabackup_logfile

排除多个个库  --databases-exclude 根据名称排除数据库 ,使用方法:--databases-exclude="db_zone_battlereport_9037 db_zone_battlereport_9038" 用空格分开。

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --databases-exclude="db_zone_battlereport_9037 db_zone_battlereport_9038 db_zone_battlereport_9039 db_zone_battlereport_9040" --parallel=2 --throttle=200 /data/tmp/ --socket=/tmp/mysql.sock
   
   
   
   

 

  7.1、全量备份

  1.创建用于备份恢复的用户 mulong 并赋予权限


   
   
   
   
  1. mysql> create user mulong@' localhost' identified by '123456';
  2. mysql> grant reload, process, lock tables, replication client on *.* to mulong@ localhost;

  2.创建数据存放目录

  mkdir -p /data/db_backup/

  3.进行数据全备


   
   
   
   
  1. [root@szq ~] # /usr/bin/innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --parallel=2 --throttle=200 /data/db_backup/xtrabackup --socket=/tmp/mysql.sock
  2. #执行命令后输出:
  3. xtrabackup: recognized server arguments:
  4. xtrabackup: recognized client arguments:
  5. 180726 15:00:18 innobackupex: Starting the backup operation
  6. IMPORTANT: Please check that the backup run completes successfully.
  7. At the end of a successful backup run innobackupex
  8. prints "completed OK!".
  9. 180726 15:00:28 All tables unlocked
  10. 180726 15:00:28 Backup created in directory '/data/db_backup/xtrabackup/2018-03-28_17-33-41/'
  11. MySQL binlog position: filename 'master-bin.000008', position '191', GTID of the last change '5be531c0-3252-11e8-a5a9-000c2923f205:1-1079'
  12. 180726 15:00:28 [00] Writing /mnt/backup/2018-07-26_15-00-18/backup-my.cnf
  13. 180726 15:00:28 [00] ... done
  14. 180726 15:00:28 [00] Writing /mnt/backup/2018-07-26_15-00-18/xtrabackup_info
  15. 180726 15:00:28 [00] ... done
  16. xtrabackup: Transaction log of lsn (1090604498) to (1090604498) was copied.
  17. 180726 15:00:29 completed OK!
  18. 以上可以看到整个备份过程,说明备份成功!

  4.查看全备后生成的文件     /data/db_backup/xtrabackup/2018-03-28_17-33-41/


   
   
   
   
  1. [root@szq 2018-03-28_17-33-41]# ll /data/db_backup/xtrabackup/2018-03-28_17-33-41/
  2. total 131112
  3. -rw-r-----. 1 root root 481 Mar 28 17:33 backup-my.cnf
  4. -rw-r-----. 1 root root 12582912 Mar 28 17:38 ibdata1
  5. -rw-r-----. 1 root root 50331648 Mar 28 17:38 ib_logfile0
  6. -rw-r-----. 1 root root 50331648 Mar 28 17:38 ib_logfile1
  7. -rw-r-----. 1 root root 12582912 Mar 28 17:38 ibtmp1
  8. drwxr-x---. 2 root root 4096 Mar 28 17:38 incre1
  9. drwxr-x---. 2 root root 4096 Mar 28 17:38 mysql
  10. drwxr-x---. 2 root root 4096 Mar 28 17:38 performance_schema
  11. drwxr-x---. 2 root root 4096 Mar 28 17:38 test
  12. -rw-r-----. 1 root root 64 Mar 28 17:38 xtrabackup_binlog_info
  13. -rw-r--r--. 1 root root 23 Mar 28 17:38 xtrabackup_binlog_pos_innodb
  14. -rw-r-----. 1 root root 113 Mar 28 17:38 xtrabackup_checkpoints
  15. -rw-r-----. 1 root root 724 Mar 28 17:38 xtrabackup_info
  16. -rw-r-----. 1 root root 8388608 Mar 28 17:38 xtrabackup_logfile
  17. -rw-r--r--. 1 root root 1 Mar 28 17:38 xtrabackup_master_key_id
  18. 配置文件注释:
  19. (1) backup-my.cnf —— 备份命令用到的配置选项信息;
  20. (2) ibdata1 —— 备份的表空间文件;
  21. (3) xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件;
  22. (4) xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置;
  23. (5) xtrabackup_logfile —— 备份的重做日志文件。
  24. (6) xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;

 

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


   
   
   
   
  1. [root@szq 2018- 03- 28_17- 33- 41] # cat xtrabackup_checkpoints
  2. backup_type = full-prepared #可以看出是全备份
  3. from_lsn = 0 #记录了LSN,日志偏移量
  4. to_lsn = 1648181
  5. last_lsn = 1648181 # LSN号
  6. compact = 0
  7. recover_binlog_info = 0

 

  backup-my.cnf 备份命令用到的配置选项信息:


   
   
   
   
  1. [ root@szq 2018-03-28_17-33-41] # cat backup-my.cnf
  2. # This MySQL options file was generated by innobackupex.
  3. # The MySQL server
  4. [ mysqld]
  5. innodb_checksum_algorithm=innodb
  6. innodb_log_checksum_algorithm=innodb
  7. innodb_data_file_path=ibdata1: 12M:autoextend
  8. innodb_log_files_in_group= 2
  9. innodb_log_file_size= 50331648
  10. innodb_fast_checksum= false
  11. innodb_page_size= 16384
  12. innodb_log_block_size= 512
  13. innodb_undo_directory=.
  14. innodb_undo_tablespaces= 0
  15. server_id= 0
  16. redo_log_version= 0
  17. server_uuid= 6e843abf -3268 -11e8-a639 -000c2923f205
  18. master_key_id= 0

  

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


   
   
   
   
  1. [root@szq 2018-03-28_17-33-41]# cat xtrabackup_binlog_info
  2. master-bin .000001 2481 6 e843abf-3268-11e8-a639-000c2923f205 :1-6

 

  xtrabackup_info,记录备份的基本信息,uuid、备份命令、备份时间、binlog、LSN、以及其他加密压缩等信息:


   
   
   
   
  1. [root@szq 2018- 03- 28_17- 33- 41] # cat xtrabackup_info
  2. uuid = a102096b- 326b- 11e8-a639- 000c2923f205
  3. name =
  4. tool_name = innobackupex
  5. tool_command = --defaults-file= /usr/local /mysql/my.cnf --user=root -- socket= /tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir= /data/db_backup/incremental/ 2018- 03- 28_17- 34- 58/ --parallel= 2 --throttle= 200
  6. tool_version = 2.4. 12
  7. ibbackup_version = 2.4. 12
  8. server_version = 5.6. 17- log
  9. start_time = 2018- 03- 28 17: 37: 25
  10. end_time = 2018- 03- 28 17: 37: 27
  11. lock_time = 0
  12. binlog_pos = filename 'master-bin.000001', position '2481', GTID of the last change '6e843abf-3268-11e8-a639-000c2923f205:1-6'
  13. innodb_from_lsn = 1632332
  14. innodb_to_lsn = 1648181
  15. partial = N
  16. incremental = Y
  17. format = file
  18. compact = N
  19. compressed = N
  20. encrypted = N

 

  7.2、全量备份后,执行全量恢复

  1.关闭数据库并移除数据文件,创建新的数据库目录


   
   
   
   
  1. [root@szq 2018- 03- 28_17- 33- 41] # /usr/local/mysql/bin/mysqld_multi --defaults-file=/usr/local/mysql/my.cnf stop 1
  2. [root@szq 2018- 03- 28_17- 33- 41] # mv /data/mysql/ /data/mysql_bak/
  3. [root@szq 2018- 03- 28_17- 33- 41] # mkdir -p /data/mysql/  

  2.在全备目录上重放已提交的事务:


   
   
   
   
  1. innobackupex --defaults-file= /usr/local /mysql/my.cnf  --user=root -- socket= /tmp/mysql.sock --apply- log  -- redo-only /data/db_backup/xtrabackup/ 2018- 03- 28_17- 33- 41/
  2. 事务提交后:查看backup_type是否为 "log-applied"
  3. cat /data/db_backup/xtrabackup/ 2018- 03- 28_17- 33- 41/
  4.   backup_type = log-applied
  5.   from_lsn = 0
  6.   to_lsn = 2034824383639
  7.   last_lsn = 2034830345359
  8.   compact = 0
  9.   recover_binlog_info = 0

  3.用全备的数据文件 [/data/db_backup/xtrabackup/2018-03-28_17-33-41/] 来恢复数据 [若全备数据之后,数据有新的增删改查修改,那么就需要使用增量备份的方式去恢复数据,详见文章:7.3-7.4]


   
   
   
   
  1. [ root@szq db_backup]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --datadir=/ data/mysql --copy-back / data/db_backup/xtrabackup/ 2018 -03 -28_17 -33 -41/
  2. xtrabackup: recognized server arguments: --datadir=/ data/mysql
  3. xtrabackup: recognized client arguments: --datadir=/ data/mysql
  4. 180328 17: 14: 22 innobackupex: Starting the copy-back operation
  5. IMPORTANT: Please check that the copy-back run completes successfully.
  6. At the end of a successful copy-back run innobackupex
  7. prints "completed OK!".
  8. innobackupex version 2.4 .12 based on MySQL server 5.7 .19 Linux (x86_64) (revision id: 170eb8c)
  9. 180328 17: 14: 22 [ 01] Copying ib_logfile0 to / data/mysql/ib_logfile0
  10. 180328 17: 14: 23 [ 01] ...done
  11. 180328 17: 14: 23 [ 01] Copying ib_logfile1 to / data/mysql/ib_logfile1
  12. 180328 17: 14: 23 [ 01] ...done
  13. 180328 17: 14: 23 [ 01] Copying ibdata1 to / data/mysql/ibdata1
  14. 180328 17: 14: 23 [ 01] ...done
  15. 180328 17: 14: 23 [ 01] Copying ./mysql/time_zone.frm to / data/mysql/mysql/time_zone.frm
  16. 180328 17: 14: 23 [ 01] ...done
  17. 180328 17: 14: 23 [ 01] Copying ./mysql/general_log.frm to / data/mysql/mysql/general_log.frm
  18. 180328 17: 14: 23 [ 01] ...done
  19. 180328 17: 14: 23 [ 01] Copying ./mysql/time_zone_name.frm to / data/mysql/mysql/time_zone_name.frm
  20. 180328 17: 14: 23 [ 01] ...done
  21. 180328 17: 14: 23 [ 01] Copying ./mysql/help_topic.MYI to / data/mysql/mysql/help_topic.MYI
  22. 180328 17: 14: 24 [ 01] ...done
  23. 180328 17: 14: 24 [ 01] Copying ./performance_schema/events_statements_current.frm to / data/mysql/performance_schema/events_statements_current.frm
  24. 180328 17: 14: 24 [ 01] ...done
  25. 180328 17: 14: 24 [ 01] Copying ./performance_schema/events_statements_summary_by_host_by_event_name.frm to / data/mysql/performance_schema/events_statements_summary_by_host_by_event_name.frm
  26. 180328 17: 14: 24 [ 01] ...done
  27. 180328 17: 14: 24 [ 01] Copying ./performance_schema/setup_actors.frm to / data/mysql/performance_schema/setup_actors.frm
  28. 180328 17: 14: 24 [ 01] ...done
  29. 180328 17: 14: 24 [ 01] Copying ./performance_schema/socket_summary_by_event_name.frm to / data/mysql/performance_schema/socket_summary_by_event_name.frm
  30. 180328 17: 14: 24 [ 01] ...done
  31. 180328 17: 14: 24 [ 01] Copying ./performance_schema/events_statements_summary_by_account_by_event_name.frm to / data/mysql/performance_schema/events_statements_summary_by_account_by_event_name.frm
  32. 180328 17: 14: 24 [ 01] ...done
  33. 180328 17: 14: 24 [ 01] Copying ./test/db.opt to / data/mysql/test/db.opt
  34. 180328 17: 14: 24 [ 01] ...done
  35. 180328 17: 14: 24 [ 01] Copying ./xtrabackup_master_key_id to / data/mysql/xtrabackup_master_key_id
  36. 180328 17: 14: 24 [ 01] ...done
  37. 180328 17: 14: 24 [ 01] Copying ./ibtmp1 to / data/mysql/ibtmp1
  38. 180328 17: 14: 24 [ 01] ...done
  39. 180328 17: 14: 24 completed OK!
  40. # 这里看出是一个copy数据的过程!

  4.全备数据恢复后,授权数据库文件,并启动MySQL


   
   
   
   
  1. [root@szq db_backup] # chown -R mysql.mysql /data/mysql
  2. [root@szq db_backup] # /usr/local/mysql/bin/mysqld_multi --defaults-file=/usr/local/mysql/my.cnf start 1

  5.可以看到数据库和表均已恢复:


   
   
   
   
  1. mysql> show databases;
  2. +--------------------+
  3. | Database |
  4. +--------------------+
  5. | information_schema |
  6. | incre1 |
  7. | mysql |
  8. | performance_schema |
  9. | test |
  10. +--------------------+
  11. 5 rows in set ( 0. 00 sec)

 

  7.3、增量备份  7.3和7.4是一个整体

  增量备份与恢复,官网地址:https://www.percona.com/doc/percona-xtrabackup/2.4/howtos/recipes_ibkx_inc.html

  我们以之前做的全备文件为基准,在全备文件的基础上做增量备份:  全备文件  /data/db_backup/xtrabackup/2018-03-28_17-33-41

 

  增量备份1、新建一张表t_3party_server,不插入数据,作为增量备份1的标记


   
   
   
   
  1. mysql> use incre1;
  2. Database changed
  3. mysql> show tables;
  4. Empty set ( 0.00 sec)
  5. mysql> create table t_3party_server(
  6. -> app varchar( 64) NOT NULL,
  7. -> server varchar( 64) NOT NULL,
  8. -> division varchar( 64) NOT NULL,
  9. -> node varchar( 64) NOT NULL,
  10. -> port varchar( 64) NOT NULL,
  11. -> status int( 10) unsigned NOT NULL,
  12. -> PRIMARY KEY (app, server,division,node,port)
  13. -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  14. Query OK, 0 rows affected ( 0.02 sec)
  15. mysql> show tables;
  16. +------------------+
  17. | Tables_in_incre1 |
  18. +------------------+
  19. | t_3party_server |
  20. +------------------+
  21. 1 row in set ( 0.00 sec)
  22. mysql> select * from t_3party_server;
  23. 0 rows in set ( 0.00 sec)

  开始执行增量备份1的命令:


   
   
   
   
  1. 一、以全备目录为基础做增量备份
  2. --incremental 指定增量备份 1的目录
  3. --incremental-basedir=指定全量备份的目录
  4. innobackupex  --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir= /data/db_backup/xtrabackup/ 2018- 03- 28_17- 33- 41/ --parallel= 2 --throttle= 200
  5. backup_type = incrementa

 

  增量备份2、在表t_3party_server内插入三条数据,作为增量备份2的标记


   
   
   
   
  1. mysql> use incre1;
  2. Database changed
  3. mysql> show tables;
  4. +------------------+
  5. | Tables_in_incre1 |
  6. +------------------+
  7. | t_3party_server |
  8. +------------------+
  9. 1 row in set ( 0. 00 sec)
  10. mysql> insert into t_3party_server(app,server,division,node,port,status) values( 'MOBA', 'haproxy', 'haproxy-login', '10.117.16.242', '30021', '0');
  11. Query OK, 1 row affected ( 0. 01 sec)
  12. mysql> insert into t_3party_server(app,server,division,node,port,status) values( 'MOBA', 'haproxy', 'haproxy-match', '10.117.16.242', '30032', '0');
  13. Query OK, 1 row affected ( 0. 01 sec)
  14. mysql> insert into t_3party_server(app,server,division,node,port,status) values( 'MOBA', 'haproxy', 'haproxy-test', '10.117.16.242', '30035', '0');
  15. Query OK, 1 row affected ( 0. 01 sec)
  16. mysql> select * from t_3party_server;
  17. +------+---------+---------------+---------------+-------+--------+
  18. | app | server | division | node | port | status |
  19. +------+---------+---------------+---------------+-------+--------+
  20. | MOBA | haproxy | haproxy-login | 10.117.16.242 | 30021 | 0 |
  21. | MOBA | haproxy | haproxy-match | 10.117. 16.242 | 30032 | 0 |
  22. | MOBA | haproxy | haproxy-test | 10.117.16.242 | 30035 | 0 |
  23. +------+---------+---------------+---------------+-------+--------+
  24. 3 rows in set ( 0. 00 sec)

  开始执行增量备份2的命令:


   
   
   
   
  1. 二、增量备份 1次之后,再次增量备份 2的话,需要在增量备份 1目录的基础上做增量备份 2
  2. --incremental 指定增量备份 2的目录 (增量备份 1和增量备份 2的目录在同一父目录下)
  3. --incremental-basedir=指定增量备份 1的目录
  4. innobackupex  --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir= /data/db_backup/incremental/ 2018- 03- 28_17- 34- 58/ --parallel= 2 --throttle= 200

 

  7.4、增量备份恢复

  增量备份的恢复需要有3个步骤

  1. 准备全备数据 [增量备份的数据是已全备数据为基础的]。
  2. 恢复增量备份到完全备份 [增量备份数据与全备数据合并,合并到全备目录]。
  3. 对整体的完全备份进行恢复,回滚未提交的数据 [增量数据和全备数据合并后,在恢复数据]。

   
   
   
   
  1. 增量备份恢复全过程:
  2. 一、准备全备数据:
  3. /usr/bin/innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --parallel= 2 --throttle= 200 /data/db_backup/xtrabackup --socket= /tmp/mysql.sock
  4. 二、准备增量备份 1:在全备文件的基础上做增量备份,以全备文件为基础做增备 1
  5. --incremental 指定增量备份 1的目录
  6. --incremental-basedir=指定全备文件的目录
  7. innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir= /data/db_backup/xtrabackup/ 2018- 03- 28_17- 33- 41/ --parallel= 2 --throttle= 200
  8. backup_type = incrementa
  9. ######################################################################
  10. 小知识:增量备份 1次之后,再次增量备份 2的话,有两种方法:[方法二 见 2.1]
  11. 方法一:在在增量备份 1目录的基础上做增量备份 2 (那么数据恢复的时候,就需要先合并增量备份 1然后在合并增量备份 2)
  12. --incremental 指定增量备份 2的目录
  13. --incremental-basedir=指定增量备份 1的目录
  14. innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir= /data/db_backup/incremental/ 2018- 03- 28_17- 34- 58/ --parallel= 2 --throttle= 200
  15. 以增备 1为基础做增备 2,数据如何恢复?
  16. 先全量备份数据+增量备份 1数据合并,然后全量备份数据+增量备份 2数据合并,数据最终合并到全量备份目录内:
  17. --incremental-dir= 先指定增量备份 1的目录
  18. innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --apply-log -- redo-only /data/db_backup/xtrabackup/ 2018- 03- 28_17- 33- 41/ --incremental-dir= /data/db_backup/incremental/ 2018- 03- 28_17- 34- 58/
  19. --incremental-dir= 先指定增量备份 2的目录
  20. innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --apply-log -- redo-only /data/db_backup/xtrabackup/ 2018- 03- 28_17- 33- 41/ --incremental-dir= /data/db_backup/incremental/ 2018- 03- 28_17- 37- 25/
  21. ######################################################################
  22. 2.1、准备增量备份 2:在全备的基础上增备,已全备目录为基础做增备 2
  23. 备注:每次的增量备份,都可以以全量备份为基础做增量备份 1234 ~~~~
  24. --incremental 指定增量备份 2的目录
  25. --incremental-basedir=指定全备的目录
  26. innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir= /data/db_backup/xtrabackup/ 2018- 03- 28_17- 33- 41/ --parallel= 2 --throttle= 200
  27. backup_type = incrementa
  28. 备份完毕后,可以通过检查文件的LSN号,来确认增量备份文件的一致性:
  29. 全备文件的LSN: 0- 1732070
  30. [root@192. 168.200. 39 ]$ cat full/全量备份文件/xtrabackup_checkpoints
  31. backup_type = full-prepared
  32. from_lsn = 0
  33. to_lsn = 1732070
  34. last_lsn = 1732070
  35. compact = 0
  36. recover_binlog_info = 0
  37. 增量备份 1文件的LSN: 1702237- 1716671 #[以全备为基础做增量备份1,可以看到LSN为:1702237-1716671]
  38. [root@192. 168.200. 39 ]$ cat incre/增量备份文件 1/xtrabackup_checkpoints
  39. backup_type = incremental
  40. from_lsn = 1702237
  41. to_lsn = 1716671
  42. last_lsn = 1716671
  43. compact = 0
  44. recover_binlog_info = 0
  45. 增量备份 2文件的LSN: 1702237- 1732070 #[以全备为基础做增量备份2,可以看到LSN为:1702237-1732070]
  46. [root@192. 168.200. 39 ]$ cat incre/增量备份文件 2/xtrabackup_checkpoints
  47. backup_type = incremental
  48. from_lsn = 1702237
  49. to_lsn = 1732070
  50. last_lsn = 1732070
  51. compact = 0
  52. recover_binlog_info = 0
  53. 优点:数据恢复的时候,直接全备数据+最后一次增量备份n做数据合并,而不是[全量备份数据+增量备份 1数据+增量备份 2数据合并]
  54. 三、在全备目录上重放已提交的事务:
  55. innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --apply-log -- redo-only /data/db_backup/xtrabackup/ 2018- 03- 28_17- 33- 41/
  56. 四、全量备份数据+增量备份 2数据合并,数据最终合并到全量备份目录内:
  57. --incremental-dir= 指定增量备份 2的目录
  58. innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --apply-log -- redo-only /data/db_backup/xtrabackup/ 2018- 03- 28_17- 33- 41/ --incremental-dir= /data/db_backup/incremental/ 2018- 03- 28_17- 37- 25/
  59. 五、在全备目录(增量数据+全备数据合并) 开始回滚未提交的事务:
  60. innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --apply-log /data/db_backup/xtrabackup/ 2018- 03- 28_17- 33- 41/
  61. #####################################################################################
  62. #注释:此行可不看
  63. 最终数据将位于全备备份目录中,而不是增量目录中。
  64. 您可以在每个目录中检查文件xtrabackup_checkpoints。
  65. 它们应该如下所示:
  66. 在全备备份中
  67. backup_type = full - backuped
  68. from_lsn = 0
  69. to_lsn = 1291135
  70. 在增量备份中:
  71. backup_type = incremental
  72. from_lsn = 1291135
  73. to_lsn = 1291340
  74. 事务提交后:查看backup_type是否为 "log-applied"
  75. cat /data/tmp/ 10.116. 207.17_3306/xtrabackup_checkpoints
  76. backup_type = log-applied
  77. from_lsn = 0
  78. to_lsn = 2034824383639
  79. last_lsn = 2034830345359
  80. compact = 0
  81. recover_binlog_info = 0
  82. #####################################################################################
  83. 六、恢复全备数据(全备+增备合并后的数据)
  84. #关闭数据库
  85. /usr/local/mysql/bin/mysqld_multi --defaults-file= /usr/local /mysql/my.cnf stop 1
  86. #移除数据目录
  87. mv /data/mysql/ /data/mysql_bak/
  88. #重新创建MySQL数据目录
  89. mkdir -p /data/mysql/
  90. #将全备数据(全备+增备)恢复到MySQL
  91. innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --datadir= /data/mysql --copy-back /data/db_backup/xtrabackup/ 2018- 03- 28_17- 33- 41/
  92. #授权
  93. chown -R mysql.mysql /data/mysql
  94. #启动MySQL
  95. /usr/local/mysql/bin/mysqld_multi --defaults-file= /usr/local /mysql/my.cnf start 1
  96. 七、检查数据库内的数据:
  97. 1、第一次增量备份:新建了一张数据表:t_3party_server。
  98. 2、第二次增量备份:在数据表t_3party_server内插入了 3条数据。
  99. #在数据库内存在数据表t_3party_server,且3条数据也同样存在。
  100. mysql> show databases;
  101. +--------------------+
  102. | Database |
  103. +--------------------+
  104. | information_schema |
  105. | incre1 |
  106. | mysql |
  107. | performance_schema |
  108. | test |
  109. +--------------------+
  110. 5 rows in set ( 0. 00 sec)
  111. mysql> use incre1;
  112. Reading table information for completion of table and column names
  113. You can turn off this feature to get a quicker startup with -A
  114. Database changed
  115. mysql> show tables;
  116. +------------------+
  117. | Tables_in_incre1 |
  118. +------------------+
  119. | t_3party_server |
  120. +------------------+
  121. 1 row in set ( 0. 00 sec)
  122. mysql> select * from t_3party_server;
  123. +------+---------+---------------+---------------+-------+--------+
  124. | app | server | division | node | port | status |
  125. +------+---------+---------------+---------------+-------+--------+
  126. | MOBA | haproxy | haproxy-login | 10.117.16.242 | 30021 | 0 |
  127. | MOBA | haproxy | haproxy-match | 10.117. 16.242 | 30032 | 0 |
  128. | MOBA | haproxy | haproxy-test | 10.117.16.242 | 30035 | 0 |
  129. +------+---------+---------------+---------------+-------+--------+
  130. 3 rows in set ( 0. 00 sec)

疑问?

MySQL挂掉后能不能进行全备和增备?若果不能的话,数据如何恢复?会丢失多少数据?

MySQL挂掉后,不能进行增量备份,以及全量备份。此时恢复数据的步骤如下:

  1、在全备目录上重放已提交的事务:
  2、增量备份数据与全量备份数据合并,数据最终合并到全量备份目录内:
  3、在全备目录(增量数据+全备数据合并) 开始回滚未提交的事务:
  4、恢复全备数据(全备+增备合并后的数据)
  5、丢失的数据:最后一次成功增量备份时间点~~MySQL挂掉的那个时间点,中间的数据全部丢失。
 

增量备份n+1次的话,为何要以上一次的增量备份n为基础,每次增量备份都以全量备份为基础可以吗?  

  本人亲测,增量备份2次,第二次增量备份2,无论是以全量备份为基础,还是以增量备份1为基础,数据都可以恢复!不过官方建议以增量备份1为基础做增量备份2。

 

   7.5、使用Xtrabackup快速搭建MySQL主从复制

    1、全备主库数据

/usr/bin/innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --parallel=2 --throttle=200 /opt/ --socket=/tmp/mysql.sock
   
   
   
   

    2、把主库的全备数据拷贝到从库

    3、停掉从库的MySQL实例,并移除数据库目录,然后创建新的数据库目录


   
   
   
   
  1. /usr/ local/mysql/bin/mysqld_multi --defaults- file=/usr/ local/mysql/my.cnf stop 1
  2. mv /data/mysql /data/mysql_bak
  3. mkdir -p /data/mysql

    4、在从库上,把主库copy过来的全备文件上重放已提交的事务。[或者在主库上全备文件之后做此操作,然后拷贝到从库] (2选1)


   
   
   
   
  1. innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --datadir= /data/mysql / --apply-log --redo-only /data /tmp/ 10.116. 207.17_3306/
  2. --datadir #从库的MySQL数据目录
  3. /data/tmp/ 10.116. 207.17_3306/ #主库拷贝过来的全备文件
  4. 事务提交后:查看backup_type是否为 "log-applied"
  5. cat /data/tmp/ 10.116. 207.17_3306/xtrabackup_checkpoints
  6. backup_type = log-applied
  7. from_lsn = 0
  8. to_lsn = 2034824383639
  9. last_lsn = 2034830345359
  10. compact = 0
  11. recover_binlog_info = 0

   5、事务提交后,把全备文件内的数据恢复到从库的MySQL数据目录,即/data/mysql

innobackupex --defaults-file=/usr/local/mysql/my.cnf  --user=root --socket=/tmp/mysql.sock --datadir=/data/mysql/ --copy-back /data/tmp/10.116.207.17_3306/
   
   
   
   

  6、授权从库的/data/mysql/目录,并启动从库MySQL实例


   
   
   
   
  1. chown -R mysql.mysql /data/mysql
  2. /usr/ local/mysql/bin/mysqld_multi --defaults- file=/usr/ local/mysql/my.cnf start 1

    7、通过全备目录内的xtrabackup_binlog_info文件,可以找到主从位置点:


   
   
   
   
  1. cat / data/tmp/ 10.116 .207 .17_3306/xtrabackup_binlog_info
  2. master-bin .002837 284721255 cc8e1365 -3855 -11e8 -8ce0 -0cc47a06f43e: 1 -130198911

    8、从库通过执行CHANGE MASTER TO 创建主从关系,并检查主从复制状态是否已经完成。


   
   
   
   
  1. mysql -u root --socket= /tmp/mysql.sock -e "show slave status\G;"
  2. mysql -u root --socket= /tmp/mysql.sock -e "change master to master_host='10.116.207.17',master_user='replicate',master_password='moba2016',master_log_file='master-bin.002837',master_log_pos=284721255;"
  3. mysql -u root --socket= /tmp/mysql.sock -e "show slave status\G;"
  4. mysql -u root --socket= /tmp/mysql.sock -e "start slave;"
  5. mysql -u root --socket= /tmp/mysql.sock -e "show slave status\G;"

     

   7.6、线上MySQL使用Xtrabackup备份数据脚本


   
   
   
   
  1. #!/bin/bash
  2. # XtraBackup Use
  3. # MySQL Server Backup
  4. # sudada
  5. # 2018/08/07
  6. #每次增量备份都是基于全备目录,数据恢复:全备数据+最后一次增备数据合并
  7. USER=root #备份使用的用户
  8. INSTALL_DIR=/data/tmp #Xtrabackup安装路径
  9. SOCKET_FILE=/tmp/mysql.sock2 #MySQL sock文件
  10. XTRABACKUP_BIN=/usr/bin/innobackupex #innobackupex绝对路径
  11. DEFAULTS_FILE=/usr/ local/mysql/my.cnf #MySQL配置文件
  12. BACK_DATA=/data/db_xtrabackup/`date +%F` #DB备份的主目录
  13. BACK_DATA_FULLBACKUP= ${BACK_DATA}/full #全量备份的目录
  14. BACK_DATA_INCREBACKUP= ${BACK_DATA}/incre #增量备份的目录
  15. BACK_LOG= ${BACK_DATA}/agent_mysql_xtrabackup.log #记录DB备份过程日志文件
  16. XTRABACKUP_LOG= ${BACK_DATA}/record_xtrabackup_status.log #记录xtrabackup备份过程的输出信息
  17. FULLBACKUP_INTERVAL=86400 #全库备份的间隔周期,单位:秒
  18. BACKUP_TIME=7 #数据备份时间(单位:天)
  19. LOCKFILE= '.xtrabackup.pid' #加锁
  20. # 安装Xtrabackup服务
  21. function Install_XtraBackup(){
  22. if [ ! -d ${INSTALL_DIR} ]; then
  23. mkdir -p ${INSTALL_DIR}
  24. fi
  25. if [ ! -f ${XTRABACKUP_BIN} ]; then
  26. echo " Install Percona Repository! " >>/dev/null 2>&1
  27. cd ${INSTALL_DIR}
  28. yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm >>/dev/null 2>&1
  29. yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm >>/dev/null 2>&1
  30. yum install -y percona-xtrabackup-24 >>/dev/null 2>&1
  31. innobackupex -- help >>/dev/null 2>&1
  32. Check=$?
  33. if [ $Check -ne 0 ]; then
  34. echo "Install Xtrabackup Failed !"
  35. exit 0
  36. fi
  37. fi
  38. }
  39. # DB全备
  40. function Back_All(){
  41. if [ ! -e "${SOCKET_FILE}" ]; then
  42. exit 0
  43. fi
  44. if [ ! -d ${BACK_DATA_FULLBACKUP} ]; then
  45. mkdir -p ${BACK_DATA_FULLBACKUP}
  46. fi
  47. if [ ! -d ${BACK_DATA_INCREBACKUP} ]; then
  48. mkdir -p ${BACK_DATA_INCREBACKUP}
  49. fi
  50. #函数开始运行的时间点,用来与全备文件做时间对比
  51. START_TIME=`date +%s`
  52. #查找最新的完全备份
  53. LATEST_FULL_BACKUP=`/bin/find ${BACK_DATA_FULLBACKUP} -mindepth 1 -maxdepth 1 - type d - printf "%P\n" | sort -nr | head -1`
  54. #查找最新全备文件的创建时间
  55. LATEST_FULL_BACKUP_CREATED_TIME=` stat -c %Y ${BACK_DATA_FULLBACKUP}/ ${LATEST_FULL_BACKUP}`
  56. #最新全备文件的创建时间与当前的时间差
  57. FULL_TIME_DIFF=$(( ${START_TIME}- ${LATEST_FULL_BACKUP_CREATED_TIME}))
  58. #如果间隔小于86400秒,那么就基于全量备份做增量备份
  59. if [ ${LATEST_FULL_BACKUP} ] && [ ${FULL_TIME_DIFF} -lt ${FULLBACKUP_INTERVAL} ]; then
  60. echo " " >> ${BACK_LOG}
  61. echo " `date +%Y/%m/%d-%H:%M`" >> ${BACK_LOG}
  62. echo " 基于全备目录:${BACK_DATA_FULLBACKUP}/${LATEST_FULL_BACKUP},做增量备份 !" >> ${BACK_LOG}
  63. #调试使用1
  64. #echo "增量备份--incremental ${BACK_DATA_INCREBACKUP}/${LATEST_INCRE_BACKUP}"
  65. #echo "全备目录--incremental-basedir= ${BACK_DATA_FULLBACKUP}/${LATEST_FULL_BACKUP}"
  66. ${XTRABACKUP_BIN} --defaults-file= ${DEFAULTS_FILE} --user= ${USER} --socket= ${SOCKET_FILE} --incremental ${BACK_DATA_INCREBACKUP} --incremental-basedir= ${BACK_DATA_FULLBACKUP}/ ${LATEST_FULL_BACKUP} --parallel=2 --throttle=200 2> ${XTRABACKUP_LOG} ;sleep 1
  67. SUCESS_BACKUP=`/bin/awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" ${XTRABACKUP_LOG}`
  68. LOG_LATEST_INCRE_BACKUP=`/bin/find ${BACK_DATA_INCREBACKUP} -mindepth 1 -maxdepth 1 - type d - printf "%P\n" | sort -nr | head -1`
  69. #查看备份日志,判断备份是否成功
  70. if [ `/usr/bin/tail -1 ${XTRABACKUP_LOG} | grep 'completed OK!' | wc -l` -eq 1 ]; then
  71. #`grep 'incremental' ${LATEST_FULL_BACKUP}/xtrabackup_checkpoints | wc -l` -eq 1
  72. echo " 增量备份1成功,目录地址:${BACK_DATA_INCREBACKUP}/${LOG_LATEST_INCRE_BACKUP}" >> ${BACK_LOG}
  73. else
  74. echo " innobackupex 增量备份命令执行失败! " >> ${BACK_LOG}
  75. echo " -------------错误日志------------- " >> ${BACK_LOG}
  76. tail -10 ${XTRABACKUP_LOG} >> ${BACK_LOG}
  77. echo " ---------------------------------- " >> ${BACK_LOG}
  78. exit 1
  79. fi
  80. fi
  81. #如果全备目录不存在,那么就重新全备一个文件
  82. if [ ! ${LATEST_FULL_BACKUP} ] || [ ${FULL_TIME_DIFF} -gt ${FULLBACKUP_INTERVAL} ]; then
  83. echo " " >> ${BACK_LOG}
  84. echo " `date +%Y/%m/%d-%H:%M` " >> ${BACK_LOG}
  85. echo " 正在执行全新的完全备份 ========>> " >> ${BACK_LOG}
  86. ${XTRABACKUP_BIN} --defaults-file= ${DEFAULTS_FILE} --user= ${USER} --parallel=2 --throttle=200 ${BACK_DATA_FULLBACKUP} --socket= ${SOCKET_FILE} 2> ${XTRABACKUP_LOG} ;sleep 1
  87. SUCESS_BACKUP=`/bin/awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" ${XTRABACKUP_LOG}`
  88. #查看备份日志,判断备份是否成功
  89. if [ `/usr/bin/tail -1 ${XTRABACKUP_LOG} | grep 'completed OK!' | wc -l` -eq 1 ]; then
  90. #`grep 'full-backuped' ${LATEST_FULL_BACKUP}/xtrabackup_checkpoints | wc -l` -eq 1
  91. echo " 数据成功备份到:${SUCESS_BACKUP} " >> ${BACK_LOG}
  92. else
  93. echo " innobackupex 全备命令执行失败! " >> ${BACK_LOG}
  94. echo " -------------错误日志------------- " >> ${BACK_LOG}
  95. tail -10 ${XTRABACKUP_LOG} >> ${BACK_LOG}
  96. echo " ---------------------------------- " >> ${BACK_LOG}
  97. exit 1
  98. fi
  99. fi
  100. }
  101. #删除过期的备份文件[暂定10天]
  102. function Delete_File(){
  103. EXPIRED_FILE=`/bin/find /data/db_xtrabackup/ -maxdepth 1 - type d -mtime + ${BACKUP_TIME} -name "20*"`
  104. echo " `date +%Y/%m/%d-%H:%M`" >> ${BACK_LOG}
  105. echo " 检查是否有过期的文件:" >> ${BACK_LOG}
  106. if [ ${EXPIRED_FILE} ]; then
  107. echo " 找到了过期文件:${EXPIRED_FILE} " >> ${BACK_LOG}
  108. /bin/find /data/db_xtrabackup/ -maxdepth 1 - type d -mtime + ${BACKUP_TIME} -name "20*" | xargs -I '{}' rm -fr {}
  109. echo " `date +%Y/%m/%d_%H:%M`, 过期文件:${EXPIRED_FILE} 已被删除!" >> ${BACK_LOG}
  110. else
  111. echo " 不存在过期的文件! " >> ${BACK_LOG}
  112. fi
  113. }
  114. function Main(){
  115. touch ${LOCKFILE}
  116. exec 57<> ${LOCKFILE}
  117. flock -xn 57
  118. if [[ $? -eq 1 ]]; then
  119. echo "$0 is Running, please wait"
  120. exit 3
  121. fi
  122. Install_XtraBackup
  123. Back_All
  124. Delete_File
  125. exec 57>&-
  126. }
  127. Main
  128. ###############################################################################################################################################################
  129. #数据恢复流程:
  130. #1、在备份目录/data/db_backup/xtrabackup/下,找到需要恢复的文件
  131. # 1.1、/data/db_backup/xtrabackup/2018-07-26/full #全备文件目录
  132. # 1.2、/data/db_backup/xtrabackup/2018-07-26/incre #增量备份文件目录
  133. #
  134. #2、拷贝文件到主库机器,并检查数据的完整性
  135. # 2.1、检查全备及增备目录下的xtrabackup_checkpoints文件
  136. # backup_type = full-backuped
  137. # from_lsn = 0
  138. # to_lsn = 1639857
  139. # last_lsn = 1639857
  140. # compact = 0
  141. # recover_binlog_info = 0
  142. #
  143. # 2.2、检查备份日志是否报错:
  144. # cat agent_mysql_xtrabackup.log
  145. #
  146. #3、开始合并数据
  147. # 3.1、全备目录上重放已提交的事务:
  148. # innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --apply-log --redo-only /data/db_backup/xtrabackup/2018-07-26/full/2018-03-28_17-33-41/ #这里写全备文件
  149. # 3.2、增量备份数据与全量备份数据合并,数据最终合并到全量备份目录内:
  150. # # --redo-onl 后是全备文件
  151. # # --incremental-dir= 指定增量备份2的目录(如果增量备份多次,那就指向最后一次增量备份的目录,这里指向的是增量备份2的目录)
  152. # innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --apply-log --redo-only /data/db_backup/xtrabackup/2018-07-26/full/2018-03-28_17-33-41/ --incremental-dir=/data/db_backup/xtrabackup/2018-07-26/incre/2018-03-28_17-37-25/
  153. #
  154. # 3.3、在全备目录(增量数据+全备数据合并) 开始回滚未提交的事务:
  155. # innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --apply-log /data/db_backup/xtrabackup/2018-07-26/full/2018-03-28_17-33-41/
  156. #
  157. #4、开始恢复数据:
  158. # 4.1、关闭数据库
  159. # /usr/local/mysql/bin/mysqld_multi --defaults-file=/usr/local/mysql/my.cnf stop 1
  160. # 4.2、移除数据目录
  161. # mv /data/mysql/ /data/mysql_bak/
  162. # 4.3、重新创建MySQL数据目录
  163. # mkdir -p /data/mysql/
  164. # 4.4、将全备数据(全备+增备)恢复到MySQL
  165. # innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --datadir=/data/mysql --copy-back /data/db_backup/xtrabackup/2018-03-28_17-33-41/
  166. # 4.5、授权
  167. # chown -R mysql.mysql /data/mysql
  168. # 4.6、启动MySQL
  169. # /usr/local/mysql/bin/mysqld_multi --defaults-file=/usr/local/mysql/my.cnf start 1
  170. #
  171. #5、检查
  172. ###############################################################################################################################################################

 

八、Mysqldump 与 Xtrabackup 线上数据备份对比测试

环境描述及结果展示:使用线上3台分区机器测试

MySQL版本:5.6.17

Xtrabackup版本:xtrabackup version 2.4

主机内存:32GB   CPU8核   Innodb buffer pool:128M   数据文件总大小:14GB

参数

xtrabackup

 

xtrabackup压缩备份

 

mysqldump压缩备份

CPU

11.82%

7.59%

7.33%

26.09%

17.43%

18.64%

16.57%

12.61%

12.82%

CPU IO wait

28.74%

31.79%

36.50%

21.19%

26.13%

30.10%

22.40%

17.24%

18.62%

Memory

50M

30M

30M

310M

290M

270M

70M

50M

40M

Main processes

xtrabackup

xtrabackup&tar&gzip

mysqldump&mysqld&gzip

Backup file size

14.5 G

13 G

13 G

14.5 G

13 G

13 G

14.5 G

13 G

13 G

Time

8分钟

8分钟

7分钟

22分钟

20分钟

20分钟

37分钟

30分钟

28分钟

数据恢复(导入)时间

5分钟

4分钟

4分钟

5分钟

4分钟

4分钟

84分钟

78分钟

73分钟

结论:

  Xtrabackup备份:占用的CPU与内存较低,消耗的IO较大,备份文件效率很高,数据恢复(导入)非常快。

  Xtrabackup压缩备份:占用的CPU与内存较高,消耗的IO相对较大,备份文件效率较高,数据恢复(导入)非常快。

  Mysqldump压缩备份时:占用的CPU与内存较少,消耗的IO较少,备份文件效率较低,数据恢复(导入)非常慢。

 

你可能感兴趣的:(mysql)