#!/bin/sh
 
START_TIME=$(date +%s)
 
PRG=`pwd`
TASK_NAME="71业务数据库"
DM_HOME=${DM_HOME:-"/opt/dmdbms/bin"}
BASE_PATH="/home/dbbackup"
BAK_PATH="$BASE_PATH/archives"
BACKUP_LOG="$BASE_PATH/backup.log"
# 保留多长时间的备份呢文件
CLEANUP_DAYS=60
LOG_DATE_FORMAT="+%Y-%m-%d %H:%M:%S"
 
DM_USERNAME=SYSDBA
DM_PASSWORD=SYSDBA
DM_HOST=127.0.0.1
DM_PORT=5236
DM_CONDETION="$DM_USERNAME/$DM_PASSWORD@$DM_HOST:$DM_PORT"
 
echo "================================================================" | tee -a $BACKUP_LOG
echo "= 达梦数据库定时备份脚本 liangj                      v20250519 =" | tee -a $BACKUP_LOG
echo "================================================================" | tee -a $BACKUP_LOG
 
log_with_status() {
    local message="$1"
    local status="$2"
    echo "[$(date "$LOG_DATE_FORMAT")] $message $status" | tee -a $BACKUP_LOG
}
 
function sendMessage() {
  content=$1
  response=$(curl --silent 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=666' \
    -H 'Content-Type: application/json' \
    -d "{
        \"msgtype\": \"text\",
        \"text\": {
            \"content\": \"$content\"
        }
    }")
    
  errcode=$(echo $response | jq -r '.errcode') 
   
  if (( $errcode == 0 )); then
    log_with_status "企业微信消息发送" "OK"
  else
    log_with_status "企业微信消息发送" "FAIL"
  fi
}
 
cd $DM_HOME
 
if [ ! -d "$BAK_PATH" ]; then
  log_with_status "备份文件夹不存在,正在创建" "OK"
  mkdir -p "$BAK_PATH" || {
    log_with_status "创建备份文件夹" "FAIL"
    exit 1
  }
fi
 
find "$BAK_PATH" -type f -mtime +$CLEANUP_DAYS -exec rm -f "{}" + && {
    log_with_status "清理 $CLEANUP_DAYS 天前备份文件" "OK"
} || {
    log_with_status "清理 $CLEANUP_DAYS 天前备份文件" "FAIL"
}
 
TIMESTYLE=$(date +"%Y-%m-%d_%H-%M-%S")
 
FILEPATH="$TIMESTYLE.dmp"
LOGPATH="$TIMESTYLE.log"
ZIPPATH="$TIMESTYLE.tar.gz"
 
log_with_status "正在导出数据库" ""
output=$($DM_HOME/dexp USERID=$DM_CONDETION DIRECTORY=$BAK_PATH FILE=$FILEPATH LOG=$LOGPATH FULL=Y 2>&1)
 
if [ $? -ne 0 ]; then
  error_output=$(echo "$output" | grep 'error')
  log_with_status "导出数据库" "FAIL"
  log_with_status "错误信息:$error_output"
  sendMessage "[$TASK_NAME] 数据库备份导出失败,错误信息:$error_output"
else
  log_with_status "导出数据库" "OK"
  cd $BAK_PATH
  log_with_status "正在压缩导出文件"
  output=$(tar -czf $ZIPPATH $FILEPATH $LOGPATH 2>&1)
  if [ $? -ne 0 ]; then
    error_output=$(echo "$output")
    log_with_status "压缩导出文件" "FAIL"
    log_with_status "错误信息:$error_output"
    sendMessage "[$TASK_NAME] 压缩导出文件失败,错误信息:$error_output"
  else
    log_with_status "压缩导出文件" "OK"
    rm -rf $FILEPATH $LOGPATH
    log_with_status "数据库备份文件名:$ZIPPATH"
  fi
fi
 
END_TIME=$(date +%s)
EXECUTION_TIME=$((END_TIME - START_TIME))
 
EXEC_HOURS=$((EXECUTION_TIME / 3600))
EXEC_MINUTES=$((EXECUTION_TIME % 3600 / 60))
EXEC_SECONDS=$((EXECUTION_TIME % 60))
 
if (( EXEC_HOURS > 0 )); then
  log_with_status "执行时间: ${EXEC_HOURS}h ${EXEC_MINUTES}m ${EXEC_SECONDS}s"
else
  log_with_status "执行时间: ${EXEC_MINUTES}m ${EXEC_SECONDS}s"
fi
 
cd $PRG