这是一个简单的MySQL数据库备份shell脚本,适用于单台Linux服务器或者VPS的mysql数据库备份工做, html
工做原理是使用mysql的mysqldump工具来导出数据库为.sql文件,而后将全部导出的文件打包归档。 mysql
而后咱们在shell脚本中使用 scp命令把备份文件复制到另一台备份机器,因为scp每次传送文件要密码 web
所以咱们须要使用 expect插件或者利用密钥。在这里介绍采用生成密钥对的方法。 sql
1,生成密匙对,我用的是rsa的密钥。使用命令 "ssh-keygen -t rsa" shell
生成的过程当中提示输入密钥对保存位置及密码,直接回车,接受默认值就好了。 数据库
其中公共密钥保存在 ~/.ssh/id_rsa.pub,私有密钥保存在 ~/.ssh/id_rsa 。 ubuntu
2,而后修改 .ssh 目录权限,chmod 755 ~/.ssh 。最后把 公共密钥复制到你要访问 vim
的机器上去,并保存为:~/.ssh/authorized_keys 。 bash
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
- # web site: http://home.ustc.edu.cn/~danewang/blog/
-
- 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中。