首页 > 数据库 >mysqldump+binlog备份脚本

mysqldump+binlog备份脚本

时间:2024-03-08 19:23:11浏览次数:35  
标签:binlog name 备份 echo mysqldump mysql path

mysqldump是一种逻辑备份工具 , 可以对数据库进行全量备份 , 和binlog增量备份共同使用可以进行数据库备份 , 基于此写了一个备份的脚本

#!/bin/bash
all_path="/opt/mysql_bakup/all" # MySQL全量备份目录
add_path="/opt/mysql_bakup/add" # MySQL增量备份目录
old_all_path="/opt/mysql_bakup/old_all" # MySQL旧全量备份目录
tar_date="$(date +%F)" # 打包时间
date_name="$(date +%F_%T)" # 备份时间
db_name="test" # 数据库名称
user_name="root" # 数据库用户名称
user_passwd="root" # 数据库用户密码
mysql_operate="mysql -u"${user_name}" -p"${user_passwd}" "
data_path="/data/mysql"
log_path="${data_path}/log" # MySQL日志存放位置

# 0.开启binlog功能
binlog_status=$($mysql_operate -e "show variables like 'log_bin'" | awk 'NR==2{print $2}')
if [ $binlog_status == "OFF" ] ; then
    cat >>/etc/my.cnf << EOF
log-bin=$data_path/log/mysql_bin # 二进制日志binlog文件位置和名称
server-id=1 #MySQL服务器的唯一标识符,用于主从同步
EOF
   systemctl restart mysqld
   if [ $? -eq 0 ] ; then
        echo "开启binlog日志功能"
    else
        echo "开启binlog日志功能失败"
        exit 10
   fi
fi

# 1.如果没有备份目录,就创建
create_dir(){
    if [ ! -d ${all_path} ] ; then
            mkdir -p ${all_path}
            echo "创建全量备份目录${all_path}结束"
    fi

    if [ ! -d ${add_path} ] ; then
            mkdir -p ${add_path}
            echo "创建增量备份目录${add_path}结束"
    fi

    if [ ! -d ${old_all_path} ] ; then
            mkdir -p ${old_all_path}
            echo "创建打tar包的旧全量备份目录${old_all_path}结束"
    fi

}

# 2.全量备份
all_backup(){
   
    # 1.将之前的全量包做打包处理
    if [ $(ls ${all_path} ) ]; then
        # 打tar包的同时删除源文件
        tar czf ${old_all_path}/${tar_date}.tar.gz -C ${all_path} . && find /opt/mysql_bakup/all -mindepth 1 -delete
        if [ $? -eq 0 ] ; then
            echo "之前的全量备份打包到${old_all_path}/${tar_date}.tar.gz"
        else
            echo "这种打包也能出问题?离谱...."
            exit 1
        fi
    fi

    # 2.将数据库的数据备份
    mysqldump -u"${user_name}" -p"${user_passwd}" --single-transaction --flush-logs -B ${db_name} > ${all_path}/${db_name}_db_${date_name}.sql
    if [ $? -eq 0 ] ; then
        echo "全量备份成功,位置为${all_path}/${db_name}_db_${date_name}.sql"
    else
        echo "就一句话的全量备份也能出问题啊?啊?...."
        exit 2
    fi

}

# 3.增量备份
add_backup(){
   
    # 1.获取当前最新的binlog文件编号
    new_num=$(cat ${log_path}/mysql_bin.index  | tail -1 | cut -d "." -f 2)
    # 2.获取目录中最新的binlog文件编号
    old_num=$(find ${add_path} -mindepth 1 | tail -1 | cut -d "." -f 2)
    if [ -z $old_num ] ; then
        old_num=0
    fi
    # 3.获取还差几个文件,加上1个刷新次数
    num=$((new_num-old_num+1))
   
    # 4.刷新binlog日志
    ${mysql_operate} -e "flush logs"

    # 2.备份相差个数的binlog文件,
    log_name=($(tail -${num} ${log_path}/mysql_bin.index))
    log_length=${#log_name[@]}
    for i in ${log_name[*]} ; do
        # 运行到最新的一行跳出
        if [[ $i == ${log_name[log_length-1]} ]] ; then
            echo "最后一次直接跳出"
            break
        fi
        cp ${i} ${add_path}
        if [ $? -eq 0 ] ; then
            echo "增量备份成功,位置为${add_path}${i}"
        else
            echo "增量备份失败"
            exit 3
        fi
    done

}

# 4.还原数据库
back_resore(){
   
    # 1.临时关闭binlog功能
    ${mysql_operate} -e "set sql_log_bin=0"
    echo "临时关闭binlog功能"

    # 2.将全量备份恢复至数据库
    all_bak="$(find ${all_path} -mindepth 1)" # 找到全量备份
    ${mysql_operate} ${db_name} < ${all_bak}
    if [ $? -eq 0 ] ; then
        echo "全量备份恢复成功"
    else
        echo "全量备份恢复失败"
        exit 4
    fi

    # 3.将增量备份按照顺序恢复至数据库    
    add_bak="$(find ${add_path} -mindepth 1)" # 找到增量备份
    for i in ${add_bak[*]} ; do
        mysqlbinlog ${i} | ${mysql_operate}
        if [ $? -eq 0 ] ; then
            echo "增量备份恢复成功,${i}"
        else
            echo "增量备份恢复失败,${i}"
            exit 5
        fi
    done
   

    # 4.开启binlog功能
    ${mysql_operate} -e "set sql_log_bin=1"
    echo "开启binlog功能"

}
create_dir
options=("all" "add" "restore")
case $1 in
    ${options[0]})
        all_backup
    ;;
    ${options[1]})
        add_backup
    ;;
    ${options[2]})
        back_resore
    ;;
    *)
        echo "请使用以下格式进行备份: "
        echo "<Usage> : sh $0 {全量备份 : all | 增量备份 : add | 还原备份 : restore}"
        exit 1
    ;;
