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): 前一天备份移除成功"
学无止境,谦卑而行.