Linux下每天自动备份Mysql数据库发送到指定Email

网站最重要的是什么?如果网站数据突然丢失 估计你会崩溃 这篇文章主要介绍 在Linux下每天自动备份Mysql数据库,并且自动发送到你指定的邮箱里,这样你再也不会为丢失数据烦恼啦。

一、安装 postfix 并配置

参考 CentOS6.4下邮件服务器搭建

二、安装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

Linux下每天自动备份Mysql数据库发送到指定Email

上一篇:mysql删除带外键约束的表的方法


下一篇:win安装oracle 10g时发生“程序异常终止。发生内部错误”的提示