一遇风云变化龙

备份日志、数据定时备份删除并检查告警

作者头像
空青、 本文作者

2024-11-5 阅读 59 约 13分钟读完

评论0

1、定时备份数据

01-odoo_data_log_backup-Pull-Zfile.sh

# cat 01-odoo_data_log_backup-Pull-Zfile.sh 
#!/bin/bash

#定义远程主机IP和用户名
REMOTE_HOST="nginx50c"
REMOTE_USER="root"

##### log系统日志备份-无删除策略 #####

#rsync -avze 'ssh -p 2250' root@nginx50c:/data/logs /data/zfile-data/backup/
rsync -avz --exclude='*.log' ${REMOTE_USER}@${REMOTE_HOST}:/data/logs /data/zfile-data/backup/

##### odoo系统数据备份-保留最近1个月 #####

#遍历要复制的目录列表
dir_file="project.list"

#切换到脚本所在目录
cd /home/scripts/backup/

if [[ ! -f "$dir_file" ]]; then
    echo "文件 $dir_file 不存在"
    exit 1
fi

for dir in $(cat "$dir_file"); do
    #跳过注释行和空行
    if [[ "$dir" =~ ^# ]] || [[ -z "$dir" ]]; then
        continue
    fi
    #定义远程和本地目录路径
    REMOTE_DIR="/data/odoo-storage/${dir}/backup"
    LOCAL_DIR="/data/zfile-data/backup/odoo/${dir}"

    #检查本地目录是否存在,不存在则创建
    if [ ! -d "$LOCAL_DIR" ]; then
        mkdir -p "$LOCAL_DIR"
        echo "Created local directory: $LOCAL_DIR"
    fi

     #使用rsync从远程主机复制文件到本地
     rsync -avz  "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/" "$LOCAL_DIR"

done

#wxincy-backup
#rsync -avz root@wxincy:/data/wxincy/backup/ /data/zfile-data/backup/odoo/wxincy/
#rsync -avz --exclude='*.log' root@wxincy:/var/log/app/wxincy /data/zfile-data/backup/logs/

#系统数据备份文件保留最近30天
#find /data/zfile-data/backup/odoo/ -type f -mtime +30 -delete
#find /data/zfile-data/backup/odoo/ -type f -mtime +30 \ 
# ! -path "/data/zfile-data/backup/odoo/wxincy/*" \
# ! -path "/data/zfile-data/backup/odoo/test/*" \
# -delete
bash /home/scripts/backup/04-delete-backup.sh

#日志数据暂永久保留

02-app_data_backup-Pull-Zfile.sh

# cat 02-app_data_backup-Pull-Zfile.sh 
#!/bin/bash

#Gitlab备份每天
rsync -avz root@gitlab101:/data/gitlab/data/backups/ /data/zfile-data/backup/app/gitlab/

#Jenkins备份每周
rsync -avz root@jenkins33:/data/backup/ /data/zfile-data/backup/app/jenkins/

#JNPF备份每天
#rsync -avz root@jnpf99:/data/backup/ /data/zfile-data/backup/app/jnpf/
rsync -avz root@jnpf190:/data/backup/ /data/zfile-data/backup/app/jnpf/

#bldsp备份每天
rsync -avz  root@bldsp150:/data/backup/ /data/zfile-data/backup/app/bldsp/

# app工具应用数据保留最近30天,不更新则停止删除

# 定义备份目录
backup_dir="/data/zfile-data/backup/app"

# 遍历备份目录下的所有子目录
for dir in "$backup_dir"/*/; do
    if [ -d "$dir" ]; then
        # 检查是否有超过3天未修改的文件
        recent_files=$(find "$dir" -type f -mtime -3)

        # 如果没有找到最近3天内有修改的文件,则跳过此目录
        if [ -z "$recent_files" ]; then
            echo "Directory $dir has no files modified in the last 3 days. Skipping..."
            continue
        fi

        # 删除30天前的文件
        find "$dir" -type f -mtime +15 -delete;
        echo "Deleted files older than 15 days in directory $dir"
    fi
done

2、检查备份

03-check-odoo_data_log_backup-zfile.sh

以备份文件的时间戳为判断标准。

 cat 03-check-odoo_data_log_backup-zfile.sh
#!/bin/bash

# 设置基础备份目录
ODOO_DIR="/data/zfile-data/backup/odoo"
LOGS_DIR="/data/zfile-data/backup/logs"

# 获取备份文件的时间戳
ALARM_DATE=$(date '+%c')
CURRENT_DATE=$(date +%Y_%m_%d)
YESTERDAY=$(date -d "yesterday" +%Y%m%d)

# 定义要检查的目录清单
dir_file="project.list"

# 切换到脚本所在目录
cd /home/scripts/backup/

# 检查文件是否存在
if [[ ! -f "$dir_file" ]]; then
    echo "文件 $dir_file 不存在"
    exit 1
fi

# 从文件中读取目录名称并存储到数组中,跳过注释行和空行
temp_file=$(mktemp)
grep -v '^#' "$dir_file" | grep -v '^$' > "$temp_file"
mapfile -t SUB_DIRS < "$temp_file"
rm "$temp_file"

# 使用for循环遍历子目录,并拼接完整路径进行检查ODOO备份数据
for DIR in "${SUB_DIRS[@]}"; do
    FULL_DIR_PATH="${ODOO_DIR}/${DIR}/"
    expected_file_prefix="${CURRENT_DATE}_"
    files_found=$(find "$FULL_DIR_PATH" -maxdepth 1 -name "${expected_file_prefix}*" 2>/dev/null)

    if [ -z "$files_found" ]; then
             curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=eb95a33d-5659-4a67-xxxxxxxxxxxxxxx' \
                        -H 'Content-Type: application/json' \
                        -d "{
                                \"msgtype\": \"text\", 
                                \"text\": {
                                \"content\": \"$ALARM_DATE \n未监测到 ${DIR}-$(date +%F) 的数据备份文件,请及时确认!\",
                                \"mentioned_list\": [\"LiuHuaLong\",\"@all\"],
                                }
                             }"
   fi
done

# 使用for循环遍历子目录,并拼接完整路径进行检查ODOO备份日志
for DIR in "${SUB_DIRS[@]}"; do
    FULL_DIR_PATH="${LOGS_DIR}/${DIR}/"
    expected_file_prefix="${YESTERDAY}.gz"
    files_found=$(find "$FULL_DIR_PATH" -maxdepth 1 -name "*${expected_file_prefix}" 2>/dev/null)

    if [ -z "$files_found" ]; then
             curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=eb95a33d-5659-4a67-xxxxxxxxxxxxxx' \
                        -H 'Content-Type: application/json' \
                        -d "{
                                \"msgtype\": \"text\", 
                                \"text\": {
                                \"content\": \"$ALARM_DATE \n未监测到 ${DIR}-$(date +%F) 的日志备份文件,请及时确认!\",
                                \"mentioned_list\": [\"LiuHuaLong\",\"@all\"],
                                }
                             }"
   fi
done

3、删除备份

04-delete-backup.sh

4、定时任务

# crontab -l
#数据日志备份
00 04 * * *  /bin/bash  /home/scripts/backup/01-odoo_data_log_backup-Pull-Zfile.sh
00 03 * * *  /bin/bash  /home/scripts/backup/02-app_data_backup-Pull-Zfile.sh

#告警监测
00 08 * * *  /bin/bash  /home/scripts/backup/03-check-odoo_data_log_backup-zfile.sh

当脚本在 crontab 中运行时,默认的工作目录通常是用户的家目录(例如 /home/username 或 /root),而不是脚本所在的目录。
因此,如果脚本中使用的是相对路径来指定 project.list 文件的位置,那么脚本可能无法找到该文件。
解决方法是确保脚本中使用绝对路径来指定文件位置,或者在脚本开始时切换到正确的目录。

上一篇 备份数据上传到对象存储 下一篇 配置prometheus监控Node节点
评论