MySQL8物理一键备份和恢复脚本分享

news/2024/11/19 23:22:54/文章来源:https://www.cnblogs.com/cheyunhua/p/18432848

MySQL8物理一键备份和恢复脚本分享

原创 我科绝伦 小周的数据库进阶之路
 

热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者频率比较的内容,希望大家能够喜欢,并提出宝贵地意见,我们一起提升,守住自己的饭碗。

小周的数据库进阶之路
致力于dba数据库经验分享、新手入门、原理解读、踩坑指南
171篇原创内容

一、一键备份

[root@myoracle ~]# chmod +x Xtrabackup.sh 
[root@myoracle ~]# sh -x Xtrabackup.sh 
图片图片

脚本内容:

说明:此脚本可以进行全量和增量的物理备份

cat Xtrabackup.sh
#!/bin/bash
# 定义变量
BACKUP_BASE_DIR="/data/backup"
DATE_STR=$(date +%F)
TIME_STR=$(date +%H%M%S)# 添加时间戳
DAY_OF_WEEK=$(date +%u)
FULL_BACKUP_DIR="${BACKUP_BASE_DIR}/db_full_${DATE_STR}"
INCREMENTAL_BACKUP_DIR="${BACKUP_BASE_DIR}/db_incr_${DATE_STR}_${TIME_STR}"
LOG_FILE="${BACKUP_BASE_DIR}/db_backup_${DATE_STR}_${TIME_STR}.log"
MYSQL_CONF="/etc/my.cnf"
MYSQL_USER="root"
MYSQL_PASSWORD="123456"
MYSQL_SOCKET="/tmp/mysql.sock"
# 上一次备份目录(可以是全备份或上一次增量备份)
LAST_BACKUP_DIR="${BACKUP_BASE_DIR}/db_last"
# 判断是否是周一,如果是,则进行全量备份;否则进行增量备份
if["$DAY_OF_WEEK"-eq 1];then
    BACKUP_DIR=$FULL_BACKUP_DIR
    BACKUP_TYPE="FULL"
    INCREMENTAL_OPTION=""
else
if[-L "$LAST_BACKUP_DIR"]&&[-d "$(readlink -f $LAST_BACKUP_DIR)"]&&[-f "$(readlink -f $LAST_BACKUP_DIR)/xtrabackup_checkpoints"];then
        BACKUP_DIR=$INCREMENTAL_BACKUP_DIR
        BACKUP_TYPE="INCREMENTAL"
        INCREMENTAL_OPTION="--incremental-basedir=$(readlink -f $LAST_BACKUP_DIR)"
else
        BACKUP_DIR=$FULL_BACKUP_DIR
        BACKUP_TYPE="FULL"
        INCREMENTAL_OPTION=""
fi
fi
# 创建新的备份目录
mkdir -p $BACKUP_DIR
# 执行 xtrabackup 备份命令
xtrabackup --defaults-file=$MYSQL_CONF \
--backup \
--target-dir=$BACKUP_DIR \
           $INCREMENTAL_OPTION \
--user=$MYSQL_USER \
--password=$MYSQL_PASSWORD \
--socket=$MYSQL_SOCKET \
> $LOG_FILE 2>&1
# 检查备份是否成功
if[ $?-eq 0];then
    echo "${BACKUP_TYPE} backup completed successfully at $(date)"| tee -a $LOG_FILE
else
    echo "${BACKUP_TYPE} backup failed at $(date)"| tee -a $LOG_FILE
exit1
fi
# 更新 LAST_BACKUP_DIR 链接指向最新备份目录
ln -sfn $BACKUP_DIR $LAST_BACKUP_DIR
# 清理3天以前的备份
find $BACKUP_BASE_DIR -type d -name "db_full_*"-mtime +3-exec rm -rf {} \;
find $BACKUP_BASE_DIR -type d -name "db_incr_*"-mtime +3-exec rm -rf {} \;
find $BACKUP_BASE_DIR -type f -name "db_backup_*.log"-mtime +3-exec rm -f {} \;
echo "Cleanup of backups older than 3 days completed at $(date)"| tee -a $LOG_FILE

添加定时任务:

crontab -e
# 每周一凌晨12点进行全量备份
0 0 * * 1 /root/Xtrabackup.sh
# 每周二至周日凌晨1点进行增量备份
0 1 * * 2-7 /root/Xtrabackup.sh
图片图片

模拟新增数据进行增量备份

root@localhost:(none)>create database test;
root@localhost:(none)>use test;
root@localhost:test>create table test(id int);
root@localhost:test>insert into test values(1);
root@localhost:test>select * from test;
root@localhost:test>flush logs; 
#继续继续备份
[root@myoracle ~]# sh -x Xtrabackup.sh 
图片图片图片

二、一键恢复

[root@myoracle ~]# pkill mysql
[root@myoracle ~]# ps -ef|grep mysql
[root@myoracle ~]# mv /data/mysql/ /data/mysql.bak
[root@myoracle ~]# chmod +x XtraRestoreall.sh 
[root@myoracle ~]# sh -x XtraRestoreall.sh
图片图片图片图片

