文章目录
Percona XtraBackup 进行 MySQL 全量备份
第一部分:安装 Percona XtraBackup
以这个为例,CentOS 8 默认的软件源可能不包含最新版的 XtraBackup,因此我们使用 Percona 官方提供的 Yum 仓库进行安装。
安装 Percona Yum 仓库
首先,下载并安装 Percona 的发布包,该包会自动配置 Yum 仓库。sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
启用 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 环境,启用
tools
和release
通常就足够了。安装 XtraBackup
使用 Yum 安装percona-xtrabackup-80
和qpress
(用于压缩功能,可选但推荐)。sudo yum install percona-xtrabackup-80 qpress
验证安装
安装完成后,检查版本以确保安装成功。xtrabackup --version
输出应类似于:
xtrabackup version 8.0.X based on MySQL server 8.0.X Linux (x86_64) (revision id: XXXX)
第二部分:准备备份所需的 MySQL 用户和权限
XtraBackup 需要连接到 MySQL 服务器并进行操作,因此需要一个具有相应权限的数据库用户。
登录 MySQL
mysql -u root -p
创建备份专用用户并授权
执行以下 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;
RELOAD
和LOCK TABLES
: 用于在备份开始时锁定表。REPLICATION CLIENT
: 用于获取二进制日志位置。BACKUP_ADMIN
: 用于执行LOCK INSTANCE FOR BACKUP
(在 MySQL 8.0+ 中推荐使用,代替LOCK TABLES
)。PROCESS
: 用于查看所有运行中的线程。SELECT on performance_schema.log_status
: 用于记录日志点。
第三部分:执行全量备份
现在我们开始进行实际的备份操作。
创建备份目录
选择一个有足够磁盘空间的位置来存放备份文件。sudo mkdir -p /opt/backups/mysql sudo chown -R $(whoami):$(whoami) /opt/backups/mysql # 确保当前用户有读写权限
运行全量备份命令
使用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=
(等号后不留空格)并在提示时输入密码,或者将密码存储在配置文件中。观察输出
命令运行后,观察终端输出。如果一切顺利,最后你会看到类似以下的信息,表示备份成功完成:
...
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 数据目录下的所有数据。请在测试环境练习,或在生产环境极度谨慎操作。
停止 MySQL 服务
sudo systemctl stop mysqld
清空或移动现有数据目录
(务必先对现有数据做备份!)sudo mv /var/lib/mysql /var/lib/mysql.old
使用 xtrabackup 恢复数据
xtrabackup --copy-back --target-dir=/opt/backups/mysql/full_backup
修复文件权限
MySQL 通常使用mysql
用户来访问数据文件。sudo chown -R mysql:mysql /var/lib/mysql
启动 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
计划任务定期执行此脚本。