MySQL——数据库备份上传到阿里云OSS存储

前言

基于阿里云的OSS存储对数据库进行备份,阿里云ossutil安装文档还是比较详细的,直街参考阿里云文档操作就好了

ossutil:https://help.aliyun.com/zh/oss/developer-reference/overview-59

内容

根据ossutil安装配置好命令行工具,然后直接写相应的脚本就好了;

#!/bin/bash

set -euo pipefail

# 基础配置
backupdir=/data/mysqlbackups/
user=<dbuser>
passwd=<dbpasswd>
dbname=<dbname>
date_str=$(date +%Y%m%d)
date_yesterday=$(date -d "1 day ago" +%Y%m%d)

# 需要忽略备份的表
ignore_tables=("table_1" "table_2" "table_3")

# 发送企业微信消息的函数
send_wechat_msg() {
    content="$1"
    curl -s -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxx" \
        -H 'Content-Type: application/json' \
        -d '{ "msgtype": "markdown", "markdown": {"content": "<font color=\"warning\">数据库备份错误告警</font>\n>服务器名称:'"$HOSTNAME"'\n>服务器IP地址:'$(hostname -I | awk '{print $1}')'\n>数据库名称:'"$dbname"'\n>备份日期:'"$date_str"'\n>备份文件:'"$backupdir/database_main_$date_str.tar.gz"'\n>错误信息:'"$content"'"}}'
}

# 定义通用错误处理函数
handle_error() {
    local err_message="$1"
    echo "$(date): 错误:$err_message"
    send_wechat_msg "$err_message"
    exit 1
}

echo "-----------------------------------------------------------"
echo "$(date): 开始备份数据库"

if ! (mkdir -p "$backupdir/$date_str" && cd "$backupdir/$date_str") ; then
    handle_error "创建或切换备份目录失败"
fi

# 获取所有表
tables=$(mysql -h localhost -u$user --password=$passwd -e "SHOW TABLES IN $dbname;" | tail -n +2)

# 备份每个表
for table in $tables; do
    if [[ ! " ${ignore_tables[*]} " =~ " ${table} " ]]; then
        # --flush-privileges --flush-logs 这里万年老库无需考虑权限和日志
        if ! (mysqldump -h localhost -u$user --password=$passwd --single-transaction --routines --events --extended-insert $dbname $table | gzip > $backupdir/$date_str/${table}.sql.gz) ; then
            handle_error "表 $table 备份失败"
        fi
    fi
done

# 压缩所有备份文件
if ! (tar -czf $backupdir/database_main_$date_str.tar.gz -C $backupdir/$date_str .) ; then
    handle_error "压缩备份文件失败"
fi

# 删除单独的表备份文件
rm -rf $backupdir/$date_str

echo "$(date): 备份数据库结束"

echo "$(date): 备份数据开始上传"
if ! (ossutil64 cp $backupdir/database_main_$date_str.tar.gz oss://<oss-bucket-name>/ -u) ; then
    handle_error "备份数据上传失败"
fi
echo "$(date): 备份数据上传结束"

echo "$(date): 开始移除前一天备份"
if ! (rm -rvf $backupdir/database_main_$date_yesterday.tar.gz) ; then
    handle_error "前一天备份移除失败"
fi
echo "$(date): 前一天备份移除成功"
posted @ 2024-03-19 21:34  。思索  阅读(170)  评论(0)    收藏  举报