MySQL使用Xtrabackup备份到AWS存储桶

2023-09-12 22:24:40

1.安装Xtrabackup

cd /tmp
wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.33-28/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.33-28.1.el7.x86_64.rpm
yum -y localinstall percona-xtrabackup-80-8.0.33-28.1.el7.x86_64.rpm
xtrabackup  --version

在这里插入图片描述

2.安装AWS CLI

2.1 安装

yum -y install python3-pip
pip3 install awscli

2.2设置 AWS CLI 配置信息

aws_access_key_id="AKI............................"         ##AWS密钥
aws_secret_access_key="JF.................................."     ##AWS密钥
aws_default_region="sa-east-1"    #这个是S3桶的区域,根据你开通的区域修改
aws_output_format="json"    #这个是默认的

2.3使用 aws configure 命令设置 AWS CLI 配置信息

aws configure set aws_access_key_id $aws_access_key_id
aws configure set aws_secret_access_key $aws_secret_access_key
aws configure set default.region $aws_default_region
aws configure set default.output $aws_output_format

2.4验证是否配置成功

aws  s3  ls

在这里插入图片描述

3.mysql授权备份用户

外部终端执行,不需要进入库

#mysql授权建立一个授权函数
check() {
    mysql=/opt/lucky/apps/mysql/bin/mysql
    sock=/opt/lucky/data/data_16303/mysql.sock
    passwd='123456'  #改成自己本地的mysql密码
    sql_command="GRANT BACKUP_ADMIN ON *.* TO 'root'@'localhost'; FLUSH PRIVILEGES;"
    $mysql -uroot -p$passwd -S $sock -e "$sql_command"
}
##执行授权函数
check

4.写入备份脚本

4.1创建一个放备份脚本的目录

脚本有两个地方需要修改的,一个是桶名字,一个是你的mysql密码

mkdir  -p  /data/backup/
vim /data/backup/backup_script.sh
#!/bin/bash
## --------------------- start config --------------------- ## 
## xtrabackup安装目录
XTRABACKUP_DIR="/usr/bin"
## 备份存放目录
BACKUP_DIR="/opt/backup"
## mysql安装目录
MYSQL_DIR="/opt/lucky/apps/mysql"
## 配置文件目录
MYSQL_CNF="/opt/lucky/conf/my_16303.cnf"
## 数据库用户
MYSQL_USER="root"
## 数据库密码
MYSQL_PASSWORD="password"
## 数据库端口
MYSQL_PORT=16303
## 数据库sock文件
MYSQL_SOCK="/opt/lucky/data/data_16303/mysql.sock"

## S3存储桶名称
S3_BUCKET="S3桶名"

## --------------------- end config --------------------- ## 

## 如果任何语句的执行结果不是true则应该退出。
set -e

## 当前天
CURRENT_DATE=$(date +%F)

## 当前小时(以24小时制表示)
CURRENT_HOUR=$(date +%H)

## AWS CLI 命令路径
aws_cmd="/usr/local/bin/aws"

function full_backup(){
    ## 描述:xtrabackup 全库备份
        
    PARA1=$1
    ## 开始时间
    START_TIME=$(date +"%s")
    ## 当前日期作为备份文件名后缀
    BACKUP_SUFFIX=$(date +"%Y%m%d%H")
    
    if [ ! -d "$BACKUP_DIR/$PARA1/full" ]; then
        mkdir $BACKUP_DIR/$PARA1/full -p
        ## 全库备份
        echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> Starting full backup."
        $XTRABACKUP_DIR/xtrabackup --defaults-file=$MYSQL_CNF -u$MYSQL_USER -p$MYSQL_PASSWORD -S$MYSQL_SOCK --backup --target-dir=$BACKUP_DIR/$PARA1/full > $BACKUP_DIR/$PARA1/full/full_backup_$BACKUP_SUFFIX.log 2>&1 
        echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> Backup logs in $BACKUP_DIR/$PARA1/full/full_backup_$BACKUP_SUFFIX.log."
        echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> Backup complete, size: $(du $BACKUP_DIR/$PARA1 --max-depth=1 -hl | grep 'full' | awk '{print $1}')."
        echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> Backup complete, using time: "$(($(date +"%s") - $START_TIME))" seconds."
        
        ## 打包全量备份
        tar -zcf $BACKUP_DIR/$PARA1/full_$BACKUP_SUFFIX.tar.gz $BACKUP_DIR/$PARA1/full
        ## 把打包好的压缩包上传到AWS S3
        $aws_cmd s3 cp $BACKUP_DIR/$PARA1/full_$BACKUP_SUFFIX.tar.gz s3://$S3_BUCKET/
        
        ## 检查上传成功后再删除备份目录和备份压缩包
        if [ $? -eq 0 ]; then
            echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> Full backup has been compressed and uploaded successfully. Deleting backup directory and archive."
            rm -rf  /opt/backup
        else
            echo $(date "+%Y-%m-%d %H:%M:%S")" [Error] --> Failed to upload full backup archive to S3. Backup files have not been deleted."
        fi

        echo ''
    else
        echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> Full backup directory already exists for the current hour."
        echo ''
    fi
}

