热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysqlbinlog备份_mysql数据库binlog日志的异地备份

MySQL数据库的二进制日志binlog记录了对数据库的全量DDL和DML操作,对数据库的pointtopoint灾难恢复起着无法替代的关键作用。因此,

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

这里主要谈及2种备份方法,一种通过脚本定时调度的方式,强行切换binlog,增量备份二进制binlog。另一种则是通过mysqlbinlog的远程实时备份的方式实现binlog备份。

1、基于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="linzj"

port="3306"

host="localhost"

name=`hostname`

last_binlog_dir="/home/mysql/chkpoint"

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

binlog_backup_dir="/tmp/logbak/$name"                       ###binlog异地存放目录

mysqlcommand="mysql -u$user -p$password -h$host -P$port -N --protocol=tcp -e "

logdir="/home/mysql/log"

binlogfile="$logdir/binlog_bak.log"

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

if [ ! -d $logdir ]

then

mkdir -p $logdir

fi

function create_timestamps()

{

text=$1

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

}

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 !!!">>$binlogfile

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 !!!">>$binlogfile

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&#61;$binlog_start;i<&#61;$binlog_num;i&#43;&#43; ))

do

if [ $i &#61;&#61; $binlog_num ]

then

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

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

fi

cd $binlog_dir

logfile&#61;&#96;sed -n "${i}p" $binlog_index|awk &#39;{print "basename "$1}&#39;|sh&#96;

num&#61;5       ###重传次数限制

###如果拷贝的binlog文件md5值对应不上&#xff0c;尝试重传$num次&#xff0c;md5值依然对不上&#xff0c;放弃备份binlog并记录日志。

for(( j&#61;1;j<&#61;$num;j&#43;&#43; ))

do

cp $logfile $binlog_backup_dir

md5_source&#61;&#96;md5sum $logfile|awk &#39;{print $1}&#39;&#96;

md5_backup&#61;&#96;md5sum $binlog_backup_dir/$logfile|awk &#39;{print $1}&#39;&#96;

if [ "$md5_source" &#61; "$md5_backup" ]

then

gzip $binlog_backup_dir/$logfile

echo "$(date &#43;%Y%m%d-%H:%M:%S):$logfile backup to the $binlog_backup_dir sucessfully." >> $binlogfile

break

fi

if [ "$j" &#61;&#61; "$num" ]

then

rm -fr $binlog_backup_dir/$logfile

echo "$(date &#43;%Y%m%d-%H:%M:%S):$logfile can not backup to the $binlog_backup_dir sucessfully,please check !!!"  >> $binlogfile

fi

done

done

}

create_timestamps "&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;"

create_timestamps "the binlog backup start now !!!"

init_binlog_backup_dir

binlog_backup

create_timestamps "the binlog backup end   now !!!"

create_timestamps "&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;"

2、通过mysqlbinlog方式实现远程异地备份binlog。

基本原理&#xff1a;通过mysqlbinlog的--read-from-remote-server、 --stop-never参数实现异地binlog实时备份。通过while死循环的方式&#xff0c;避免由于网络等异常造成的断连。

脚本如下&#xff1a;#!/bin/sh

BACKUP_BIN&#61;"mysqlbinlog"

LOCAL_BACKUP_DIR&#61;"/mysqlbackup/logbak/mysql2/"                                          ###异地存放binlog的目录

BACKUP_LOG&#61;"/home/mysql/log/binlog_log"

REMOTE_HOST&#61;"192.168.124.132"

REMOTE_PORT&#61;"3306"

REMOTE_USER&#61;"root"

REMOTE_PASS&#61;"linzj"

MYSQLCOMMAND&#61;"mysql -u$REMOTE_USER -p$REMOTE_PASS -P$REMOTE_PORT --protocol&#61;tcp -N -e "

FIRST_BINLOG&#61;$($MYSQLCOMMAND "show binary logs" 2>/dev/null|head -1|awk &#39;{print $1}&#39;)   ###获取当前数据库最老的binlog

if [ ! $FIRST_BINLOG ]

then

echo "无法获取binlog信息&#xff0c;请检查数据库帐号权限和当前数据库是否打开binlog日志"

exit

fi

#time to wait before reconnecting after failure

SLEEP_SECONDS&#61;10

##create local_backup_dir if necessary

mkdir -p ${LOCAL_BACKUP_DIR}

cd ${LOCAL_BACKUP_DIR}

## 运行while循环&#xff0c;连接断开后等待指定时间&#xff0c;重新连接

while :

do

if [ &#96;ls -A "${LOCAL_BACKUP_DIR}" |wc -l&#96; -eq 0 ];then

LAST_FILE&#61;${FIRST_BINLOG}

else

LAST_FILE&#61;&#96;ls -l ${LOCAL_BACKUP_DIR} | tail -n 1 |awk &#39;{print $9}&#39;&#96;

fi

${BACKUP_BIN} --raw --read-from-remote-server --stop-never --host&#61;${REMOTE_HOST} --port&#61;${REMOTE_PORT} --user&#61;${REMOTE_USER} --password&#61;${REMOTE_PASS} ${LAST_FILE}

echo "&#96;date &#43;"%Y/%m/%d %H:%M:%S"&#96; mysqlbinlog停止&#xff0c;返回代码&#xff1a;$?" | tee -a ${BACKUP_LOG}

echo "${SLEEP_SECONDS}秒后再次连接并继续备份" | tee -a ${BACKUP_LOG}

sleep ${SLEEP_SECONDS}

done

综上所述&#xff0c;这两种binlog备份的方式各有优缺点&#xff1a;

缺点&#xff1a;

第一种方式&#xff0c;必须通过定时调度的方式实现备份&#xff0c;极端情况下存在丢失binlog的可能(在两个定时调度的窗口时间&#xff0c;MySQL异常并且所有生产binlog不可用&#xff0c;这个窗口时间产生的binlog无法备份到)。

第二种方式&#xff0c;通过mysqlbinlog的功能去实现实时备份&#xff0c;无法确认备份的可用性&#xff0c;即无法通过对比文件md5值来判断文件是否同生产环境保持一致。极端情况下会出现异常(网络异常造成的断连并且备份路径的binlog被误操作)&#xff0c;因为断连是通过while死循环去实现重连的&#xff0c;而重连的位置点信息是基于备份路径下的最新binlog文件。

优点&#xff1a;

第一种方式&#xff0c;可以通过验证md5值的方式确保备份同生产的一致性。备份的逻辑简单&#xff0c;便于理解。

第二种方式&#xff0c;可以实现binlog实时备份功能。

所以&#xff0c;基于以上的优缺点分析&#xff0c;选择哪种备份策略&#xff0c;仍需要根据生产环境的实际需要进行抉择。



推荐阅读
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 如何修改MySQL数据库密码的方法及步骤详解
    本文详细介绍了四种修改MySQL数据库密码的方法,包括使用SET PASSWORD命令、mysqladmin命令、UPDATE语句直接编辑user表的步骤和操作示例。通过本文的指导,读者可以轻松掌握修改MySQL数据库密码的技巧和方法。 ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
  • 目录1、将mysql数据导出到SQL文件中(数据库存在的情况)2、将现有的sql文件数据导入到数据库中(前提数据库存在) 3、利用Navicat导出SQL文件和导入SQL文件1)从 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • mysqldinitializeconsole失败_mysql03误删除了所有用户解决办法
    误删除了所有用户解决办法第一种方法(企业常用)1.将数据库down掉[rootdb03mysql]#etcinit.dmysqldstopShuttingdownMySQL..SU ... [详细]
author-avatar
lql
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有