• 【5】MySQL数据库备份-XtraBackup - 全量备份


    前言

    关于数据库备份的一些常见术语、工具等,可见《MySQL数据库-备份》章节,当前不再重复概述。本篇主要对 XtraBackup 工具的使用做下详细讲解。

    首先,说下所使用的环境、版本。

    环境

    • 操作系统:Red Hat Enterprise Linux Server release 7.5 (Maipo)
    • 数据库:mysql Ver 8.0.32 for Linux on x86_64 (MySQL Community Server - GPL)
    • XtraBackup:
      • percona-xtrabackup-80-8.0.35-30.1.el7.x86_64.rpm
      • percona-xtrabackup-80-8.0.32-25.1.el7.x86_64.rpm

    版本

    关于 XtraBackup 的版本这里有必要说明下,参考官网如下:

    但我个人的习惯,还是尽量和数据库的版本保持一致(仅个人习惯)。
    原因如下
    当前 MySQL 数据库版本 8.0.32,若安装 XtraBackup 版本为 8.0.35-??,则查看 XtraBackup 版本时,将有如下输出、其最后一句,看着别扭
    在这里插入图片描述
    版本也是经过测试的,可以备份 MySQL 8.0.32 的版本。

    而且备份中,也有输出:xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64) (revision id: 6beb4b49)
    看着就是别扭故 XtraBackup 版本一般与数据库当前版本保持一致
    在这里插入图片描述在这里插入图片描述

    安装部署

    下载

    下载安装包的方式较多,当前主要以RPM包二进制包进行讲解,本篇博文使用RPM包安装部署、测试。

    RPM 包

    访问官网地址:https://www.percona.com/downloads
    打开官网页面后,鼠标往下扒拉、可找到如下截图:依次选择下载 即可。
    在这里插入图片描述
    或者直接使用下载地址:

    二进制包

    1. 执行如下命令进行下载:
    $ wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-30/binary/tarball/percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz
    
    

    上述下载命令中包版本的选择(或者包名字的选择), 可参考官网如下地址:
    https://docs.percona.com/percona-xtrabackup/8.0/binary-tarball-names.html
    在这里插入图片描述

    安装

    在安装 XtraBackup 过程中遇到了报错,见《XtraBackup 安装报错 zstd》文章,故提前做下依赖包的安装。

    1. 安装依赖包执行如下命令:
    yum -y install epel-release zstd
    
    1. 安装 XtraBackup
    yum -y install percona-xtrabackup-80-8.0.35-30.1.el7.x86_64.rpm
    
    1. 查看版本
      说明下哈:实际上,我使用的版本是8.0.32 版本,当前安装的是 8.0.35 版本,你懂我的意思吧?-- 下面有卸载步骤。
    [root@testdbmy01 soft]# xtrabackup -version
    
    2024-06-01T10:05:07.033137+08:00 0 [Note] [MY-011825] [Xtrabackup] recognized server arguments: --server-id=8833 --datadir=/mysql/data --tmpdir=/mysql/tmp --open_files_limit=65535 --log_bin=/mysql/binlog/mysql-bin --innodb_data_home_dir=/mysql/data/ --innodb_log_group_home_dir=/mysql/data/ --innodb_file_per_table=1 --innodb_data_file_path=ibdata1:1G:autoextend --innodb_flush_log_at_trx_commit=1 --innodb_buffer_pool_size=1G --innodb_io_capacity=1000 --innodb_max_dirty_pages_pct=60 --innodb_flush_method=O_DIRECT --innodb_log_file_size=2G --innodb_log_files_in_group=2 --innodb_log_buffer_size=64M --innodb_write_io_threads=8 --innodb_read_io_threads=8 --innodb_open_files=4096 
    xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64) (revision id: 6beb4b49)
    [root@testdbmy01 soft]# 
    

    卸载

    1. 查找已经安装的 XtraBackup 名称
    [root@testdbmy01 soft]# yum list installed | grep -i xtrabackup
    percona-xtrabackup-80.x86_64              8.0.35-30.1.el7          installed    
    [root@testdbmy01 soft]# 
    
    
    1. 卸载
    [root@testdbmy01 soft]# yum -y remove percona-xtrabackup-80.x86_64
    Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
    This system is not registered with an entitlement server. You can use subscription-manager to register.
    Resolving Dependencies
    --> Running transaction check
    ---> Package percona-xtrabackup-80.x86_64 0:8.0.35-30.1.el7 will be erased
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    ==========================================================================================================================================================================================
     Package                                              Arch                                  Version                                        Repository                                Size
    ==========================================================================================================================================================================================
    Removing:
     percona-xtrabackup-80                                x86_64                                8.0.35-30.1.el7                                installed                                219 M
    
    Transaction Summary
    ==========================================================================================================================================================================================
    Remove  1 Package
    
    Installed size: 219 M
    Downloading packages:
    Running transaction check
    Running transaction test
    Transaction test succeeded
    Running transaction
      Erasing    : percona-xtrabackup-80-8.0.35-30.1.el7.x86_64                                                                                                                           1/1 
      Verifying  : percona-xtrabackup-80-8.0.35-30.1.el7.x86_64                                                                                                                           1/1 
    
    Removed:
      percona-xtrabackup-80.x86_64 0:8.0.35-30.1.el7                                                                                                                                          
    
    Complete!
    [root@testdbmy01 soft]# 
    

    场景分析

    再次声明 虽然安装的步骤中是8.0.35版本,但实际上:背地里 偷偷的卸载重装了 XtraBackup 版本是 8.0.32
    如下场景也是基于8.0.32版本,一个小版本号而已,问题不大。

    全量备份 | 恢复

    备份

    1. 创建备份目录(使用root用户执行)
    [root@testdbmy01 /]# DATE=`date +%Y%m%d%H`
    [root@testdbmy01 /]# mkdir -p /backup/$DATE 
    
    1. 执行备份
    [root@testdbmy01 /]# xtrabackup --backup --target-dir=/backup/2024060110 --user=root --password=123456 
    

    参数讲解:

    • --backup:指示 XtraBackup 执行备份。
    • --target-dir:指定备份文件的目标目录。
    • --user--password:用于访问 MySQL 数据库的用户凭证。
    1. 准备数据
    [root@testdbmy01 /]# xtrabackup --prepare --target-dir=/backup/2024060110
    

    这个准备数据 是干啥的?能不能省略?

    既然写了,那肯定是不能省略滴~。原因有以下三个:

    1. 应用事务日志:在备份期间,XtraBackup 会创建一个不一致的备份,因为数据库在备份过程中可能有写操作。为了确保备份的一致性,需要应用事务日志。--prepare 步骤会读取备份中的事务日志文件,并应用这些日志到数据文件,从而使数据文件处于一致状态。
    2. 使备份可恢复:未经 --prepare 处理的备份数据文件是不可恢复的。必须先准备备份,应用所有的事务日志,才能确保恢复时数据文件的一致性。
    3. 支持增量备份 :如果你在全量备份的基础上执行了增量备份,必须先对全量备份执行 --prepare --apply-log-only,然后才能应用增量备份。最后再执行一次 --prepare,使整个备份集可恢复。

    上述的备份,涉及的命令,也可以合并在一起。如下,将其放到脚本中了。

    使用时,
    先设置下这 3个变量:BACKUP_DIRMYSQL_USERMYSQL_PASSWORD
    然后,用 root 账号执行就好了,sh export.sh ,是不是很 easy …

    cat > backup_export.sh <<EOF
    #!/bin/bash
    
    # 设置变量
    BACKUP_DIR="/backup/`date +%Y%m%d%H`"
    MYSQL_USER="root"
    MYSQL_PASSWORD="123456"
    
    # 创建备份目录
    mkdir -p \$BACKUP_DIR
    
    # 执行全量备份
    xtrabackup --backup --target-dir=\$BACKUP_DIR --user=\$MYSQL_USER --password=\$MYSQL_PASSWORD
    
    # 检查备份是否成功
    if [ \$? -eq 0 ]; then
        echo "Backup successful, preparing the backup..."
        # 准备备份数据
        xtrabackup --prepare --target-dir=\$BACKUP_DIR
        if [ \$? -eq 0 ]; then
            echo "Backup prepared successfully."
        else
            echo "Failed to prepare backup."
        fi
    else
        echo "Backup failed."
    fi
    
    echo "Backup path:\$BACKUP_DIR"
    EOF
    

    恢复

    恢复步骤,更 easy 了,就 1 条命令。

    [root@testdbmy01 backup]# xtrabackup --copy-back --target-dir=/backup/2024060110
    

    综合

    主要是基于上面的备份恢复步骤,进行一次完整的演示操作。这里主要分为 6个步骤,如下:

    1. 创建 脚本,并执行,完成备份。
    • 创建脚本
    cat > backup_export.sh <<EOF
    #!/bin/bash
    
    # 设置变量
    BACKUP_DIR="/backup/`date +%Y%m%d%H`"
    MYSQL_USER="root"
    MYSQL_PASSWORD="123456"
    
    # 创建备份目录
    mkdir -p \$BACKUP_DIR
    
    # 执行全量备份
    xtrabackup --backup --target-dir=\$BACKUP_DIR --user=\$MYSQL_USER --password=\$MYSQL_PASSWORD
    
    # 检查备份是否成功
    if [ \$? -eq 0 ]; then
        echo "Backup successful, preparing the backup..."
        # 准备备份数据
        xtrabackup --prepare --target-dir=\$BACKUP_DIR
        if [ \$? -eq 0 ]; then
            echo "Backup prepared successfully."
        else
            echo "Failed to prepare backup."
        fi
    else
        echo "Backup failed."
    fi
    
    echo "Backup path:\$BACKUP_DIR"
    EOF
    
    • 执行脚本
    ## 检查 MySQL 数据库 运行中。
    [root@testdbmy01 soft]# ps -ef | grep mysql
    root      17601      1  0 11:15 pts/1    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/mysql/data --pid-file=/mysql/data/testdbmy01.pid
    mysql     18971  17601  0 11:15 pts/1    00:02:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/mysql/logs/mysql-error.log --open-files-limit=65535 --pid-file=/mysql/data/testdbmy01.pid --socket=/mysql/tmp/mysql.sock --port=3306
    root      21242   4833  0 15:11 pts/1    00:00:00 grep --color=auto mysql
    [root@testdbmy01 soft]# 
    
    ## 执行导出
    [root@testdbmy01 soft]# sh backup_export.sh 
    
    1. 停止数据库,并删除库(模拟故障)。
    ## 停止数据库
    [root@testdbmy01 soft]# service mysqld stop
    Shutting down MySQL.. SUCCESS! 
    [root@testdbmy01 soft]# 
    
    ## 我怕万一、恢复不出来。我没敢删除(rm -rf),我又偷偷的 mv 了...
    [root@testdbmy01 soft]# mv /mysql /mysql_bak202406
    [root@testdbmy01 soft]# 
    
    1. 创建数据库目录&文件
      恢复时,只有databinlog 会自动创建,其他还需手动创建。所以这里一次性全部创建完成。
    [root@testdbmy01 soft]# mkdir -p /mysql/{data,binlog,logs,tmp}
    [root@testdbmy01 soft]# touch /mysql/logs/{mysql-error.log,mysql-slow.log}
    
    1. 使用 步骤1 中的备份,进行恢复。
    [root@testdbmy01 soft]# xtrabackup --copy-back --target-dir=/backup/2024060115
    
    1. 设置权限
    [root@testdbmy01 soft]# chown -R mysql.mysql /mysql
    
    1. 启动数据库
    [root@testdbmy01 soft]# service mysqld start
    Starting MySQL..... SUCCESS! 
    [root@testdbmy01 soft]# 
    
    

    最后,在登录数据库验证一下,就 Okk 了。

    增量备份 | 恢复

    ~ 忒长了~ 已写 9千多字了,我怕~写完,字数太长受限制不能发布,
    当前章节、晚会我补链接~~

    部分备份 | 恢复

    在这里插入图片描述

  • 相关阅读:
    公众号查题:一步一步搭建属于自己的查题
    关于VUE启动内存溢出
    7、Lock的生产者消费者问题
    GitHub标星34.7k,没有记不住的正则表达式
    Github开源项目详解--Mall(一)
    软件设计模式系列之十七——解释器模式
    看完这篇 教你玩转渗透测试靶机Vulnhub——Toppo: 1
    JAVA多线程并发(一):线程的创建
    点云从入门到精通技术详解100篇-基于点云数据的钢板表面三维缺陷检测(续)
    Design A Youtube
  • 原文地址:https://blog.csdn.net/CharlesYuangc/article/details/139373039