网站最重要的是什么?如果网站数据突然丢失 估计你会崩溃 这篇文章主要介绍 在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=yesset from=root@medesky.meset 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:Beta1.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"
exit
fi
#连接到mysql数据库,无法连接则备份退出
mysql-h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password <
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"
exitelse#判断有没有定义备份的数据库,如果定义则开始备份,否则退出备份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
doneelse`echo"ERROR:No database to backup! backup stop" >>$backup_log_mailcontent`
`mutt $adminmail-s "$subject_msg_error"
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"
exit
fi
`echo"All database backup success! Thank you!" >>$backup_log_mailcontent`
`mutt $adminmail-s "$subject_msg" -a $backup_data_filename
exit
fi
直接创建一个automysqlbackup.sh文件将上面内容复制到里面就可以了 如果你连这步都不想做的话 你可以选择下载这个脚本哈
关于这个脚本如果有什么bug之类的或需要改进的地方 欢迎提意见
脚本顶端一部分需要根据你自己的情况进行设定 可别忘记这步哈
2、给automysqlbackup.sh设定可执行的权限
[root@localhost ~]# chmod 755 /root/automysqlbackup.sh
如果不设定可执行权限的话 脚本是不能运行的 这你懂的哈
3、执行脚本
测试脚本是否可以正常运行
[root@localhost ~]# ./automysqlbackup.sh
如果出现
/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 (pid2900) 正在运行...
如果没有运行 执行下面的命令进行开启crond
[root@localhost ~]# service crond start
2、添加计划任务
现在我们就可以将automysqlbackup.sh的脚本加入周期性计划任务里
使用如下命令 执行crontab -e edit 可以查看这个命令支持的一些参数 其实是一个错误的命令
[root@localhost ~]# crontab -e edit
crontab: usage error: no arguments permitted afterthisoption
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-5service sshd start0 18 * * 1-5service sshd stop*/2 12-14 * 3-6,9-12 1-5
好了 结束了哈