mysql备份恢复工具Percona XtraBackup使用教程

XtraBackup是备份MySQL最流行的解决方案之一,这是有充分理由的。它支持非常灵活的配置,包括备份压缩、文件加密等。

一、XtraBackup快速使用

InnoDB是一个崩溃安全的存储引擎。如果MySQL发生崩溃,它会使用基于重做日志(redo log)的崩溃恢复模式来恢复正确的数据。

Percona XtraBackup也是基于这种设计的。当使用Percona XtraBackup进行备份时,它会记录日志序列号(LSN),并使用该序列号对备份文件执行崩溃恢复。它还会在一些特定的时刻锁定实例,以确保与复制相关的信息准确无误。

Percona XtraBackup (简称XtraBackup) 的安装和使用主要分为安装、准备、备份、恢复几个步骤。下表完整概括了其核心使用流程:

步骤 核心任务与命令 关键说明
一、安装与准备 1. 选择版本 :根据MySQL版本选择XtraBackup版本。 2. 创建用户:在MySQL中创建专用备份用户并授权。 版本必须匹配,否则可能失败。
二、执行全量备份 xtrabackup --backup --target-dir=/path/to/backup --user=backup_user --password 备份数据至--target-dir指定目录。
三、准备备份 xtrabackup --prepare --target-dir=/path/to/backup 必需步骤,使备份数据一致且可用于恢复。
四、恢复备份 1. 停止MySQLsystemctl stop mysql 2. 清空数据目录 3. 执行恢复xtrabackup --copy-back --target-dir=/path/to/backup 4. 修改权限chown -R mysql:mysql /var/lib/mysql 5. 启动MySQLsystemctl start mysql 恢复前需确保MySQL已停止,且数据目录为空。

下面是各步骤的具体操作指南。

(一)安装与前期准备

这是最关键的一步,直接影响后续操作的成功。

1. 版本选择与安装

必须根据你的MySQL主版本号选择对应的XtraBackup大版本。安装通常通过系统包管理器进行。

  • MySQL 5.6 及以前 :安装 Percona XtraBackup 2.3
  • MySQL 5.7 :安装 Percona XtraBackup 2.4
  • MySQL 8.0 :安装 Percona XtraBackup 8.0

注:XtraBackup 8.0已整合了旧版innobackupex工具的所有功能,现在主要使用 xtrabackup 命令。

官方链接地址:http://www.percona.com/software/percona-xtrabackup;可以下载源码编译安装,也可以下载适合的 RPM 包或使用 yum 进行安装或者下载二进制源码包。

(1)下载压缩包方式安装

可以下载压缩包的方式进行安装

