@Percona XtraBackup 进行 MySQL 备份&恢复

发布于:2025-09-06 ⋅ 阅读:(13) ⋅ 点赞:(0)

Percona XtraBackup 进行 MySQL 全量备份

第一部分:安装 Percona XtraBackup

以这个为例,CentOS 8 默认的软件源可能不包含最新版的 XtraBackup,因此我们使用 Percona 官方提供的 Yum 仓库进行安装。

  1. 安装 Percona Yum 仓库
    首先,下载并安装 Percona 的发布包,该包会自动配置 Yum 仓库。

    sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
    
  2. 启用 Percona 仓库
    默认情况下,percona-release 设置可能只启用原始版本的仓库。我们需要启用 XtraBackup 8.0 的仓库(适用于 MySQL 8.0)。

    sudo percona-release enable-only tools release
    # 或者,如果你明确知道你的 MySQL 版本,可以使用更具体的命令,例如:
    # sudo percona-release setup ps80 # 如果你用的是 Percona Server 8.0
    # sudo percona-release setup pxb80 # 专门启用 XtraBackup 8.0 工具库
    

    对于大多数 MySQL 8.0 环境,启用 toolsrelease 通常就足够了。

  3. 安装 XtraBackup
    使用 Yum 安装 percona-xtrabackup-80qpress(用于压缩功能,可选但推荐)。

    sudo yum install percona-xtrabackup-80 qpress
    
  4. 验证安装
    安装完成后,检查版本以确保安装成功。

    xtrabackup --version
    

    输出应类似于:
    xtrabackup version 8.0.X based on MySQL server 8.0.X Linux (x86_64) (revision id: XXXX)


第二部分:准备备份所需的 MySQL 用户和权限

XtraBackup 需要连接到 MySQL 服务器并进行操作,因此需要一个具有相应权限的数据库用户。

  1. 登录 MySQL

    mysql -u root -p
    
  2. 创建备份专用用户并授权
    执行以下 SQL 语句,创建一个名为 backupuser 的用户(请务必将 'YourStrongPassword123!' 替换为一个复杂的密码)。

    CREATE USER 'backupuser'@'localhost' IDENTIFIED BY 'YourStrongPassword123!';
    GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backupuser'@'localhost';
    GRANT SELECT ON performance_schema.log_status TO 'backupuser'@'localhost';
    FLUSH PRIVILEGES;
    
    • RELOADLOCK TABLES: 用于在备份开始时锁定表。
    • REPLICATION CLIENT: 用于获取二进制日志位置。
    • BACKUP_ADMIN: 用于执行 LOCK INSTANCE FOR BACKUP(在 MySQL 8.0+ 中推荐使用,代替 LOCK TABLES)。
    • PROCESS: 用于查看所有运行中的线程。
    • SELECT on performance_schema.log_status: 用于记录日志点。

第三部分:执行全量备份

现在我们开始进行实际的备份操作。

  1. 创建备份目录
    选择一个有足够磁盘空间的位置来存放备份文件。

    sudo mkdir -p /opt/backups/mysql
    sudo chown -R $(whoami):$(whoami) /opt/backups/mysql # 确保当前用户有读写权限
    
  2. 运行全量备份命令
    使用 xtrabackup 命令进行备份。以下是一个常用命令示例:

    xtrabackup \
    --defaults-file=/etc/my.cnf \    # 指定 MySQL 配置文件路径,如果不在默认位置或需要明确指定
    --host=localhost \                # MySQL 主机
    --user=backupuser \               # 上一步创建的备份用户
    --password='YourStrongPassword123!' \ # 备份用户的密码
    --port=3306 \                     # MySQL 端口,默认为 3306
    --backup \                        # 执行备份操作
    --target-dir=/opt/backups/mysql/full_backup_$(date +%Y%m%d_%H%M%S) \ # 备份文件存放目录,带时间戳
    --compress \                      # (可选)使用 qpress 算法压缩备份文件
    --compress-threads=4 \            # (可选)压缩线程数,根据 CPU 核心数调整
    --parallel=4 \                    # (可选)备份时拷贝数据的线程数,可显著提高速度
    --extra-lsndir=/opt/backups/mysql/full_backup_$(date +%Y%m%d_%H%M%S) # 额外生成一个重要的 xtrabackup_checkpoints 文件
    

    简化版命令(无压缩,单线程):
    如果你是第一次测试,可以先使用一个简单的命令:

    xtrabackup --backup --user=backupuser --password='YourStrongPassword123!' --target-dir=/opt/backups/mysql/full_backup
    

    重要提示: 在命令行中直接使用 --password 参数可能会在进程列表中被看到,存在安全风险。更安全的方法是使用 --password=(等号后不留空格)并在提示时输入密码,或者将密码存储在配置文件中。

  3. 观察输出
    命令运行后,观察终端输出。如果一切顺利,最后你会看到类似以下的信息,表示备份成功完成:
    ...
    230101 10:30:00 completed OK!


