当前位置: 首页 > news >正文

分享mysql数据库自动备份脚本(本机和docker都可用)

利用系统的定时任务周期性执行
备份mysql中的数据
备份策略:
最近30天(每天1份)
最近24小时(每小时1份)

关键点

  • DB_NAME: 备份的数据库名
  • DB_USER: 数据库账号
  • DB_PASS: 数据库密码

本地部署的mysql

  • DUMP: 本机mysqldump路径

使用mysqldump备份

$DUMP -u$DB_USER -p$DB_PASS $DB_NAME --default-character-set=utf8 --opt -Q -R ->-skip-lock-tables> $OUT_SQL 

docker部署的mysql

  • DOCKER_CONTAINER: docker容器名

调用docker中的mysqldump备份

docker exec -i "$DOCKER_CONTAINER" mysqldump \-u"$DB_USER" -p"$DB_PASS" \--single-transaction \--skip-lock-tables \--no-tablespaces \"$DB_NAME" > "$OUT_SQL"

下面是脚本源码

修改自己的数据库账号密码和备份路径

#!/bin/sh
DUMP=/usr/bin/mysqldump 	#mysqldump备份程序执行路径(方案A)
DOCKER_CONTAINER="mysql8"  # MySQL 容器名称(方案B)OUT_DIR=/home/developer/mysqlBak 		#备份文件存放路径
LINUX_USER=root 			#系统用户名
DB_NAME=user 				#要备份的数据库名字
DB_USER=mysql 			    #数据库账号
DB_PASS='123456'	        #数据库密码
DAYS=30 					#DAYS=30代表删除30天前的备份,即只保留最近30天的备份cd $OUT_DIR 				#进入备份存放目录
DATE=`date +%Y_%m_%d_%H` 	#获取当前系统时间
OUT_SQL="$DATE.sql" 		#备份数据库的文件名
TAR_SQL="mysqldata_$DATE.tar.gz" #最终保存的数据库备份文件名## 方案A: 下面这行是用本机的mysqldump来备份的
#$DUMP -u$DB_USER -p$DB_PASS $DB_NAME --default-character-set=utf8 --opt -Q -R --skip-lock-tables> $OUT_SQL 		#备份## 方案B: 下面这行是通过docker exec的方式来备份
# 通过 docker exec 执行 mysqldump(安全方式)
docker exec -i "$DOCKER_CONTAINER" mysqldump \-u"$DB_USER" -p"$DB_PASS" \--single-transaction \--skip-lock-tables \--no-tablespaces \"$DB_NAME" > "$OUT_SQL"# 检查备份是否成功
if [ $? -ne 0 ]; thenecho "MySQL backup failed!"rm -f "$OUT_SQL"exit 1
fitar -czf $TAR_SQL ./$OUT_SQL #压缩为.tar.gz格式
rm $OUT_SQL 				#删除.sql格式的备份文件
# chown $LINUX_USER:$LINUX_USER $OUT_DIR/$TAR_SQL 				#更改备份数据库文件的所有者# 获取所有备份文件的日期(去重) - 修复正则表达式匹配下划线格式# 清理策略:保留当天所有备份 + 30天内每日最新备份
TODAY=$(date +%Y%m%d)
echo "开始清理备份,当天日期: $TODAY"# 获取所有备份文件的日期(去重) - 修复正则表达式匹配下划线格式
dates=$(find "$OUT_DIR" -maxdepth 1 -name "mysqldata_*.tar.gz" -type f | \sed -n 's/.*mysqldata_\([0-9]\{4\}\)_\([0-9]\{2\}\)_\([0-9]\{2\}\)_.*/\1\2\3/p' | sort -u)echo "找到的备份日期: $dates"# 对每个日期处理:非当天的每天只保留最新备份
for date in $dates; doecho "处理日期: $date"if [ "$date" = "$TODAY" ]; thenecho "  跳过当天备份: $date"continuefi# 将YYYYMMDD格式转换为YYYY_MM_DD格式进行文件查找year=$(echo $date | cut -c1-4)month=$(echo $date | cut -c5-6)day=$(echo $date | cut -c7-8)date_pattern="${year}_${month}_${day}"echo "  查找日期模式 $date_pattern 的所有备份文件..."files_with_time=$(find "$OUT_DIR" -maxdepth 1 -name "mysqldata_${date_pattern}_*.tar.gz" -type f -printf "%T@ %p\n")echo "  找到的文件: $files_with_time"if [ -z "$files_with_time" ]; thenecho "  该日期没有备份文件"continuefi# 统计文件数量file_count=$(echo "$files_with_time" | wc -l)echo "  该日期共有 $file_count 个备份文件"if [ "$file_count" -gt 1 ]; thenecho "  开始删除旧备份,保留最新的..."echo "$files_with_time" | sort -n | head -n -1 | while read -r timestamp file; doif [ -n "$file" ]; thenecho "    删除文件: $file"rm -v "$file"elseecho "    文件路径为空,跳过"fidone# 显示保留的文件latest_file=$(echo "$files_with_time" | sort -n | tail -1 | awk '{print $2}')echo "  保留最新备份: $latest_file"elseecho "  该日期只有1个备份文件,无需清理"fiecho "  ----"
doneecho "开始删除30天前的备份..."
old_files=$(find "$OUT_DIR" -name "mysqldata_*" -type f -mtime +$DAYS)
if [ -n "$old_files" ]; thenecho "30天前的备份文件:"echo "$old_files"find "$OUT_DIR" -name "mysqldata_*" -type f -mtime +$DAYS -exec rm -v {} \;
elseecho "没有找到30天前的备份文件"
fiecho "备份清理完成"
http://www.dtcms.com/a/391006.html

