首页 > 数据库 >MySQL8物理一键备份和恢复脚本分享

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

时间:2024-09-26 09:50:36浏览次数:6  
标签:log MySQL8 backup 备份 一键 -- BACKUP DIR

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

原创 我科绝伦 小周的数据库进阶之路    2024年09月23日 00:01 重庆

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

小周的数据库进阶之路 致力于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篇原创内容 公众号

 

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

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

 

 

我科绝伦

赞赏二维码喜欢作者

MySQL5 日常运维10 备份与恢复脚本2 MySQL · 目录 上一篇教你玩转MySQL8物理备份利器Xtrabackup下一篇生产数据恢复系列之-MySQL8使用delete误删数据恢复 个人观点,仅供参考 阅读 1322   ​ 分享此内容的人还喜欢   OGG日常运维命令都在这里了     我看过的号 小周的数据库进阶之路   不看的原因   站内信消息未读/已读数据表设计 以及 如何用Golang实现     我关注的号 Go语言圈   不看的原因   开源服务器管理软件Nexterm     各种折腾   不看的原因 写留言             小周的数据库进阶之路     写留言 留言  

暂无留言

标签:log,MySQL8,backup,备份,一键,--,BACKUP,DIR
From: https://www.cnblogs.com/cheyunhua/p/18432848

相关文章

  • 教你玩转MySQL8物理备份利器Xtrabackup
    教你玩转MySQL8物理备份利器Xtrabackup原创 我科绝伦 小周的数据库进阶之路  2024年09月22日00:00 重庆热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者频率比较的内容,......
  • 校对:一键修复所有错误
    校对是Gboard的一项新功能,它使用服务器端大型语言模型(LLM),只需点击一下就可以提供无缝的句子级和段落级更正,减轻了那些喜欢专注于打字而不是检查已提交单词的快速打字者的痛点。校对背后的系统由四个部分组成:数据生成、指标设计、模型调优和模型服务。数据生成过程涉及一......
  • Jenkins备份和恢复
    Jenkins备份和恢复一、插件备份和恢复1.安装备份插件重启系统后查看2.配置周期备份点击进入,点击SettingsBackuponlybuildsmarkedtokeep,如果启用此选项,则仅备份标记为“永久保留此生成”的生成结果/项目。如下图BackupuserContentfolder ~......
  • 解读MySQL8.0数据字典重构源码
    摘要:本文对社区MySQL5.7到8.0演进过程中数据字典DD的重构(缓存,持久化),AtomicDDL的关键实现进行了分析。本文分享自华为云社区《【华为云MySQL技术专栏】MySQL8数据字典重构源码解读》,作者:GaussDB数据库1.背景介绍在MySQL5.7版本的使用实践过程中,我们很容易遇到DDL崩溃后导致数......
  • SQLServer中,当压缩备份遇到TDE加密的数据库
    压缩备份和TDESQLServer的压缩备份是一个特性,根据实际使用中的观察,压缩比至少在1:5左右,也就是备份时增加了压缩选项后可以至少压缩到数据文件大小的20%甚至更低,可以很大程度上加快备份执行时间,减轻IO压力和节省磁盘存储空间SQLServer的TDE(TransparentDataEncryption)作为数据库......
  • 单个48TB大小SQL Server数据库备份导致日志文件无法截断
    单个48TB大小SQLServer数据库备份导致日志文件无法截断 SQLServer版本:SQLServer2019背景在一个48T大小的单数据库环境中,采用简单恢复模式,日志文件大小限制为600G。执行一次完整备份时,耗时超过12小时,导致日志文件无法截断并达到上限,后续事务无法正常写入,导致整个数据库不可......
  • 代码报错不用愁,CodeGeeX一键完成代码修复、错误解释的功能上线了!
    作为一名开发者,你一定遇到过在编写代码时出现的各种错误。这些错误可能是语法错误、运行时错误或者逻辑错误。处理这些错误通常需要花费大量的时间和精力,特别是当你对错误的原因一无所知时。CodeGeeX的v2.7.4版本最新上线的代码修复和错误解释功能,让你在解决代码错误的问题上,......
  • OPENLDAP部署完整版(Linux)附一键式脚本
    (一)环境信息1,系统环境2,域信息(本章节使用)(二)应用部署1,ladp部署1、yum方式安装OpenLDAP服务2、拷贝数据库配置配置文件,并启动服务3、slappasswd生成OpenLDAP管理员密码4、导入基本的模式5、在OpenLDAPDB上配置域信息2,安装phpLDAPadmin实现通过Web管理LDAP服务1,部署httpd2,部署php应......
  • 删除归档日志和过期备份
    删除归档日志删除某个Sequence之前(包含该Sequence)的归档日志RMAN>deletearchiveloguntilsequencexxx;RMAN>deletearchivelogfromsequencexxxuntilsequencexxx; 删除系统时间1天以前的归档日志,不会删除闪回区有效的归档日志(可以指定删除多久日志)RMAN>delet......
  • 【ComfyUI工作流】神级AI文生图Flux.1本地一键部署整合包,6G显存NSFW版本​
    FLUX.1是由BlackForestLabs精心研发的AI图像生成模型,其强大的文本到图像的转换能力,让梦想变得触手可及。然而,FLUX.1模型对硬件的要求极为苛刻,尤其是显存需求高达42GB,这使得大多数普通用户难以直接运行该模型。为了解决这一难题,开发者们推出了FLUX.1GGUF版本。GGUF(GPT-Generated......