Shell脚本定时备份MySQL数据库并同步至其它机器

发布时间:2020-12-12编辑:脚本学堂
本文介绍了用shell脚本备份mysql数据库,定时备份mysql并同步到其它机器上的方法,一例shell脚本,需要的朋友参考下。

一个简单的mysql/ target=_blank class=infotextkey>mysql数据库备份shell/ target=_blank class=infotextkey>shell脚本,适用于单台linux服务器或者VPS的mysql数据库备份工作,

原理:使用mysql的mysqldump工具来导出数据库为.sql文件,然后将所有导出的文件打包归档。

在shell脚本中使用scp命令把备份文件复制到另外一台备份机器,由于scp每次传送文件要密码,因此需要使用 expect插件或者利用密钥。
在这里介绍采用生成密钥对的方法。

1,生成密匙对,我用的是rsa的密钥。使用命令 "ssh-keygen -t rsa"
 生成的过程中提示输入密钥对保存位置及密码,直接回车,接受默认值就行了。 
其中公共密钥保存在 ~/.ssh/id_rsa.pub,私有密钥保存在 ~/.ssh/id_rsa 。

2,然后修改 .ssh 目录权限,chmod 755 ~/.ssh 。最后把 公共密钥复制到你要访问
的机器上去,并保存为:~/.ssh/authorized_keys 。
scp -P 1110 ~/.ssh/id_rsa.pub daniel@*.*.*.*:/home/daniel/.ssh/authorized_keys
(注意这里- P 为大写, 表示目标机器daniel 的ssh端口为1110,小写的p为源ssh端口,修改ssh端口在文件/etc/ssh/sshd_config下 。)这里完成scp 脚本免密钥的方法介绍。

相关阅读:

最后使用crontab定时执行脚本即可!
脚本如下:
 

复制代码 代码示例:
#!/bin/bash 
# description:  MySQL buckup shell script 
# author:       Daniel 
 
st=$(date +%s) 
USER="root"  
PASSWORD="*****"#用户名  
DATABASE="myblogdb" #数据库用户密码  
MAIL="abcd@gmail.com"#mail    
BACKUP_DIR=/home/daniel/data_backup/ #备份文件存储路径  
LOGFILE=/home/daniel/data_backup/data_backup.log #日志文件路径 
  
DATE=`date +%Y%m%d-%H%M`#用日期格式作为文件名 
DUMPFILE=$DATE.sql  
ARCHIVE=$DATE.sql.tar.gz  
OPTIONS="-u$USER -p$PASSWORD $DATABASE" 
 
#判断备份文件存储目录是否存在,否则创建该目录  
if [ ! -d $BACKUP_DIR ]  
then 
    mkdir -p "$BACKUP_DIR" 
fi   
 
#开始备份之前,将备份信息头写入日记文件  
echo "    ">> $LOGFILE  
echo "--------------------" >> $LOGFILE  
echo "BACKUP DATE:" $(date +"%y-%m-%d %H:%M:%S") >> $LOGFILE  
echo "-------------------" >> $LOGFILE   
 
#切换至备份目录  
cd $BACKUP_DIR  
mysqldump $OPTIONS > $DUMPFILE  
#判断数据库备份是否成功  
if [[ $? == 0 ]] 
then  
    tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1  
    echo "[$ARCHIVE] Backup Successful!" >> $LOGFILE  
    rm -f $DUMPFILE #删除原始备份文件,只需保留备份压缩包 
    # 把压缩包文件备份到其他机器上。 
    scp -P 1110 $BACKUP_DIR$ARCHIVE ubuntu@*.*.*.*:/home/user/data_backup/ >> $LOGFILE  2>&1 
 else  
    echo "Database Backup Fail!" >> $LOGFILE  
#备份失败后向管理者发送邮件提醒  
mail -s "database:$DATABASE Daily Backup Fail!" $MAIL  
fi  
echo "Backup Process Done"  
#删除3天以上的备份文件 
#Cleaning 
find $BACKUP_DIR  -type f -mtime +2 -name "*.tar.gz" -exec rm -f {} ; 

