Shell脚本一键逻辑备份PostgreSQL数据库多个指定数据库

  1. 原始脚本

    #!/bin/bash

    多数据库备份示例

    数据库连接配置

    export PGPASSWORD="fYhuqwuiooo="
    DB_HOST="10.10.88.180"
    DB_PORT="5432"
    DB_USER="lmzf"

    要备份的数据库列表

    DATABASES=("pg_database1","pg_database2")
    BACKUP_DIR="/path/to/backup"
    DATE=$(date +"%Y%m%d")

    for DB_NAME in "{DATABASES[@]}"; do BACKUP_FILE="{BACKUP_DIR}/{DB_NAME}_{DATE}.dump"
    echo "(date) - 开始备份数据库: {DB_NAME}" >> ${BACKUP_DIR}/backup.log

    复制代码
     pg_dump -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -Fc -f ${BACKUP_FILE}
     
     if [ $? -eq 0 ]; then
         echo "$(date) - ${DB_NAME} 备份成功" >> ${BACKUP_DIR}/backup.log
     else
         echo "$(date) - ${DB_NAME} 备份失败" >> ${BACKUP_DIR}/backup.log
     fi

    done

  2. 优化后脚本

    #!/bin/bash

    PostgreSQL多数据库自动备份脚本

    功能:备份指定数据库列表,压缩存储,自动清理7天前备份,记录详细日志

    数据库连接配置

    DB_HOST="localhost"
    DB_PORT="5432"
    DB_USER="postgres"
    export PGPASSWORD="your_password" # 建议使用.pgpass文件更安全

    备份配置

    BACKUP_DIR="/opt/postgresql_backups"
    DATE_STAMP=(date +"%Y%m%d_%H%M%S") RETENTION_DAYS=7 LOG_FILE="{BACKUP_DIR}/backup.log"

    要备份的数据库列表(排除系统数据库)

    DATABASES=("db1" "db2" "db3" "production_db")

    创建备份目录

    mkdir -p ${BACKUP_DIR}

    记录备份开始

    echo "(date +'%Y-%m-%d %H:%M:%S') - 开始PostgreSQL数据库备份" >> {LOG_FILE}

    循环备份每个数据库

    for DB_NAME in "{DATABASES[@]}"; do BACKUP_FILE="{BACKUP_DIR}/{DB_NAME}_backup_{DATE_STAMP}.dump"

    复制代码
     echo "$(date +'%Y-%m-%d %H:%M:%S') - 正在备份数据库: ${DB_NAME}" >> ${LOG_FILE}
     
     # 执行备份命令(使用自定义格式,支持压缩和选择性恢复)
     pg_dump -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -Fc -v -f ${BACKUP_FILE} >> ${LOG_FILE} 2>&1
     
     # 检查备份是否成功
     if [ $? -eq 0 ]; then
         echo "$(date +'%Y-%m-%d %H:%M:%S') - 数据库 ${DB_NAME} 备份成功: ${BACKUP_FILE}" >> ${LOG_FILE}
         
         # 压缩备份文件
         gzip ${BACKUP_FILE}
         if [ $? -eq 0 ]; then
             echo "$(date +'%Y-%m-%d %H:%M:%S') - 备份文件已压缩: ${BACKUP_FILE}.gz" >> ${LOG_FILE}
         else
             echo "$(date +'%Y-%m-%d %H:%M:%S') - 警告: ${DB_NAME} 备份文件压缩失败" >> ${LOG_FILE}
         fi
     else
         echo "$(date +'%Y-%m-%d %H:%M:%S') - 错误: 数据库 ${DB_NAME} 备份失败!" >> ${LOG_FILE}
     fi

    done

    清理7天前的旧备份文件

    echo "(date +'%Y-%m-%d %H:%M:%S') - 开始清理超过{RETENTION_DAYS}天的旧备份" >> {LOG_FILE} find {BACKUP_DIR} -name "*.dump.gz" -type f -mtime +{RETENTION_DAYS} -exec rm -f {} \; if [ ? -eq 0 ]; then
    echo "(date +'%Y-%m-%d %H:%M:%S') - 成功清理超过{RETENTION_DAYS}天的旧备份文件" >> {LOG_FILE} else echo "(date +'%Y-%m-%d %H:%M:%S') - 警告: 清理旧备份文件时出错" >> ${LOG_FILE}
    fi

    echo "(date +'%Y-%m-%d %H:%M:%S') - 数据库备份流程完成" >> {LOG_FILE}

相关推荐
正儿八经的少年1 小时前
redis 的大 key 和热 key 详解
数据库·redis·缓存
AI砖家1 小时前
多智能体系统实战:架构设计、数据库表设计与 Skill 体系
数据库·多智能体·skill·agent架构设计·agengt
jun_bai2 小时前
Orthanc服务器使用java上传dicom影像文件
java·运维·服务器
夜雪一千2 小时前
MySQL查询条件的顺序是否影响查询效率
数据库·mysql
X-⃢_⃢-X2 小时前
十、Redis之布隆过滤器
数据库·redis·缓存
Nturmoils2 小时前
订单号查出了三笔,我以为是数据脏了,其实是自己写错了
数据库
ZKNOW甄知科技2 小时前
燕千云深度集成飞书:以AI之力,开启无感IT运维体验
大数据·运维·网络·数据库·人工智能·低代码·集成学习
TDengine (老段)2 小时前
TDengine 免费版说明
java·大数据·数据库·物联网·时序数据库·tdengine
汉知宝科技2 小时前
历史案件数据迁移:知识产权管理系统落地的第一道门槛
大数据·数据库
RisunJan2 小时前
Linux命令-semanage(SELinux 策略管理)
linux·运维·服务器