当前位置: 首页 > news >正文

shell脚本备份PostgreSQL数据库和库下表

注意:

  • 以下为对PostgreSQL13.16版本数据库备份shell脚本参考
  • 请确认备份节点上psql和pgdump的版本不至于太低,建议>=13.16
  • 该脚本目前是对于整库、(默认针对public这个schema,如果有其他schema,请自行添加一层循环)库下各表都做了备份,若不需要对各表进行备份,去除关于备表的for循环即可

一.脚本内容 

#!/bin/bash

# 定义连接pg的用户、密码、地址、端口
export pg_user="postgres"
export pg_pass="SLBpg2025"
export pg_host="192.168.2.199"
export pg_port="25432"
# 备份主目录
bak_path="/data/pg/back"
# 备份数据保留周期(单位:天)
retain_days=3
# 时间格式
date="$(date +"%Y-%m-%d")"
# 日志存放目录
log_file="$bak_path/$date/backup.log"
# 忽略备份的数据库
exdbname=' template0| template1| postgres'
# 获取所有数据库名
dbname=$(PGPASSWORD=$pg_pass psql -h$pg_host -p$pg_port -U$pg_user -c "SELECT datname FROM pg_database;" | sed -n '3,$p'|head -n -2 | grep -Ev "^($exdbname)$")
echo $dbname
if [ -z "$dbname" ]; then
    echo "未获取到有效的数据库列表,请检查 PGSQL 连接和权限。" > $log_file
    exit 1
fi

for db in $dbname; do
    # 创建数据库对应的备份目录
    db_backup_dir="$bak_path/$date/$db"
    if [ ! -d "$db_backup_dir" ]; then
        mkdir -p "$db_backup_dir"
    fi
    # 备份整个数据库
    PGPASSWORD=$pg_pass pg_dump -h$pg_host -p$pg_port -U$pg_user $db | gzip > $db_backup_dir/${db}_$(date +%F).sql.gz
    if [ $? -ne 0 ]; then
        echo "备份数据库 $db 失败。" >> $log_file
    else
        echo "数据库 $db 备份成功,存放路径 $db_backup_dir/${db}_$(date +%F).sql.gz" >> $log_file
    fi
    # 获取数据库中的表列表
    tb_list=$(PGPASSWORD=$pg_pass psql -h$pg_host -p$pg_port -U$pg_user -d"$db" -tAc "SELECT tablename FROM pg_tables WHERE schemaname = 'public';")
    # 检查是否获取到表列表
    if [ -z "$tb_list" ]; then
        echo "未获取到数据库 $db 中的表列表。" >> $log_file
        continue
    fi
    # 对每个表进行操作
    for tb in $tb_list; do
        # 备份单个表
        PGPASSWORD=$pg_pass pg_dump -h$pg_host -p$pg_port -U$pg_user -d"$db" -t"$tb" -F p | gzip > "$db_backup_dir/${db}_${tb}_$(date +%F).sql.gz"
        if [ $? -ne 0 ]; then
            echo "备份表 $db.$tb 失败。" >> $log_file
        else
            echo "表 $db.$tb 备份成功,存放路径 $db_backup_dir/${db}_${tb}_$(date +%F).sql.gz" >> $log_file
        fi
    done
done

find $bak_path -mtime +$retain_days -exec rm -f {} \;

二.执行效果

[root@master01 back]# bash back.sh 
slb
[root@master01 back]# ll
total 4
drwxr-xr-x 3 root root   35 Feb 17 22:10 2025-02-17
-rw-r--r-- 1 root root 2157 Feb 17 22:10 back.sh
[root@master01 back]# cd 2025-02-17/
[root@master01 2025-02-17]# ll
total 4
-rw-r--r-- 1 root root 299 Feb 17 22:10 backup.log
drwxr-xr-x 2 root root 112 Feb 17 22:10 slb
[root@master01 2025-02-17]# cat backup.log 
数据库 slb 备份成功,存放路径 /data/pg/back/2025-02-17/slb/slb_2025-02-17.sql.gz
表 slb.students 备份成功,存放路径 /data/pg/back/2025-02-17/slb/slb_students_2025-02-17.sql.gz
表 slb.employees 备份成功,存放路径 /data/pg/back/2025-02-17/slb/slb_employees_2025-02-17.sql.gz

三.创建定时任务

[root@master01 2025-02-17]# tail -1 /etc/crontab 
0 2 * * * root /usr/bin/bash /data/pg/back/back.sh

相关文章:

  • 信息安全管理(3):网络安全
  • 基于Matlab实现信道估计仿真(源码)
  • YOLOV8的学习记录(一) 环境配置和安装
  • 单片机的原理
  • Linux高并发服务器开发 第十八天(信号及相关概念 信号捕捉)
  • 教资信息技术之信息与信息技术
  • java听书项目
  • 【复现DeepSeek-R1之Open R1实战】系列4:跑通GRPO!
  • 【Vue3源码解析】应用实例创建及页面渲染
  • 后端生成二维码,前端请求接口生成二维码并展示,且多个参数后边的参数没有正常传输问题处理
  • 【MySQL】我在广州学Mysql 系列——Mysql 日志管理详解
  • 0079.基于springboot+vue的学科竞赛管理系统+论文
  • Linux探秘坊-------8.进程详解
  • 【性能测试】如何理解“10个线程且10次循环“的请求和“100线程且1次循环“的请求
  • 基于TCP与UDP协议的性能测试研究
  • 【SpringBoot苍穹外卖】debugDay04
  • 计算机专业知识【 轻松理解数据库四大运算:笛卡尔积、选择、投影与连接】
  • HDFS是如何存储和管理大数据
  • JavaScript 开发秘籍:日常总结与实战技巧-1
  • JS宏进阶:递归练习
  • 阳光保险拟设立私募证券投资基金,总规模200亿元
  • 广西:坚决拥护党中央对蓝天立进行审查调查的决定
  • 埃尔多安:愿在土耳其促成俄乌领导人会晤
  • 最高法、证监会:常态化开展证券纠纷代表人诉讼,降低投资者维权成本
  • 1至4月全国铁路发送旅客14.6亿人次,创同期历史新高
  • 4月新增社融1.16万亿,还原地方债务置换影响后信贷增速超过8%