背景:数据库备份异地备份本地备份服务尤为重要,本文记录自己的电脑备份远程数据库
首先脚本数据库备份sh脚本:mysql-beifen_db.sh 远程的话更改保存路径和远端的数据登录配置就好(mysql-beifen_db-dev.sh)
脚本概览
脚本源码:
#!/bin/bash
#主机地址可以是远程
HOSTNAME="localhost"
USER="root"
PASSWORD="root"
PORT="3306"
#全库备份 放开该注释
#DATABASE_ARR=("--all-databases")#备份的库的名称
DATABASE_ARR=("qboa-admin" "qboa-oa" "qboa-pubapp" "mysql")
#长度减一循环到下标
db_length=`expr ${#DATABASE_ARR[@]} - 1`
DATE=`date '+%Y%m%d_%H%M%S'` #日期格式(作为文件名)
day=`date '+%Y%m%d'` #日期格式(作为文件名)
BACKUP_DIR=/home/zddts/mysql/beifen #备份文件存储路径
LOGFILE=$BACKUP_DIR/log/"$day"_mysql_beifen.log #日记文件路径
#切换至备份目录
cd $BACKUP_DIR
echo " " >> $LOGFILE
echo " " >> $LOGFILE
echo "———————————————–" >> $LOGFILE
echo "------begin----BACKUP DATE:" $(date +"%y-%m-%d %H:%M:%S") >> $LOGFILE
#按库来进行备份
for i in $(seq 0 ${db_length}); do
# do something....
DATABASE=${DATABASE_ARR[$i]}
OPTIONS="-h$HOSTNAME -u$USER -p$PASSWORD $DATABASE -P$PORT"
if [ "$DATABASE" = "--all-databases" ];then
DATABASE="all-databases"
fi
DUMPFILE=$DATE-$DATABASE.sql #备份文件名
ARCHIVE=$DATE-$DATABASE.tar.gz #压缩文件名
#mysqldump --help
#判断备份文件存储目录是否存在,否则创建该目录
if [ ! -d $BACKUP_DIR ] ;
then
mkdir -p "$BACKUP_DIR"
fi
#开始备份之前,将备份信息头写入日记文件
#echo " " >> $LOGFILE
#echo " " >> $LOGFILE
#echo "———————————————–" >> $LOGFILE
#echo "BACKUP DATE:" $(date +"%y-%m-%d %H:%M:%S") >> $LOGFILE
#echo "———————————————– " >> $LOGFILE
#使用mysqldump 命令备份制定数据库,并以格式化的时间戳命名备份文件
mysqldump $OPTIONS > $DUMPFILE
#判断数据库备份是否成功
if [[ $? == 0 ]]; then
#创建备份文件的压缩包
tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1
#输入备份成功的消息到日记文件
echo " [$ARCHIVE] Backup Successful!" >> $LOGFILE
#删除原始备份文件,只需保 留数据库备份文件的压缩包即可
rm -f $DUMPFILE
else
echo " Database Backup Fail!" >> $LOGFILE
fi
#输出备份过程结束的提醒消息
echo " Database Done" $DATABASE $i >> $LOGFILE
done
#删除超时备份文件 5天
#find $BACKUP_DIR -name "*.sql.gz" -type f -mtime +14 -exec rm -rf {} \; > $BACKUP_DIR/null 2>&1
for file in `find $BACKUP_DIR -name "*.tar.gz" -type f -mtime +14` ;
do
echo " delete file " $file >> $LOGFILE
rm -rf $file
done
#清理超时日志
for file in `find $BACKUP_DIR -name "*.log" -type f -mtime +14` ;
do
echo " delete log " $file >> $LOGFILE
rm -rf $file
done
#输出备份过程结束的提醒消息
echo "----end----BACKUP DATE:" $(date +"%y-%m-%d %H:%M:%S") >> $LOGFILE
echo "———————————————–" >> $LOGFILE
二、由于我的mysql是用docker的容器,所以不能使用linux下的cron来定时跑该脚本(如果mysql是直接装在宿主机下可以使用),所有我只能在docker 的mysql容器中安装cron
如果已安装忽略安装步骤:docker中安装
docker exec -it mymysql /bin/bash #进入mysql容器
apt-get update #更新
apt-get install cron #安装cron
/etc/init.d/cron status #查看状态
/etc/init.d/cron restart #启动服务
修改/etc/pam.d/cron文件 注释session required pam_loginuid.so(不能编辑安装vi:apt-get install vim)
然后重启cron服务:/etc/init.d/cron restart
安装好cron设置定时任务
crontab -e
如图我设置了两个sh脚本 一个是备份本地数据库 ,一个是备份远端的数据库 将两个都定时备份到我的本地电脑上。
注:我sh存放路径是容器/home/zddts/mysql/sh/ 下,我将/home/zddts/mysql映射到宿主机linux下的/home/zddts/mysql/ 这个按照个人来,需要建好目录beifen以及log用来存放文件
新上传的sh可能没有执行权限用chmod a+x /home/zddts/sh/mysql-beifen_db.sh 执行授权;同时可以设置定时间提早执行已验证脚本是否执行。备份效果如下图,对应的库压缩包和log文件日志
cron 语法:
.crontab文件格式:
* * * * * command
minute hour day month week command
分 时 天 月 星期 命令
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
星号(*):代表每的意思,例如month字段如果是星号,则表示每月都执行该命令操作。
逗号(,):表示分隔时段的意思,例如,“1,3,5,7,9”。
中杠(-):表示一个时间范围,例如“2-6”表示“2,3,4,5,6”。
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。