修改/etc/crontab,添加定时任务
#vi /etc/crontab
在下面添加:
 

复制代码 代码示例:
00 02 * * * user /data/backup/dump.sh # user 为当前系统的用户
 

注意/data/backup/dump.sh为脚本的存放位置.
表示每天2点钟执行备份。
重新启动crond
 

复制代码 代码示例:
# /etc/rc.d/init.d/crond restart

当scp备份到其他机器出现问题时 查看/var/log下的cron日志,/如果var/log下没有cron日志,
则需要:修改rsyslog,命令:sudo vim /etc/rsyslog.d/50-default.conf ,cron.* /var/log/cron.log
#将cron前面的注释符去掉 ,重启rsyslog ,命令:sudo service rsyslog restart,可以查看crontab
日志。
less /var/log/cron.log , crontab问题定位。

注意命令,格式:command > file 2>&1
2>&1 是将错误输出重定向到标准输出。 然后将标准输入重定向到文件file。&1 表示的是文件描述1,
表示标准输出,如果这里少了&就成了数字1,就表示重定向到文件1。
 这句命令的意思:首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。

shell脚本备份mysql数据库
需求

临近年关整理一些脚本程序,发现一个mysql数据库备份的脚本可以和大家分享一下,基于环境是ubuntu10.04server

思路
获取mysql服务器所有数据库名称,过滤掉不需要备份的数据库
通过mysqldump来for循环导出所有的数据库的sql文件
用zip加密压缩所有的sql文件
定期进行数据清理工作

shell代码,数据库导出代码:
 

复制代码 代码示例:

#!/bin/bash
#1.数据库信息定义
mysql_host="192.168.1.1"
mysql_user="root"
mysql_passwd="root"

#sql备份目录
root_dir="/backup"
back_dir="/backup/databases"
data_dir="databases"
store_dir="database"

if [ ! -d $back_dir ]; then
mkdir -p $back_dir
fi

#备份的数据库数组
db_arr=$(echo "show databases;" | mysql -u$mysql_user -p$mysql_passwd -h$mysql_host)

#不需要备份的单例数据库
nodeldb="test1"

#当前日期
date=$(date -d '+0 days' +%Y%m%d)

#zip打包密码
zippasswd="passwd"
zipname="lczh_"$date".zip"

#2.进入到备份目录
cd $back_dir

#3.循环备份
for dbname in ${db_arr}
do
if [ $dbname != $nodeldb ]; then
   sqlfile=$dbname-$date".sql"
   mysqldump -u$mysql_user -p$mysql_passwd -h$mysql_host $dbname >$sqlfile
fi
done

#4.tar打包所有的sql文件
tar -zcPpf $root_dir/$store_dir/$zipname --directory / $root_dir/$data_dir

#打包成功后删除sql文件
if [ $? = 0 ]; then
rm -r $data_dir
fi

数据定期清理脚本
作用:
定期清理14天前的备份文件

shell代码
 

复制代码 代码示例:

#!/bin/bash -
#1.参数配置
#mysql文件备份目录
backup_dir1="/backup/test1/"
backup_dir2="/backup/test2/"
backdir_arr=($backup_dir1 $backup_dir2)

#过期文件的时间
keep_time=14

#当前所在星期,crontab在奇数的星期7执行
week=$(date +%W)

flag=`expr $week % 2`

#2.清理过期文件,只在奇数星期7执行
if [ $flag -eq 1 ]; then
for dir in ${backdir_arr[*]}
do
if [ -d $dir ]; then
#查找14天之外的文件数据
clean_arr=`find $dir -type f -mtime +$keep_time -exec ls {} ;`
for cleanfile in ${clean_arr}
do
rm $cleanfile
done
fi
done
fi

crontab配置:
0 5 * * 7 执行清理脚本