xtrabackup 备份MySQL

以下是在Ubuntu上安装XtraBackup的步骤:

  1. 添加Percona的软件仓库

    sudo add-apt-repository 'deb http://repo.percona.com/apt $(lsb_release -sc) main'

  2. 添加Percona的公钥并安装percona-release工具

    wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
    sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
    sudo apt-get update

  3. 安装XtraBackup

    sudo apt-get install percona-xtrabackup-24

    如果安装过程中出现依赖关系错误,可以运行以下命令来修复:

    sudo apt --fix-broken install

  4. 验证安装: 安装完成后,可以使用以下命令验证XtraBackup的版本:

    xtrabackup --version
  5. 创建备份目录(如果需要):

    sudo mkdir -p /backup/mysql

通过以上步骤,就可以在Ubuntu上成功安装XtraBackup,并用于备份MySQL数据库。

XtraBackup实战:MySQL数据库备份与恢复

一、项目背景

在企业级应用中,数据的安全性和完整性至关重要。为了应对数据库故障、人为误操作、硬件损坏等意外情况,我们需要定期对MySQL数据库进行备份,并制定完善的备份策略和恢复方案。本项目将使用Percona XtraBackup工具,为一个生产环境中的MySQL数据库实例制定一套完整的备份与恢复方案,包括全量备份、增量备份、备份文件压缩与传输、以及数据恢复等操作。

二、环境准备

  1. 服务器信息

    • 数据库服务器(生产环境):192.168.1.100(运行MySQL数据库)

    • 备份服务器:192.168.1.101(用于存储备份文件)

    • 操作系统:Ubuntu Server 20.04 LTS

    • MySQL版本:5.7.33

  2. 安装MySQL数据库

    sudo apt update
    sudo apt install mysql-server
    sudo mysql_secure_installation

  3. 安装Percona XtraBackup

    sudo add-apt-repository 'deb http://repo.percona.com/apt $(lsb_release -sc) main'
    wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
    sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
    sudo percona-release setup ps57
    sudo apt update
    sudo apt install percona-xtrabackup-24

三、备份策略制定

1. 全量备份

每周日凌晨0点进行一次全量备份,确保拥有完整的数据库副本。

2. 增量备份

每天凌晨2点进行增量备份,仅备份自上次全量备份或增量备份以来发生更改的数据,减少备份数据量和备份时间。

3. 备份文件压缩与传输

每次备份完成后,将备份文件压缩并传输至备份服务器,节省存储空间并确保数据安全。

四、备份操作步骤

(一)全量备份

  1. 创建备份目录

    sudo mkdir -p /backup/mysql/full
  2. 执行全量备份

    sudo xtrabackup --user=root --password=your_password --backup --target-dir=/backup/mysql/full/full_backup_$(date +%F) --socket=/var/run/mysqld/mysqld.sock
    • --user--password:指定具有备份权限的MySQL用户及其密码

    • --backup:表示执行备份操作

    • --target-dir:指定备份文件的存储目录,使用$(date +%F)动态生成带有日期的目录名,便于区分不同时间的备份

    • --socket:指定MySQL的socket文件路径,用于本地连接

  3. 准备备份(使备份文件可用于恢复)

    sudo xtrabackup --prepare --target-dir=/backup/mysql/full/full_backup_$(date +%F)

以下是一个将XtraBackup全量备份操作写入的Shell脚本:

#!/bin/bash
​
# 定义变量
BACKUP_DIR="/backup/mysql"
FULL_BACKUP_DIR="${BACKUP_DIR}/full"
DATE=$(date +%F)
MYSQL_USER="root"
MYSQL_PASSWORD="your_password"
SOCKET="/var/run/mysqld/mysqld.sock"
​
# 创建备份目录
mkdir -p ${FULL_BACKUP_DIR}
​
# 执行全量备份
echo "开始全量备份..."
xtrabackup \
    --user=${MYSQL_USER} \
    --password=${MYSQL_PASSWORD} \
    --backup \
    --target-dir=${FULL_BACKUP_DIR}/full_backup_${DATE} \
    --socket=${SOCKET}
​
# 检查备份是否成功
if [ $? -eq 0 ]; then
    echo "全量备份完成: ${FULL_BACKUP_DIR}/full_backup_${DATE}"
else
    echo "全量备份失败"
    exit 1