function delete_seven_days_ago(){
        ## 描述:使用AWS命令删除S3桶内7天前的备份文件
        # 7天前的日期
        seven_days_ago=$(date -d "7 days ago" +%Y%m%d)

        # 列出存储桶中的文件
        files=$($aws_cmd s3 ls s3://$S3_BUCKET/)

        while read -r line; do
          # 获取文件名
          file_name=$(echo "$line" | awk '{print $4}')
          
          # 提取文件名中的日期部分(full_2023091207.tar.gz -> 2023091207)
          date_part=$(echo "$file_name" | grep -oE '[0-9]{10}')
          
          # 检查文件日期是否早于7天前
          if [[ -n "$date_part" && "$date_part" < "$seven_days_ago" ]]; then
            echo "Deleting $file_name..."
            
            # 删除文件
            $aws_cmd s3 rm "s3://$S3_BUCKET/$file_name"
            
            echo "File $file_name deleted."
          fi
        done <<< "$files"
}

## 每小时执行一次全量备份
full_backup $CURRENT_DATE
## 删除7天前的备份文件
delete_seven_days_ago

4.2赋予执行权限

chmod +x /data/backup/backup_script.sh

5.设定定时任务

0 * * * * /bin/bash /data/backup/backup_script.sh >> /data/backup/crontab_backup.log 2>&1

在这里插入图片描述

更多推荐

《golang设计模式》第二部分·结构型模式-05-门面模式Facade)

文章目录1.概述1.1角色1.2类图2.代码示例2.1设计2.2代码2.2类图1.概述门面(Facade)向客户端提供使用子系统的统一接口,用于简化客户端使用子系统的操作。1.1角色门面角色(Facade)客户端可以调用的接口或方法此角色知晓系统的所有功能和责任一般情况下,该角色没有实际业务逻辑,只是一个委托类。子系统

蓝桥杯每日一题2023.9.16

蓝桥杯2022年第十三届省赛真题-X进制减法-C语言网(dotcpp.com)题目描述进制规定了数字在数位上逢几进一。X进制是一种很神奇的进制,因为其每一数位的进制并不固定!例如说某种X进制数,最低数位为二进制,第二数位为十进制,第三数位为八进制,则X进制数321转换为十进制数为65。现在有两个X进制表示的整数A和B,

基于NAudio实现录制声卡声音

之前的文章《测试.net开源音频库NAudio》中介绍了基于NAudio模块中的WaveInEvent和WaveFileWriter类实现基本的录音功能,但存在一个问题:本来想录制视频中的声音,但录音过程中会把麦克风中的杂音(挪动物品的声音、说话声音等)一并录进去。NAudio模块中提供有WasapiLoopbackC

代理IP与Socks5代理:跨界电商智能爬虫与出海之道

跨界电商正成为全球市场的关键驱动力,而代理IP和Socks5代理则为其提供了技术支持。本文将深入研究这两种代理技术在跨界电商、爬虫和出海战略中的重要作用。引言:介绍跨界电商的崛起和全球化趋势。引出代理IP和Socks5代理的重要性以及本文的主题。第一部分:代理IP和Socks5代理的基础知识代理IP和Socks5代理的

文心一言 VS 讯飞星火 VS chatgpt (97)-- 算法导论9.3 3题

三、用go语言,假设所有元素都是互异的,说明在最坏情况下,如何才能使快速排序的运行时间为O(nlgn)。文心一言:快速排序是一种基于分治策略的排序算法,其平均时间复杂度为O(nlgn)。在最坏情况下,快速排序的时间复杂度为O(n^2),这是因为当输入数组已经排序或接近排序时,快速排序的性能会退化。为了使快速排序在最坏情

Python的协程异步IO(asyncio)详解

一、协程简介1.1定义协程不是系统级线程,很多时候协程被称为“轻量级线程”、“微线程”、“纤程(fiber)”等。简单来说可以认为协程是线程里不同的函数,这些函数之间可以相互快速切换。协程和用户态线程非常接近,用户态线程之间的切换不需要陷入内核,但部分操作系统中用户态线程的切换需要内核态线程的辅助。协程是编程语言(或者

Blender关键帧动画简明教程

Blender3D是一款能够创建令人惊叹的动画的免费软件。Blender中的大多数动画都使用所谓的关键帧。Blender中关键帧的介绍将涵盖开始制作动画所需的一切!推荐:用NSDT编辑器快速搭建可编程3D场景1、什么是关键帧?在计算机出现之前,动画师必须手动绘制动画的每一帧——在每幅图像之间进行极其微小的更改。通过Bl

SpringBoot-AOP-Logback用切面拦截操作日志

在SpringBoot中使用切面来拦截操作日志,以及配合使用MyBatis-Plus框架进行操作,并使用Thymeleaf视图显示商品列表,同时配置Logback日志输出到文件。CREATETABLEproduct(idBIGINTAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(255)NOT

typescript type 类型别名详解

TypeScript中的Type类型别名是一种强大的工具,用于创建自定义类型。通过类型别名,我们可以为复杂的类型结构创建更具可读性和可维护性的名字。TypeScript中的Type类型别名简介在TypeScript中,我们可以使用type关键字来定义一个类型的别名,这就是所谓的类型别名。通过类型别名,我们可以为复杂的类

Zookeeper集群 + Kafka集群

Zookeeper概述//Zookeeper定义*Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。//Zookeeper工作机制*****Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦

javascript基础第二天笔记

JavaScript基础-第2天理解什么是流程控制,知道条件控制的种类并掌握其对应的语法规则,具备利用循环编写简易ATM取款机程序能力运算符语句综合案例运算符算术运算符数字是用来计算的,比如:乘法*、除法/、加法+、减法-等等,所以经常和算术运算符一起。算术运算符:也叫数学运算符,主要包括加、减、乘、除、取余(求模)等

热文推荐