数据库-xtrabackup定时热备份生产数据库

xtrabackup定时热备份生产数据库

  • 1.Xtrabackup介绍
  • 2.Xtrabackup优点
  • 3.备份专用用户创建
  • 4.下载安装xtrabackup
    • 4.1下载xtrabackup
      • 4.1.1libev
      • 4.1.2xtrabackup
    • 4.2安装依赖
      • 4.2.2安装perl-DBD-MySQ
      • 4.2.3安装libev
      • 4.2.4安装xtrabackup
      • 4.2.5安装xtrabackup
      • 4.2.6安装xtrabackup-test
      • 4.2.7遇到的问题
    • 4.3验证
  • 5.全量备份
    • 5.1备份准备
    • 5.2创建备份目录
    • 5.3全量备份命令
    • 5.4后台执行命令
    • 5.5结果查看
  • 6.备份恢复
    • 6.1准备(prepare)一个完全备份
    • 6.2从一个完全备份中恢复数据
  • 7.实战
    • 7.1备份
    • 7.1恢复
  • 8.linux脚本定时
    • 8.1创建脚本
    • 8.2赋予执行权限
    • 8.3手动执行测试
    • 8.4定时任务crontab

1.Xtrabackup介绍

  • MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份。在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周实用完整备份,周一到周六实用增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,xtrabakackup有2个工具,分别是xtrabakup、innobakupe。
  • Percona-xtrabackup是 Percona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。

2.Xtrabackup优点

  • 备份速度快,物理备份可靠
  • 备份过程不会打断正在执行的事务(无需锁表)
  • 能够基于压缩等功能节约磁盘空间和流量
  • 自动备份校验
  • 还原速度快
  • 可以流传将备份传输到另外一台机器上
  • 在不增加服务器负载的情况备份数据

3.备份专用用户创建

如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户:如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户:

mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY '123456';  #创建用户
mysql> REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'bkpuser';  #回收此用户所有权限
mysql> GRANT RELOAD,LOCK TABLES,RELICATION CLIENT ON *.* TO 'bkpuser'@'localhost';  #授权刷新、锁定表、用户查看服务器状态
mysql> FLUSH PRIVILEGES;  #刷新授权表

4.下载安装xtrabackup

4.1下载xtrabackup

  • 由于服务器的版本是centos6,所以xtrabackup版本不能太高,这里建议采用2.4.7版本。

4.1.1libev

  • 下载依赖插件libev,命令如下:
wget ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/libev-4.15-1.el6.rf.x86_64.rpm 

4.1.2xtrabackup

  • 下载xtrabackup,分3个,命令如下

注:安装前提必须要有mysql,若无法使用wget命令,也可以下载文件后,手动上传至服务器

	wget 	https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.7/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm
	wget 	https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.7/binary/redhat/6/x86_64/percona-xtrabackup-24-debuginfo-2.4.7-2.el6.x86_64.rpm
	wget 	https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.7/binary/redhat/6/x86_64/percona-xtrabackup-test-24-2.4.7-2.el6.x86_64.rpm

4.2安装依赖

4.2.2安装perl-DBD-MySQ

命令如下:

	yum install perl-DBD-MySQL

数据库-xtrabackup定时热备份生产数据库_第1张图片

4.2.3安装libev

命令如下:

	rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm

在这里插入图片描述

4.2.4安装xtrabackup

命令如下:

	rpm -ivh percona-xtrabackup-24-debuginfo-2.4.7-2.el6.x86_64.rpm

在这里插入图片描述

4.2.5安装xtrabackup

命令如下:

	rpm -ivh percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm

在这里插入图片描述

4.2.6安装xtrabackup-test

命令如下:

	rpm -ivh percona-xtrabackup-test-24-2.4.7-2.el6.x86_64.rpm

4.2.7遇到的问题

a.出现如图错误:
在这里插入图片描述
解决方法:

yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
yum -y install rsync perl l perl-Digest-MD5

b.出现如图错误:
在这里插入图片描述
解决方法:
xtrabackup-test为测试使用,若出现无法安装等情况,略过即可,不影响正常使用。

4.3验证

安装完成后,输入命令,如下图所示:

rpm -qa|grep xtrabackup

在这里插入图片描述

5.全量备份

5.1备份准备

  • 在备份前,我们需要先确认mysql的配置文件(通常在/etc/my.cnf)和sock文件地址(通常在/tmp/mysql.sock)
    若不确定,可以使用命令搜索:
