Zabbix企业级分布式监控系统
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.11 Zabbix数据库备份

备份Zabbix数据库可以防止数据库因意外损坏而导致所有的配置数据丢失,备份的目的是灾难恢复。这里选择对单表备份,而非全部备份。排除以下的表(原因是这几个表的数据为监控的历史展示数据,非配置类数据):

history* trends* Acknowledges Alerts Auditlog Events service_alarms

备份脚本(zabbix_mysqldump.sh)如下,读者可以根据需要进行修改。

shell# vim /usr/sbin/zabbix_mysqldump.sh
#! /bin/bash
#author: itnihao
#mail: itnihao#qq.com
#license: apache 2.0
#from :https://github.com/zabbix-book/zabbix-mysql-backup
#usage: chmod 700 ${PATH}/zabbix_mysqldump.sh
#crontab: 0 3 * * * ${PATH}/zabbix_mysqldump.sh mysqldump

red='\e[0;31m' #红色
RED='\e[1;31m'
green='\e[0;32m' #绿色
GREEN='\e[1;32m'
blue='\e[0;34m' #蓝色
BLUE='\e[1;34m'
purple='\e[0;35m' #紫色
PURPLE='\e[1;35m'
NC='\e[0m' #没有颜色

source /etc/bashrc
source /etc/profile
MySQL_USER=zabbix                          #MySQL的用户
MySQL_PASSWORD=zabbix                     #MySQL的密码
MySQL_HOST=localhost                      #MySQL的服务器地址
MySQL_PORT=3306                            #MySQL的服务器端口
MySQL_DUMP_PATH=/mysql_backup             #MySQL的备份路径
MYSQL_BIN_PATH=/usr/bin/mysql             #mysql命令的路径
MYSQL_DUMP_BIN_PATH=/usr/bin/mysqldump    #mysqldump命令的路径
MySQL_DATABASE_NAME=zabbix                #库的名称
DATE=$(date '+%Y-%m-%d')

MySQLDUMP(){
    [ -d ${MySQL_DUMP_PATH} ] || mkdir ${MySQL_DUMP_PATH}
    cd ${MySQL_DUMP_PATH}
    [ -d logs    ] || mkdir logs
    [ -d ${DATE} ] || mkdir ${DATE}
    cd ${DATE}

    TABLE_NAME_ALL=$(${MYSQL_BIN_PATH} -u${MySQL_USER} -p${MySQL_PASSWORD}  -h${MySQL_HOST} ${MySQL_DATABASE_NAME} -e \
    "show tables"|egrep -v "(Tables_in_zabbix|history*|trends*|acknowledges|alerts|auditlog|events|service_alarms)")
    for TABLE_NAME in ${TABLE_NAME_ALL}
    do
        ${MYSQL_DUMP_BIN_PATH} --opt -u${MySQL_USER} -p${MySQL_PASSWORD}-P${MySQL_PORT} -h${MySQL_HOST} \
        ${MySQL_DATABASE_NAME} ${TABLE_NAME} >${TABLE_NAME}.sql
        sleep 0.01
    done

    [ "$? " == 0 ] && echo "${DATE}: Backup zabbix succeed"     >>${MySQL_DUMP_PATH}/logs/ZabbixMysqlDump.log
    [ "$? " ! = 0 ] && echo "${DATE}: Backup zabbix not succeed" >>${MySQL_DUMP_PATH}/logs/ZabbixMysqlDump.log
    cd ${MySQL_DUMP_PATH}/
    [ "$? " == 0 ] && rm -rf $(date +%Y-%m-%d --date='5 days ago')
    exit 0
}

MySQLImport(){
    cd ${MySQL_DUMP_PATH}
    DATE=$(ls  ${MySQL_DUMP_PATH} |egrep "\b^[0-9]+-[0-9]+-[0-9]+$\b")
    echo -e "${green}${DATE}"
    echo -e "${blue}what DATE do you want to import, please input date:${NC}"
    read SELECT_DATE
    if [ -d "${SELECT_DATE}" ]; then
        echo -e "you select is ${green}${SELECT_DATE}${NC}, do you want to contine, if, input ${red}(yes|y|Y)${NC}, \
        else then exit"
        read Input
        [[ 'yes|y|Y' =~ "${Input}" ]]
        status="$? "
        if [ "${status}" == "0"  ]; then
            echo "now import SQL....... Please wait......."
        else
            exit 1
        fi
        cd ${SELECT_DATE}
        for PER_TABEL_SQL in $(ls *.sql)
        do
            ${MYSQL_BIN_PATH} -u${MySQL_USER} -p${MySQL_PASSWORD}  -h${MySQL_HOST} ${MySQL_DATABASE_NAME} < ${PER_TABEL_SQL}
            echo -e "import ${PER_TABEL_SQL} ${PURPLE}.............${NC}"
        done
        echo "Finish import SQL, Please check Zabbix database"
    else
        echo "Don't exist ${SELECT_DATE} DIR"
    fi
}

case "$1" in
MySQLDUMP|mysqldump)
    MySQLDUMP
    ;;
MySQLImport|mysqlimport)
    MySQLImport
    ;;
*)
    echo "Usage: $0 {(MySQLDUMP|mysqldump)(MySQLImport|mysqlimport)}"
    ;;
esac

该脚本的使用方法如下:

shell# bash /usr/sbin/zabbix_mysqldump.sh mysqldump    #备份数据
shell# bash /usr/sbin/zabbix_mysqldump.sh mysqlimport  #恢复数据