Mysql的备份与恢复全过程(使用XtraBackup)

 更新时间:2026年01月27日 15:37:53   作者:杨了个杨8982  
xtrabackup是MySQL的物理备份工具,比mysqldump更快,安装时需选择适合MySQL版本的PerconaXtraBackup,备份分为全量和增量,恢复时需停服务,清空数据目录,按全量和增量恢复,最后准备备份并启动服务,注意MySQL8.0的特殊配置和权限设置

xtrabackup是MySQL的一种物理备份工具,相对于mysqldump,备份和还原速度更快。

一、安装 XtraBackup

MySQL 8.0版本

# CentOS 7
wget https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo rpm -ivh percona-release-latest.noarch.rpm
sudo percona-release enable-only tools release
yum install -y percona-xtrabackup-80


# CentOS 8
dnf install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release setup -y ps80
dnf install -y percona-xtrabackup-80

# Ubuntu
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 enable-only tools release
sudo apt update
sudo apt install -y percona-xtrabackup-80

 MySQL 5.7版本

# CentOS 7
wget https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo rpm -ivh percona-release-latest.noarch.rpm
sudo percona-release enable tools release
sudo yum install percona-xtrabackup-24


# CentOS 8
sudo dnf install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo percona-release setup tools
sudo dnf install percona-xtrabackup-24

# Ubuntu
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 enable tools release
sudo apt update
sudo apt install percona-xtrabackup-24

 注意:

  • Percona XtraBackup 8.0 版本适合 MySQL 8.0
  • Percona XtraBackup 2.4 版本适合 MySQL 5.7

二、备份 MySQL 数据库

1.创建备份目录

sudo mkdir -p /data/backups/mysql
sudo chown -R mysql:mysql /data/backups

2.执行备份

(1)全量备份

# MySQL 5.7
xtrabackup --user=backupuser --password=password \
  --host=localhost --backup --target-dir=/data/backups/mysql/full_$(date +%F)

# MySQL 8.0(需添加 --no-timestamp 参数)
xtrabackup --user=backupuser --password=password \
  --host=localhost --backup --target-dir=/data/backups/mysql/full_$(date +%F) \
  --no-timestamp

(2)增量备份(可选)

# 首次全量备份
xtrabackup --backup --target-dir=/data/backups/full

# 后续增量备份
xtrabackup --backup --target-dir=/data/backups/incremental_1 \
  --incremental-basedir=/data/backups/full

xtrabackup --backup --target-dir=/data/backups/incremental_2 \
  --incremental-basedir=/data/backups/incremental_1

三、恢复 MySQL 数据库

1.停止 MySQL 服务

# CentOS 7
sudo systemctl stop mysqld

# CentOS 8/Ubuntu
sudo systemctl stop mysql

2.执行恢复操作

(1)清空数据目录

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

(2)全量备份还原

# 注意:恢复时需使用 --copy-back 参数
xtrabackup --prepare --target-dir=/data/backups/mysql/full_$(date +%F)
xtrabackup --copy-back --target-dir=/data/backups/mysql/full_$(date +%F)

(3)增量备份还原(可选)

# 有增量备份的还原,最后一次还原不需要加选项--apply-log-only,假设存在两个增量备份:incremental_1 和 incremental_2,按顺序应用增量备份

# 准备全量备份(不生成回滚点)
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/full

# 应用第一个增量备份
xtrabackup --prepare --apply-log-only \
  --target-dir=/data/backups/full \
  --incremental-dir=/data/backups/incremental_1

# 应用第二个增量备份
xtrabackup --prepare --apply-log-only \
  --target-dir=/data/backups/full \
  --incremental-dir=/data/backups/incremental_2

# 最终准备(生成回滚点)
xtrabackup --prepare --target-dir=/data/backups/full

# 还原最终回滚点
xtrabackup --copy-back --target-dir=/data/backups/mysql/full

关键参数说明

  • 1.--apply-log-only
  • 防止在应用增量日志后自动生成回滚点,确保可以继续应用后续增量备份
  • 2.--incremental-dir
  • 指定增量备份文件所在目录
  • 3.最终 prepare 不使用 --apply-log-only
  • 生成最终回滚点,使备份数据处于一致性状态

3.修复权限

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

4.启动 MySQL 服务

# CentOS 7
sudo systemctl start mysqld

# CentOS 8/Ubuntu
sudo systemctl start mysql

注意:

1.MySQL 8.0 特殊配置

  • 需添加 --no-timestamp 参数避免创建时间戳目录
  • 可能需要调整 validate_password 插件配置

2.备份用户需具备 RELOAD, LOCK TABLES, REPLICATION CLIENT 权限

CREATE USER 'backupuser'@'localhost' IDENTIFIED BY 'password';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, PROCESS ON *.* TO 'backupuser'@'localhost';
FLUSH PRIVILEGES;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解MySQL8的新特性ROLE

    详解MySQL8的新特性ROLE

    这篇文章主要介绍了详解MySQL8的新特性ROLE的相关资料,帮助大家更好的理解和使用MySQL8,感兴趣的朋友可以了解下
    2020-11-11
  • MySQL 的覆盖索引与回表的使用方法

    MySQL 的覆盖索引与回表的使用方法

    这篇文章主要介绍了MySQL 的覆盖索引与回表的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • mysql中迅速插入百万条测试数据的方法

    mysql中迅速插入百万条测试数据的方法

    最近想到创建一个大量数据的测试环境,于是找了一下怎么插入100W条数据,我用的是20个字段
    2012-04-04
  • MySQL游标和触发器的操作流程

    MySQL游标和触发器的操作流程

    本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • 计算机管理服务中找不到mysql的服务的解决办法

    计算机管理服务中找不到mysql的服务的解决办法

    MySQL是一种流行的开源关系型数据库管理系统,用于存储和管理大量数据,在计算机管理中,启动MySQL服务是一项重要的任务,因为它可以确保数据库系统的顺利运行,这篇文章主要给大家介绍了关于计算机管理服务中找不到mysql的服务的解决办法,需要的朋友可以参考下
    2023-05-05
  • Lost connection to MySQL server at ''reading authorization packet'', system error: 0

    Lost connection to MySQL server at ''reading authorization p

    这篇文章主要介绍了Lost connection to MySQL server at 'reading authorization packet', system error: 0错误解决方法,需要的朋友可以参考下
    2014-08-08
  • 详解mysql中字符串转为数字的三种方法

    详解mysql中字符串转为数字的三种方法

    这篇文章主要为大家详细介绍了mysql中字符串转为数字的三种常用方法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • MySQL中可为空的字段设置为NULL还是NOT NULL

    MySQL中可为空的字段设置为NULL还是NOT NULL

    今天小编就为大家分享一篇关于MySQL中可为空的字段设置为NULL还是NOT NULL,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • MySQL重复数据提取最新一条技术方法详解

    MySQL重复数据提取最新一条技术方法详解

    在MySQL数据库中清除重复数据是一项常见的任务,下面这篇文章主要给大家介绍了关于MySQL重复数据提取最新一条的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • MySQL使用IF语句及用case语句对条件并结果进行判断 

    MySQL使用IF语句及用case语句对条件并结果进行判断 

    这篇文章主要介绍了MySQL使用IF语句及用case语句对条件并结果进行判断,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09

最新评论