#!/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