第四部分:准备备份(Prepare)

备份得到的文件处于不一致状态,就像数据库突然断电一样。prepare 步骤会回滚未提交的事务、前滚已提交的事务,使备份文件达到一个一致且可用的状态,才能用于恢复。

非常重要:在恢复之前,必须先 prepare 备份。

# 如果你使用了 --compress 选项,需要先解压
xtrabackup --decompress --target-dir=/opt/backups/mysql/full_backup

# 然后进行 prepare
xtrabackup --prepare --target-dir=/opt/backups/mysql/full_backup

输出结尾再次出现 completed OK! 即表示准备成功。


第五部分:恢复备份(可选,用于演练)

警告: 恢复操作会覆盖现有 MySQL 数据目录下的所有数据。请在测试环境练习,或在生产环境极度谨慎操作。

  1. 停止 MySQL 服务

    sudo systemctl stop mysqld
    
  2. 清空或移动现有数据目录
    (务必先对现有数据做备份!)

    sudo mv /var/lib/mysql /var/lib/mysql.old
    
  3. 使用 xtrabackup 恢复数据

    xtrabackup --copy-back --target-dir=/opt/backups/mysql/full_backup
    
  4. 修复文件权限
    MySQL 通常使用 mysql 用户来访问数据文件。

    sudo chown -R mysql:mysql /var/lib/mysql
    
  5. 启动 MySQL 服务

    sudo systemctl start mysqld
    

自动化脚本示例

你可以创建一个 Shell 脚本 (/usr/local/bin/mysql-full-backup.sh) 来自化整个过程:

#!/bin/bash

# 定义变量
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/opt/backups/mysql"
BACKUP_NAME="full_backup_${TIMESTAMP}"
MY_CNF="/etc/my.cnf"
MYSQL_USER="backupuser"
MYSQL_PASSWORD='YourStrongPassword123!'
LOG_FILE="${BACKUP_DIR}/backup_${TIMESTAMP}.log"

# 创建备份目录
mkdir -p ${BACKUP_DIR}

# 执行备份
echo "Starting XtraBackup full backup at ${TIMESTAMP}" | tee -a ${LOG_FILE}
xtrabackup \
  --defaults-file=${MY_CNF} \
  --user=${MYSQL_USER} \
  --password=${MYSQL_PASSWORD} \
  --backup \
  --compress \
  --parallel=4 \
  --target-dir=${BACKUP_DIR}/${BACKUP_NAME} 2>> ${LOG_FILE}

if [ $? -eq 0 ]; then
    echo "Backup completed successfully! Preparing backup..." | tee -a ${LOG_FILE}
    # 准备备份
    xtrabackup --prepare --target-dir=${BACKUP_DIR}/${BACKUP_NAME} 2>> ${LOG_FILE}
    if [ $? -eq 0 ]; then
        echo "Prepare completed successfully!" | tee -a ${LOG_FILE}
        # (可选)删除旧备份,例如保留最近7天的
        find ${BACKUP_DIR} -name "full_backup_*" -type d -mtime +7 -exec rm -rf {} \;
        find ${BACKUP_DIR} -name "backup_*.log" -mtime +30 -delete
    else
        echo "Prepare failed! Check log: ${LOG_FILE}" | tee -a ${LOG_FILE}
        exit 1
    fi
else
    echo "Backup failed! Check log: ${LOG_FILE}" | tee -a ${LOG_FILE}
    exit 1
fi

给脚本添加执行权限:

sudo chmod +x /usr/local/bin/mysql-full-backup.sh

然后可以通过 cron 计划任务定期执行此脚本。


网站公告

今日签到

点亮在社区的每一天
去签到