layout: post
title: Mysql数据库备份—-Percona XtraBackup实现全量和增量备份
date: 2018-02-25
tags: [“Mariadb”,”软件服务”]


一、Xtrabackup简介

1、Percona提供的mysql数据库备份工具,惟一开源的能够对innodb和xtradb数据库进行热备的工具

2、特点:

(1)备份还原过程快速、可靠
(2)备份过程不会打断正在执行的事务
(3)能够基于压缩等功能节约磁盘空间和流量
(4)自动实现备份检验
(5)开源,免费

xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 mysqld server 没有交互;innobackupex 脚本用来备份非InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还
会和 mysqld server 发送命令进行交互,如加读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。即innobackupex是在xtrabackup 之上做了一层封装实现的。

Xtrabackup2.2版之前包括4个可执行文件:

Innobackupex: perl 脚本
Xtrabackup: C/C++ 编译的二进制
Xbcrypt:加解密
Xbstream:支持并发写的流文件格式

注意:虽然目前一般不用 MyISAM 表,只是mysql 库下的系统表是MyISAM 的,因此备份基本都通过 innobackupex 命令进行。(在高版本的Xtrabackup中,其”Innobackupex”已经变为”Xtrabackup”的软连接了)

3、xtrabackup的获取方法

1)、通过epel源直接yum安装

  1. yum install percona-xtrabackup

2)、通过官网获取最新版本https://www.percona.com/software/mysql-database/percona-xtrabackup

 

4、xtrabackup的使用选项

Xtrabackup备份的选项:

innobackupex [option] BACKUP-ROOT-DIR

选项说明:
—user:该选项表示备份账号
—password:该选项表示备份的密码
—host:该选项表示备份数据库的地址
—databases:该选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;如:”xtra_test dba_test”,同时,在指定某数据库时,也可以只指定其中的某张表。如:”mydatabase.mytable”。该选项对innodb引擎表无效,还是会备份所有innodb表
—defaults-file:该选项指定了从哪个文件读取MySQL配置,必须放在命令行第一个选项的位置
—incremental:该选项表示创建一个增量备份,需要指定—incremental-basedir
—incremental-basedir:该选项表示接受了一个字符串参数指定含有fullbackup的目录为增量备份的base目录,与—incremental同时使用
—incremental-dir:该选项表示增量备份的目录
—include=name:指定表名,格式:databasename.tablename

Xtrabackup准备阶段选项:

innobackupex —apply-log [option] BACKUP-DIR

选项说明:
—apply-log:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
—use-memory:该选项表示和—apply-log选项一起使用,prepare 备份的时候,xtrabackup做crash recovery分配的内存大小,单位字节。也可(1MB,1M,1G,1GB),推荐1G
—defaults-file:该选项指定了从哪个文件读取MySQL配置,必须放在命令行第一个选项的位置
—export:表示开启可导出单独的表之后再导入其他Mysql中
—redo-only:这个选项在prepare base full backup,往其中merge增量备份时候使用

Xtrabackup还原的选项:

innobackupex —copy-back [选项] BACKUP-DIR

—copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
—move-back:这个选项与—copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须小心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本

二、实验环境

一台测试机:A(172.18.30.1)

操作系统:Centos7

操作对象数据库版本:mariadb-10.2

三、实现目的

使用Xtrabackup实现数据备份的完整备份、增量备份和还原

四、实验简单步骤

  1. 下载并安装Xtrabackup工具
  2. 使用Xtrabackup进行完整备份
  3. 向数据库中添加新数据
  4. 使用Xtrabackup做增量备份
  5. 再次想数据库中添加新数据
  6. 使用Xtrabackup做增量备份
  7. 删除原数据库
  8. 使用Xtrabackup实现数据还原

五、实验步骤

1、安装最新版Xtrabackup

  1. wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
  2. yum install -y ./percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

2、使用Xtrabackup进行完整备份

因为是测试,在做完整备份之前,我们首先登录数据库查看一下测试数据,以确保操作的准确性

  1. [root@localhost ~]# mysql
  2. MariaDB [(none)]> use test;
  3. MariaDB [test]> select * from test;
  4. +-----------+--------------+---------------+-----------------+
  5. ' runoob_id ' runoob_title ' runoob_author ' submission_date '
  6. +-----------+--------------+---------------+-----------------+
  7. ' 1 ' test1 ' stuff ' 2018-02-23 '
  8. ' 2 ' test2 ' stuff ' 2018-02-23 '
  9. ' 3 ' test3 ' Goodluck ' 2018-02-23 '
  10. ' 4 ' Thanks a lot ' sun ' 2018-02-23 '
  11. +-----------+--------------+---------------+-----------------+
  12. 4 rows in set (0.00 sec)
  13.  
  14. MariaDB [test]>

