电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

mysql数据库如何备份binlog

来源:金蝶云社区作者:金蝶2024-09-233

mysql数据库如何备份binlog

一 背景

mysql数据库的二进制日志binlog记录了对数据库的全量ddl和dml操作,对数据库的point to point灾难恢复起着无法替代的关键作用。因此,需要对生产环境产生的binlog做好相应的备份措施。

二 方案

基本原理

基于flush logs方式实现binlog文件的切换。
通过last_binlog_pos.txt文件记录上一次备份的位置点信息,下一次备份基于该位置点信息进行增量备份。如果是首次备份(last_binlog_pos.txt文件不存在,则全量备份binlog)。通过flush logs的方式强行切换binlog文件(只备份到次新的binlog文件),避免备份binlog过程中,mysql仍对其进行写入操作。备份每个binlog文件对其生产侧和备份侧的binlog文件md5值进行校验,校验不通过则通过配置重传次数$num,超过重传次数仍md5值校验不通过的话,放弃该binlog备份并记录到日志。

脚本

#!/bin/sh

######脚本功能:本地定时备份生产目录的binlog到备份目录。#####

user="root"

password=" "

port=" "

host="localhost"

socket='指定sock的绝对路径'

name=`hostname`

last_binlog_dir="../binlog/chkpoint"                    #备份位置点

last_binlog_pos="$last_binlog_dir/last_binlog_pos.txt"  ###上一次备份的位置点

binlog_backup_dir="../binlog"                           ###binlog备份存放目录

mysqlcommand="mysql -u$user -p$password --socket=$socket  -N  -e "

logdir="../log"                                         #mysql日志目录

baklog="$logdir/binlogbak_$(date +%Y%m%d%H%M).log"

 

###脚本运行日志存放的目录必须先行存在,否则后续写日志会报日志文件不存在的问题

if [ ! -d $logdir ]

then

    mkdir -p $logdir

fi

function create_timestamps()

{

    text=$1

    echo "$(date +%Y%m%d-%H:%M:%S):$text" >>$baklog

}

function init_binlog_backup_dir()

{

    ###判断存放上一次备份位置点的目录是否存在,不存在就创建

    if [ ! -d $last_binlog_dir ]

    then

        #echo "$(date +%Y%m%d-%H:%M:%S):last binlog save dir is not existed, now create it !!!">>$baklog

        create_timestamps "last binlog save dir is not existed, now create it !!!"

        mkdir -p $last_binlog_dir

    fi

    ###判断备份目录是否存在,不存在就创建

    if [ ! -d $binlog_backup_dir ]

    then

        #echo "$(date +%Y%m%d-%H:%M:%S):binlog backup dir is not existed, now create it !!!">>$baklog

        create_timestamps "binlog backup dir is not existed, now create it !!!"

        mkdir -p $binlog_backup_dir

    fi

}

function binlog_backup()

{

    ###获取存放binlog日志的目录

    binlog_dir=`$mysqlcommand "show variables like 'log_bin_index';" 2>/dev/null|awk '{print "dirname "$2}'|sh`

    ###获取binlog日志的index文件名

    binlog_index=`$mysqlcommand "show variables like 'log_bin_index';" 2>/dev/null|awk '{print $2}'`

   

    ###获取binlog日志的个数信息

    binlog_num=`wc -l $binlog_index|awk '{print $1}'`

    ###如果是首次备份,偏移量binlog_start为1;如果非首次备份,偏移量binlog_start为上次偏移量+1。

    if [ ! -f "$last_binlog_pos" ] 

    then

        binlog_start="1"

    else

        binlog_last_file=`cat $last_binlog_pos|awk -F \/ '{print $NF}'`

        binlog_last=`grep -n $binlog_last_file $binlog_index|awk -F \: '{print $1}'`

        binlog_start=`expr ${binlog_last} + 1 `

    fi

   

    #echo "binlog_start is $binlog_start"

    #flush logs,强制切换到新的binlog文件,避免备份当前最新的binlog文件时,mysql仍对其进行写操作###

    $mysqlcommand "flush logs" 2>/dev/null  

    for (( i=$binlog_start;i<=$binlog_num;i++ ))

    do

        if [ $i == $binlog_num ]

        then

            ##记录当次备份的最后一个binlog文件,作为本次备份的位置点信息

            sed -n "${i}p" $binlog_index > $last_binlog_pos

        fi

        cd

mysql数据库如何备份binlog

一 背景mysql数据库的二进制日志binlog记录了对数据库的全量ddl和dml操作,对数据库的point to point灾难恢复起着无法替代的关键作用。...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信