bash 复制代码
# 下载 xtrabackup
wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.27/binary/tarball/percona-xtrabackup-2.4.27-Linux-x86_64.glibc2.12.tar.gz
# 解压
tar xvf percona-xtrabackup-2.4.27-Linux-x86_64.glibc2.12.tar.gz
# 进入解压目录
cd percona-xtrabackup-2.4.4-Linux-x86_64/
# 复制 bin 下的所有程序到/usr/bin
cp bin/* /usr/bin/
# 安装相关插件
yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey.x86_64 perl-Digest-MD5 --y
# 下载 percona-toolkit 并安装
wget https://www.percona.com/downloads/percona-toolkit/2.2.19/RPM/percona-toolkit-2.2.19-1.noarch.rpm
# rpm -vih percona-toolkit-2.2.19-1.noarch.rpm
(2)包管理器方式安装(推荐)

但是最简单、最推荐的方法还是使用包管理器方式安装。

bash 复制代码
# 添加 Percona 官方软件源
sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm -y
# 启用对应仓库
percona-release enable-only tools release
# 选择你安装的版本:
# 对应 MySQL 8.0
sudo yum install percona-xtrabackup-80 -y  
# 适用于5.7
sudo yum install percona-xtrabackup-24 -y   
# 通常安装2.3版,适用于5.6
sudo yum install percona-xtrabackup -y     
(3)验证安装

安装完成后,通过以下命令验证:

bash 复制代码
xtrabackup --version

2.配置数据库备份用户

为安全起见,强烈建议在MySQL中创建一个专用用户用于备份:

它有以下好处:

  • 最小权限原则:备份用户只需必要的权限,防止在备份脚本获取root用户误删数据库
  • 审计追踪:专用用户便于监控备份操作
  • 责任分离:避免使用高权限的管理员账户进行日常备份
sql 复制代码
# 创建专用备份用户
CREATE USER 'backupuser'@'localhost' IDENTIFIED BY 'YourStrongPassword';
# 授予必要权限
GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backupuser'@'localhost';
# 授予状态信息查询权限
GRANT SELECT ON performance_schema.* TO 'backupuser'@'localhost';
# MySQL 8.0+ 额外需要的权限
GRANT BACKUP_ADMIN ON *.* TO 'backupuser'@'localhost';
# 刷新权限
FLUSH PRIVILEGES;

权限说明:

权限 用途
RELOAD 执行FLUSH TABLES等操作
LOCK TABLES 锁定表以确保一致性
PROCESS 查看当前运行的线程
REPLICATION CLIENT 获取二进制日志位置
BACKUP_ADMIN (8.0+) 执行LOCK INSTANCE FOR BACKUP
SELECT (特定库) 访问需要备份的数据库

(二)执行全量备份

使用 --backup 选项执行备份。以下是一个基本命令示例:

bash 复制代码
xtrabackup --backup --target-dir=/data/backups/full_backup --user=backupuser --password=YourStrongPassword

备份完成后,如果看到 completed OK! 的提示,说明备份成功。

1.xtrabackup常用参数

这里附上xtrabackup常用参数:

bash 复制代码
--user:指定连接数据库的用户名。
--password:指定连接数据库的密码。
--backup:执行备份操作。
--prepare:执行备份准备操作。
--copy-back:将备份恢复到原来的数据目录。
--datadir:指定数据目录的路径。
--target-dir:指定备份文件存储目录。
--incremental:执行增量备份操作。
--incremental-lsn:指定增量备份的LSN号。
--tables:仅备份特定的表。
--databases:仅备份特定的数据库。
--compress:压缩备份文件。#开启备份压缩,根据数据内容不同,压缩比可以在50%~60%
--stream=xbstream #开启流式备份,备份出来的数据输出到stdout
--remote-host=user@ip DST_DIR #备份到远程主机

2.MySQL数据目录文件和目录解释

一般来说备份成功会出现下列目录或文件。

bash 复制代码
-rw-r----- 1 root root      487 1月  26 08:48 backup-my.cnf
-rw-r----- 1 root root      436 1月  26 08:48 ib_buffer_pool
-rw-r----- 1 root root 79691776 1月  26 08:48 ibdata1
drwxr-x--- 2 root root     4096 1月  26 08:48 mysql
drwxr-x--- 2 root root     8192 1月  26 08:48 performance_schema
drwxr-x--- 2 root root     8192 1月  26 08:48 sys
drwxr-x--- 2 root root       72 1月  26 08:48 your_database
-rw-r----- 1 root root      141 1月  26 08:48 xtrabackup_checkpoints
-rw-r----- 1 root root      461 1月  26 08:48 xtrabackup_info
-rw-r----- 1 root root     2560 1月  26 08:48 xtrabackup_logfile

配置文件备份

backup-my.cnf:MySQL配置文件(my.cnf)的备份文件。MySQL的配置文件通常位于/etc/my.cnf,这个文件是它的备份,用于在配置修改出错时恢复。

InnoDB系统文件

ibdata1:InnoDB存储引擎的系统表空间文件。这是InnoDB的核心文件,包含:

  • 数据字典(存储表结构信息)
  • 回滚段(用于事务回滚)
  • 未提交的更改
  • 系统表空间的其他数据

ib_buffer_pool:InnoDB缓冲池的快照文件。InnoDB缓冲池是存储引擎的内存区域,用于缓存表数据和索引,这个文件保存了缓冲池的快照,用于快速恢复。

系统数据库

mysql :存储MySQL系统数据库的数据文件和元数据文件。这个数据库包含:

  • 用户权限表(user, db等)
  • 系统变量
  • 存储系统级元数据信息

performance_schema:存储性能监控和诊断相关的数据文件和元数据。这个数据库提供MySQL服务器的性能指标,用于监控和诊断性能问题。

sys :存储系统级别的元数据信息。这个数据库提供更易读的视图,用于监控和分析MySQL性能。

XtraBackup备份相关文件

xtrabackup_checkpoints :XtraBackup备份工具的检查点信息文件。记录了备份的检查点位置,用于增量备份。
xtrabackup_info:XtraBackup备份工具的信息文件,包含备份的详细信息,如备份时间、备份类型等。
xtrabackup_logfile:XtraBackup备份工具的日志文件,记录备份过程的详细信息。

(三)准备备份

我们使用XtraBackup进行备份时,备份的数据文件并不是完全一致的,因为备份过程中可能还有事务在进行,所以备份的数据文件可能包含未提交的事务或者已经提交但还没有应用到数据页上的事务。

因此,我们需要通过"准备"阶段来恢复数据的一致性,使得备份的数据文件达到一个一致的状态,可以用于恢复。

下面是执行命令:

bash 复制代码
xtrabackup --prepare --target-dir=/data/backups/full_backup

注意必须先backup之后再prepare,因为prepare操作的对象是备份文件,所以这里必须有--target-dir的值。

1.原理解释

xtrabackupprepare过程类似于给集体拍照:

  • 摄影师:开始拍照!(开始备份)
  • 张三突然转头看旁边(事务日志)
  • 照片拍完了(备份完成)
  • 结果:照片中张三是模糊的(数据不一致)
  • prepare就像:用PS把张三的脸P正(应用重做日志)
  • 最终:得到一张完美的集体照(一致性备份)

具体来说,xtrabackup --prepare命令的作用是:

  • 应用重做日志 (redo log):将备份过程中产生的重做日志应用到数据页上,确保数据页包含所有已提交的更改。这个日志在xtrabackup_logfile文件上。

  • 回滚未提交的事务:由于备份可能包含未提交的事务,这些事务需要被回滚,以保证数据的一致性。

在准备阶段,XtraBackup会模拟InnoDB的恢复过程,类似于MySQL启动时的崩溃恢复。这个过程使得备份的数据文件达到一个"一致点",即所有已提交的事务都被应用,未提交的事务都被回滚。

如果不进行prepare,那么备份的数据文件可能处于不一致的状态,直接用于恢复可能会导致数据损坏或无法启动。

2.误区澄清

注意在prepare阶段,我们并不需要MySQL服务器运行,甚至于mysql软件可以被删,因为prepare是在备份文件上进行的操作

它同步事务日志不是靠本地数据库的日志,而是在xtrabackup_logfile文件上的日志。该日志会记录从备份开始到备份结束中发生的事务的变动。

因此,可以将备份文件压缩后传输到远程备份服务器。若远程备份服务器安装了xtrabackup工具,也可自行prepare操作应用事务日志的变化。不需要在原数据库服务器进行prepare操作。

  • 对于全量备份,我们只需要在一个备份目录上运行一次prepare。

  • 对于增量备份,我们需要先对基础全量备份进行prepare(但是使用--apply-log-only,并且不提交事务),然后将增量备份应用到基础备份上,最后再统一进行prepare。

(四)恢复备份

恢复过程涉及将备份文件复制回MySQL的数据目录。

1.恢复步骤

(1)停止MySQL服务
bash 复制代码
systemctl stop mysql
# 或
service mysql stop
(2)清空或移走原数据目录
bash 复制代码
# 备份原有数据目录
mv /var/lib/mysql /var/lib/mysql_old_$(date +%Y%m%d)

# 或重命名
mv /var/lib/mysql /var/lib/mysql_backup
(3)执行恢复命令
bash 复制代码
xtrabackup --copy-back --target-dir=/data/backups/full_backup --datadir=/var/lib/mysql
(4)修改文件权限

恢复的文件可能属主不对,需更改。

bash 复制代码
chown -R mysql:mysql /var/lib/mysql
(5)启动MySQL服务
bash 复制代码
systemctl start mysql

(五)备份恢复实际使用案例

1.准备数据

创建一个数据库表

sql 复制代码
-- 1. 无索引的表(基准对照)
CREATE TABLE users_no_index (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50),
    email VARCHAR(100),
    age INT,
    city VARCHAR(50),
    created_at DATETIME,
    salary DECIMAL(10, 2),
    is_active BOOLEAN
);

批量插入数据(100万条):

sql 复制代码
-- 删除原有存储过程(如果存在)
DROP PROCEDURE IF EXISTS generate_test_data_optimized;
--- 声明插入函数
DELIMITER $$
CREATE PROCEDURE generate_test_data_optimized(IN num_rows INT)
BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE batch_size INT DEFAULT 1000;
    DECLARE current_batch INT DEFAULT 0;
    DECLARE batch_count INT DEFAULT 0;
    DECLARE sql_stmt LONGTEXT DEFAULT '';
    DECLARE start_time BIGINT DEFAULT UNIX_TIMESTAMP();
    
    -- 关闭自动提交,使用事务
    SET autocommit = 0;
    SET unique_checks = 0;
    SET foreign_key_checks = 0;
    
    -- 计算批次
    SET batch_count = CEIL(num_rows / batch_size);
    SET i = 0;
    
    -- 批次循环
    WHILE current_batch < batch_count DO
        -- 重置SQL语句
        SET sql_stmt = CONCAT('INSERT INTO users_no_index VALUES ');
        
        -- 构建一批数据
        SET @batch_values = '';
        WHILE i < (current_batch + 1) * batch_size AND i < num_rows DO
            -- 构建单行数据
            SET @row_value = CONCAT(
                IF(@batch_values = '', '', ','),
                '(',
                'NULL, ',
                CHAR(39), 'user_', FLOOR(RAND() * 100000), CHAR(39), ', ',
                CHAR(39), 'email_', FLOOR(RAND() * 100000), '@test.com', CHAR(39), ', ',
                FLOOR(18 + (RAND() * 62)), ', ',
                CHAR(39), ELT(FLOOR(1 + RAND() * 10), '北京','上海','广州','深圳','杭州','成都','武汉','南京','西安','重庆'), CHAR(39), ', ',
                'DATE_SUB(NOW(), INTERVAL ', FLOOR(RAND() * 365*5), ' DAY), ',
                ROUND(3000 + (RAND() * 15000), 2), ', ',
                IF(RAND() > 0.3, 1, 0),
                ')'
            );
            
            -- 添加到批次值
            SET @batch_values = CONCAT(@batch_values, @row_value);
            SET i = i + 1;
        END WHILE;
        
        -- 合并SQL语句
        SET sql_stmt = CONCAT(sql_stmt, @batch_values);
        
        -- 执行插入
        SET @dynamic_sql = sql_stmt;
        PREPARE stmt FROM @dynamic_sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        
        -- 每10个批次提交一次
        IF current_batch % 10 = 0 THEN
            COMMIT;
        END IF;
        
        SET current_batch = current_batch + 1;
    END WHILE;
    
    -- 最终提交
    COMMIT;
    
    -- 恢复设置
    SET autocommit = 1;
    SET unique_checks = 1;
    SET foreign_key_checks = 1;
    
END$$
DELIMITER ;

-- 执行数据生成
CALL generate_test_data_optimized(1000000);

数据准备完成后大概有100万条数据

统计数值总和方便后续验证

sql 复制代码
select sum(salary) from users_no_index;
-- 10499719519.05

2.备份数据

bash 复制代码
# 备份数据
xtrabackup --backup --target-dir=/data/backups/full_backup --user=backupuser --password=YourStrongPassword
# 准备数据
xtrabackup --prepare --target-dir=/data/backups/full_backup

3.删除数据

连上mysql后模拟删除数据

sql 复制代码
# 删除该表的数据
truncate users_no_index;

重新执行查询语句,可以看到是没数据的。

4.恢复数据

接着我们开始恢复数据。

bash 复制代码
# 停止mysql服务
systemctl stop mysql
# 将原有数据目录重命名
mv /var/lib/mysql /var/lib/mysql_old_$(date +%Y%m%d)
# 执行恢复命令
xtrabackup --copy-back --target-dir=/data/backups/full_backup --datadir=/var/lib/mysql
# 更改文件目录权限
chown -R mysql:mysql /var/lib/mysql
# 启动mysql服务
systemctl start mysql

执行完毕后,再查询,可以看到数据恢复了。

统计数值也与之前一样,说明每行都没出错。

sql 复制代码
select sum(salary) from users_no_index;
-- 10499719519.05

二、进阶使用技巧

(一)常用技巧

1.多线程备份

是否应该使用多线程备份?建议使用,但需从低并发度开始,并严格监控。

使用多线程(--parallel)能显著缩短备份时间,从而减少备份窗口对业务的影响。但它确实会瞬时增加对系统资源的消耗。

主要体现在CPU (处理并行任务)和I/O(并发读取数据文件)上。如果数据库由大量小表组成,提升效果明显;如果主要是少数巨型单表,则提升有限。

bash 复制代码
# 使用4个线程进行备份
xtrabackup --backup  --target-dir=/path/to/backup --parallel=4

2.压缩

是否应该进行压缩?如果网络带宽或存储空间是瓶颈,则开启压缩;如果CPU是瓶颈,则避免压缩。

压缩是一个典型的 "用CPU时间换取磁盘/网络空间" 的操作。

bash 复制代码
# 默认使用quicklz算法进行压缩,若使用mysql8.0以上数据库,也可使用zstd算法在压缩速度和效率上平衡较好。可使用 --compress=zstd,压缩后的文件扩展名通常是 .qp(quicklz)或 .zst(zstd)。
xtrabackup --backup --target-dir=/path/to/compressed_backup --compress

# 若同时使用并行处理和压缩,这里使用4线程并行备份,同时用2线程并行进行压缩,适合需要快速完成备份并节省存储空间的场景。
xtrabackup --backup \
  --target-dir=/path/to/backup \
  --parallel=4 \
  --compress \
  --compress-threads=2

# 解压缩备份文件,--remove-original意思是解压后删除原文件
xtrabackup --decompress --target-dir=/path/to/compressed_backup --remove-original
# 解压缩有可能失败,因为未安装解压缩工具
yum install -y qpress

# 解压缩后需要prepare再进行恢复
xtrabackup --prepare --target-dir=/path/to/compressed_backup
# 将备份文件复制到MySQL数据目录(假设已经清空)
xtrabackup --copy-back --target-dir=/path/to/compressed_backup

这里有些注意点:

  • 解压的时候建议加--remove-original命令,因为需要解压后删除原文件,要不然压缩前的文件还留在原地会造成干扰。
  • 最好解压前的原文件多保留一份。要不然解压中途失败,会把原文件也删了。
  • 解压后注意需要执行prepare操作,才能进行恢复。

如果恢复速度是首要考虑,那么应该谨慎选择压缩。因为解压需要额外时间,可能延长RTO(恢复时间目标)。

因此也可以在备份时不采用--compress命令,而是在先prepare后通过tar压缩命令压缩成单一文件,后续再直接解压用于恢复。

bash 复制代码
# 步骤1:备份
xtrabackup --backup --target-dir=/tmp/backup
# 步骤2:在本地prepare
xtrabackup --prepare --target-dir=/tmp/backup
# 步骤3:压缩prepare后的备份文件
tar -czf backup.tar.gz -C /tmp/backup .
# 步骤4:传输到远程备份服务器
scp backup.tar.gz remote-backup-server:/backup/
# 恢复时:
# 步骤5:从远程备份服务器下载压缩的备份文件
scp remote-backup-server:/backup/backup.tar.gz /tmp/
# 步骤6:解压备份文件
tar -xzf /tmp/backup.tar.gz -C /tmp/restore
# 步骤7:将备份文件复制到MySQL数据目录(假设已经清空)
xtrabackup --copy-back --target-dir=/tmp/restore

3.挑选数据库表

有时候数据库中有些表是日志表,文件比较大,但是又没有业务价值。若进行备份的话,严重影响备份速度和存储空间。

bash 复制代码
# 排除名为logs的数据库
xtrabackup --backup   --target-dir=/backup/   --databases-exclude=logs
# 排除特定表(格式:database.table)
xtrabackup --backup --target-dir=/backup/ --tables-exclude=mydb.log_table,mydb.audit_log

# 或使用正则表达式
xtrabackup --backup --target-dir=/backup/  --tables-exclude=^logs\.  # 排除logs库的所有表

或进行反向排除

bash 复制代码
# 只备份指定数据库
xtrabackup --backup --target-dir=/backup/ --databases="mysql sys myapp"  # 只备份这些数据库

(二)每日备份脚本

1.编写shell脚本

bash 复制代码
#!/bin/bash
# MySQL备份脚本(使用xtrabackup,按日期分文件夹管理)
# 功能:本地执行MySQL实例完整备份,自动压缩并清理旧备份

#######################################
# 【配置参数区】-- 在此处修改以下参数
#######################################
DB_USER="root"                   # 数据库用户名
DB_PASS="password"               # 数据库密码(在此处修改)
BACKUP_ROOT_DIR="/home/backup"   # 备份根目录(所有日期的备份放在这里)
RETENTION_DAYS=30                # 备份保留天数(默认30天)
LOG_RETENTION_DAYS=30            # 日志文件保留天数
#######################################
# 【配置结束】-- 以下内容无需修改
#######################################

# 初始化变量(按日期创建子文件夹)
CURRENT_DATE=$(date +%Y%m%d)      # 当天日期(用于文件夹命名)
TIMESTAMP=$(date +%Y%m%d_%H%M%S)  # 完整时间戳(用于文件名)
BACKUP_DIR="$BACKUP_ROOT_DIR/$CURRENT_DATE"  # 当天备份的具体目录
LOG_FILE="$BACKUP_DIR/backup_$TIMESTAMP.log"

# 检查并创建备份目录(包括当天子文件夹)
if [ ! -d "$BACKUP_DIR" ]; then
  echo "备份目录 $BACKUP_DIR 不存在,尝试创建..."
  mkdir -p "$BACKUP_DIR"
  # 检查目录创建结果
  if [ $? -ne 0 ]; then
    echo "错误:无法创建备份目录 $BACKUP_DIR,请检查权限!"
    exit 1
  fi
  echo "备份目录创建成功"
fi

# 写入日志头部
echo "===== xtrabackup备份开始于 $TIMESTAMP =====" >> "$LOG_FILE"
echo "备份目录:$BACKUP_DIR" >> "$LOG_FILE"
echo "备份保留天数:$RETENTION_DAYS" >> "$LOG_FILE"

# 检查xtrabackup是否安装
check_xtrabackup() {
  # 优先检查xtrabackup(新版)
  if command -v xtrabackup &> /dev/null; then
    echo "xtrabackup"
    return 0
  else
    echo "未找到"
    return 1
  fi
}

# 获取可用备份命令
BACKUP_CMD=$(check_xtrabackup)

echo "使用备份工具:$BACKUP_CMD" >> "$LOG_FILE"

# 执行全量备份
perform_backup() {
  local backup_name="full_backup_$TIMESTAMP"
  local backup_path="$BACKUP_DIR/$backup_name"
  
  echo "开始执行全量备份..." >> "$LOG_FILE"
  echo "备份目标路径:$backup_path" >> "$LOG_FILE"
  
  # 根据使用的备份工具执行相应的命令
  if [ "$BACKUP_CMD" = "xtrabackup" ]; then
    # 使用xtrabackup(新版)- 简单直接
    echo "使用xtrabackup进行备份..." >> "$LOG_FILE"
    
    # 简单执行,xtrabackup会自动使用默认的本地连接
    xtrabackup \
      --backup \
	  --compress \
      --user="$DB_USER" \
      --password="$DB_PASS" \
      --target-dir="$backup_path" \
      2>> "$LOG_FILE"
  fi
  
  # 检查备份是否成功
  if [ $? -eq 0 ]; then
    echo "MySQL实例备份成功:$backup_path" >> "$LOG_FILE"
	echo "MySQL实例备份成功:$backup_path"  # 同时输出到控制台
  else
    echo "MySQL实例备份失败:$backup_path" >> "$LOG_FILE"
    echo "MySQL实例备份失败:$backup_path" # 同时输出到控制台
  fi
}

# 执行备份
perform_backup


# 清理过期备份(删除整个过期日期的文件夹)
echo "开始清理${RETENTION_DAYS}天前的备份文件夹..." >> "$LOG_FILE"
find "$BACKUP_ROOT_DIR" -maxdepth 1 -type d -name "20[0-9][0-9][0-1][0-9][0-3][0-9]" -mtime +"$RETENTION_DAYS" -exec rm -rf {} \; 2>> "$LOG_FILE"
echo "过期备份文件夹清理完成" >> "$LOG_FILE"

# 清理旧日志文件
echo "开始清理${LOG_RETENTION_DAYS}天前的日志文件..." >> "$LOG_FILE"
find "$BACKUP_ROOT_DIR" -name "*.log" -type f -mtime +"$LOG_RETENTION_DAYS" -delete 2>> "$LOG_FILE"
echo "旧日志文件清理完成" >> "$LOG_FILE"

# 检查磁盘使用情况
echo "检查磁盘使用情况..." >> "$LOG_FILE"
df -h "$BACKUP_ROOT_DIR" >> "$LOG_FILE"

# 写入日志尾部
END_TIME=$(date +%Y%m%d_%H%M%S)
echo "===== 备份结束于 $END_TIME =====" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"

echo "所有备份操作已完成,详细日志:$LOG_FILE"

2.其它处理

bash 复制代码
# 将`.sh`文件变更为可执行文件。
chmod +x mysql_backup.sh
# 换行符替换
sed -i 's/\r$//' mysql_backup.sh
# 设置定时任务
crontab -e
# 每天02:00执行备份脚本,并将错误输出到日志
0 2 * * * /path/to/mysql_backup.sh >> /path/to/backup/error.log 2>&1
相关推荐
鹿角片ljp2 小时前
动态SQL实现模糊查询
数据库·sql·oracle
DomDanrtsey2 小时前
oracle所有表中文与字段最大长度检测
数据库·oracle
Z...........2 小时前
数据库表设计
数据库
tudficdew2 小时前
使用Python操作文件和目录(os, pathlib, shutil)
jvm·数据库·python
浒畔居2 小时前
工具、测试与部署
jvm·数据库·python
云和数据.ChenGuang2 小时前
python对接mysql和模型类的故障
数据库·python·mysql·oracle·conda·virtualenv
2301_822382762 小时前
开发一个简单的Python计算器
jvm·数据库·python
2501_920999272 小时前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python
_F_y2 小时前
MySQL用户管理
android·mysql·adb