百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

PostgreSQL 数据库备份脚本实战指南

gudong366 2025-03-20 10:46 9 浏览

PostgreSQL 数据库备份脚本实战指南

在数据库管理中,备份是一项至关重要的工作。今天我要分享一个功能强大的 PostgreSQL 数据库备份脚本,它不仅支持 Windows 和 Linux 系统,还提供了灵活的备份选项,让你的数据库管理工作更加高效。

脚本功能亮点

这个备份脚本具有以下几个突出特点:

  1. 1. 跨平台兼容:同时支持 Windows 和 Linux 系统
  2. 2. 灵活的备份范围:可以按需导出指定数据库、指定 schema 或指定表
  3. 3. 多种导出模式:支持导出表结构+数据、仅表结构或仅数据
  4. 4. 操作安全保障:执行前需要手动确认,避免误操作
  5. 5. 便捷的导入提示:备份完成后自动生成对应的导入命令

脚本实现原理

脚本通过调用 PostgreSQL 的 pg_dump 工具来实现数据库备份。它首先检测操作系统类型,然后根据用户输入构建适合的备份命令。整个过程中,脚本会记录详细日志,并在完成后提供导入指令。

使用方法详解

1. 基本信息配置

脚本会引导你输入以下基本信息:

  • o pg_dump 可执行文件的完整路径
  • o 数据库服务器 IP 地址(默认:localhost)
  • o 数据库端口号(默认:5432)
  • o 数据库用户名(默认:postgres)
  • o 数据库密码(默认:123456)
  • o 要备份的数据库名称

2. 选择备份范围

脚本提供三种备份范围选项:

  • o 导出整个数据库
  • o 导出指定 schema
  • o 导出指定 schema 下的特定表

3. 选择导出类型

根据需求选择以下导出类型:

  • o 仅结构:只导出表结构,不包含数据
  • o 仅数据:只导出数据,不包含表结构
  • o 结构和数据:同时导出表结构和数据

4. 设置输出文件

输入导出文件的基本名称,脚本会自动添加时间戳,形成最终的输出文件名。

5. 确认执行

脚本会显示将要执行的命令(出于安全考虑,密码不会显示),需要你确认后才会执行。

6. 完成备份

备份完成后,脚本会输出导入命令,方便你在需要时恢复数据。

脚本代码

以下是完整的脚本代码:

#!/bin/bash

#
检测操作系统类型
if [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "win32" ]] || [[ "$OSTYPE" == "cygwin" ]]; then
IS_WINDOWS=true
else
IS_WINDOWS=false
fi

#
设置日志文件
LOG_FILE="pg_export_$(date +%Y%m%d_%H%M%S).log"

#
日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

#
错误处理函数
error_exit() {
log "错误: $1"
exit 1
}

#
验证输入函数
validate_input() {
if [ -z "$1" ]; then
error_exit "输入不能为空"
fi
}

#
验证pg_dump路径
validate_pg_dump() {
if $IS_WINDOWS; then
# Windows下检查.exe后缀
win_path=$(echo "$1" | sed 's|^/||; s|/|\\|g')
echo "检查路径: $win_path"
# 检查路径是否存在
if [ ! -f "$win_path" ] && [ ! -f "${win_path}.exe" ]; then
error_exit "pg_dump路径无效: $win_path"
fi
# 保存处理后的路径
PG_DUMP="$win_path"
else
if [ ! -x "$1" ]; then
error_exit "pg_dump路径无效或没有执行权限: $1"
fi
fi
}

#
获取基本信息
if $IS_WINDOWS; then
echo "请输入pg_dump可执行文件的完整路径(例如: /C:/Program Files/PostgreSQL/16/bin/pg_dump):"
else
echo "请输入pg_dump可执行文件的完整路径(例如: /usr/bin/pg_dump):"
fi
read PG_DUMP
validate_input "$PG_DUMP"
validate_pg_dump "$PG_DUMP"

echo "请输入数据库服务器IP地址(默认:localhost):"
read DB_HOST
DB_HOST=${DB_HOST:-localhost}
validate_input "$DB_HOST"

echo "请输入数据库端口号(默认:5432):"
read DB_PORT
DB_PORT=${DB_PORT:-5432}

echo "请输入数据库用户名(默认:postgres):"
read DB_USER
DB_USER=${DB_USER:-postgres}
validate_input "$DB_USER"

echo "请输入数据库密码(默认:123456):"
read -s DB_PASS
DB_PASS=${DB_PASS:-123456}
validate_input "$DB_PASS"

echo "请输入数据库名称:"
read DB_NAME
validate_input "$DB_NAME"

#
选择导出范围
echo "请选择导出范围:"
echo "1) 导出整个数据库"
echo "2) 导出指定schema"
echo "3) 导出指定schema下的特定表"
read EXPORT_SCOPE