esac
mysql -uroot -proot -e "use test; select * from testlog"

标签:binlog,name,备份,echo,mysqldump,mysql,path
From: https://www.cnblogs.com/ramiro/p/18061678

相关文章

  • Linux文件上传百度云盘轻松解决数据传输和备份
    本文主要的目的就是在Linux环境下通过命令行来使用百度云盘,直接在服务器上打包压缩备份将数据传输到百度网盘,之后可以进行轻松分享,而且还可以支持备份,解决文件的传输和分享难题。插件介绍bypy是一个Python客户端,用于操作百度网盘提供了丰富的命令行操作。该工具能够直接在Li......
  • Mysql数据备份
    一、数据库备份1、备份可分为完全备份、差异备份、增量备份2、常见备份方法:物理备份:冷备份,在数据库关闭状态下进行备份启用二进制日志进行增量备份:二进制日志为用户提供复制、对执行备份点后进行的数据库更改所需的信息进行备份。二、备份操作1、完全备份1、直接打包数......
  • FFU、WIM、ESD、VHD和VHDX都是与Windows操作系统部署、备份和虚拟化相关的文件格式。
    FFU(FullFlashUpdate)文件格式是微软开发的,用于在Windows设备上进行固件更新和完整系统部署的一种映像文件格式。FFU文件包含了设备的完整磁盘映像,包括所有分区、文件系统和数据。这种格式允许精确复制存储设备的内容,提供了一种高效且可靠的方式来恢复、更新或部署设备。下面是对F......
  • 22_BKP备份寄存器&RTC实时时钟
    BKP备份寄存器&RTC实时时钟BKP简介BKP基本结构一个数据寄存器存2字节RTC简介选LSE的32.768kHZ的时钟频率,因为支持VBAT供电RTC框图RTC基本结构硬件电路供电方案RTC操作注意事项读写备份寄存器接线图代码main.c#include"stm32f10x.h"......
  • mongodb备份与恢复
    在MongoDB中,备份可以通过多种方式进行,主要包括使用mongodump命令、文件系统快照或者复制集和分片集群的特性。1.使用mongodump进行备份mongodump是MongoDB自带的备份工具,它可以导出所有数据库的数据到BSON文件中。以下是一个基本的使用示例:mongodump--hostmongodb1.example......
  • MySQL binlog/redolog/undolog 的区别?
    想和大家聊聊InnoDB中的锁机制,那么不可避免的要涉及到MySQL的日志系统,binlog、redolog、undolog等,看到有小伙伴总结的这三个日志还不错,赶紧拿来和各位小伙伴分享。日志是 mysql 数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、......
  • PNPUTIL 驱动 添加 删除 导出(备份) DPInst64 驱动 安装
    MicrosoftPnP工具PNPUTIL[/add-driver<...>|/delete-driver<...>|     /export-driver<...>|/enum-drivers|     /enum-devices[<...>]|/enum-interfaces[<...>]|     /disable-device<...>|/enable-devi......
  • Q:批处理备份临时文件
    批处理:将本月临时文件移动到历史目录中chcp936@echooffsetmonth=%date:~2,2%%date:~5,2%setyear=%date:~0,4%echo%year%echo%month%chcp65001setMonthFolder=F:\我的工作\%year%\%month%setYearFolder=F:\我的工作\%year%ifnotexist%YearFolder%(re......
  • docker启动gitlab 备份与恢复
    一、数据备份进入容器备份dockerexec-itgitlab/bin/bashgitlab-rakegitlab:backup:create或者一条命令dockerexecgitlabgitlab-rakegitlab:backup:create默认将备份文件保存至/var/opt/gitlab/backups/这条命令是在Docker容器内部执行GitLab的备份操作。......
  • etcd 数据库的备份和恢复
    在K8s中,很多etcd服务都是以容器的方式运行,比如使用rancher和kubeadm部署管理的容器等。由于kubeadm部署的etcd没有etcdctl命令,需要下载etcd二进制包。通过在宿主机上使用etcdctl操作容器中的etcd。1、etcdctl安装#wgethttps://github.com/etcd-io/etcd/releases/downl......