iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL如何使用使用Xtrabackup进行备份和恢复
  • 629
分享到

MySQL如何使用使用Xtrabackup进行备份和恢复

MySQLXtrabackupMySQL备份和恢复 2022-05-27 16:05:42 629人浏览 泡泡鱼
摘要

目录1 备份1.1 全备1.2 增备2 备份恢复2.1 准备数据2.2 进行恢复3 目录结构4 备份脚本4.1 脚本4.2 配置文件5 恢复脚本5.1 脚本5.2 配置文件1 备份 进行备份前需要先创建备份用户,直接

目录
  • 1 备份
    • 1.1 全备
    • 1.2 增备
  • 2 备份恢复
    • 2.1 准备数据
    • 2.2 进行恢复
  • 3 目录结构
    • 4 备份脚本
      • 4.1 脚本
      • 4.2 配置文件
    • 5 恢复脚本
      • 5.1 脚本
      • 5.2 配置文件

    1 备份

    进行备份前需要先创建备份用户,直接使用 root 用户进行备份也行,但是这样不太规范。

    
        create user backup@'localhost' identified by '123456';
        grant reload,process,lock tables,replication client on *.* to backup@localhost;

    1.1 全备

    备份整个库,使用的是备份用户,备份文件存放地址为 /backup/

    
        innobackupex --defaults-file=/etc/my.cnf --user=backup --passWord=123456 /backup/
    

    1.2 增备

    指定为增量备分,使用的是备份用户,增量的基础为上一次的全备,已经使用 --incremental-basedir 进行指定了,备份后存放的文件为 /backup/

    
        innobackupex --defaults-file=/etc/my.cnf --user=backup --password=123456 --incremental --incremental-basedir=/backup/2021-06-01_14-44-54 /backup/
    
    

    2 备份恢复

    2.1 准备数据

    回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态

    
        innobackupex --apply-log --redo-only /backup/2021-06-01_14-44-54/
    

    2.2 进行恢复

    在恢复前,需要确保 Mysql 的数据目录为已经删除了。

    
        innobackupex --copy-back --datadir=/usr/local/mysql/data /backup/2021-06-01_14-44-54/
    

    恢复后,需要对 Mysql 的data 目录进行重新赋权:

    
        chown -R mysql:mysql data/
    

    到这恢复就完成了。

    3 目录结构

    4 备份脚本

    4.1 脚本

    backup.sh

    
        #!/bin/bash
        # 获得程序路径名
        program_dir=`dirname $0`/..
        # 读取配置文件中的所有变量值, 设置为全局变量
        # 配置文件
        conf_file="$program_dir/conf/backup.conf"
        # mysql 用户
        user=`sed '/^user=/!d;s/.*=//' $conf_file`
        # mysql 密码
        password=`sed '/^password=/!d;s/.*=//' $conf_file`
        # mysql 备份目录
        backup_dir=`sed '/^backup_dir=/!d;s/.*=//' $conf_file`
        # mysql 备份压缩打包目录
        gzip_dir=`sed '/^gzip_dir=/!d;s/.*=//' $conf_file`
        # percona-xtrabackup命令xtrabackup路径
        xtrabackup_bin=`sed '/^xtrabackup_bin=/!d;s/.*=//' $conf_file`
        # mysql 全备前缀标识
        full_backup_prefix=`sed '/^full_backup_prefix=/!d;s/.*=//' $conf_file`
        # mysql 增量备前缀标识
        increment_prefix=`sed '/^increment_prefix=/!d;s/.*=//' $conf_file`
        # 备份错误日志文件
        error_log=$program_dir/var/`sed '/^error_log=/!d;s/.*=//' $conf_file`
        # 备份索引文件
        index_file=$program_dir/var/`sed '/^index_file=/!d;s/.*=//' $conf_file`
        # 备份日期
        backup_date=`date +%F`
        # 备份时间
        backup_time=`date +%H-%M-%S`
        # 备份时的周几
        backup_week_day=`date +%u`
        # 创建相关目录
        log_dir=$program_dir/log/backup
        var_dir=$program_dir/var
        mkdir -p $backup_dir
        mkdir -p $log_dir
        mkdir -p $var_dir
        mkdir -p $gzip_dir
        # 全量备份
        function full_backup() {
          backup_folder=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
          mkdir -p $backup_dir/$backup_folder
          $xtrabackup_bin \
            --user=$user \
            --password=$password \
            --backup \
            --target-dir=$backup_dir/$backup_folder > $log_dir/${backup_folder}.log 2>&1
          return $?
        }
        # 增量备份
        function increment_backup() {
          backup_folder=${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day}
          incr_base_folder=`sed -n '$p' $index_file | \
                           awk -F '[, {}]*' '{print $3}' | \
                           awk -F ':' '{print $2}'`
          mkdir -p $backup_dir/$backup_folder
          $xtrabackup_bin \
            --user=$user \
            --password=$password \
            --backup \
            --target-dir=$backup_dir/$backup_folder \
            --incremental-basedir=$backup_dir/$incr_base_folder > $log_dir/${backup_folder}.log 2>&1
          return $?
        }
        # 删除之前的备份(一般在全备完成后使用)
        function delete_before_backup() {
          cat $index_file | awk -F '[, {}]*' '{print $3}' | \
            awk -v backup_dir=$backup_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s\n", backup_dir, $2)}}' | \
            /bin/bash
          cat $index_file | awk -F '[, {}]*' '{print $3}' | \
            awk -v gzip_dir=$gzip_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s\n", gzip_dir, $2)}}' | \
            /bin/bash
          cat $index_file | awk -F '[, {}]*' '{print $3}' | \
            awk -v log_dir=$log_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s.log\n", log_dir, $2)}}' | \
            /bin/bash
        }
        # 备份索引文件
        function backup_index_file() {
          cp $index_file ${index_file}_$(date -d "1 day aGo" +%F)
        }
        # 备份索引文件
        function send_index_file_to_remote() {
          # ./expect_scp ip地址 账号 密码  ${index_file} 目标服务器存放的文件夹 端口号 
          echo 'send index file ok'
        }
        # 添加索引, 索引记录了当前最新的备份
        function append_index_to_file() {
          echo "{week_day:$backup_week_day, \
                 dir:${1}_${backup_date}_${backup_time}_${backup_week_day}, \
                 type:${1}, \
                 date:${backup_date}}" >> $index_file
        }
        # 记录错误消息到文件
        function logging_backup_err() {
          echo "{week_day:$backup_week_day, \
                 dir:${1}_${backup_date}_${backup_time}_${backup_week_day}, \
                 type:${1}, \
                 date:${backup_date}}" >> $error_log
        }
        # 清空索引
        function purge_index_from_file() {
          > $index_file
        }
        # 清空错误日志信息
        function purge_err_log() {
          > $error_log
        }
        # 打包备份
        function tar_backup_file() {
          cd $backup_dir
          tar -jcf ${gzip_dir}/${1}_${backup_date}_${backup_time}_${backup_week_day}.tar.bz2 \
                   ${1}_${backup_date}_${backup_time}_${backup_week_day}
          cd - > /dev/null
          rm -rf ${backup_dir}/${1}_${backup_date}_${backup_time}_${backup_week_day}
        }
        # 发送备份到远程
        function send_backup_to_remote() {
          #  ./expect_scp ip地址 账号 密码 ${gzip_dir}/${1}_${backup_date}_${backup_time}_${backup_week_day}.tar.bz2 目标服务器存放的文件夹 端口号 
          echo "send $1 remote ok"
        }
        # 判断是应该全备还是增量备份
        # 0:full, 1:incr
        function get_backup_type() {
          backup_type=0
          if [ 1 -eq `date +%H` ]; then
            backup_type=0
          else
            backup_type=1
          fi
          touch $index_file
          if [ ! -n "`cat $index_file`" ]; then
            backup_type=0
          fi
          return $backup_type
        }
        # 测试配置文件正确性
        function test_conf_file() {
          # 判断每个变量是否在配置文件中有配置,没有则退出程序
          if [ ! -n "$user" ]; then echo 'fail: configure file user not set'; exit 2; fi
          if [ ! -n "$password" ]; then echo 'fail: configure file password not set'; exit 2; fi
          if [ ! -n "$backup_dir" ]; then echo 'fail: configure file backup_dir not set'; exit 2; fi
          if [ ! -n "$gzip_dir" ]; then echo 'fail: configure file backup_dir not set'; exit 2; fi
          if [ ! -n "$full_backup_prefix" ]; then echo 'fail: configure file full_backup_prefix not set'; exit 2; fi
          if [ ! -n "$increment_prefix" ]; then echo 'fail: configure file increment_prefix not set'; exit 2; fi
          if [ ! -n "$error_log" ]; then echo 'fail: configure file error_log not set'; exit 2; fi
          if [ ! -n "$index_file" ]; then echo 'fail: configure file index_file not set'; exit 2; fi
        }
        # 执行
        function main() {
          # 检测配置文件值
          test_conf_file
          # 判断是执行全备还是增量备份
          get_backup_type
          backup_type=$?
          case $backup_type in
            0 )
              # 全量备份
              full_backup
              backup_ok=$?
              if [ 0 -eq "$backup_ok" ]; then
              # 全备成功
                # 打包最新备份
                tar_backup_file $full_backup_prefix
                # # 将tar备份发送到远程
                send_backup_to_remote $full_backup_prefix
                # 备份索引文件
                backup_index_file
                # 清除之前的备份
                delete_before_backup
                # 清除索引文件
                purge_index_from_file
                # 添加索引, 索引记录了当前最新的备份
                append_index_to_file $full_backup_prefix
                # 发送索引文件到远程
                send_index_file_to_remote
              else
              # 全备失败
                # 删除备份目录
                rm -rf ${backup_dir}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
                # 记录错误日志
                logging_backup_err $full_backup_prefix
              fi
              ;;
            1 )
              # 增量备份
              increment_backup
              backup_ok=$?
              if [ "$backup_ok" -eq 0 ]; then
              # 增量备份成功
                # 打包最新备份
                tar_backup_file $increment_prefix
                # # 将tar备份发送到远程
                send_backup_to_remote $increment_prefix
                # 添加索引, 索引记录了当前最新的备份
                append_index_to_file $increment_prefix
                # # 发送索引文件到远程
                send_index_file_to_remote
              else
              # 增量备份失败
                # 删除备份目录
                rm -rf ${backup_dir}/${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day}
                # 记录错误日志
                logging_backup_err $increment_prefix
              fi
              ;;
          esac
        }
        main
    
    

    4.2 配置文件

    backup.conf

    
        # mysql 用户名
        user=backup
        # mysql 密码
        password=123456
        # 备份路径
        backup_dir=/data/backup
        # 备份压缩打包目录
        gzip_dir=/data/backups/backups_zip
        # innobackupex 命令路径
        xtrabackup_bin=/opt/xtrabackup/bin/xtrabackup
        # 全量备信息名称 前缀
        full_backup_prefix=full
        # 增量备信息名称 前缀
        increment_prefix=incr
        # 错误日志文件(根据此文件知道备份是否成功)
        # fORMat:
        # {week_day:1,dir:full/incr_2015-12-29_00-00-00_7,type:full/incr,date:2015-12-30}
        error_log=mysql_increment_hot_backup.err
        # 索引文件
        # format:
        # {week_day:1,dir:full/incr_2015-12-29_00-00-00_7,type:full/incr,date:2015-12-30}
        index_file=mysql_increment_hot_backup.index
    

    5 恢复脚本

    5.1 脚本

    restore.sh

    
        #!/bin/bash
        # 获得程序路径名
        program_dir=`dirname $0`/..
        # 读取配置文件中的所有变量值, 设置为全局变量
        # 配置文件
        conf_file="$program_dir/conf/restore.conf"
        # MySQL 数据文件夹
        data_dir=`sed '/^data_dir=/!d;s/.*=//' $conf_file`
        # 备份索引文件路径
        backup_index_file=`sed '/^backup_index_file=/!d;s/.*=//' $conf_file`
        # percona-xtrabackup命令xtrabackup路径
        xtrabackup_bin=`sed '/^xtrabackup_bin=/!d;s/.*=//' $conf_file`
        # 备份文件目录
        backup_restore_dir=`sed '/^backup_restore_dir=/!d;s/.*=//' $conf_file`
        # 检查配置文件正确性
        function exam_conf_file() {
            # 判断每个变量是否在配置文件中有配置,没有则退出程序
            if [ ! -n "$data_dir" ]; then echo 'fail: configure file data_dir not set'; exit 2; fi
            if [ ! -n "$backup_index_file" ]; then echo 'fail: configure file backup_index_file not set'; exit 2; fi
            if [ ! -n "$xtrabackup_bin" ]; then echo 'fail: configure file xtrabackup_bin not set'; exit 2; fi
            if [ ! -n "$backup_restore_dir" ]; then echo 'fail: configure file backup_restore_dir not set'; exit 2; fi
        }
        # 检查备份文件是否是压缩格式
        function exam_backup_restore_file(){
            file_backup_restore_name_arr=`ls $backup_restore_dir`
            for file_name in $file_backup_restore_name_arr;do
                if [ "${file_name##*.}"x = "bz2"x ];then
                    tar -jxf $backup_restore_dir/$file_name -C $backup_restore_dir
                    rm -rf $backup_restore_dir/$file_name
                fi
    
            done
        }
        # 检查 MySQL 是否停止
        function exam_mysql_is_stop(){
            if [ 0 -eq `ps -ef | grep mysql | grep -v grep | wc -l` ]; then
                echo "MySQL 服务已停止"
            else
                /etc/init.d/mysqld stop
                echo "正在停止 MySQL 服务"
                sleep 3
                echo "已停止 MySQL 服务"
            fi
        }
        # 检查 MySQL data 文件是否删除
        function exam_data_is_del(){
            if [ -d $data_dir ];then
                echo "正在删除 MySQL 的data文件"
                rm -rf $data_dir
            else
                echo "MySQL 的数据文件已删除 "
            fi
        }
        # 读取备份索引文件
        function read_backup_index() {
            cat $backup_index_file | awk '{print $2}' | awk -F: '{print $2}' | awk '{sub(/.$/,"")}1'
        }
        # 准备全备文件
        function ready_full(){
            full_file_name=`echo ${1} | awk '{print $1}'`
            $xtrabackup_bin/innobackupex \
                --apply-log \
                --redo-only \
                $backup_restore_dir/$full_file_name
    
            echo "全备文件已准备好"
        }
        # 准备增备文件
        function ready_incr(){
            backup_index=$(read_backup_index)
            full_file_name=`echo $backup_index | awk '{print $1}'`
            for file_name in $backup_index;do
                if [ 1 -eq `echo "$file_name" | grep incr | wc -l` ]; then 
                    $xtrabackup_bin/innobackupex \
                        --apply-log \
                        --redo-only \
                        $backup_restore_dir/$full_file_name \
                        --incremental-dir=$backup_restore_dir/$file_name
                fi
            done
            echo "增备文件已准备好"
        }
        # 执行备份恢复
        function exec_backup_restore(){
            echo "开始进行备份恢复"
            full_file_name=`echo ${1} | awk '{print $1}' `
            $xtrabackup_bin/innobackupex \
                --copy-back \
                --datadir=$data_dir \
                $backup_restore_dir/$full_file_name
        }
        # 执行
        function main() {
            # 检查配置文件正确性
            exam_conf_file
            # 检查备份文件是否是压缩格式
            exam_backup_restore_file
            # 检查 MySQL 是否停止
            exam_mysql_is_stop
            # 检查 MySQL data 文件是否删除
            exam_data_is_del
            # 读取索引文件
            backup_index=$(read_backup_index)
            # 准备全备文件
            ready_full $backup_index
            # 准备增备文件
            ready_incr
            # 执行备份恢复
            exec_backup_restore $backup_index
            # 对数据文件进行赋权
            echo "重新对数据目录赋权"
            chown -R mysql:mysql $data_dir
            echo "正在启动MySQL"
            /etc/init.d/mysqld start
            echo "备份恢复成功"
        }
        main
    
    

    5.2 配置文件

    restore.conf

    
        # MySQL 数据文件夹
        data_dir=/opt/mysql/data
        #备份索引文件路径
        backup_index_file=/opt/xtrabackup/backup/var/mysql_increment_hot_backup.index
        #xtrabackup bin 的目录 
        xtrabackup_bin=/opt/xtrabackup/bin
        # 备份文件目录
        backup_restore_dir=/data/backups/backups_zip
    

    以上就是MySQL如何使用使用Xtrabackup进行备份和恢复的详细内容,更多关于MySQL 用Xtrabackup备份和恢复的资料请关注自学编程网其它相关文章!

    您可能感兴趣的文档:

    --结束END--

    本文标题: MySQL如何使用使用Xtrabackup进行备份和恢复

    本文链接: https://www.lsjlt.com/news/10407.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 如何进行MySQL中的xtrabackup备份恢复
      这篇文章给大家介绍如何进行MySQL中的xtrabackup备份恢复,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。    XtraBackup是Percona推出...
      99+
      2024-04-02
    • 如何使用mysqldump对mysql进行备份和恢复
      这篇文章给大家分享的是有关如何使用mysqldump对mysql进行备份和恢复的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。mysqldump是mysql的逻辑备份恢复工具,可以...
      99+
      2024-04-02
    • 如何使用MySQL进行数据备份和恢复?
      如何使用MySQL进行数据备份和恢复?数据库中的数据对于任何企业或个人而言都是非常重要的。由于各种原因(如硬件故障、人为错误或恶意攻击等),数据可能会丢失或损坏。因此,定期进行数据库备份是非常重要的。MySQL作为最受欢迎的开源关系型数据库...
      99+
      2023-10-22
      数据恢复 MySQL备份 MySQL数据备份
    • 如何用Percona XtraBackup进行MySQL从库的单表备份和恢复
      环境说明: 主库:192.168.0.1 从库1:192.168.0.2 从库2:192.168.0.3 备份工具 : Percona xtrabackup version 2.4.8 based on M...
      99+
      2024-04-02
    • MySQL如何使用Xtrabackup备份
      这篇文章给大家分享的是有关MySQL如何使用Xtrabackup备份的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。01 背景    Xtrabackup是Percona公司开发的一款...
      99+
      2023-06-14
    • MySQL Xtrabackup备份和恢复方法
      本篇内容主要讲解“MySQL Xtrabackup备份和恢复方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL Xtrabackup备份和恢复方法”吧...
      99+
      2024-04-02
    • 如何进行MySQL 5.6 xtrabackup 全量和增量的备份及恢复
      今天就跟大家聊聊有关如何进行MySQL 5.6 xtrabackup 全量和增量的备份及恢复,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。xtrab...
      99+
      2024-04-02
    • 如何使用xtrabackup备份和还原mysql
      这篇文章给大家介绍如何使用xtrabackup备份和还原mysql,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、安装percona-xtrabackup# 下载安装包:# ...
      99+
      2024-04-02
    • 使用XtraBackup备份MySQL
      一、使用每表单个表空间这样ibdata1文件不会过大。xtrabackup可以使用部分备份了,需要在一个表一个文件的状况下才能使用。1.在使用xtrabackup之前,我们需要查看我们当前mysql是否是使...
      99+
      2024-04-02
    • 使用DBeaver进行mysql数据备份与恢复
      目录 前言 一、Dbeaver是什么? 二、Dbeaver如何备份与恢复数据 1.备份Mysql数据 2.恢复Mysql数据 三、导入sql失败与解决 总结 前言 项目迭代、版本升级的过程中,有时候会涉及到数据库表结构的更改,因而,数据库...
      99+
      2023-08-18
      android 前端 后端
    • 如何使用Xtrabackup远程备份Mysql
      小编给大家分享一下如何使用Xtrabackup远程备份Mysql,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Xtrabackup的远程备份,是把备份传到标准输出,再传到远程服务器。首先,...
      99+
      2024-04-02
    • 如何使用SQL语句在MySQL中进行数据备份和恢复?
      如何使用SQL语句在MySQL中进行数据备份和恢复?在数据库中,数据备份和恢复是非常重要的操作,可以保证数据的安全性并且在遇到意外情况时能够迅速恢复数据。MySQL是一个非常常用的关系型数据库,它提供了多种方式来进行数据备份和恢复,其中一种...
      99+
      2023-12-17
      MySQL SQL 数据备份
    • FreeBSD如何进行备份和恢复
      FreeBSD可以使用多种工具来进行备份和恢复,以下是一些常用的方法: 使用rsync命令进行备份和恢复: 备份:可以使用rs...
      99+
      2024-04-02
    • xtrabackup如何实现MySQL自动备份恢复
      这篇文章主要介绍了xtrabackup如何实现MySQL自动备份恢复,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. xtrabackup...
      99+
      2024-04-02
    • 如何使用Xtrabackup备份MySQL数据库
      这篇文章将为大家详细讲解有关如何使用Xtrabackup备份MySQL数据库,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。本文则演示如何从xtrabackup的备份中进行...
      99+
      2024-04-02
    • MySQL中如何进行数据备份和恢复
      MySQL 中可以通过使用 mysqldump 工具来进行数据备份和恢复操作。以下是备份和恢复的步骤: 数据备份: 打开命令行工具...
      99+
      2024-03-06
      MySQL
    • MySQL中如何进行备份和恢复数据
      在MySQL中,可以使用mysqldump命令来备份数据库,使用mysql命令来恢复数据库。 备份数据: mysqldump -u ...
      99+
      2024-04-09
      MySQL
    • xtrabackup备份以及恢复(MySQL适用于8.0)
      一、安装xtrabackup 官网:Percona XtraBackup for MySQL - Percona 上传至服务器并安装: rpm -ivh percona-xtrabackup-80-8.0.32-26.1.el7.x86_6...
      99+
      2023-09-06
      mysql 数据库
    • 详解如何利用Xtrabackup进行mysql增量备份
      目录利用Xtrabackup进行mysql增量备份安装设置数据库用于备份账户全量备份增量备份提问总结原理为什么最后一次增量备份不用 "--apply-log-only"为什么备份完后要准备备份 &qu...
      99+
      2024-04-02
    • 如何使用Mysqldump备份和恢复mysql数据库
      这篇文章给大家介绍如何使用Mysqldump备份和恢复mysql数据库,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 dump is an effective tool to bac...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作