公司用到的MySQL数据库,经常有同事通过一顿骚操作把一些关键的配置数据误删,每次恢复都要花上不少时间,于是写了个shell脚本,结合corntab每天凌晨备份数据库,并保留7天。
同样的备份脚本也可用于生产环境MySQL数据库定时备份。
环境:CentOS 7.5 / MySQL 5.7
#!/bin/sh # 数据库账号信息 DB_USER="root" DB_PWD="root" DB_HOST="127.0.0.1" DB_PORT="3306" # MYSQL所在目录 MYSQL_DIR="/home/mysql" # 备份文件存放目录 BAK_DIR="/home/db_backup" # 时间格式化,如 20200902 DATE=`date +%Y%m%d` # 备份脚本保存的天数 DEL_DAY=7 # 要备份的数据库,空格分隔 DATABASES=("apolloconfigdb" "apolloportaldb" "apolloconfigdb-uat" "frame-assistor" "frame-authorization" ) # 创建日期目录 mkdir $BAK_DIR/$DATE echo "-------------------$(date +%F_%T) start ---------------" >>${BAK_DIR}/db_backup.log for database in "${DATABASES[@]}" do # 执行备份命令 $MYSQL_DIR/bin/mysqldump --opt -u$DB_USER -p$DB_PWD -h$DB_HOST -P$DB_PORT ${database} > $BAK_DIR/$DATE/${database}.sql done echo "--- backup file created: $BAK_DIR/db_backup_$DATE.tar.gz" >>${BAK_DIR}/db_backup.log # 将备份好的sql脚本压缩到db_backup_yyyyMMdd.tar.gz tar -czf $BAK_DIR/db_backup_$DATE.tar.gz $BAK_DIR/$DATE # 压缩后,删除压缩前的备份文件和目录 rm -f $BAK_DIR/$DATE/* rmdir $BAK_DIR/$DATE # 遍历备份目录下的压缩文件 LIST=$(ls ${BAK_DIR}/db_backup_*) # 获取截止时间,早于该时间的文件将删除 SECONDS=$(date -d "$(date +%F) -${DEL_DAY} days" +%s) for index in ${LIST} do # 对文件名进行格式化,取命名末尾的时间,格式如 20200902 timeString=$(echo ${index} | egrep -o "?[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]") if [ -n "$timeString" ] then indexDate=${timeString//./-} indexSecond=$( date -d ${indexDate} +%s ) # 与当天的时间做对比,把早于7天的备份文件删除 if [ $(( $SECONDS- $indexSecond )) -gt 0 ] then rm -f $index echo "---- deleted old backup file : $index " >>${BAK_DIR}/db_backup.log fi fi done echo "-------------------$(date +%F_%T) end ---------------" >>${BAK_DIR}/db_backup.log
保存成 backupDB.sh 脚本后,执行脚本验证一下。查看BAK_DIR备份目录下的db_backup.log可以看到备份的执行情况。
-------------------2020-09-02_21:33:01 start ---------------
--- backup file created: /home/db_backup/db_backup_20200902.tar.gz
-------------------2020-09-02_21:33:18 end ---------------
验证没问题后,通过crontab -e配置成定时任务执行,要注意的是,mysqldump备份执行时是会锁表的,建议在凌晨没什么人操作数据库的时候执行备份操作。
# 每天凌晨3点执行 0 3 * * * sh /home/backupDB.sh > /dev/null 2>&1 &
注意:
如果不希望备份时锁表,可以在mysqldump命令中添加参数--skip-lock-tables;
上述脚本中指定了要备份的数据库,如果想备份所有数据库,则无需指定数据库,在mysqldump命令中添加参数--all-databases即可。
到此这篇关于shell脚本定时备份MySQL数据库数据并保留指定时间的文章就介绍到这了,更多相关shell定时备份MySQL内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
本文向大家介绍MySQL备份时排除指定数据库的方法,包括了MySQL备份时排除指定数据库的方法的使用技巧和注意事项,需要的朋友参考一下 使用mysqldump命令备份时候,--all-databases 可以备份所有的数据库。 使用ignore-table 还可以排除制定的表。但是,mysqldump没有参数可以排除数据库的。 要备份的数据库少的时候,可以通过mysqldump -uroot -p
本文向大家介绍CentOS下mysql定时备份Shell脚本分享,包括了CentOS下mysql定时备份Shell脚本分享的使用技巧和注意事项,需要的朋友参考一下 1、备份语句 语句说明: /usr/local/mysql/bin/mysqldump:MySql安装目录下 -utest:分为两块,一块为-u一块为test;其中-u表示其为用户名,test表示为当前用户名 -ptest:分为
本文向大家介绍MySQL数据库定时备份的实现方法,包括了MySQL数据库定时备份的实现方法的使用技巧和注意事项,需要的朋友参考一下 1. 创建shell脚本 2. 给shell脚本添加执行权限 3. 给脚本添加定时任务 crontab文件的说明: 用户创建的crontab文件中,每一行都代表一项定时任务,每行的每个字段代表一项设置,它的格式每行共分为六个字段,前五段是时间设定字段,第六段是要执行
本文向大家介绍CentOS Mysql数据库如何实现定时备份,包括了CentOS Mysql数据库如何实现定时备份的使用技巧和注意事项,需要的朋友参考一下 如下脚本用于mysql全库定时备份 mysql_dump_script.sh centos 设置crontab yum install crontabs systemctl enable crond (设为开机启动) systemctl sta
问题内容: 我尝试了许多脚本来进行数据库备份,但是我做不到。我想每小时备份一次数据库。 我将文件添加到“ /etc/cron.hourly/”文件夹,将其chmod更改为755,但未运行。至少我写了我的伪代码。 如果您可以为此操作编写脚本并告诉我该怎么办,我将非常高兴。将这个脚本文件添加到文件夹之后。 获取当前日期并创建一个变量, 为文件名创建一个变量, 像这样获取我的数据库的转储 删除文件夹中所
我尝试了很多数据库备份脚本,但都做不到。我想每小时备份一次数据库 我将文件添加到“/etc/cron.hourly/”文件夹,将其chmod更改为755,但没有运行。至少我写了我的伪代码。 如果你能为这次行动写一个脚本,告诉我应该做些什么,我会很高兴的?将此脚本文件添加到文件夹。 获取当前日期并创建一个变量, 为文件名创建一个变量, 像下面这样获取我的数据库转储文件