通过xtrabackup完全恢复数据库

一、恢复前的准备工作

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 阶段要做两件事:

  1. Redo 已提交事务:将已提交但未写入数据文件的事务重做
  2. Undo 未提交事务:回滚未提交的事务
  3. 最终使数据文件处于一致性状态

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 数据目录,最后修改权限启动数据库。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注