脚本内容:

说明:此脚本可以进行全量和增量的物理备份恢复

cat XtraRestoreall.sh
#!/bin/bash
# 定义变量
BACKUP_BASE_DIR="/data/backup"
FULL_BACKUP_DIR="${BACKUP_BASE_DIR}/db_full_2024-09-22"# 第一次全量备份的目录
INCREMENTAL_BACKUP_DIR="${BACKUP_BASE_DIR}/db_last"# 增量备份目录
MYSQL_DATA_DIR="/data/mysql"
LOG_FILE="${BACKUP_BASE_DIR}/db_restore_$(date +%F).log"
MYSQL_CONF="/etc/my.cnf"
MYSQL_USER="root"
MYSQL_PASSWORD="123456"
# 日志记录函数
log(){
    echo "$1"| tee -a $LOG_FILE
}
# 检查是否存在必要文件的辅助函数
check_required_files(){
local backup_dir=$1
if[!-f "${backup_dir}/xtrabackup_checkpoints"]||[!-f "${backup_dir}/backup-my.cnf"];then
        log "Error: Backup directory ${backup_dir} is missing necessary files."
return1
fi
return0
}
# 准备全量备份
prepare_full_backup(){
    log "Preparing full backup..."
    xtrabackup --prepare --apply-log-only --target-dir=$FULL_BACKUP_DIR >> $LOG_FILE 2>&1
if[ $?-ne 0];then
        log "Failed to prepare full backup."
exit1
fi
}
# 应用增量备份
apply_incremental_backups(){
if[-d "$INCREMENTAL_BACKUP_DIR"];then
        log "Applying incremental backups..."
for incr in $(ls -d ${INCREMENTAL_BACKUP_DIR}/* | sort); do
            check_required_files $incr
            if [ $? -eq 0 ]; then
                log "Applying incremental backup: $incr"
                xtrabackup --prepare --apply-log-only --target-dir=$FULL_BACKUP_DIR --incremental-dir=$incr >> $LOG_FILE 2>&1
                if [ $? -ne 0 ]; then
                    log "Failed to apply incremental backup: $incr"
                    exit 1
                fi
            else
                log "Skipping incremental backup: $incr due to missing files."
            fi
        done
    else
        log "No incremental backup directory found, skipping incremental backup application."
    fi
}
# 执行最后的准备步骤
finalize_backup_preparation() {
    log "Finalizing the backup preparation..."
    xtrabackup --defaults-file=$MYSQL_CONF --user=$MYSQL_USER --password=$MYSQL_PASSWORD --prepare --target-dir=$FULL_BACKUP_DIR >> $LOG_FILE 2>&1
    if [ $? -ne 0 ]; then
        log "Failed to finalize the backup preparation."
        exit 1
    fi
}
# 恢复备份到数据目录
restore_backup() {
    # 停止MySQL服务
    service mysql stop
    if [ $? -ne 0 ]; then
        log "Failed to stop MySQL service."
        exit 1
    fi
    # 清空当前数据目录
    rm -rf $MYSQL_DATA_DIR/*
    if [ $? -ne 0 ]; then
        log "Failed to clear MySQL data directory."
        service mysql start
        exit 1
    fi
    # 恢复备份到数据目录
    log "Restoring backup to data directory..."
    xtrabackup --defaults-file=$MYSQL_CONF --user=$MYSQL_USER --password=$MYSQL_PASSWORD --copy-back --target-dir=$FULL_BACKUP_DIR >> $LOG_FILE 2>&1
    if [ $? -ne 0 ]; then
        log "Failed to restore backup to data directory."
        service mysql start
        exit 1
    fi
    # 修复文件权限
    chown -R mysql:mysql $MYSQL_DATA_DIR
    if [ $? -ne 0 ]; then
        log "Failed to set proper file permissions."
        service mysql start
        exit 1
    fi
    # 启动MySQL服务
    service mysql start
    if [ $? -eq 0 ]; then
        log "Database restored successfully and MySQL service started."
    else
        log "Failed to start MySQL service after restoration."
        exit 1
    fi
}
# 主函数
main() {
    # 判断是否存在第一次全量备份
    check_required_files $FULL_BACKUP_DIR
    if [ $? -ne 0 ]; then
        log 'Error: No valid first full backup directory found.'
        exit 1
    fi
    # 准备全量备份
    prepare_full_backup
    # 应用增量备份
    apply_incremental_backups
    # 执行最后的准备步骤
    finalize_backup_preparation
    # 恢复备份
    restore_backup
}
# 执行主函数main
小周的数据库进阶之路
致力于dba数据库经验分享、新手入门、原理解读、踩坑指南
171篇原创内容

 

文中的概念来源于互联网,如有侵权,请联系我删除。

欢迎关注公众号:小周的数据库进阶之路,一起交流数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。

 

 

我科绝伦

赞赏二维码喜欢作者

MySQL · 目录
上一篇教你玩转MySQL8物理备份利器Xtrabackup下一篇生产数据恢复系列之-MySQL8使用delete误删数据恢复
个人观点,仅供参考
阅读 1322
 
写留言
 
 
 
 
 
 
 
 
写留言
留言
 

暂无留言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/803900.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM工具-基础

Jvm内存 1.堆内存(Heap): 堆内存是Java中用于存放对象实例的内存区域,几乎所有的对象实例(包括数组)都在这里分配内存。 堆内存由垃圾回收器(Garbage Collector,GC)自动管理,程序员不需要手动释放。 堆内存可以细分为年轻代(Young Generation)、老年代(Old Genera…

学生订阅如何免费获得2台Azure ArchLinux虚拟机

微软Azure 的学生订阅可以免费开 Windows 和 Linux 虚拟机各一台,但是只有1G内存,在Windows Server里面跑不动程序。 下面记录了我将安装了Ubuntu和Windows Server的2台虚拟机都重装成ArchLinux的过程。 一、登录github学生账号,登入https://portal.azure.com/ 分别开通两台…

教你玩转MySQL8物理备份利器Xtrabackup

教你玩转MySQL8物理备份利器Xtrabackup 原创 我科绝伦 小周的数据库进阶之路2024年09月22日 00:00 重庆热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者频率比较的内容,希望…

双面打印机:激光打印、复印、扫描一体机LaserJet Pro MFP 4104dw

双面打印机: 型号:LaserJet Pro MFP 4104dw 功能:激光打印、复印、扫描一体机

【计算几何】凸包问题 (Convex Hull)

【计算几何】凸包问题 (Convex Hull) 引言 凸多边形 凸多边形是指所有内角大小都在\([0,π]\)范围内的简单多边形 凸包 在平面上能包含所有给定点的最小凸多边形叫做凸包。 其定义为:对于给定集合 X,所有包含 X 的凸集的交集 S 被称为 X 的 凸包。 实际上可以理解为用一个橡皮…

2535. 数组元素和与数字和的绝对差

给你一个正整数数组 nums 。 元素和 是 nums 中的所有元素相加求和。 数字和 是 nums 中每一个元素的每一数位(重复数位需多次求和)相加求和。 返回 元素和 与 数字和 的绝对差。 注意:两个整数 x 和 y 的绝对差定义为 |x - y| 。 示例 1: 输入:nums = [1,15,6,3] 输出:9…

[34](CSP 集训)CSP-S 联训模拟 1

A 几何 重复若干次 -> 不能重叠,因此考虑直接暴力 DP 设 \(f_{i,j,k}\) 表示主串匹配到第 \(i\) 位(将前 \(i\) 位分别归为两类),其中 \(x\) 在重复了若干次后,又匹配到了第 \(j\) 位,\(y\) 在重复了若干次后,又匹配到了第 \(k\) 位 转移非常好写,枚举 \(i\),尝试把…

ShiftAddAug:基于乘法算子训练的最新无乘法网络方案 | CVPR24

不包含乘法的运算符,如移位和加法,因其与硬件的兼容性而日益受到重视。然而,采用这些运算符的神经网络(NNs)通常表现出比具有相同结构的传统NNs更低的准确性。ShiftAddAug利用成本较高的乘法来增强高效但功能较弱的无乘法运算符,从而在没有任何推理开销的情况下提高性能。…

ubuntu录屏转格式 webm转mp4

起因 想着将一些操作录屏记录下来。之前在win上面,使用EV录屏或者用CS(CamtasiaStudio)。这次用ubuntu,发现系统自带的录屏似乎就可以用,于是试了一下。操作确实很方便,但录屏生成的文件是.webm后缀,似乎要上传一些平台需要转格式。遂祭起AI大旗。 AI协助转格式 在Ubunt…

飞驰云联亮相”电子半导体数智化年会” 获”数据交换领域最佳厂商奖”

2024年9月20日,“2024第二届电子半导体/智能制造数智化年会暨品牌出海论坛”于上海隆重开幕,Ftrans飞驰云联作为国内领先的数据安全交换厂商,应邀携半导体全场景产品和解决方案亮相此次峰会。会上进行了“智象奖”评选,Ftrans飞驰云联凭借创新的技术以及优质的服务,荣获“…

智能同步,效率倍增:Ftrans文件自动化实时同步技术革新!

随着企业结构分散化,企业内部数据流转更加频繁,为了保证数据在不同平台和设备之间的一致性和可用性、保障数据的安全性并有效支撑业务开展,越来越多的企业需要将内部数据在多个数据中心之间、多台服务器之间、多云和本地间进行服务器文件自动化实时同步处理。通过同步软件,…

跨地域协作新篇章:异地传输文件的最优方案!

基于市场拓展、获取丰富资源、实现长期战略目标、分散运营风险等考量,企业会在多个城市或国家设立分支机构,用以覆盖更广泛的市场和客户群体,提高业务的可靠性和稳定性。企业在实现总分支机构之间异地传输文件时,会面临以下挑战: 1.管理难统一 不同业务部门、机构之间进行…