首页 > 其他分享 >xtrabackup脚本

xtrabackup脚本

时间:2024-03-08 19:22:59浏览次数:14  
标签:脚本 备份 sock xtrabackup mysql path bak

xtrabackup是MySQL的一种物理备份工具,相对于mysqldump,备份和还原速度更快 , 我写了一份可以进行备份 + 还原的脚本

#!bin/bash
all_bak_path="/opt/my_bak/xbak" # 主备目录
add_bak_path="/opt/my_bak/add" # 增量备份目录
mysql_data_path="/data/mysql/data" # 数据库数据路径
mysql_name="mysqld" # 数据库名称
mysql_cnf="/etc/my.cnf" # MySQL 配置文件
userName="root" # 数据库用户名称
userPasswd="root" # 数据库用户密码
# 获取mysql.sock文件路径
# sock_path=$(find / -name mysql.sock) # 第一次获取时使用 
sock_path="/usr/local/mysql/mysql.sock"
mysql_port="3306"
innobackupex_options="
    --defaults-file=${mysql_cnf} \
    --socket=${sock_path} \
    --user=${userName} --password=${userPasswd} \
    --port=${mysql_port}" 

# 0.创建全量备份和增来那个备份路径
create_path(){
    if [ ! -d ${all_bak_path} ] ; then
        mkdir -p ${all_bak_path}
        echo "创建/opt/my_bak/xbak/目录完成"
    fi

    if [ ! -d ${add_bak_path} ] ; then
        mkdir -p ${add_bak_path}
        echo "创建/opt/my_bak/add/目录完成"
    fi
}


# 1.安装xtrabackup
ins_xtra(){
    ins_app="libev-4.03-3.el6.x86_64.rpm percona-xtrabackup-24-2.4.29-1.el7.x86_64.rpm"
    yum -y install $ins_app
    if [ $? -ne 0 ]; then
        echo "安装xtrabackup失败"
        exit 1
    fi
    echo "安装xtrabackup完成"

    data_dir=$(cat ${mysql_cnf} | grep datadir)
    if [ -z "$data_dir" ]; then
        cat >> ${mysql_cnf} <<EOF
datadir=${mysql_data_path}/ # 选择备份的数据库目录
EOF
        systemctl restart ${mysql_name}
        if [ $? -ne 0 ]; then
            echo "重启mysql失败"
            exit 1
        fi
        echo -e "修改${mysql_cnf}文件完成"
    fi
}

# 2.对数据库进行全量备份
all_backup(){
    innobackupex ${innobackupex_options} ${all_bak_path}
}