find / -name mysql.sock
find / -name my.cnf

5.2创建备份目录

mkdir /data/back_up
cd /data/back_up

5.3全量备份命令

innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --user=xxx--password=xxx /data/back_up

参数简介:

–defaults-file:配置文件
–socket:sock文件地址
–user:数据用户名
–password:数据库密码
最后的/data/backupall是备份目录
–databases 指定数据库
–incremental 创建增量备份
–incremental-basedir 指定包含完全备份的目录
–incremental-dir 指定包含增量备份的目录
–tmpdir=DIRECTORY
当有指定–remote-host or --stream时, 事务日志临时存储的目录, 默认采用MySQL配置文件中所指定的临时目录tmpdir
–apply-log 对备份进行预处理操作
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
–redo-only 不回滚未提交事务
–copy-back 恢复备份目录

数据库-xtrabackup定时热备份生产数据库_第2张图片

命令执行结束后,最后几行会显示类似于:”120407 09:01:04 innobackupex: completed OK!”,则表示备份成功。
数据库-xtrabackup定时热备份生产数据库_第3张图片

5.4后台执行命令

nohup innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --user=xxx--password=xxx /data/backupall &

在这里插入图片描述
使用后台执行会生成一个nohup.out用于记录日志。

5.5结果查看

  • 执行完毕后会生成一个当前时间的文件夹用于保存备份数据:

在这里插入图片描述
使用innobackupex备份时,其会调用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目录来存储备份数据。

至此,备份操作结束!

6.备份恢复

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

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

  • innobackupex命令的–apply-log选项可用于实现上述功能,如下面的命令:

innobackupex --apply-log /data/back_up

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

120407 09:01:04 innobackupex: completed OK!

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

6.2从一个完全备份中恢复数据

注:恢复不用启动MySQL

  • innobackupex命令的–copy-back选项用于恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。
innobackupex --defaults-file=/etc/my.cnf --copy-back /data/back_up
  • 注意:上面命令中/data/back_up是备份目录,并不是数据目录。我们备份与恢复的mysql数据库的数据目录必须保持一致。
    命令执行结束后,最后几行会显示类似于:”120407 09:01:04 innobackupex: completed OK!”,则表示恢复成功。

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

chown -R mysql.mysql /data/mysql_data/

至此,备份恢复结束!

总结全库备份与恢复三步:

  • innobackupex全量备份,并指定备份目录路径;
  • 在恢复前,需要使用–apply-log参数先进行合并数据文件,确保数据的一致性要求;
  • 恢复时,直接使用–copy-back参数进行恢复,需要注意的是,在my.cnf中要指定数据文件目录的路径。

7.实战

具体操作命令如下:

7.1备份

[root@master backups]# innobackupex --user=root --password=123456 --host=127.0.0.1 /backups/  #在master上进行全库备份#语法解释说明:
#--user=root 指定备份用户
#--password=123456  指定备份用户密码
#--host  指定主机
#/backups  指定备份目录
[root@master backups]# ll
total 0
drwxr-x--- 7 root root 232 Jul 30 11:01 2018-07-30_11-01-37
[root@master backups]# ll 2018-07-30_11-01-37/  #查看备份数据
total 77856
-rw-r----- 1 root root      418 Jul 30 11:01 backup-my.cnf  #备份用到的配置选项信息文件
-rw-r----- 1 root root 79691776 Jul 30 11:01 ibdata1  #数据文件
drwxr-x--- 2 root root       20 Jul 30 11:01 kim
drwxr-x--- 2 root root     4096 Jul 30 11:01 mysql
drwxr-x--- 2 root root     4096 Jul 30 11:01 performance_schema
drwxr-x--- 2 root root       20 Jul 30 11:01 repppp
drwxr-x--- 2 root root     4096 Jul 30 11:01 wordpress
-rw-r----- 1 root root       21 Jul 30 11:01 xtrabackup_binlog_info  #mysql服务器当前正在使用的二进制日志文件和此时二进制日志时间的位置信息文件
-rw-r----- 1 root root      113 Jul 30 11:01 xtrabackup_checkpoints  #备份的类型、状态和LSN状态信息文件
-rw-r----- 1 root root      482 Jul 30 11:01 xtrabackup_info
-rw-r----- 1 root root     2560 Jul 30 11:01 xtrabackup_logfile    #备份的日志文件

7.1恢复

