运维脚本: Mysql数据库备份

背景介绍

  • 在数据库管理和运维中,定期备份数据库是防止数据丢失和灾难恢复的基础。对于 MySQL 数据库,手动备份可能会导致频繁的操作失误或遗漏,因此,自动化备份脚本的编写变得尤为重要。
  • 本文将为你介绍如何编写一个简单且实用的 MySQL 备份脚本,通过该脚本,用户可以轻松自动化备份过程,确保数据库数据的安全

目标和用途

  • 创建一个简单的 Bash 脚本,用于自动备份 MySQL 数据库。
  • 通过自动化脚本来减轻数据库管理负担,确保定期备份。
  • 提供自动化的备份策略,例如按日期创建备份文件,保留历史备份等。

备份工具

  • 采用percona-xtrabckup实现MySQL数据库物理热备。
  • xtrabckup 优点
    • 备份速度快,物理备份可靠。
    • 备份过程不会打断正在执行的事务(无需锁表)
    • 自动备份校验
    • 还原速度快

脚本示例

复制代码
#!/bin/bash
# 作者: 阿杰
# 说明:Mysql数据库备份脚本
# 备份工具: percona-Xtrabackup
# 备份策略:
#     (1) 每周日凌晨2点进行全量备份
#     (2) 每周一至周六凌晨两点进行增量备份
# 定时任务配置策略
# 0 2 * * * bash /data/mysql_backup/mysql_backup.sh
# 告警:可根据备份失败触发邮件告警机制。告警需自行配置


# 日志记录
log_err() {
    printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[31mERROR: \033[0m$@\n" >> /data/mysql_backup/error.log
    exit 1
}

log_info() {
    printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[32mINFO: \033[0m$@\n" >> /data/mysql_backup/info.log
}

log_warning() {
    printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[33mWARNING: \033[0m$@\n" >> /data/mysql_backup/warning.log
}



# 初始化函数
function init() {
    init_config
    check_backup_is_exist
}

# 初始化配置
function init_config() {
    # 备份工具
    xtrabckup_path="/usr/bin/innobackupex"
    # Mysql配置文件路径
    mysql_cnf_path="/etc/my.cnf"
    # 线程数
    thread_cnt=4
    #备份路径, 时间格式:年-周
    backup_base_dir="/data/mysql_backup/$(date "+%Y-%U")"
    # 当前备份文件
    current_backup_path="${backup_base_dir}/$(date "+%Y-%m-%d")"

    # 数据库信息
    db_host="localhost"
    db_user="root"
    db_password="U9qaQrQEgV8nqnMY2VWZyAWMkL7"

}

# 检查是否存在percona-Xtrabackup 工具
function check_backup_is_exist() {
    if [ -z "$(rpm -qa | grep xtrabackup)" ];then
        curl -o /tmp/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm  https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm > /dev/null 2>&1
        if [ $? -ne 0 ];then
            log_err "[check_backup_is_exist] 在线安装 percona-xtrabackup 备份工具失败! 请检查是否可出网"
        fi
        yum -y install /tmp/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm 1> /dev/null 
        if [ $? -ne 0 ];then
            log_err "[check_backup_is_exist] yum 安装 percona-xtrabackup 备份工具失败! " 
        fi
    fi
}

# 全量备份
function full_backup() {
    # 不存在则创建
    if [ ! -d "$backup_base_dir" ];then
        mkdir -pv $backup_base_dir > /dev/null 2>&1
        if [ $? -ne 0 ];then
            log_err "[full_backup] 创建备份目录 $backup_base_dir 失败!"
        fi
        # 全量备份
        full
    fi


}

function full() {
    log_info "[full_backup] 全量备份开始..."
    SECONDS=0
    $xtrabckup_path --defaults-file=$mysql_cnf_path --host=$db_host --user=$db_user --password=$db_password --parallel=$thread_cnt --slave-info --safe-slave-backup --no-timestamp $current_backup_path
    if [ $? -ne 0 ];then
        # 执行失败,删除备份目录
        rm -rf $current_backup_path > /dev/null 2>&1
        if [ $? -ne 0 ];then
            log_warning "[full] 执行备份失败 删除备份路径: $current_backup_path 失败"
        fi
        log_err "[full_backup] 执行备份失败 备份路径: $current_backup_path"
        
    fi
    execution_time=$SECONDS
    log_info "[full_backup] 全量备份结束, 备份路径: $current_backup_path 耗时: $SECONDS"
    # 全量备份完成后退出脚本
    exit 1
}

# 增量备份
function incremental_backup() {
    log_info "[incremental_backup] 增量备份开始..."
    prev_backup_dir="/data/mysql_backup/$(date "+%Y-%U")/$(date -d "-1day" "+%Y-%m-%d")"
    stat $prev_backup_dir > /dev/null 2>&1
    if [ $? -ne 0 ];then
        log_warning "[incremental_backup] 前一天执行备份失败 备份路径:$prev_backup_dir"
        # 查找上一次备份结果
        while true;do
            local s=0
            local i=2
            
            # 重试次数,到达5次则退出脚本
            if [ $s -eq 5 ];then
                log_err "[incremental_backup] 未找到历史备份数据, 重试次数: $s 请检查备份路径下是否存在数据 备份路径: $backup_base_dir"
            fi
            
            prev_backup_dir="/data/mysql_backup/$(date "+%Y-%U")/$(date -d "-${i}day" "+%Y-%m-%d")"
            stat $prev_backup_dir > /dev/null 2>&1
            if [ $? -eq 0 ];then
                break
            fi
            ((i++))
            ((s++))
        done
    fi
    $xtrabckup_path --defaults-file=$mysql_cnf_path --host=$db_host --user=$db_user --password=$db_password --parallel=$thread_cnt --slave-info --safe-slave-backup --no-timestamp --incremental $current_backup_path --incremental-basedir=${prev_backup_dir}
    if [ $? -ne 0 ]; then
        log_err "[incremental_backup] 执行增量备份失败, 备份路径: $current_backup_path"
    fi
    log_info "[incremental_backup] 增量备份结束, 备份路径: $current_backup_path"
}


# 主函数
function main() {
    init
    full_backup
    incremental_backup
}

main
复制代码

 

posted @   小书童·阿杰  阅读(228)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
点击右上角即可分享
微信分享提示