一、恢复前的准备工作
1.1 确认备份文件完整性
# 查看备份信息
cat /data2/backup/xtrabackup_info
cat /data2/backup/xtrabackup_checkpoints
1.2 确保目标目录为空
# 检查 MySQL 数据目录
ls -la /var/lib/mysql/
# 如果不是空的,需要备份后清空(谨慎!)
mv /var/lib/mysql /var/lib/mysql.bak.$(date +%Y%m%d)
mkdir /var/lib/mysql
1.3 停止 MySQL 服务(如果正在运行)
systemctl stop mysqld
# 确认已停止
systemctl status mysqld
二、第一阶段:Prepare(准备备份)
2.1 Prepare 的作用
Prepare 阶段要做两件事:
- Redo 已提交事务:将已提交但未写入数据文件的事务重做
- Undo 未提交事务:回滚未提交的事务
- 最终使数据文件处于一致性状态
2.2 执行 Prepare
xtrabackup \
--host=localhost \
--user=root \
--password='root@mySQL123' \
--port=3306 \
--prepare \
--target-dir=/data2/backup
2.3 验证 Prepare 结果
# 查看 prepare 后的备份状态
cat /data2/backup/xtrabackup_info | grep finished
# 查看备份文件
ls -la /data2/backup/
Prepare 成功标志:出现 completed OK! 提示
三、第二阶段:Copy-Back(恢复数据文件)
3.1 执行 Copy-Back
xtrabackup \
--host=localhost \
--user=root \
--password='root@mySQL123' \
--port=3306 \
--datadir=/var/lib/mysql \
--copy-back \
--target-dir=/data2/backup
3.2 参数说明
| 参数 | 说明 |
|---|---|
--copy-back | 将备份文件拷贝回数据目录 |
--datadir | 指定 MySQL 数据目录路径 |
--target-dir | 指定备份文件所在目录 |
3.3 验证恢复结果
# 检查数据目录内容
ls -la /var/lib/mysql/
# 检查文件数量是否匹配
ls -la /data2/backup/ | wc -l
ls -la /var/lib/mysql/ | wc -l
四、第三阶段:权限设置
4.1 修改目录所有者
chown -R mysql:mysql /var/lib/mysql
4.2 验证权限
ls -ld /var/lib/mysql
# 应该显示 drwxr-x--- mysql mysql
五、第四阶段:启动数据库
5.1 启动 MySQL 服务
systemctl start mysqld
5.2 检查启动状态
systemctl status mysqld
# 应该是 active (running)
# 查看错误日志
tail -f /var/log/mysqld.log
5.3 验证数据完整性
# 登录 MySQL
mysql -u root -p
# 检查数据库列表
SHOW DATABASES;
# 检查表数据
USE your_database;
SELECT COUNT(*) FROM your_table;
六、完整恢复脚本(一键执行)
#!/bin/bash
# xtrabackup_restore.sh - 完整恢复脚本
# 配置变量
BACKUP_DIR="/data2/backup"
DATA_DIR="/var/lib/mysql"
MYSQL_USER="root"
MYSQL_PASS="root@mySQL123"
MYSQL_HOST="localhost"
MYSQL_PORT="3306"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color
echo -e "${YELLOW}开始数据库恢复流程...${NC}"
# 1. 检查备份目录
if [ ! -d "$BACKUP_DIR" ]; then
echo -e "${RED}错误:备份目录 $BACKUP_DIR 不存在${NC}"
exit 1
fi
# 2. 停止 MySQL
echo -e "${YELLOW}1. 停止 MySQL 服务...${NC}"
systemctl stop mysqld
if [ $? -ne 0 ]; then
echo -e "${RED}警告:停止 MySQL 失败,可能未运行${NC}"
fi
# 3. 清空数据目录
echo -e "${YELLOW}2. 准备数据目录...${NC}"
if [ -d "$DATA_DIR" ] && [ "$(ls -A $DATA_DIR)" ]; then
mv $DATA_DIR ${DATA_DIR}.bak.$(date +%Y%m%d_%H%M%S)
echo -e "${GREEN}已备份原数据目录到 ${DATA_DIR}.bak.$(date +%Y%m%d_%H%M%S)${NC}"
fi
mkdir -p $DATA_DIR
# 4. Prepare 备份
echo -e "${YELLOW}3. 执行 Prepare 操作...${NC}"
xtrabackup \
--host=$MYSQL_HOST \
--user=$MYSQL_USER \
--password=$MYSQL_PASS \
--port=$MYSQL_PORT \
--prepare \
--target-dir=$BACKUP_DIR
if [ $? -ne 0 ]; then
echo -e "${RED}错误:Prepare 失败${NC}"
exit 1
fi
echo -e "${GREEN}Prepare 完成${NC}"
# 5. Copy-Back 恢复
echo -e "${YELLOW}4. 执行 Copy-Back 恢复...${NC}"
xtrabackup \
--host=$MYSQL_HOST \
--user=$MYSQL_USER \
--password=$MYSQL_PASS \
--port=$MYSQL_PORT \
--datadir=$DATA_DIR \
--copy-back \
--target-dir=$BACKUP_DIR
if [ $? -ne 0 ]; then
echo -e "${RED}错误:Copy-Back 失败${NC}"
exit 1
fi
echo -e "${GREEN}Copy-Back 完成${NC}"
# 6. 修改权限
echo -e "${YELLOW}5. 修改数据目录权限...${NC}"
chown -R mysql:mysql $DATA_DIR
echo -e "${GREEN}权限设置完成${NC}"
# 7. 启动 MySQL
echo -e "${YELLOW}6. 启动 MySQL 服务...${NC}"
systemctl start mysqld
sleep 3
if systemctl is-active --quiet mysqld; then
echo -e "${GREEN}MySQL 启动成功${NC}"
else
echo -e "${RED}错误:MySQL 启动失败,请检查日志${NC}"
tail -20 /var/log/mysqld.log
exit 1
fi
# 8. 验证恢复
echo -e "${YELLOW}7. 验证数据库连接...${NC}"
mysql -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST -P$MYSQL_PORT -e "SHOW DATABASES;" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo -e "${GREEN} 数据库恢复成功完成!${NC}"
echo -e "${GREEN}恢复时间:$(date)${NC}"
else
echo -e "${RED} 数据库连接失败,请手动检查${NC}"
fi
七、常见问题及解决方法
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| Prepare 失败 | 备份文件损坏 | 检查备份完整性,用其他备份重试 |
| Copy-Back 失败 | 目标目录非空 | rm -rf /var/lib/mysql/* 清空 |
| 权限错误 | 目录所有者不对 | chown -R mysql:mysql /var/lib/mysql |
| MySQL 启动失败 | my.cnf 配置不匹配 | 检查错误日志,调整配置 |
| 数据不一致 | Prepare 未正确执行 | 重新执行 Prepare |
八、重要注意事项
恢复前的检查清单
- [ ] 备份文件是否完整?
- [ ] MySQL 是否已停止?
- [ ] 数据目录是否已清空?
- [ ] 磁盘空间是否足够?
- [ ] 是否有最新备份?
恢复后的验证清单
- [ ] MySQL 能否正常启动?
- [ ] 能否正常登录?
- [ ] 数据量是否匹配?
- [ ] 关键表能否查询?
- [ ] 应用能否连接?
九、一句话总结
Xtrabackup 恢复分两步:先用 --prepare 使备份文件处于一致性状态,再用 --copy-back 将数据文件恢复到 MySQL 数据目录,最后修改权限启动数据库。
发表回复