zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    is_enable()、is_displayed()、isSelected()
    python selenium(常用关键字)
    Jenkins 构建 Jmeter 项目之源代码管理(SVN)
    Jenkins 构建 Jmeter 项目
    SAP SD基础知识之现金销售
    SAP SD基础知识之与FI集成相关的流程与配置
    SAP SD 基础知识之计划行类别(Schedule Line Category)
    SAP MM 事务代码MRKO触发的财务凭证不会出现在PO History里
    SAP MM 对于MRKO事务代码的几点优化建议
    SAP SD 销售中的借贷项凭证
  • 原文地址:https://www.cnblogs.com/surplus/p/14754113.html
Copyright © 2011-2022 走看看