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高级实战 - 自学精灵