• MySQL定时整库备份&滚动删除指定日期前的备份数据


    需求描述

    实现如下MySQL备份功能:

    1、对MySQL库表schema 及 数据 进行定时备份
    2、滚动删除指定日期(如30天)前的所有备份数据

    测试脚本

    vim /data/backup/scripts/MySQL_Backup.sh

    #!/bin/bash
    
    # Desc:
    #   1. Implements all MySQL databases backup 
    #   2. Implements Rolling delete data 30 days ago
    
    set -x
    
    USERNAME="DB_Backuper"
    PASSWORD="DB_Backuper"
    DBHOST="localhost"
    PORT=3306
    
    MySQL_BACKUP_DBLIST="db_1|db_2|db_3|db_4|db_5"
    MySQL_STORAGE_BACKUP_PATH="/data/backup/data"
    MySQL_BIN_PATH="/usr/bin"
    
    Y_DIR=`(date "-d 0 day ago" +%Y)`
    M_DIR=`(date "-d 0 day ago" +%Y%m)`
    D_DIR=`(date "-d 0 day ago" +%Y%m%d%H%M)`
    
    Y_LAST_DIR=$(date +%Y "-d -1 year")
    TWO_YEARS="$Y_LAST_DIR|$Y_DIR"
    
    # N days ago's data will be deleted
    N=30
    
    echo -e "*****************************************"
    echo ">>>>>>>>>>>>>>>>>>>>>>> backup started on" `date +%Y/%m/%d--%k:%M:%S`;
    
    for DB in `echo ${MySQL_BACKUP_DBLIST//|/ }`; 
    	do
    
    	mkdir -p $MySQL_STORAGE_BACKUP_PATH/$DB/$Y_DIR/$M_DIR/$D_DIR
    	DB_BACKUP_PATH=$MySQL_STORAGE_BACKUP_PATH/$DB/$Y_DIR/$M_DIR/$D_DIR
    
    	$MySQL_BIN_PATH/mysqldump --host=$DBHOST --user=$USERNAME --password=$PASSWORD --port=$PORT --opt --triggers --routines --single-transaction --set-gtid-purged=OFF $DB | sed 's/DEFINER=`[^`]+`@`[^`]+`/DEFINER=CURRENT_USER/g' > $DB_BACKUP_PATH/$DB.sql
    
    	# Rolling delete data N days ago
    	for YEAR in `echo ${TWO_YEARS//|/ }`;do
    	    PATH_TOBE_CHECK=$MySQL_STORAGE_BACKUP_PATH/$DB/$YEAR
    	    if [ -d $PATH_TOBE_CHECK ];then
    	        find $PATH_TOBE_CHECK -type d -mtime +$N | xargs rm -rf
    	    fi
    	done
    done;
    
    echo ">>>>>>>>>>>>>>>>>>>>>>> backup ended   on" `date +%Y/%m/%d--%k:%M:%S` 
    echo -e "*****************************************"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    说明:

    1. 文本替换
      for … in 语法中要求数据需要以空格分割, 这里需要对数据库列表进行文本替换
      ${MySQL_BACKUP_DBLIST//|/ }
      注意}前有一个空格
      当然也可以使用sed来做文本替换.
    1. 判断文件夹(或文件)非空
      如果文件夹或文件为空,则在删除时会报错,这里只需要对已存在的文件(夹)做删除操作即可.
      ① 判断文件夹是否存在: if [ -d $PATH_TOBE_CHECK ]
      ② 判断文件夹不存在: if [ ! -d $PATH_TOBE_CHECK ]
      ③ 如果判断是文件类型, 只需要把"-d"参数替换为"-f"参数.
    1. 跨年时前一年数据无法删除的问题(思路可以再优化)
      指定近2年的年份进行删除
  • 相关阅读:
    基于神经网络的预测控制,神经网络预测系统应用
    时序分析深入必学的时序模型详细讲解
    13.3测试用例进阶
    什么是联盟营销以及如何使用它在网上赚更多的钱
    算法第一天——数组理论基础
    系列十九、使用JDK生成HTTPS证书
    专业制造一体化ERP系统,专注于制造工厂生产管理信息化,可定制-亿发
    异步编程-线程池实现异步编程
    读取jsonArray文件并转换为java对象工具类
    力扣(141.21)补9.1
  • 原文地址:https://blog.csdn.net/liuwei0376/article/details/125517723