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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值