postgresql全库自动备份shell脚本

脚本功能说明:

将某台postgresql数据库服务器下所有业务数据库备份至指定目录

使用说明:

将以下脚本中备份目录、数据库IP地址、用户名、端口、密码修改为自己的postgresql服务器配置值,其它不用改。然后在postgresql服务器创建一个空文本pg_auto_bak.sh,将修改后的代码复制粘贴至文本并保存。

#!/bin/sh
 
# 当前日期
today=$(date "+%Y%m%d%H%M")
 
# 当前3天前日期
three_days_before=$(date -d "3 days ago" +%Y%m%d%H%M)
 
# 打印日志
echo '开始备份数据库,时间:'$today
 
#备份目录
bakupdir=/home/pgDataBak/
cd $bakupdir
 
# 创建文件夹
mkdir $today
cd $today
 
# 数据库IP地址、端口
db_host=192.168.120.25
db_port=5432
 
# 获取所有库名
export PGPASSWORD=密码
post_data=(`psql -X -A -d postgres -U postgres -h $db_host -p $db_port -t -c "SELECT datname FROM pg_database where datname not in('template0','template1','postgres')"`)
 
# 先删除存在的
echo '删除3天前的备份,时间:'$three_days_before
for i in ${post_data[@]}
do
  echo '库名:='${i}
  # 执行备份
  echo '开始备份:'${i}_$today.dump
  /usr/pgsql-14/bin/pg_dump -f $bakupdir$today/${i}_$today.dump -F c -h $db_host -p $db_port "dbname=${i} user=postgres password=密码"
  echo '结束备份:'${i}_$today.dump
 
  echo '开始删除文件:'$bakupdir$three_days_before/${i}_$three_days_before.dump
  # 执行删除
  # rm -rf ${i}_$three_days_before.dump
 
  if [ -d "$bakupdir$three_days_before/${i}_$three_days_before.dump" ]; then
    rm -f $bakupdir$three_days_before/${i}_$three_days_before.dump
  else
    echo "文件不存在跳过删除"
  fi
  #rm $bakupdir$three_days_before/${i}_$three_days_before.dump
  echo '结束删除文件:'$bakupdir$three_days_before/${i}_$three_days_before.dump
done
 
#删除空文件夹
echo '开始删除历史空文件夹'
if [ -d "$bakupdir$three_days_before" ]; then
    rm -rf $bakupdir$three_days_before
else
    echo "文件夹不存在跳过删除"
fi
echo '结束删除历史空文件夹'

 

chmod +x  pg_auto_bak.sh 添加执行权限  

定时执行配置:

输入crontab -e打开linux定任务配置文件,添加代码行:

# 每晚23点50分自动备份postgresql数据库

50 23 * * * /home/pgDataBak/pg_auto_bak.sh

# 恢复数据
pg_restore -h 127.0.0.1 -U postgres -W -d ceshiDB -C /csbak/202508181627/ceshi_202508181627.dump

  

posted @ 2025-08-18 17:22  Sんí丶頭  阅读(20)  评论(0)    收藏  举报