test.test表中有4条数据,现在我们开始进行全库备份。

  1. [root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf.d/server.cnf --user=root /backup
  2. 180226 20:00:54 innobackupex: Starting the backup operation
  3.  
  4. IMPORTANT: Please check that the backup run completes successfully.
  5. At the end of a successful backup run innobackupex
  6. prints "completed OK!".
  7. .
  8. .
  9. .
  10. .
  11. 180226 20:00:56 Executing UNLOCK TABLES
  12. 180226 20:00:56 All tables unlocked
  13. 180226 20:00:56 Backup created in directory '/backup/2018-02-26_20-00-54/'
  14. MySQL binlog position: filename 'localhost-bin.000005', position '545', GTID of the last change '0-1-6'
  15. 180226 20:00:56 [00] Writing /backup/2018-02-26_20-00-54/backup-my.cnf
  16. 180226 20:00:56 [00] ...done
  17. 180226 20:00:56 [00] Writing /backup/2018-02-26_20-00-54/xtrabackup_info
  18. 180226 20:00:56 [00] ...done
  19. xtrabackup: Transaction log of lsn (1620544) to (1620553) was copied.
  20. 180226 20:00:56 completed OK!

查看我们生成的文件

  1. [root@localhost ~]# ll /backup/
  2. 总用量 0
  3. drwxr-x--- 5 root root 202 2 26 20:00 2018-02-26_20-00-54
  1. [root@localhost 2018-02-26_20-00-54]# cat xtrabackup_info
  2. uuid = 4fb8721b-196e-11e8-82be-000c29451ce7
  3. name =
  4. tool_name = innobackupex
  5. tool_command = --defaults-file=/etc/my.cnf.d/server.cnf --user=root /backup #记录了使用何种命令进行的备份
  6. tool_version = 2.4.9
  7. ibbackup_version = 2.4.9
  8. server_version = 10.2.13-MariaDB-log
  9. start_time = 2018-02-26 20:00:54
  10. end_time = 2018-02-26 20:00:56
  11. lock_time = 0
  12. binlog_pos = filename 'localhost-bin.000005', position '545', GTID of the last change '0-1-6' #记录了binlog信息和GTID信息(事物信息)
  13. innodb_from_lsn = 0
  14. innodb_to_lsn = 1620544
  15. partial = N
  16. incremental = N
  17. format = file
  18. compact = N
  19. compressed = N
  20. encrypted = N
  21.  
  22. [root@localhost 2018-02-26_20-00-54]# cat xtrabackup_checkpoints
  23. backup_type = full-backuped
  24. from_lsn = 0
  25. to_lsn = 1620544
  26. last_lsn = 1620553
  27. compact = 0
  28. recover_binlog_info = 0
  29.  
  30. [root@localhost 2018-02-26_20-00-54]# cat xtrabackup_binlog_info #记录了binlog信息和GTID信息(事物信息)
  31. localhost-bin.000005 545 0-1-6

以上的三个文件记录的信息非常重要,之后还原也会使用到这几个文件

3、我们向 test.test表中插入一条数据

  1. mysql -e "insert into test.test (runoob_title,runoob_author,submission_date) values('ok','ook',now());"

4、进行数据库的增量备份

  1. [root@localhost /]# mkdir /backup/incremental{1..2} #创建增量数据存放目录
  2. [root@localhost /]# innobackupex --incremental /backup/incremental1/ --incremental-basedir=/backup/2018-02-26_20-00-54/ #第一次增量备份
  3. 180226 20:27:46 innobackupex: Starting the backup operation
  4.  
  5. IMPORTANT: Please check that the backup run completes successfully.
  6. At the end of a successful backup run innobackupex
  7. prints "completed OK!".
  8.  
  9. 180226 20:27:46 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup' (using password: NO).
  10. 180226 20:27:46 version_check Connected to MySQL server
  11. 180226 20:27:46 version_check Executing a version check against the server...
  12. 180226 20:27:46 version_check Done.
  13. 180226 20:27:46 Connecting to MySQL server host: localhost, user: not set, password: not set, port: not set, socket: not set
  14. Using server version 10.2.13-MariaDB-log
  15. innobackupex version 2.4.9 based on MySQL server 5.7.13 Linux (x86_64) (revision id: a467167cdd4)
  16. incremental backup from 1620544 is enabled.
  17. xtrabackup: uses posix_fadvise().
  18. xtrabackup: cd to /var/lib/mysql/
  19. xtrabackup: open files limit requested 0, set to 102400
  20. xtrabackup: using the following InnoDB configuration:
  21. xtrabackup: innodb_data_home_dir = .
  22. xtrabackup: innodb_data_file_path = ibdata1:12M:autoextend
  23. xtrabackup: innodb_log_group_home_dir = ./
  24. xtrabackup: innodb_log_files_in_group = 2
  25. xtrabackup: innodb_log_file_size = 50331648
  26. InnoDB: Number of pools: 1
  27. .
  28. .
  29. .
  30. .
  31. 180226 20:27:48 Executing UNLOCK TABLES
  32. 180226 20:27:48 All tables unlocked
  33. 180226 20:27:48 Backup created in directory '/backup/incremental1/2018-02-26_20-27-46/'
  34. MySQL binlog position: filename 'localhost-bin.000005', position '816', GTID of the last change '0-1-7'
  35. 180226 20:27:48 [00] Writing /backup/incremental1/2018-02-26_20-27-46/backup-my.cnf
  36. 180226 20:27:48 [00] ...done
  37. 180226 20:27:48 [00] Writing /backup/incremental1/2018-02-26_20-27-46/xtrabackup_info
  38. 180226 20:27:48 [00] ...done
  39. xtrabackup: Transaction log of lsn (1622268) to (1622277) was copied.
  40. 180226 20:27:48 completed OK!

5、再次想数据库中插入一条数据

  1. [root@localhost /]# mysql -e "insert into test.test (runoob_title,runoob_author,submission_date) values('over','oover',now());"

6、再次进行增量备份

  1. [root@localhost /]# innobackupex --incremental /backup/incremental2 --incremental-basedir=/backup/incremental1/2018-02-26_20-27-46
  2. 180226 20:43:50 innobackupex: Starting the backup operation
  3.  
  4. IMPORTANT: Please check that the backup run completes successfully.
  5. At the end of a successful backup run innobackupex
  6. prints "completed OK!".
  7. .
  8. .
  9. .
  10. .
  11. 180226 20:43:52 Executing UNLOCK TABLES
  12. 180226 20:43:52 All tables unlocked
  13. 180226 20:43:52 Backup created in directory '/backup/incremental2/2018-02-26_20-43-50/'
  14. MySQL binlog position: filename 'localhost-bin.000005', position '1091', GTID of the last change '0-1-8'
  15. 180226 20:43:52 [00] Writing /backup/incremental2/2018-02-26_20-43-50/backup-my.cnf
  16. 180226 20:43:52 [00] ...done
  17. 180226 20:43:52 [00] Writing /backup/incremental2/2018-02-26_20-43-50/xtrabackup_info
  18. 180226 20:43:52 [00] ...done
  19. xtrabackup: Transaction log of lsn (1623489) to (1623498) was copied.
  20. 180226 20:43:52 completed OK!

注意:第二次增量备份是基于上一次的增量备份而进行的。

7、我们查看一下现在数据库中test.test表中的数据

  1. [root@localhost /]# mysql -e 'select * from test.test'
  2. +-----------+--------------+---------------+-----------------+
  3. ' runoob_id ' runoob_title ' runoob_author ' submission_date '
  4. +-----------+--------------+---------------+-----------------+
  5. ' 1 ' test1 ' stuff ' 2018-02-23 '
  6. ' 2 ' test2 ' stuff ' 2018-02-23 '
  7. ' 3 ' test3 ' Goodluck ' 2018-02-23 '
  8. ' 4 ' Thanks a lot ' sun ' 2018-02-23 '
  9. ' 5 ' ok ' ook ' 2018-02-26 '
  10. ' 6 ' over ' oover ' 2018-02-26 '
  11. +-----------+--------------+---------------+-----------------+

8、执行删库操作

  1. [root@localhost mysql]# rm -rf /var/lib/mysql/*

9、使用备份进行还原

首先我们需要预处理备份的数据

  1. [root@localhost /]# innobackupex --apply-log --redo-only /backup/2018-02-26_20-00-54/
  2. [root@localhost /]# innobackupex --apply-log --redo-only /backup/2018-02-26_20-00-54/ --incremental-dir=/backup/incremental1/2018-02-26_20-27-46
  3. [root@localhost /]# innobackupex --apply-log --redo-only /backup/2018-02-26_20-00-54/ --incremental-dir=/backup/incremental2/2018-02-26_20-43-50

注意:数据整理需要依次整理,在整理增量数据的时候,其指定的base目录都是其第一次的完整备份,整理增量数据需要按照时间顺序来整理,否则会出问题

还原数据库

  1. [root@localhost incremental2]# systemctl stop mariadb
  2. [root@localhost incremental2]# innobackupex --copy-back /backup/2018-02-26_20-00-54/
  3. 180226 21:08:03 innobackupex: Starting the copy-back operation
  4.  
  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.  
  9. innobackupex version 2.4.9 based on MySQL server 5.7.13 Linux (x86_64) (revision id: a467167cdd4)
  10. 180226 21:08:03 [01] Copying ibdata1 to /var/lib/mysql/ibdata1
  11. 180226 21:08:03 [01] ...done
  12. 180226 21:08:03 [01] Copying ./test/test.ibd to /var/lib/mysql/test/test.ibd
  13. 180226 21:08:03 [01] ...done
  14. 180226 21:08:03 [01] Copying ./test/test.frm to /var/lib/mysql/test/test.frm
  15. 180226 21:08:03 [01] ...done
  16. .
  17. .
  18. .
  19. 180226 21:08:03 [01] Copying ./performance_schema/threads.frm to /var/lib/mysql/performance_schema/threads.frm
  20. 180226 21:08:03 [01] ...done
  21. 180226 21:08:03 [01] Copying ./xtrabackup_binlog_pos_innodb to /var/lib/mysql/xtrabackup_binlog_pos_innodb
  22. 180226 21:08:03 [01] ...done
  23. 180226 21:08:03 [01] Copying ./xtrabackup_info to /var/lib/mysql/xtrabackup_info
  24. 180226 21:08:03 [01] ...done
  25. 180226 21:08:03 completed OK!
  26. [root@localhost /]# chown -R mysql.mysql /var/lib/mysql #千万注意权限,否则数据库起不来

还原数据库需要注意一个细节:”innobackupex “会读取现有数据库中的配置文件来定义其数据库目录是哪儿,如果默认没有配置”datadir”选项,则会备份失败,如果机器启动的是多实例数据库,可以使用指定配置文件选项来恢复数据库—“—defaults-file=”

10、登录数据库查看数据的完整性

  1. [root@localhost /]# systemctl start mariadb
  2. [root@localhost /]# mysql -e 'select * from test.test;'
  3. +-----------+--------------+---------------+-----------------+
  4. ' runoob_id ' runoob_title ' runoob_author ' submission_date '
  5. +-----------+--------------+---------------+-----------------+
  6. ' 1 ' test1 ' stuff ' 2018-02-23 '
  7. ' 2 ' test2 ' stuff ' 2018-02-23 '
  8. ' 3 ' test3 ' Goodluck ' 2018-02-23 '
  9. ' 4 ' Thanks a lot ' sun ' 2018-02-23 '
  10. ' 5 ' ok ' ook ' 2018-02-26 '
  11. ' 6 ' over ' oover ' 2018-02-26 '
  12. +-----------+--------------+---------------+-----------------+

11、新生成的数据可以通过binlog来恢复,恢复数据时需要隔离环境,这里不再演示了,之前写的mysqldump数据恢复和lvm备份数据库中已经提到

六、使用xtrabackup工具的注意事项

1、可以实现热备,该工具主要是针对innodb引擎来进行的备份,以数据块的方式来进行备份。

2、在备份非innodb的表时,其实际是使用复制文件的方法来进行备份的。

3、在恢复数据库时需要关闭数据库

4.datadir目录必须为空。除非指定innobackupex —force-non-empty-directorires选项指定,否则—copy-backup选项不会覆盖

5.由于文件属性会被保留,大部分情况下你需要在启动实例之前将文件的属主改为mysql,这些文件将属于创建备份的用户 。chown -R mysql:mysql /var/lib/mysql

以上需要在用户调用innobackupex之前完成

—force-non-empty-directories:指定该参数时候,使得innobackupex —copy-back或—move-back选项转移文件到非空目录,已存在的文件不会被覆盖。如果—copy-back和—move-back文件需要从备份目录拷贝一个在datadir已经存在的文件,会报错失败

文档更新时间: 2020-05-25 12:16   作者:张尚