[root@slave ~]# /etc/init.d/mysqld stop  #停止slave上的mysql
Shutting down MySQL.. SUCCESS! 

[root@slave tools]# yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm   #安装xtrabackup
[root@master backups]# scp -r 2018-07-30_11-01-37/ [email protected]:/backups/   #从master上拷贝备份数据
[root@slave tools]# innobackupex --apply-log /backups/2018-07-30_11-01-37/      #合并数据,使数据文件处于一致性的状态
180729 23:18:23 innobackupex: Starting the apply-log operation

IMPORTANT: Please check that the apply-log run completes successfully.
           At the end of a successful apply-log run innobackupex
           prints "completed OK!".

innobackupex version 2.4.9 based on MySQL server 5.7.13 Linux (x86_64) (revision id: a467167cdd4)
xtrabackup: cd to /backups/2018-07-30_11-01-37/
xtrabackup: This target seems to be not prepared yet.
InnoDB: Number of pools: 1
xtrabackup: xtrabackup_logfile detected: size=8388608, start_lsn=(3127097)
......
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 3129915
180729 23:18:30 completed OK!
[root@slave ~]# rm -rf /usr/local/mysql/data/  #在slave上删除原有的数据
[root@slave ~]# vim /etc/my.cnf  #配置my.cnf的数据目录路径,否则会报错,要和master一致
datadir=/usr/local/mysql/data
[root@slave ~]# innobackupex --copy-back /backups/2018-07-30_11-01-37/  #在slave上数据恢复
180729 23:32:03 innobackupex: Starting the copy-back operation

IMPORTANT: Please check that the copy-back run completes successfully.
           At the end of a successful copy-back run innobackupex
           prints "completed OK!".
......
180729 23:32:08 completed OK!  #看到completed OK就是恢复正常了
[root@slave ~]# ll /usr/local/mysql/data/  #slave上查看数据目录,可以看到数据已经恢复,但是属主会有问题,需要进行修改,所以一般使用mysql的运行用户进行恢复,否则需要进行修改属主和属组信息
total 188432
-rw-r----- 1 root root 79691776 Jul 29 23:32 ibdata1
-rw-r----- 1 root root 50331648 Jul 29 23:32 ib_logfile0
-rw-r----- 1 root root 50331648 Jul 29 23:32 ib_logfile1
-rw-r----- 1 root root 12582912 Jul 29 23:32 ibtmp1
drwxr-x--- 2 root root       20 Jul 29 23:32 kim
drwxr-x--- 2 root root     4096 Jul 29 23:32 mysql
drwxr-x--- 2 root root     4096 Jul 29 23:32 performance_schema
drwxr-x--- 2 root root       20 Jul 29 23:32 repppp
drwxr-x--- 2 root root     4096 Jul 29 23:32 wordpress
-rw-r----- 1 root root      482 Jul 29 23:32 xtrabackup_info
[root@slave ~]# chown -R mysql.mysql /usr/local/mysql/data/  #修改属主属组
[root@slave ~]# /etc/init.d/mysqld start  #启动mysql
Starting MySQL. SUCCESS! 
[root@slave ~]# mysql -uroot -p -e "show databases;"  #查看数据,是否恢复
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kim                |
| mysql              |
| performance_schema |
| repppp             |
| wordpress          |
+--------------------+

8.linux脚本定时

8.1创建脚本

执行命令:

[root@elcndc2xabx07t back_up]# vim mysql_bak.sh 

脚本内容:

# !/bin/sh
DATE=`date +%Y%m%d_%H%M%S`
# TODO
cd /data/back_up
innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --user=root --password=password --stream=tar ----tmpdir=/data/tmp /data/back_up | gzip > /data/back_up/back_up_$DATE.tar.gz
find /data/back_up -name "*.tar.gz" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1

8.2赋予执行权限

[root@elcndc2xabx07t back_up]# chmod -R 777 mysql_bak.sh 

执行后查看:
数据库-xtrabackup定时热备份生产数据库_第4张图片

8.3手动执行测试

[root@elcndc2xabx07t back_up]# ./mysql_bak.sh 

在这里插入图片描述

8.4定时任务crontab

增加定时任务:3点执行脚本。

[root@elcndc2xabx07t back_up]# crontab -e

查看定时任务:

[root@elcndc2xabx07t back_up]# crontab -l

数据库-xtrabackup定时热备份生产数据库_第5张图片

你可能感兴趣的:(mysql,mysql)