Percona-xtrabackup备份MySQL使用详解与原理

一、Percona-xtrabackup介绍

以下文档来自官网介绍(https://www.percona.com/doc/percona-xtrabackup/8.0/index.html),并经过简单翻译。

Percona xtrabackup is an open-source hot backup utility for MySQL - based servers that doesn’t lock your database during the backup.

Whether it is a 24x7 highly loaded server or a low-transaction-volume environment, Percona xtrabackup is designed to make backups a seamless procedure without disrupting the performance of the server in a production environment.

Percona xtrabacku can back up data from InnoDB, XtraDB, MyISAM, and MyRocks tables on MySQL 8.0 servers as well as Percona Server for MySQL with XtraDB, Percona Server for MySQL 8.0, and Percona XtraDB Cluster 8.0.

Percona xtrabackup是基于MySQL服务器的开源热备份实用程序,在备份过程中不会锁定数据库。无论是24x7高负载服务器还是低事务量环境,Percona xtrabackup都旨在使备份成为无缝过程,而不会破坏生产环境中服务器的性能。

Percona xtrabackup可以备份InnoDB,XtraDB, MyISAM的数据,并且支持备份MyRocks表的数据,包括 MySQL 8.0 、Percona Server for MySQL with XtraDB、Percona Server for MySQL 8.0和Percona XtraDB Cluster 8.0。

注意:在版本8.0.6中添加了对MyRocks存储引擎的支持,Percona xtrabackup 8.0还不支持TokuDB存储引擎。

Percona xtrabackup 8.0 does not support making backups of databases created in versions prior to 8.0 of MySQL, Percona Server for MySQL or Percona XtraDB Cluster. As the changes that MySQL 8.0 introduced in data dictionaries, redo log and undo log are incompatible with previous versions, it is currently impossible for Percona xtrabackup 8.0 to also support versions prior to 8.0.

Percona xtrabackup 8.0不支持对8.0之前的版本的MySQL 、Percona Server for MySQL或Percona XtraDB Cluster中创建的数据库进行备份。由于MySQL 8.0在数据字典,重做日志和撤消日志中引入的更改与以前的版本不兼容,因此Percona xtrabackup 8.0目前不可能支持8.0之前的版本。

本次实验用的MySQL版本为5.7,按照官方文档介绍我们选择了Percona xtrabackup 2.4。官网文档介绍地址:https://www.percona.com/doc/percona-xtrabackup/2.4/index.html

Percona xtrabackup2.4特性

Percona xtrabackup is the world’s only open-source, free MySQL hot backup software that performs non-blocking backups for InnoDB and XtraDB databases. With Percona xtrabackup, you can achieve the following benefits:

  • Backups that complete quickly and reliably
  • Uninterrupted transaction processing during backups
  • Savings on disk space and network bandwidth
  • Automatic backup verification
  • Higher uptime due to faster restore time

Percona xtrabackup是世界上唯一的开源,免费MySQL热备份软件,该软件对InnoDB和XtraDB数据库执行非阻塞备份。使用Percona xtrabackup,您可以获得以下好处:

  • 快速可靠地完成备份
  • 备份期间不间断的事务处理
  • 节省磁盘空间和网络带宽
  • 自动备份验证
  • 更快的恢复时间可延长正常运行时间

Percona xtrabackup提供以下功能:

  • 创建InnoDB热备份而不会暂停数据库
  • 进行MySQL的增量备份
  • 将压缩的MySQL备份流式传输到另一台服务器
  • 在线在MySQL服务器之间移动表
  • 轻松创建新的MySQL复制副本
  • 备份MySQL而不增加服务器负载

Percona xtrabackup备份原理

Percona xtrabackup基于InnoDB的故障恢复(crash-recovery )功能。它会复制您的InnoDB数据文件,从而导致数据内部不一致;但随后它将对文件执行故障恢复,以使它们再次成为一致的可用数据库。

之所以可行,是因为InnoDB维护redo日志,也称为事务日志。这包含对InnoDB数据的每次更改的记录。当InnoDB 启动时,它将检查数据文件和事务日志,并执行这两个步骤。它将已提交的事务日志条目应用于数据文件,并对已修改数据但未提交的所有事务执行撤消(undo)操作。

Percona xtrabackup的工作方式是在启动时记住日志序列号(LSN),然后复制数据文件。这需要一些时间。因此,如果文件正在更改,则它们会在不同的时间点反映数据库的状态。同时,Percona xtrabackup运行一个后台进程监视事务日志文件,并从中复制更改的数据。Percona xtrabackup需要连续执行此操作,因为事务日志以循环方式编写,并且可以在一段时间后重新使用。自开始执行以来,Percona xtrabackup需要对数据文件的每次更改都具有事务日志记录。

Percona xtrabackup将在可用的情况下使用备份锁(Percona Server for MySQL 5.6+中提供了此功能)替代FLUSH TABLES WITH READ LOCK。Percona xtrabackup使用此功能自动复制非InnoDB数据,以避免阻止修改InnoDB表的DML查询。当服务器支持备份锁时, xtrabackup 将首先复制InnoDB数据,运行LOCK TABLES FOR BACKUP并复制MyISAM表和.frm文件。完成此操作后,将开始文件备份。它将备份.frm,.MRG,.MYD,.MYI,.TRG,.TRN, .ARM,.ARZ,.CSM,.CSV,.par和.opt的格式文件。

之后 xtrabackup 将使用LOCK BINLOG FOR BACKUP阻止可能发生变化的二进制日志位置,或者通过SHOW MASTER/SLAVE STATUS报道Exec_Master_Log_Pos操作 或者Exec_Gtid_Set操作(即源的二进制日志坐标对应于复制副本当前SQL线程状态)。然后,**xtrabackup**将完成REDO日志文件的复制,并获取二进制日志坐标。完成此操作后, **xtrabackup**将解锁二进制日志和表。

最后,二进制日志位置将被打印到STDERR, xtrabackup 如果一切正常将退出并返回0。

Percona xtrabackup增量备份原理

无论 xtrabackupinnobackupex 工具支持增量备份,这意味着它们可以只复制自上次备份以来发生变化的数据。

您可以在每个完整备份之间执行许多增量备份,因此您可以设置备份过程,例如每周一次完整备份和每天增量备份,或者每天完整备份和每小时增量备份。

增量备份之所以有效,是因为每个InnoDB页面都包含一个日志序列号或LSN。该LSN是整个数据库系统的版本号。每个页面的LSN都显示了最近的更改时间。

增量备份复制其LSN比先前的增量或完全备份的LSN更新的每个页面。有两种算法用于查找要复制的此类页面集。第一个可用于所有服务器类型和版本的服务器是通过读取所有数据页直接检查LSN页。Percona Server for MySQL中提供的第二个功能是启用服务器上已更改的页面跟踪功能,该功能将在更改页面时记录下来。然后将这些信息写在一个紧凑的单独的所谓的位图文件中。该 xtrabackup 二进制文件将使用该文件来读取增量备份所需的数据页,从而可能保存许多读取请求。如果 xtrabackup 二进制文件找到了位图文件,则默认情况下启用后一种算法。即使位图数据可用,也可以指定读取(xtrabackup --incremental-force-scan)所有页面。

Percona xtrabackup恢复原理

要使用 xtrabackup 恢复备份,可以使用xtrabackup --copy-backxtrabackup --move-back

xtrabackup 将从my.cnf读取datadir, InnoDB_data_home_dir,InnoDB_data_file_path,InnoDB_log_group_home_dir变量并检查目录是否存在。

首先将复制的MyISAM表,索引等(.frm, .MRG,.MYD,.MYI,.TRG,.TRN,.ARM,.ARZ,.CSM,.CSV,.par和 .opt),其次复制InnoDB的表和索引,最后是日志文件。在复制文件时,它将保留文件的属性,您可能需要在启动数据库之前将文件的所有权更改MySQL,因为它
们由创建备份的用户拥有。

或者使用xtrabackup --move-back选项可用于还原备份,此选项类似于xtrabackup --copy-back, 唯一的区别在于,它不是复制文件,而是将文件移动到目标位置。由于此选项将删除备份文件,因此必须谨慎使用。在没有足够的可用磁盘空间来容纳数据文件及其备份副本的情况下,此选项很有用。

二、Percona xtrabackup的安装

由于我们的服务器大部分为无法连接公网,因此需要下载RPM包进行安装,该章节内容是基于el7安装。

下载RPM包,并上传到目标服务器

1
https://www.percona.com/downloads/Percona-xtrabackup-2.4/Percona-xtrabackup-2.4.21/binary/redhat/7/

安装时可能会遇到缺少包的问题,本次实验过程中缺少了libev 、perl:DBD::MySQL、perl::Digest::MD

下载libev-4.15-7.el7.x86_64.rpm并执行如下命令完成安装

1
2
3
yum install perl-DBD-MySQL
yum install perl-Digest-MD5
rpm -ivh libev-4.15-7.el7.x86_64.rpm

继续安装percona-xtrabackup

1
yum install percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm

安装完成,将增加如下可用命令

1
2
3
4
innobackupex
xbcrypt
xbstream
xtrabackup

主要使用的是innobackupexxtrabackup命令。

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

xbcrypt 是加解密用的;xbstream 类似于tar,是 Percona 自己实现的一种支持并发写的流文件格式。两都在备份和解压时都会用到(如果备份用了加密和并发)。

备份时innobackupexxtrabackup交互和协调过程

innobackupex和xtrabackup交互和协调过程

  1. innobackupex 在启动后,会先 fork 一个进程,启动 xtrabackup进程,然后就等待xtrabackup 备份完 ibd 数据文件;

  2. xtrabackup 在备份 InnoDB 相关数据时,是有2种线程的,1种是 redo 拷贝线程,负责拷贝 redo 文件,1种是 ibd 拷贝线程,负责拷贝 ibd 文件;redo 拷贝线程只有一个,在ibd 拷贝线程之前启动,在 ibd 线程结束后结束。xtrabackup 进程开始执行后,先启动redo 拷贝线程,从最新的 checkpoint 点开始顺序拷贝 redo 日志;然后再启动 ibd 数据拷贝线程,在 xtrabackup 拷贝 ibd 过程中,innobackupex 进程一直处于等待状态(等待文件被创建)。

  3. xtrabackup 拷贝完成idb后,通知 innobackupex(通过创建文件),同时自己进入等待(redo 线程仍然继续拷贝);

  4. innobackupex 收到 xtrabackup 通知后,执行FLUSH TABLES WITH READ LOCK (FTWRL),取得一致性位点,然后开始备份非 InnoDB 文件(包括 frm、MYD、MYI、CSV、opt、par等)。拷贝非 InnoDB 文件过程中,因为数据库处于全局只读状态,如果在业务的主库备份的话,要特别小心,非 InnoDB 表(主要是MyISAM)比较多的话整库只读时间就会比较长,这个影响一定要评估到。

  5. innobackupex 拷贝完所有非 InnoDB 表文件后,通知 xtrabackup(通过删文件) ,同时自己进入等待(等待另一个文件被创建);

  6. xtrabackup 收到 innobackupex 备份完非 InnoDB 通知后,就停止 redo 拷贝线程,然后通知 innobackupexredo log 拷贝完成(通过创建文件);

  7. innobackupex 收到 redo 备份完成通知后,就开始解锁,执行 UNLOCK TABLES;

  8. 最后 innobackupexxtrabackup 进程各自完成收尾工作,如资源的释放、写备份元数据信息等,innobackupex 等待 xtrabackup 子进程结束后退出。

三、备份和恢复

全量备份

要创建备份,使用xtrabackup --backup 该选项运行 xtrabackup 。您还需要指定一个xtrabackup --target-dir选项,即备份的存储位置,如果InnoDB数据或日志文件未存储在同一目录中,则可能还需要指定这些文件的位置。如果目标目录不存在,则 xtrabackup 会创建它。如果该目录确实存在并且为空,则 xtrabackup 将成功。如果存在文件,xtrabackup 不会覆盖现有文件,它显示操作系统错误17并失败。

备份命令

1
innobackupex --defaults-file=/opt/MySQL/my.cnf --user=root --password=*** /backup/MySQL/data

该语句将拷贝数据文件(由my.cnf里的变量datadir指定)至备份目录下(/backup/MySQL/data),注意:如果不指定–defaults-file,默认值为/etc/my.cnf。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
160906 10:19:17 Finished backing up non-InnoDB tables and files
160906 10:19:17 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '62988944'
xtrabackup: Stopping log copying thread.
.160906 10:19:18 >> log scanned up to (137343534)
160906 10:19:18 Executing UNLOCK TABLES
160906 10:19:18 All tables unlocked
160906 10:19:18 Backup created in directory '/backup/MySQL/data'
160906 10:19:18 [00] Writing backup-my.cnf
160906 10:19:18 [00]       ...done
160906 10:19:18 [00] Writing xtrabackup_info
160906 10:19:18 [00]       ...done
xtrabackup: Transaction log of lsn (26970807) to (137343534) was copied.
160906 10:19:18 completed OK!

您应该看到的最后一行显示类似于以下内容,其中的值LSN将是一个取决于您的系统的数字:

1
xtrabackup: Transaction log of lsn (<SLN>) to (<LSN>) was copied.

备份成功后,将在备份目录下创建一个时间戳目录(本例创建的目录为/backup/MySQL/data/2021-03-17_09-05-25),在该目录下存放备份文件。

准备备份

使用该选项xtrabackup --backup进行备份后,首先需要准备它以进行还原。在准备好数据文件之前,它们在时间点上是不一致的,因为它们是在程序运行时在不同的时间复制的,并且在此过程中它们可能已被更改。如果您尝试使用这些数据文件启动InnoDB,它将检测到损坏并自身崩溃,以防止您在损坏的数据上运行。该步骤xtrabackup --prepare可以使文件在单个时间瞬间完全一致,因此您可以在它们上运行InnoDB

在prepare操作过程中, xtrabackup会 启动一种嵌入其中的经过修改的InnoDB(与之链接的库)。必须进行这些修改才能禁用InnoDB的标准安全检查,例如比较日志文件的大小不合适,这不适用于备份。这些修改仅适用于xtrabackup二进制文件;您不需要修改的InnoDB即可使用xtrabackup 进行备份。

prepare步骤使用嵌入式InnoDB使用复制的日志文件对复制的数据文件执行故障恢复。该prepare步骤非常简单:您只需运行xtrabackup --prepare选项并告诉它要准备的目录,例如:

1
xtrabackup --prepare --target-dir=/data/backups/

完成此操作后,您应该看到带有InnoDB shutdown以下消息的,其中LSN的值再次取决于您的系统。

1
2
InnoDB: Shutdown completed; log sequence number 137345046
160906 11:21:01 completed OK!

不建议在准备备份时中断xtrabackup过程,因为这可能会导致数据文件损坏并且备份将变得不可用。如果准备过程中断,则不能保证备份的有效性。

恢复

1
2
innobackupex --defaults-file=/opt/MySQL/my.cnf --user=root --password=*** --use-memory=4G --apply-log /backup/MySQL/data/2021-03-17_09-05-25
innobackupex --defaults-file=/opt/MySQL/my.cnf --user=root --password=*** --copy-back /backup/MySQL/data/2021-03-17_09-05-2

恢复分为两个步骤,第1步是apply-log,为了加快速度,一般建议设置–use-memory,这个步骤完成之后,目录/backup/MySQL/data/2021-03-17_09-05-25下的备份文件已经准备就绪。

第2步是copy-back,即把备份文件拷贝至原数据目录下。

恢复完成之后,一定要记得检查数据目录的所有者和权限是否正确。

增量备份

注意:innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备。

增量备份需要基于全量备份, xtrabackup 备份时写入一个名为xtrabackup_checkpoints到备份的目标目录。该文件包含一行显示 to_lsn,这是备份结束时数据库的LSN。全备的信息如下:

1
2
3
4
backup_type = full-backuped
from_lsn = 0
to_lsn = 563759005914
last_lsn = 563759005914

假设我们已经有了一个全备(/backup/MySQL/data/2021-03-17_09-05-25)。

1
innobackupex --defaults-file=/opt/MySQL/my.cnf --user=root --password=*** --incremental-basedir=/backup/MySQL/data/2021-03-17_09-05-25 --incremental /backup/MySQL/data

其中–incremental-basedir指向全备目录,–incremental指向增量备份的目录。

上面语句执行成功之后,会在–incremental执行的目录下创建一个时间戳子目录(本例中为:/backup/MySQL/data/2021-03-17_09-52-37),在该目录下存放着增量备份的所有文件。

基于该全备的增量备份的信息如下:

1
2
3
4
backup_type = incremental
from_lsn = 563759005914
to_lsn = 574765133284
last_lsn = 574765133284

从上面可以看出,增量备份的from_lsn正好等于全备的to_lsn。

那么,我们是否可以在增量备份的基础上再做增量备份呢?答案是肯定的,只要把–incremental-basedir执行上一次增量备份的目录即可,如下所示:

1
innobackupex --defaults-file=/opt/MySQL/my.cnf  --user=root --password=*** --incremental-basedir=/backup/MySQL/data/2021-03-17_09-52-37 --incremental /backup/MySQL/data

它的xtrabackup_checkpoints记录着备份信息如下:

1
2
3
4
backup_type = incremental
from_lsn = 574765133284
to_lsn = 574770200380
last_lsn = 574770200950

可以看到,该增量备份的from_lsn是从上一次增量备份的to_lsn开始的。

准备增量备份

增量备份的xtrabackup --prepare步骤与完全备份的步骤不同。在完全备份中,将执行两种类型的操作以使数据库保持一致:已提交的事务相对于数据文件从日志文件中重放,未提交的事务被回滚。在准备增量备份时,必须跳过未提交事务的回滚,因为在备份时未提交的事务可能正在进行中,并且很有可能将在下一个增量备份中提交。您应该使用该xtrabackup --apply-log-only选项来防止回滚阶段。

要准备基本备份,您需要照常运行xtrabackup --prepare,但要防止回滚阶段:

1
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base

输出应以类似于以下内容的文本结尾:

1
2
InnoDB: Shutdown completed; log sequence number 1626007
161011 12:41:04 completed OK!

要将第一个增量备份应用于完整备份,请运行以下命令:

1
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base --incremental-dir=/data/backups/inc1

这会将增量文件应用于中的文件/data/backups/base,从而将它们及时向前滚动到增量备份的时间。然后,它像往常一样将重做日志应用于结果。最终数据在中 /data/backups/base,而不在增量目录中。您应该看到类似于以下内容的输出:

1
2
3
4
5
6
7
8
9
incremental backup from 1626007 is enabled.
xtrabackup: cd to /data/backups/base
xtrabackup: This target seems to be already prepared with --apply-log-only.
xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(4124244)
...
xtrabackup: page size for /tmp/backups/inc1/ibdata1.delta is 16384 bytes
Applying /tmp/backups/inc1/ibdata1.delta to ./ibdata1...
...
161011 12:45:56 completed OK!

增量备份恢复

增量备份的恢复比全备要复杂很多,第一步是在所有备份目录下重做已提交的日志,如:

1
2
3
innobackupex --apply-log --redo-only BASE-DIR
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

其中BASE-DIR是指全备目录,INCREMENTAL-DIR-1是指第一次的增量备份,INCREMENTAL-DIR-2是指第二次的增量备份,以此类推。

这里要注意的是:最后一步的增量备份并没有–redo-only选项!还有,可以使用–use_memory提高性能。

以上语句执行成功之后,最终数据在BASE-DIR(即全备目录)下。

第一步完成之后,我们开始第二步,回滚未完成的日志:

1
innobackupex --apply-log BASE-DIR

上面执行完之后,BASE-DIR里的备份文件已完全准备就绪,最后一步是拷贝:

1
innobackupex --copy-back BASE-DIR

同样地,拷贝结束之后,记得检查下数据目录的权限是否正确。

四、自动备份脚本

全量脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/bash
# set -e
# 1.声明数据库账号信息等
user=root
password=Root@123
LEAVE_DAY_AGO=$(date -d "-30 day" +'%s')
# 2.动态创建备份文件的临时存储目录
[ -d /home/ap/backupdb ] || mkdir -p /home/ap/backupdb &>>/home/ap/backupdb/backupdb_log.log
[ -d /home/ap/backup_data/db ] || mkdir -p /home/ap/backup_data/db &>>/home/ap/backupdb/backupdb_log.log
echo "start copying ..." &>>/home/ap/backupdb/backupdb_log.log
# 3.执行备份命令开始数据备份
/usr/bin/innobackupex --user="$user" --password="$password" /home/ap/backup_data/db >/home/ap/backupdb/backupdb_log.log 2>&1
# 4. 校验备份结果是否通过
if [ "$?" != "0" ]; then
# 4.2 备份失败
echo " backup db error !" &>>/home/ap/backupdb/backupdb_log.log
exit 1
else
# 4.2 备份成功
echo " end copied! ..." &>>/home/ap/backupdb/backupdb_log.log
echo $(ls -lt /home/ap/backup_data/db | grep - | head -n 1 | awk '{print $9}') >/home/ap/backup_data/last_backup_dir_name
fi
# 5. 删除 ${LEAVE_DAY_AGO} 天前的备份目录及子目录、文件
path="/home/ap/backup_data/db"
files=$(ls $path)
for filename in $files; do
file=(${filename:0:10})
if
echo $file | grep -Eq "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}" && date -d $file+%Y%m%d >/dev/null 2>&1
then
echo $filename 'format is right date' &>>/home/ap/backupdb/backupdb_log.log
file_time=$(date -d $file +'%s')
#校验备份记录是否已过期
if [$file_time -lt $LEAVE_DAY_AGO ]; then
rm -rf $path/$filename*
echo " remove $filename directory " &>>/home/ap/backupdb/backupdb_log.log
else
echo "$filename is valid backup directory" &>>/home/ap/backupdb/backupdb_log.log
fi
else
echo "date format is invalid" $filename &>>/home/ap/backupdb/backupdb_log.log
fi
done

增量脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash
# set -e
# 1.声明数据库账号信息等
user=root
password=Root@123
LEAVE_DAY_AGO=$(date -d "-30 day" +'%s')
# 2.动态创建临时文件临时存储目录
[ -d /home/ap/backupdb ] || mkdir -p /home/ap/backupdb
&>>/home/ap/backupdb/backupdb_increment_log.log
[ -d /home/ap/backup_data/db/increment ] || mkdir -p
/home/ap/backup_data/db/increment &>>/home/ap/backupdb/backupdb_increment_log.log
echo "increment start copying ..." &>>/home/ap/backupdb/backupdb_increment_log.log
# 3.搜素并获取上一次全量备份的目录地址
last_backup_dir_name=$(cat /home/ap/backup_data/last_backup_dir_name)
# 4.执行备份命令开始数据备份
/usr/bin/innobackupex --user="$user" --password="$password" --incremental \
/home/ap/backup_data/db/increment/ --incremental-basedir \
/home/ap/backup_data/db/"$last_backup_dir_name" \
> /home/ap/backupdb/backupdb_increment_log.log 2>&1
# 5.校验备份结果是否超过
if [ "$?" != "0" ]; then
# 4.2 备份失败
echo " increment backup db error !" &>>/home/ap/backupdb/backupdb_increment_log.log
exit 1
else
# 4.2 备份成功
echo "increment end copied! ..." &>>/home/ap/backupdb/backupdb_increment_log.log
fi
# 6. 删除 ${LEAVE_DAY_AGO} 天前的备份目录及子目录、文件
path="/home/ap/backup_data/db/increment"
files=$(ls $path)
for filename in $files; do
file=(${filename:0:10})
if
echo $file | grep -Eq "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}" && date -d $file+%Y%m%d >/dev/null 2>&1
then
echo $filename 'format is right date' &>>/home/ap/backupdb/backupdb_increment_log.log
file_time=$(date -d $file +'%s')
#校验备份记录是否已过期
if [$file_time -lt $LEAVE_DAY_AGO ]; then
rm -rf $path/$filename*
echo " remove $filename directory " &>>/home/ap/backupdb/backupdb_increment_log.log
else
echo "$filename is valid backup directory" &>>/home/ap/backupdb/backupdb_increment_log.log
fi
else
echo "date format is invalid" $filename &>>/home/ap/backupdb/backupdb_increment_log.log
fi
done

设置crontab 调度执行 crontab -e

1
2
3
4
# 每周一凌晨4点执行全量备份
0 4 * * 1 sh /home/ap/backupdb/db_backup.sh >>/home/ap/backupdb/backupdb_log.log
# 每天凌晨2点执行增量备份
0 2 * * * sh /home/ap/backupdb/db_backup_increment.sh >>/home/ap/backupdb/backupdb_increment_log.log