SCHEMA_NAME=""
TABLE_NAME=""
EXPORT_PARAMS=""

case $EXPORT_SCOPE in
1)
log "选择导出整个数据库"
;;
2)
echo "请输入schema名称:"
read SCHEMA_NAME
validate_input "$SCHEMA_NAME"
EXPORT_PARAMS="$EXPORT_PARAMS -n $SCHEMA_NAME"
;;
3)
echo "请输入schema名称:"
read SCHEMA_NAME
validate_input "$SCHEMA_NAME"
echo "请输入表名:"
read TABLE_NAME
validate_input "$TABLE_NAME"
EXPORT_PARAMS="$EXPORT_PARAMS -t $SCHEMA_NAME.$TABLE_NAME"
;;
*)
error_exit "无效的选择"
;;
esac

#
选择导出类型
echo "请选择导出类型:"
echo "1) 仅结构"
echo "2) 仅数据"
echo "3) 结构和数据"
read EXPORT_TYPE

case $EXPORT_TYPE in
1)
EXPORT_PARAMS="$EXPORT_PARAMS --schema-only"
;;
2)
EXPORT_PARAMS="$EXPORT_PARAMS --data-only"
;;
3)
# 默认导出结构和数据,不需要额外参数
;;
*)
error_exit "无效的选择"
;;
esac

#
设置输出文件名
echo "请输入导出文件名(不需要扩展名):"
read OUTPUT_NAME
validate_input "$OUTPUT_NAME"

#
添加时间戳到文件名
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
OUTPUT_FILE="${OUTPUT_NAME}_${TIMESTAMP}.sql"

#
构建完整的命令
if $IS_WINDOWS; then
# Windows下使用处理后的路径
EXPORT_CMD="\"$PG_DUMP\" -h \"$DB_HOST\" -p \"$DB_PORT\" -U \"$DB_USER\" -d \"$DB_NAME\" $EXPORT_PARAMS -O -f \"$OUTPUT_FILE\""
else
# Linux下使用原始路径
EXPORT_CMD="\"$PG_DUMP\" -h \"$DB_HOST\" -p \"$DB_PORT\" -U \"$DB_USER\" -d \"$DB_NAME\" $EXPORT_PARAMS -O -f \"$OUTPUT_FILE\""
fi

#
显示将要执行的命令(隐藏密码)
echo "即将执行以下命令:"
echo "$EXPORT_CMD"
echo "注意:实际执行时将通过环境变量传递数据库密码"

#
确认执行
echo "是否确认执行?(y/n)"
read CONFIRM
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
log "用户取消操作"
exit 0
fi

#
设置环境变量以避免密码在命令行中显示
export PGPASSWORD="$DB_PASS"

#
执行导出
log "开始导出数据库..."

eval "$EXPORT_CMD" 2>> "$LOG_FILE"

if [ $? -eq 0 ]; then
# 设置输出文件权限(仅在Linux下)
if ! $IS_WINDOWS; then
chmod 600 "$OUTPUT_FILE"
fi
log "导出成功完成!"
log "导出文件:$OUTPUT_FILE"
# 输出下导入命令
echo "导入命令:psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -f $OUTPUT_FILE"
else
error_exit "导出过程中发生错误,请查看日志文件:$LOG_FILE"
fi

#
清除环境变量
unset PGPASSWORD

适用场景

这个脚本在以下场景特别有用:

  1. 1. 定期备份:可以结合定时任务,实现数据库的定期备份
  2. 2. 迁移准备:在数据库迁移前,导出数据库结构和数据
  3. 3. 开发测试:为开发环境准备测试数据
  4. 4. 部分数据恢复:只恢复特定的 schema 或表

安全注意事项

  1. 1. 脚本使用环境变量传递密码,避免了密码在命令行中明文显示
  2. 2. 在 Linux 系统中,脚本会自动设置备份文件的权限为 600,确保只有文件所有者可以读写
  3. 3. 执行前需要确认,防止误操作

总结

这个 PostgreSQL 备份脚本,它提供了灵活的备份选项,适用于各种场景。通过使用这个脚本,你可以更加高效地备份数据库,简单方便。

希望这个脚本能够帮助到你的数据库管理工作!如有任何问题或改进建议,欢迎在评论区留言。

相关推荐

U盘文件被删怎么简单恢复(u盘里的文件被误删了怎么找回)

现在这个社会不是靠关系靠路子,主要还是靠实力。刘强在机关工作,人长得帅气,工作能力又强。唯独一样不好,脾气太大,动不动就发火,因为小事常和同事发生口角。一次他火大的差点把办公桌给掀翻了,领导见他野蛮的...

不小心删除了一些文件?9 个最佳免费硬盘恢复软件