fi
​
# 准备备份(使备份文件可用于恢复)
echo "准备备份文件..."
xtrabackup \
    --prepare \
    --target-dir=${FULL_BACKUP_DIR}/full_backup_${DATE}
​
# 检查准备是否成功
if [ $? -eq 0 ]; then
    echo "备份文件准备完成"
else
    echo "备份文件准备失败"
    exit 1
fi

脚本说明

  1. 变量定义

    • BACKUP_DIR:备份文件的根目录。

    • FULL_BACKUP_DIR:全量备份文件的存储目录。

    • DATE:当前日期,用于动态生成备份目录名。

    • MYSQL_USERMYSQL_PASSWORD:具有备份权限的MySQL用户及其密码。

    • SOCKET:MySQL的socket文件路径,用于本地连接。

  2. 创建备份目录

    • 确保备份目录存在,如果不存在则创建。

  3. 执行全量备份

    • 使用 xtrabackup 命令进行全量备份,并将备份文件存储在指定目录。

    • --target-dir 指定备份文件的存储路径,动态生成带有日期的目录名,便于区分不同时间的备份。

  4. 准备备份

    • 使用 xtrabackup --prepare 命令对备份文件进行准备,使其可用于恢复。

  5. 错误处理

    • 检查每个步骤的执行结果,如果失败则输出错误信息并退出脚本。

使用方法

  1. 将上述脚本保存为文件,例如 full_backup.sh

  2. 赋予脚本执行权限:

    chmod +x full_backup.sh
  3. 运行脚本:

    ./full_backup.sh

定时任务设置

可以将该脚本添加到cron中,实现定期自动备份。例如,每周日凌晨0点执行全量备份:

crontab -e

添加以下内容:

0 0 * * 0 /path/to/full_backup.sh

(二)增量备份

  1. 创建备份目录

    sudo mkdir -p /backup/mysql/incremental

  2. 首次增量备份

    sudo xtrabackup --user=root --password=your_password --backup --target-dir=/backup/mysql/incremental/inc_backup_$(date +%F) --incremental-basedir=/backup/mysql/full/full_backup_$(date -d "last sunday" +%F) --socket=/var/run/mysqld/mysqld.sock
    • --incremental-basedir:指定基于哪个全量备份进行增量备份(这里以每周日的全量备份为基准)

  3. 后续增量备份 每天执行增量备份时,基于上一次的增量备份目录:

    sudo xtrabackup --user=root --password=your_password --backup --target-dir=/backup/mysql/incremental/inc_backup_$(date +%F) --incremental-basedir=/backup/mysql/incremental/inc_backup_$(date -d "yesterday" +%F) --socket=/var/run/mysqld/mysqld.sock

  4. 准备备份

    sudo xtrabackup --prepare --target-dir=/backup/mysql/incremental/inc_backup_$(date +%F)

(三)备份文件压缩与传输

  1. 压缩备份文件

    # 对全量备份进行压缩
    tar -czvf full_backup_$(date +%F).tar.gz /backup/mysql/full/full_backup_$(date +%F)
    ​
    # 对增量备份进行压缩
    tar -czvf inc_backup_$(date +%F).tar.gz /backup/mysql/incremental/inc_backup_$(date +%F)

  2. 传输至备份服务器

    scp /backup/mysql/full_backup_$(date +%F).tar.gz root@192.168.1.101:/backup/mysql/
    scp /backup/mysql/inc_backup_$(date +%F).tar.gz root@192.168.1.101:/backup/mysql/

五、恢复操作步骤

