MYSQL-物理备份(xtrabackup)使用指南

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。

MySQL**(本章节)**

PostgreSQL

MongoDB

Redis

Etcd

物理备份分两种情况:一种是直接复制库的物理文件(利用的是Linux复制文件的特性),但是这种情况一般需要在数据库服务停止的情况下进行,适合那种允许中断业务的情况进行。另外一种就是利用开源工具XtraBackup进行备份,因为他具有增量备份的能力,所有部分云厂商的备份也会基于类似的操作。

备份

安装

arduino 复制代码
# 安装 Percona 仓库
sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo percona-release enable tools release
sudo yum install percona-xtrabackup-24

全量备份

ini 复制代码
# 基本全量备份
xtrabackup --backup --target-dir=/path/to/backup --user=root --password=your_password

# 完整示例
xtrabackup \
    --backup \
    --target-dir=/backup/mysql/full_$(date +%Y%m%d_%H%M%S) \
    --user=root \
    --password=your_password \
    --socket=/var/lib/mysql/mysql.sock \
    --parallel=4 \
    --compress

251013 22:26:57 Executing UNLOCK TABLES
251013 22:26:57 All tables unlocked
251013 22:26:57 [00] Compressing ib_buffer_pool to /backup/mysql/full_20251013_222642/ib_buffer_pool.qp
251013 22:26:57 [00]        ...done
251013 22:26:57 Backup created in directory '/backup/mysql/full_20251013_222642/'
MySQL binlog position: filename 'mysql-bin.000014', position '154'
251013 22:26:57 [00] Compressing /backup/mysql/full_20251013_222642/backup-my.cnf.qp
251013 22:26:57 [00]        ...done
251013 22:26:57 [00] Compressing /backup/mysql/full_20251013_222642/xtrabackup_info.qp
251013 22:26:57 [00]        ...done
xtrabackup: Transaction log of lsn (1079467870) to (1079467879) was copied.
251013 22:26:58 completed OK!

备份完成内容

可以和数据存储的的数据进行比对,你会发现具体的某个库下面的实际内容和数据目录甚至是一模一样。

sql 复制代码
[root@localhost xback]# ll
total 77876
-rw-r----- 1 root root      487 Sep 28 00:45 backup-my.cnf
-rw-r----- 1 root root      790 Sep 28 00:45 ib_buffer_pool
-rw-r----- 1 root root 79691776 Sep 28 00:45 ibdata1
drwxr-x--- 2 root root     4096 Sep 28 00:45 mysql
drwxr-x--- 2 root root     8192 Sep 28 00:45 performance_schema
drwxr-x--- 2 root root     8192 Sep 28 00:45 sys
drwxr-x--- 2 root root      214 Sep 28 00:45 test_db
-rw-r----- 1 root root       21 Sep 28 00:45 xtrabackup_binlog_info
-rw-r----- 1 root root      144 Sep 28 00:45 xtrabackup_checkpoints
-rw-r----- 1 root root      493 Sep 28 00:45 xtrabackup_info
-rw-r----- 1 root root     2560 Sep 28 00:45 xtrabackup_logfile

备份单个库

ini 复制代码
# 备份指定数据库的所有表
xtrabackup --backup \
    --target-dir=/backup/database1_full \
    --user=root \
    --password='@!qaz2WSX' \
    --tables="^database1[.].*"

# 示例:备份 db1 数据库
xtrabackup --backup \
    --target-dir=/backup/db1_full \
    --user=root \
    --password='@!qaz2WSX' \
    --tables="^db1[.].*"

第一次增量备份

ini 复制代码
FULL_BACKUP_DIR="/backup/mysql/full_20251013_222642" && \
INC_BACKUP_DIR1="/backup/mysql/inc1_$(date +%Y%m%d_%H%M%S)" && \
xtrabackup --backup --target-dir=$INC_BACKUP_DIR1 --incremental-basedir=$FULL_BACKUP_DIR --user=root --password='@!qaz2WSX' --socket=/var/lib/mysql/mysql.sock && \
echo "第一次增量备份完成: $INC_BACKUP_DIR1"

第二次增加备份

ini 复制代码
FULL_BACKUP_DIR="/backup/mysql/full_20251013_222642" && \
INC_BACKUP_DIR1="/backup/mysql/inc1_$(date +%Y%m%d_%H%M%S)" && \
xtrabackup --backup --target-dir=$INC_BACKUP_DIR1 --incremental-basedir=$FULL_BACKUP_DIR --user=root --password='@!qaz2WSX' --socket=/var/lib/mysql/mysql.sock && \
echo "第一次增量备份完成: $INC_BACKUP_DIR1"

注意:这里的备份需要上一次备份具体目录。

还原

合并备份

bash 复制代码
#!/bin/bash

# 备份目录
FULL_BACKUP_DIR="/backup/mysql/full_20251013_222642"
INC_BACKUP_DIR1="/backup/mysql/inc1_20251013_223918"
INC_BACKUP_DIR2="/backup/mysql/inc2_20251013_224134"  # 您的第二次增量备份目录

echo "开始合并还原全量+增量备份..."

# 步骤1: 准备全量备份(应用redo日志)
echo "1. 准备全量备份..."
xtrabackup --prepare --apply-log-only --target-dir=$FULL_BACKUP_DIR

# 步骤2: 合并第一次增量备份
echo "2. 合并第一次增量备份..."
xtrabackup --prepare --apply-log-only --target-dir=$FULL_BACKUP_DIR \
    --incremental-dir=$INC_BACKUP_DIR1

# 步骤3: 合并第二次增量备份(最后一步不使用--apply-log-only)
echo "3. 合并第二次增量备份..."
xtrabackup --prepare --target-dir=$FULL_BACKUP_DIR \
    --incremental-dir=$INC_BACKUP_DIR2

echo "合并完成!现在可以执行恢复操作..."

还原

bash 复制代码
# 1. 停止MySQL
systemctl stop mysql

# 2. 清空数据目录(确保已备份重要数据)
rm -rf /var/lib/mysql/*

# 3. 执行还原
xtrabackup --copy-back --target-dir=/backup/mysql/full_20251013_222642

# 4. 设置权限
chown -R mysql:mysql /var/lib/mysql

# 5. 启动MySQL
systemctl start mysql

这样我们就完成了使用增量物理备份工具(xtrabackup),从备份到还原的全部操作,当然这里只演示步骤,真实环境还需要考虑很多因素,会更复杂。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

相关推荐
5***26201 小时前
MySQL存储过程优化实例
数据库·mysql
hans汉斯1 小时前
基于改进YOLOv11n的无人机红外目标检测算法
大数据·数据库·人工智能·算法·yolo·目标检测·无人机
Anthony_49261 小时前
【踩坑】gorm 回写主键不正确
mysql·go·orm
郝学胜-神的一滴1 小时前
Effective Python 第52条:用subprocess模块优雅管理子进程
linux·服务器·开发语言·python
晨枫阳1 小时前
不同语言数组详解
linux·服务器·windows
r***11332 小时前
【玩转全栈】----Django模板语法、请求与响应
数据库·python·django
冉冰学姐2 小时前
SSM计算机课程在线教育服务平台xpwo1(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库
q_19132846952 小时前
基于SpringBoot2+Vue2的宠物健康医疗论坛系统
vue.js·spring boot·mysql·健康医疗·宠物·计算机毕业设计
q***75182 小时前
Linux(CentOS)安装 MySQL
linux·mysql·centos