网站最重要的是什么?如果网站数据突然丢失 估计你会崩溃 这篇文章主要介绍 在Linux下每天自动备份Mysql数据库,并且自动发送到你指定的邮箱里,这样你再也不会为丢失数据烦恼啦。
一、安装 postfix 并配置
二、安装mutt并配置mutt
mutt,它是一款基于文字界面的邮件客户端,非常小巧,但功能强大,可以用它来读写,回复保存和删除你的邮件,能在linux命令行模式下收发邮件附件
1、安装mutt
首先确定你的系统是否已经安装了mutt
[root@localhost ~]# rpm -qa | grep mutt mutt-1.5.20-2.20091214hg736b6a.el6_1.1.i686
我已经安装过了 如果你还没有安装 那就用yum一下吧
[root@localhost ~]# yum install -y mutt
2、配置
这里这一绕过的哦 不需要进行任何配置就可以正常使用的哦
如果你想配置一些额外信息的话 可以了解一下
默认 /root 下没有 . muttrc 文件 执行下面命令得到.muttrc文件
[root@localhost ~]# find / -name Muttrc /etc/Muttrc [root@localhost ~]# cp /etc/Muttrc /root/.muttrc
如果你想自定义发件人信息,需要进行如下设置
set use_from=yes set from=root@medesky.me set realname="medesky"
安装完mutt后,在/usr/share/doc/mutt* 下有一份很好的手册,可以看一下
3、发送语法
mutt [-hnpRvxz][-a<文件>][-b<地址>][-c<地址>][-f<邮件文 件>][-F<配置文件>][-H<邮件草稿>][-i<文件>][-m<类型>] [-s<主题>][邮件地址] 参 数: -a <文件> 在邮件中加上附加文件。 -b <地址> 指定密件副本的收信人地址。 -c <地址> 指定副本的收信人地址。 -f <邮件文件> 指定要载入的邮件文件。 -F <配置文件> 指定mutt程序的设置文件,而不读取预设的.muttrc文件。 -h 显示帮助。 -H <邮件草稿> 将指定的邮件草稿送出。 -i <文件> 将指定文件插入邮件内文中。 -m <类型> 指定预设的邮件信箱类型。 -n 不要去读取程序培植文件(/etc/Muttrc)。 -p 在mutt中编辑完邮件后,而不想将邮件立即送出,可将该邮件暂缓寄出。 -R 以只读的方式开启邮件文件。 -s <主题> 指定邮件的主题。 -v 显示mutt的版本信息以及当初编译此文件时所给予的参数。 -x 模拟mailx的编辑方式。 -z 与-f参数一并使用时,若邮件文件中没有邮件即不启动mutt。
如:
mutt me@medesky.me -s "数据备份" -a /home/backup/test.sql < /root/readme.txt 或者 echo "test" | mutt me@medesky.me -s "数据备份" -a /home/backup/test.sql
如果要发送多个附件,需要在每个附件前加 -a 参数
三、automysqlbackup.sh
1、创建automysqlbackup.sh
#!/bin/bash #Script:automysqlbackup.sh #Version:Beta 1.0 #author:www.weibo.com/100306117 #date:2013-06-15 #以下配置信息请自己修改 mysql_user="root" #MySQL备份用户 mysql_password="" #MySQL备份用户的密码 mysql_host="localhost" #要备份的主机,一般为localhost mysql_port="3306" #MySQL端口号,一般为3306 backup_db_arr=("db1" "db2") #要备份的数据库名称,多个用空格分开隔开 如("db1" "db2" "db3") backup_location=/databackup/mysql #备份数据存放位置,末尾请不要带"/",此项可以保持默认,程序会自动创建文件夹 expire_backup_delete="ON" #是否开启过期备份删除 ON为开启 OFF为关闭 expire_days=3 #过期时间天数 默认为三天,此项只有在expire_backup_delete开启时有效 adminmail="me@medesky.me" #接收备份数据的邮箱 也就是管理员的邮箱 subject_msg="MYSQL data backup" #备份邮件主题 subject_msg_error="ERROR:MYSQL data backup" #备份ERROR邮件主题 #以下配置请保持默认不要修改 backup_time=`date +%Y%m%d%H%M` #定义备份详细时间 backup_cache_dir=$backup_location/cache #备份缓存文件夹全路径 backup_data_dir=$backup_location/data #备份文件夹全路径 backup_data_filename=$backup_data_dir/$backup_time.sql.tar.gz #备份文件的名称 包括路径 backup_log_dir=$backup_location/log #备份日志文件夹全路径 backup_log_mailcontent=$backup_log_dir/mailcontent.log #邮件内容缓存文件全路径 welcome_msg="Welcome to use auto MySQL backup tools!" #欢迎语 #写入欢迎信息 `mkdir -p $backup_log_dir` `echo $welcome_msg > $backup_log_mailcontent` #判断MYSQL是否启动,mysql没有启动则备份退出 mysql_ps=`ps -ef | grep mysql | wc -l` mysql_listen=`netstat -an | grep LISTEN | grep $mysql_port | wc -l` if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then `echo "ERROR:MySQL is not running! backup stop!" >> $backup_log_mailcontent` `mutt $adminmail -s "$subject_msg_error" < $backup_log_mailcontent` exit fi #连接到mysql数据库,无法连接则备份退出 mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password <<end use mysql; select host,user from user where user=‘root‘ and host=‘localhost‘; exit end flag=`echo $?` if [ $flag != "0" ]; then `echo "ERROR:Can‘t connect mysql server! backup stop!" >> $backup_log_mailcontent` `mutt $adminmail -s "$subject_msg_error" < $backup_log_mailcontent` exit else #判断有没有定义备份的数据库,如果定义则开始备份,否则退出备份 if [ "$backup_db_arr" != "" ];then #dbnames=$(cut -d ‘,‘ -f1-5 $backup_database) #echo "arr is (${backup_db_arr[@]})" for dbname in ${backup_db_arr[@]} do `mkdir -p $backup_cache_dir` `mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname > $backup_cache_dir/$dbname$backup_time.sql` flag=`echo $?` if [ $flag != "0" ];then `echo "database $dbname backup fail!" >> $backup_log_mailcontent` fi done else `echo "ERROR:No database to backup! backup stop" >> $backup_log_mailcontent` `mutt $adminmail -s "$subject_msg_error" < $backup_log_mailcontent` exit fi #如果开启了删除过期备份,则进行删除操作 backup_data_num=`ls $backup_data_dir | wc -l` if [ "$expire_backup_delete" == "ON" -a $backup_data_num!=0 ];then `find $backup_data_dir -type f -ctime +$expire_days -exec rm -rf {} \;` fi #缓存备份目录打包放到数据备份目录 删除缓存备份目录 backup_cache_num=`ls $backup_cache_dir | wc -l` if [ $backup_cache_num!=0 ];then `mkdir -p $backup_data_dir` `tar zcPf $backup_data_filename $backup_cache_dir/` `rm -rf $backup_cache_dir` else `echo "All database backup fail!" >> $backup_log_mailcontent` `mutt $adminmail -s "$subject_msg_error" < $backup_log_mailcontent` exit fi `echo "All database backup success! Thank you!" >> $backup_log_mailcontent` `mutt $adminmail -s "$subject_msg" -a $backup_data_filename < $backup_log_mailcontent` exit fi
直接创建一个automysqlbackup.sh文件将上面内容复制到里面就可以了 如果你连这步都不想做的话 你可以选择下载这个脚本哈
automysqlbackup.sh下载地址:http://vdisk.weibo.com/s/uoOJDg9XokuLP/1371350473
关于这个脚本如果有什么bug之类的或需要改进的地方 欢迎提意见
脚本顶端一部分需要根据你自己的情况进行设定 可别忘记这步哈
2、给automysqlbackup.sh设定可执行的权限
[root@localhost ~]# chmod 755 /root/automysqlbackup.sh
如果不设定可执行权限的话 脚本是不能运行的 这你懂的哈
3、执行脚本
测试脚本是否可以正常运行
[root@localhost ~]# ./automysqlbackup.sh
如果出现
/bin/bash^M: bad interpreter: 没有那个文件或目录
如上的提示错误的话 你可以参考 /bin/bash^M: bad interpreter: 没有那个文件或目录 这篇文章
四、利用crontab 实现自动备份
crontab 是一个实现周期性计划任务的工具
1、查看crond当前状态
[root@localhost ~]# service crond 用法:/etc/init.d/crond {start|stop|status|restart|condrestart|try-restart|reload|force-reload} [root@localhost ~]# service crond status crond (pid 2900) 正在运行...
如果没有运行 执行下面的命令进行开启crond
[root@localhost ~]# service crond start
2、添加计划任务
现在我们就可以将automysqlbackup.sh的脚本加入周期性计划任务里
使用如下命令 执行crontab -e edit 可以查看这个命令支持的一些参数 其实是一个错误的命令
[root@localhost ~]# crontab -e edit crontab: usage error: no arguments permitted after this option usage: crontab [-u user] file crontab [-u user] [ -e | -l | -r ] (default operation is replace, per 1003.2) -e (edit user‘s crontab) -l (list user‘s crontab) -r (delete user‘s crontab) -i (prompt before deleting user‘s crontab) -s (selinux context) [root@localhost ~]# crontab -e
现在增加如下内容 一行为一个周期性计划任务
27 02 * * * /root/automysqlbackup.sh
这样就实现了每天02:27自动备份mysql数据库并发送到你指定的Email里
关于计划任务格式说明 这里简单提一下吧
计划任务规则格式
原则:
a)知道的时间填上,不知道写*
b)连续值用 - ,不连续值用 , ,周日用0或7表示,24小时制,间隔固定时间*/n
如:
分钟 小时 天 月 星期 命令 0 2 * * * 0 2 * * 1-6 0 2 * * 0 0 9 * * 1-5 service sshd start 0 18 * * 1-5 service sshd stop */2 12-14 * 3-6,9-12 1-5