相关文章:

  • avue crud表头跨列
  • 鸿蒙网络优化实战:从智能切换到缓存加速的完整指南
  • Redis-实现分布式锁
  • 软件工程实践五:Spring Boot 接口拦截与 API 监控、流量控制
  • 【LINUX网络】NAT _ 代理_ 内网穿透
  • 智慧养老+数字大健康:当科技为“银发时代”按下温暖加速键
  • rook-ceph的ssd类osd的纠删码rgw存储池在迁移时的异常处理
  • Http升级Https使用Certbot申请证书并免费续期
  • scTenifoldKnk:“虚拟敲除基因”,查看转录组其他基因的变化幅度(升高or降低)
  • 牛客算法基础noob47 校门外的树
  • AD-GS:稀疏视角 3D Gaussian Splatting 的“交替致密化”,同时抑制浮游物与保留细节
  • maven package多出来一个xxx.jar.original和一个xxx-shaded.jar是什么?怎么去掉
  • Gin 框架中使用 Validator 进行参数校验的完整指南
  • apt install nvidia-cuda-toolkit后cuda不在/usr/local/cuda怎么办
  • SpringBoot整合Kafka总结
  • Parasoft C/C++test 针对 CMake 项目的自动化测试配置
  • LED强光手电筒MCU控制方案开发分析
  • linux中为什么 rm 命令能删除自己 | linux使用rm命令删自己会怎样?
  • django登录注册案例(下)
  • 【TES600G】基于JFM7K325T FPGA+FT-M6678 DSP的全国产化信号处理平台
  • 卷积神经网络深度解析:从基础原理到实战应用的完整指南
  • 企业档案管理系统:精准破局制造行业档案管理困境
  • 【完整源码+数据集+部署教程】考古坑洞私挖盗洞图像分割系统: yolov8-seg-act
  • MMDB详解
  • TC8:SOMEIP_ETS_130测试用例解析
  • 等效学习率翻倍?梯度累积三连坑:未除以 accum_steps、调度器步进错位、梯度裁剪/正则标度错误(含可复现实验与修复模板)
  • 嵌入式学习笔记(44)IMX6ULL
  • OpenStack 学习笔记(五):网络管理和虚拟网络实践与存储管理实验(下)
  • 博睿数据携手华为共筑智能未来,深度参与HUAWEI CONNECT 2025并发表主题演讲
  • 陈童理论物理新讲1 哈密顿力学初步