# 3.对数据进行增量备份
add_backup(){

    # 检测是否有全量备份
    if [ -z "$(find $all_bak_path -maxdepth 1 -type d)" ]; then
        echo "没有全量备份,需先全量备份"
        exit 1
    fi

    # 执行增量备份部分语句
    add_half="innobackupex ${innobackupex_options} \
            --incremental "${add_bak_path}" "
    #最新的全量备份
    new_all_backup_path=$(find ${all_bak_path}/*_* -maxdepth 0 -type d | sort -r | head -1) 
    
    #没有更新的话,上一次目录路径选择全量目录
    if [ -z "$(find $add_bak_path -mindepth 1 -maxdepth 1)" ]; then
        $add_half --incremental-basedir="${new_all_backup_path}"
        echo "增量执行完成,在全量备份后备份"
    else
        # 获取所有增量备份
        new_add_backup_path=($(find ${add_bak_path}/*_* -maxdepth 0 -type d | sort | cut -d ":" -f 1)) 
        # 获取全量备份文件名
        tmp_all_path=$(echo $new_all_backup_path | cut -d "/" -f 5) 
        # 将文件名格式化为数字格式
        all_time=$(echo "${tmp_all_path//[-_]}/" | cut -d "/" -f 1) 
        # 获取增量备份数量
        add_length=${#new_add_backup_path[@]} 

        # 获取全量备份以后得增量备份
        for i in ${new_add_backup_path[@]} ; do # 遍历
            tmp_add_path=$(echo $i | cut -d "/" -f 5) # 获取文件名
            add_time=$(echo "${tmp_add_path//[-_]}/" | cut -d "/" -f 1) # 将文件名格式化为数字格式
            if [ $all_time -le $add_time ] ; then # 判断增量备份名称是否相对于全量备份日期更新
                $add_half --incremental-basedir="${new_add_backup_path[add_length-1]}"
                echo -e "增量执行完成,在上一次增量备份后备份,上一次备份位置${new_add_backup_path[add_length-1]}"
                break
            else
                $add_half --incremental-basedir="${new_all_backup_path}"
                echo "增量执行完成,在全量备份后备份"
                break
            fi
        done
    fi
}

# 4.对全量备份进行合并
merge_backup(){
    #最新的全量备份
    new_all_backup_path=$(find ${all_bak_path}/*_* -maxdepth 0 -type d | sort -r | head -1) 
    # 倒序获取所有增量备份
    new_add_backup_path=($(find ${add_bak_path}/*_* -maxdepth 0 -type d | sort | cut -d ":" -f 1)) 
    # 获取全量备份文件名
    tmp_all_path=$(echo $new_all_backup_path | cut -d "/" -f 5) 
    # 将文件名格式化为数字格式
    all_time=$(echo "${tmp_all_path//[-_]}/" | cut -d "/" -f 1) 
    # 获取增量备份数量
    add_length=${#new_add_backup_path[@]} 
    # 执行合并部分语句
    apply_half="innobackupex --apply-log"

    echo "准备全量备份"
    ${apply_half} --redo-only $new_all_backup_path
    if [ $? -eq 0 ] ; then 
        echo -e "准备全量备份完成,位置为${new_all_backup_path}"
    else 
        echo "准备全量备份报错,位置为${new_all_backup_path}"
        exit 1
    fi

    # 将增量备份脚本从后向前进行合并
    if [ -n $new_add_backup_path ] ; then
        # 获取全量备份以后得增量备份
        for i in ${new_add_backup_path[@]} ; do # 遍历
            tmp_add_path=$(echo $i | cut -d "/" -f 5) # 获取文件名
            add_time=$(echo "${tmp_add_path//[-_]}/" | cut -d "/" -f 1) # 将文件名格式化为数字格式
            if [ $all_time -le $add_time ] ; then # 判断增量备份名称是否相对于全量备份日期更新
                if [ $i == ${new_add_backup_path[add_length - 1]} ] ; then
                    $apply_half $new_all_backup_path --incremental-dir=${new_add_backup_path[add_length - 1]}
                    if [ $? -eq 0 ] ; then 
                        echo -e "最后一次合并完成,位置为${i}"
                    else 
                        echo "最后一次合并报错,位置为${i}"
                        exit 1
                    fi
                else
                    $apply_half --redo-only $new_all_backup_path --incremental-dir=$i
                    if [ $? -eq 0 ] ; then 
                        echo -e "增量合并至全量完成,位置为${i}"
                    else 
                        echo "增量合并至全量报错,位置为${i}"
                        echo -e "语句为: $apply_half --redo-only $new_all_backup_path --incremental-dir=${i}"
                        exit 1
                    fi
                fi
            fi
        done
    else
        echo "没有增量备份"
    fi

    echo "最后一次准备全量备份"
    ${apply_half} $new_all_backup_path
    if [ $? -eq 0 ] ; then 
        echo -e "准备全量备份完成,位置为${new_all_backup_path}"
    else 
        echo "准备全量备份报错,位置为${new_all_backup_path}"
        exit 1
    fi
}

# 5.对数据库进行还原
db_restore(){    
    #最新的全量备份
    new_all_backup_path=$(find ${all_bak_path}/*_* -maxdepth 0 -type d | sort -r | head -1) 

    innobackupex --copy-back ${new_all_backup_path}
    echo "还原数据完成"

    chown -R mysql.mysql ${mysql_data_path}
    echo "修改mysql数据库权限完成"

    systemctl restart ${mysql_name}
    echo "重启数据库完成"

    echo "数据库连接测试: "
    mysql -u${userName} -p${userPasswd} -e "show databases"
    mysql -u${userName} -p${userPasswd} -e "select * from test.testlog"
}  

options=("全量备份" "增量备份" "还原数据" "安装xtrabackup" "点击任意键退出")
create_path
select i in ${options[@]} ;do
    case $i in 
        ${options[0]})
            all_backup
        ;;
        ${options[1]})
            add_backup
        ;;
        ${options[2]})
            merge_backup
            db_restore
        ;;
        ${options[3]})
            ins_xtra
        ;;
        *)
            echo "退出"
            break 2
        ;;
    esac
done



``

标签:脚本,备份,sock,xtrabackup,mysql,path,bak
From: https://www.cnblogs.com/ramiro/p/18061680

相关文章

  • 自己写的初始化脚本,其实也包含了一些功能,以后如果有什么想法,会继续在选项中追加
    #!/bin/bashbase_ori(){ #1.关闭防火墙 stop_firewalld(){ fw_stat=$(systemctlstatusfirewalld|awk'/Active/{print$3}') if[$fw_stat=="(running)"];then systemctlstopfirewalld&&echo"关闭防火墙" fi fw_e......
  • 编写kickstart脚本,执行时遇到的问题
    KickStart脚本#!/bin/bash#declarevaryum_ins="yum-yinstall"sys_res="systemctlrestart"#1.配置dhcpdhcp_cfg(){#declaredhcp_vardhcp_path="/etc/dhcp"dhcp_conf=$dhcp_path/dhcpd.conf#网段net_seg="......
  • UI自动化测试使用场景及脚本录制
    经常有人会问,什么样的项目才适合进行UI自动化测试呢?UI自动化测试相当于模拟手工测试,通过程序去操作页面上的控件。而在实际测试过程中,经常会遇到无法找到控件,或者因控件定义变更而带来的维护成本等问题。哪些场景下适合UI自动化测试介入呢?产品比较稳定,不会有频繁的需求变更;需要......
  • python 脚本中 # -*- coding: utf-8 -*-的作用
     001、[root@pc1test1]#lstest01.pytest02.py[root@pc1test1]#cattest01.py#!/usr/bin/envpython#注释内容list1=["aa","bb","cc"]print(list1)[root@pc1test1]#cattest02.py#!/usr/bin/envpython#-*-coding:utf-8......
  • python脚本的开头该怎么写
     001、第一句通常为a、#!/usr/bin/envpythonb、#!/usr/bin/python首先以上两脚都是指定脚本语言的解释器,均表示用python解释器执行下面的脚本。a的写法比b的写法更加的健壮。因为b把解释器写死了,如果python的可执行程序不在/usr/bin/python中,那么程序就容易出错。而a的......
  • flock脚本
    importrequestsfrometh_accountimportAccountimportuuidimporttimedef获取钱包地址():account=Account.create()private_key=account.key.hex()address=account.addressprint("私钥:",private_key)print("地址:",add......
  • Jmeter —— 录制脚本
    1.第一步:添加http代理服务器,在测试计划--》添加--》非测试元件--》http代理服务器 2.第二步:添加线程组(这个线程组是用来放录制的脚本,不添加也可以,就直接放在代理服务器下)测试计划--》添加--》线程--》线程组(顺便讲一下线程组执行顺序:setUp--线程组--tearDown) 3.第三......
  • 清理挖矿程序的脚本
    systemctldisablemyservice.servicesystemctlstopmyservice.servicesystemctlstatusmyservice.servicerm-fr/usr/lib/systemd/system/myservice.servicerm-fr/root/.cfgrm-fr/usr/bin/mslogrm-fr/usr/bin/playersed-i/disown/d/var/spool/cron/root......
  • linux脚本:/bin/bash^M: bad interpreter: No such file or directory(/bin/sh^M).sh: no
    origin如图,运行一个脚本文件报错: 原因:在执行shell脚本时提示这样的错误主要是由于shell脚本文件是dos格式,即每一行结尾以\r\n来标识,而unix格式的文件行尾则以\n来标识解决方法,用dos2unixfilename命令,,直接把文件转换为unix格式 其他解决方法:(1)使用linux命令dos2unixfi......
  • 使用脚本配置ModelSim仿真
    最后修改日期:2024/03/061.问题使用ModelSim建立Project仿真的方法并不困难,但是经常提示类似于:Error:failtoopen...这样的错误。ModelSim经常找不到compile之后的模块,不知道为什么。此外,Project的方式反而会产生一堆乱七八糟的文件,这不便于管理。2.解决方法2.1.Mod......