(一)全量恢复

  1. 停止MySQL服务

    sudo systemctl stop mysql

  2. 删除原数据目录(请确保已备份重要数据)

    sudo rm -rf /var/lib/mysql/*

  3. 解压备份文件并恢复

    tar -xzvf /backup/mysql/full_backup_$(date +%F).tar.gz -C /backup/mysql/full/
    sudo xtrabackup --copy-back --target-dir=/backup/mysql/full/full_backup_$(date +%F)

  4. 调整数据目录权限并启动MySQL服务

    sudo chown -R mysql:mysql /var/lib/mysql
    sudo systemctl start mysql

(二)基于增量备份的恢复

  1. 停止MySQL服务并删除原数据目录(同全量恢复步骤1-2)

  2. 合并增量备份到全量备份

    sudo xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/full/full_backup_$(date -d "last sunday" +%F)
    sudo xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/full/full_backup_$(date -d "last sunday" +%F) --incremental-dir=/backup/mysql/incremental/inc_backup_$(date +%F)

  3. 恢复数据

    sudo xtrabackup --copy-back --target-dir=/backup/mysql/full/full_backup_$(date -d "last sunday" +%F)

  4. 调整权限并启动服务(同全量恢复步骤4)

六、自动化与监控

1. 自动化脚本编写

创建一个备份脚本mysql_backup.sh

#!/bin/bash
​
# 定义变量
BACKUP_DIR="/backup/mysql"
DATE=$(date +%F)
FULL_BACKUP_DIR="${BACKUP_DIR}/full/full_backup_${DATE}"
INCREMENTAL_BACKUP_DIR="${BACKUP_DIR}/incremental/inc_backup_${DATE}"
MYSQL_USER="root"
MYSQL_PASSWORD="your_password"
SOCKET="/var/run/mysqld/mysqld.sock"
BACKUP_SERVER="192.168.1.101"
​
# 创建备份目录
mkdir -p ${FULL_BACKUP_DIR}
mkdir -p ${INCREMENTAL_BACKUP_DIR}
​
# 执行全量备份
xtrabackup --user=${MYSQL_USER} --password=${MYSQL_PASSWORD} --backup --target-dir=${FULL_BACKUP_DIR} --socket=${SOCKET}
xtrabackup --prepare --target-dir=${FULL_BACKUP_DIR}
​
# 执行增量备份(基于上次全量备份)
xtrabackup --user=${MYSQL_USER} --password=${MYSQL_PASSWORD} --backup --target-dir=${INCREMENTAL_BACKUP_DIR} --incremental-basedir=${FULL_BACKUP_DIR} --socket=${SOCKET}
xtrabackup --prepare --target-dir=${INCREMENTAL_BACKUP_DIR}
​
# 压缩并传输备份文件
tar -czvf ${FULL_BACKUP_DIR}.tar.gz ${FULL_BACKUP_DIR}
tar -czvf ${INCREMENTAL_BACKUP_DIR}.tar.gz ${INCREMENTAL_BACKUP_DIR}
​
scp ${FULL_BACKUP_DIR}.tar.gz root@${BACKUP_SERVER}:/backup/mysql/
scp ${INCREMENTAL_BACKUP_DIR}.tar.gz root@${BACKUP_SERVER}:/backup/mysql/
​
# 清理本地备份文件(可选,根据磁盘空间需求调整)
# find ${BACKUP_DIR} -type f -name "*.tar.gz" -mtime +7 -exec rm -f {} \;

赋予脚本执行权限:

chmod +x mysql_backup.sh

2. 定时任务设置

编辑crontab文件,设置定时备份任务:

crontab -e

添加以下内容:

# 每周日凌晨0点执行全量备份
0 0 * * 0 /path/to/mysql_backup.sh --full
​
# 每天凌晨2点执行增量备份
0 2 * * * /path/to/mysql_backup.sh --incremental

3. 监控与告警

  • 监控备份任务执行状态:通过检查备份日志文件(如/var/log/xtrabackup.log)中的返回码和错误信息,判断备份是否成功。

  • 设置告警通知:当备份失败时,使用邮件、短信或即时通讯工具发送告警通知给运维人员,以便及时处理问题。

七、注意事项

  1. 备份权限管理:确保备份使用的MySQL用户仅具有必要的备份权限,遵循最小权限原则,避免因权限过高导致的安全风险。

  2. 备份文件存储安全:备份服务器应采取适当的安全措施,如防火墙限制、数据加密等,防止备份文件被未授权访问或篡改。

  3. 定期测试恢复过程:定期进行恢复演练,验证备份文件的完整性和可恢复性,确保在真正需要恢复时能够顺利进行,避免因长期未测试导致的问题。

  4. 监控磁盘空间使用情况:密切关注生产服务器和备份服务器的磁盘空间,避免因空间不足导致备份失败或数据丢失,及时清理过期的备份文件或扩展存储容量。

  5. 记录备份与恢复操作日志:详细记录每次备份和恢复操作的时间、执行人员、操作类型、结果等信息,便于后续审计和问题追溯,为数据库的运维管理提供数据支持。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值