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

MySQL命令--备份和恢复数据库的Shell脚本

原文网址:MySQL命令--备份和恢复数据库的Shell脚本_IT利刃出鞘的博客-CSDN博客

简介

备份mysql数据库是很必要的,这里写一个可以备份数据库的shell脚本,可以将数据库进行备份,并自动添加日期。

Shell脚本

下边的文件我放到mysql docker容器的/bak/文件夹下。

备份

新建一个backup_db.sh,内容如下:

#/bin/bash​# 用法1:用默认的备份路径
# ./backup_db.sh dbName
# 
# 用法2:用指定的备份路径
# ./backup_db.sh dbName /bak/perm/dbName=$1
dateStr=`date +%Y%m%d_%H%M%S`backupPath=/bak/
if [ $# -eq 2 ]
thenbackupPath=$2
fiif [ ! -e ${backupPath} ]
thenmkdir -p ${backupPath}
fifileName=${backupPath}${dbName}'_'${dateStr}'.sql'mysqldump -uadmin -pcode9510. ${dbName} > ${fileName}
echo ${dbName}'已备份到'${fileName}

用法1:用默认的备份路径

./backup_db.sh dbName

用法2:用指定的备份路径

./backup_db.sh dbName /bak/perm/

恢复

新建一个recover_db.sh,内容如下:

#/bin/bash# ​用法:./recover_db.sh dbName dbName_xxx.sqldbName=$1
dbBackupFileName=$2
dateStr=`date +%Y%m%d_%H%M%S`
fileName='/bak/'${dbBackupFileName}
mysql -uadmin -pxxx ${dbName} < ${fileName}
echo ${dbName}'已从此文件恢复:'${fileName}

 用法

./recover_db.sh dbName dbName_xxx.sql

快捷调用

上边的脚本是直接执行的mysql命令,如果它在docker,不好执行,再写一个脚本去调用它。

下边的文件我放在:/work/quick/文件夹。

备份

db_backup.sh

#/bin/bash# 没有参数,或者参数为 --help 或 -h
if [[ $# -lt 1 || $1 == "--help" || $1 == "-h" ]]; then# 如果是,则打印用法echo "Usage: db_backup.sh [dbName] <containerInnerPath>"echo "  eg1: ./db_backup.sh dbName"echo "  eg2: ./db_backup.sh dbName /bak/perm/"exit 0
fidbName=$1backupPath=/bak/
if [ $# -eq 2 ]
thenbackupPath=$2
fidocker exec mysql8 bash -c '/bak/backup_db.sh '${dbName}' '${backupPath}

用法1:使用默认路径

./db_backup.sh dbName

用法2:指定路径

./db_backup.sh dbName /bak/perm/

恢复

db_recover.sh

#!/bin/bash# 没有参数,或者参数为 --help 或 -h
if [[ $# -lt 1 || $1 == "--help" || $1 == "-h" ]]; then# 如果是,则打印用法echo "Usage: db_recover.sh [dbName] [dbFileName]"echo "  eg: ./db_recover.sh dbName dbFile1.sql"exit 0
fidbName=$1
dbBackupFileName=$2
docker exec mysql8 bash -c "/bak/recover_db.sh ${dbName} ${dbBackupFileName}"

用法

./db_recover.sh dbName dbFile1.sql

删除

db_delete_backup.sh

#!/bin/bash# 没有参数,或者参数为 --help 或 -h
if [[ $# -lt 1 || $1 == "--help" || $1 == "-h" ]]; then# 如果是,则打印用法echo "Usage: db_delete_backup.sh [dbFileName]"echo "  eg:./db_delete_backup.sh dbFile1.sql"exit 0
fidbBackupFileName=$1
dbBackupFolder='/work/db/mysql/bak/'
dbBackupFileFullName=${dbBackupFolder}${dbBackupFileName}
sudo rm ${dbBackupFileFullName}
echo ${dbBackupFileFullName}'已删除'
ls ${dbBackupFolder}

用法

./db_delete_backup.sh dbFile1.sql

定时备份数据库

可以将上边的内容写到一个脚本中,然后定时地去备份数据库。

每小时备份一次

本处我的脚本是backup-mysql_sh,内容如下:

#!/bin/bash# 备份对应的宿主机的位置
backupPathOfHost=/work/db/mysql/bak/
# 文件存活分钟数(这些分钟之前的文件会被删掉)
oldFileTtl=300# 如果最近latestBackupTime分钟内,文件数量少于minBackupCount,则不要删除)
# 最近的备份时间
latestBackupTime=500
# 最少的备份个数
minBackupCount=5# 需要备份的数据库名字
dbNameArray=(learn monitor)
# 当前时间
nowTime=$(date +"%Y%m%d %H")
# 备份的脚本
backupShell=/work/quick/db_backup.shif [ ! -d "$backupPathOfHost" ];
thenmkdir -p "$backupPathOfHost"
ficd $backupPathOfHostfor dbName in ${dbNameArray[@]}
do${backupShell} ${dbName}# 统计以数据库名开头的文件数量count=$(find ${backupPathOfHost} -maxdepth 1 -name ${dbName}'*' -mmin -$latestBackupTime | wc -l)if [ ${count} -gt ${minBackupCount} ]; then# 删除指定时间之前的日志find ${backupPathOfHost} -maxdepth 1 -name ${dbName}'*' -mmin +$oldFileTtl | xargs rm -rffi
done

然后结合Linux自带的定时任务即可:Linux命令--crontab定时任务的用法_IT利刃出鞘的博客-CSDN博客

每天备份一次

有上边的可能还不够,比如,我想备份时间长一些,几天之前的数据我也想备份。

可以再新建一个每天执行一次的任务,备份到另一个路径下边,比如:/bak/perm/。

本处我的脚本是backup-mysql_sh,内容如下:

#!/bin/bash# 备份对应的宿主机的位置
backupPathOfHost=/work/db/mysql/bak/perm/
# 备份对应的容器的位置
backupPathOfContainer=/bak/perm/
# 文件存活天数(这些天之前的文件会被删掉)
oldFileTtl=10# 如果最近latestBackupTime天内,文件数量少于minBackupCount,则不要删除)
# 最近的备份时间
latestBackupTime=15
# 最少的备份个数
minBackupCount=10# 需要备份的数据库名字
dbNameArray=(learn monitor)
# 当前时间
nowTime=$(date +"%Y%m%d %H")
# 备份的脚本
backupShell=/work/quick/db_backup.shif [ ! -d "$backupPathOfHost" ];
thenmkdir -p "$backupPathOfHost"
fifor dbName in ${dbNameArray[@]}
do${backupShell} ${dbName} ${backupPathOfContainer}# 统计以数据库名开头的文件数量count=$(find ${backupPathOfHost} -maxdepth 1 -name ${dbName}'*' -mtime -$latestBackupTime | wc -l)if [ ${count} -gt ${minBackupCount} ]; then# 删除指定时间之前的日志find ${backupPathOfHost} -maxdepth 1 -name ${dbName}'*' -mtime +$oldFileTtl | xargs rm -rffi
done

然后结合Linux自带的定时任务即可:Linux命令--crontab定时任务的用法_IT利刃出鞘的博客-CSDN博客

-----------------------------------------------------------------------------------------------------------------

分享Java真实高频面试题,吊打面试官: Java后端真实面试题大全 - 自学精灵

分享靠谱的Java高级开发实战,包含:高并发、架构、全局处理、链路追踪等:JavaWeb高级实战 - 自学精灵

http://www.xdnf.cn/news/1458325.html

相关文章:

  • C++工程实战入门笔记11-三种初始化成员变量的方式
  • TCP协议的三次握手与四次挥手深度解析
  • 从头开始学习AI:第二篇 - 线性回归的数学原理与实现
  • 基础crud项目(前端部分+总结)
  • Flink反压问题
  • 算法 --- 分治(归并)
  • 【Markdown转Word完整教程】从原理到实现
  • VOC、COCO、YOLO、YOLO OBB格式的介绍
  • AgentThink:一种在自动驾驶视觉语言模型中用于工具增强链式思维推理的统一框架
  • 深入剖析Spring Boot / Spring 应用中可自定义的扩展点
  • elasticsearch学习(五)文档CRUD
  • 基于脚手架微服务的视频点播系统-界面布局部分(二):用户界面及系统管理界面布局
  • 02-ideal2025 Ultimate版安装教程
  • SPI flash挂载fatfs文件系统
  • 什么是静态住宅IP 跨境电商为什么要用静态住宅IP
  • More Effective C++ 条款28:智能指针
  • 稠密矩阵和稀疏矩阵的对比
  • 神马 M21 31T 矿机解析:性能、规格与市场应用
  • Python多序列同时迭代完全指南:从基础到高并发系统实战
  • vcruntime140_1.dll缺失?5个高效解决方法
  • 手机秒变全栈IDE:Claude Code UI的深度体验
  • SpringBoot实现国际化(多语言)配置
  • MySQL 8.0 主从复制原理分析与实战
  • 深入解析Java HashCode计算原理 少看大错特错的面试题
  • 多线程——线程状态
  • 并发编程——17 CPU缓存架构详解高性能内存队列Disruptor实战
  • ResNet(残差网络)-彻底改变深度神经网络的训练方式
  • linux——自定义协议
  • 多Agent协作案例:用AutoGen实现“写代码+测Bug”的自动开发流程
  • 秒店功能更新:多维度优化升级,助力商家经营