恢复您曾经无意或意外删除的所有文件和数据。您是否曾经错误地删除了一个对您的工作至关重要并导致您丢失所有进度的文件?我们为您提供了一些最好的免费硬盘恢复软件,以帮助您恢复意外删除的文件,以解决您的文件删...

Studio 中文版:数据救援神器,误删 / 分区损坏 / RAID 恢复一键找回

Studio中文版:数据救援神器,误删/分区损坏/RAID恢复一键找回当文件意外删除、分区损坏,或RAID阵列崩溃时,一款可靠的数据恢复工具往往能挽回关键损失。R-Studio中文版...

你值得拥有的11款Linux数据恢复工具

如果你使用的是Linux操作系统,那么你一定想知道一旦硬盘崩溃的话又该如何保存和恢复数据。其实,现在有很多Linux数据恢复工具可以让我们摆脱数据安全的困扰。小编已经为各位准备好了一些最好的Linux...

误删文件内容怎么恢复(误删文件内容怎么恢复回来)

  在日常使用电脑的过程中,误删文件的情况时有发生。无论是由于操作失误还是病毒攻击,误删文件都会给我们带来不小的困扰。幸运的是,随着技术的发展,误删文件恢复已不再是难题。本文将介绍几款国内外知名的误删...

u盘如何恢复删除的文件?推荐5款u盘数据恢复软件!

在日常生活与工作中,U盘作为便捷的数据存储载体,频繁用于传输和保存各类重要文件。然而,误删文件的情况却时有发生,无论是珍贵的照片、重要的工作文档,还是精心制作的视频,一旦删除,都可能带来不小的麻烦。...

怎么恢复删除的数据?5种有效的数据恢复方法汇总!

在数字化办公与生活的时代,电脑里的每一份数据都承载着重要信息。然而,一个误操作就可能导致数据被删除,无论是尚未保存的重要文档,还是珍藏多年的照片,都可能瞬间“消失”。但其实,数据删除并不意味着永久丢...

u盘删除文件怎么找回?5个数据恢复工具汇总,助你巧妙恢复数据!

在日常使用U盘的过程中,误删文件的情况时有发生,重要的工作文档、珍贵的照片视频一旦消失,难免让人焦急万分。别担心,只要选对数据恢复工具,被删除的数据仍有找回的可能。下面就为你汇总5款实用的数据...

Linux下恢复误删文件:思路+实践(linux删除如何恢复)

周五篮球群里有人问误删文件了怎么恢复,得知是ext4文件系统之后我推荐了ext4magic这个工具,然后又有人提到了xfs的话怎么办,正好前几天看到DaveChinner在邮件列表里提到了这个问题,...

苹果放大招!不用虚拟机了,Mac直接跑Linux容器,开发者效率翻倍

苹果这次真给开发者送福利了!今天凌晨(6月10日),苹果在官宣的Containerization框架直接炸了技术圈——Mac现在能原生运行Linux容器镜像了!这可不是虚拟机那种“套娃”方案,而是基...

7 款老牌经典软件,值得收藏(经典老歌软件)

Calibrehttps://calibre-ebook.com/Calibre是一个电脑电子书管理软件。肯定有人说了,电子书还要管理?那当然了。它的功能更强大的让你想象不到,首先它可以导入PDF,...

神仙级的免费开源电子书阅读器,还支持听书功能

神仙级的免费开源电子书阅读器,还支持听书功能,极空间部署『KoodoReader』哈喽小伙伴们好,我是Stark-C~前段时间不是给大家分享的电子书管理工具『TaleBook』嘛~,然后就有粉丝私信...

如何在Ubuntu系统中重置root密码(ubuntu忘记密码重置root密码命令)

很多人有个问题,就是喜欢把密码设置得很长很复杂,结果谁也没防住,却成功防住了自己ヽ(.ˇдˇ;)ノ对于现代人,特别是年轻人,都有过忘记密码的经历吧。在这篇文章中,我们来了解如何在Ubuntu1...

5款功能强大的PDF阅读器,让PDF阅读更轻松

分享5款功能强大的PDF阅读器,拥有丰富的PDF阅读工具,支持PDF文档划线、笔记、标记等操作,让PDF阅读更轻松!1.嗨动PDF编辑器一款实用的PDF处理软件,不仅可以阅读PDF文档,还能直接编辑、...

上班摸鱼利器! 免费好用的电子书阅读器,NAS轻松部署Koodo Reader

哈喽,大家好我是生活爱好者。笔者也是一名小说爱好者,平时用手机用某信读书,会员也开了,在家看体验也不错,但是上班的时候,在工作快速完成之后,想摸个鱼用手机就不太方便啦,作为爱折腾的人,必须要工作认真,...