1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG105-PG逻辑备份pg_dump实战教程

本文档详细介绍PostgreSQL数据库逻辑备份工具pg_dump的使用方法,包括全库备份、表级备份、数据恢复等操作,风哥教程参考PostgreSQL官方文档Backup and Restore内容,适合DBA在日常运维工作中使用。

Part01-基础概念与理论知识

1.1 PostgreSQL逻辑备份概念

PostgreSQL逻辑备份是指将数据库对象和数据导出为SQL脚本或归档文件的过程。逻辑备份可以备份整个数据库、指定Schema或单个表,支持选择性备份和恢复。与物理备份相比,逻辑备份更灵活,可以跨版本、跨平台恢复数据。更多视频教程www.fgedu.net.cn

PostgreSQL逻辑备份特点:

  • 备份内容可读性强,便于检查和修改
  • 支持选择性备份和恢复
  • 可以跨版本、跨平台恢复
  • 备份和恢复速度相对较慢
  • 备份期间不影响数据库运行
  • 适合中小型数据库的备份需求

1.2 PostgreSQL备份工具分类

# PostgreSQL备份工具分类

# 1. pg_dump – 单数据库备份
# – 备份单个数据库
# – 支持多种输出格式
# – 支持并行备份
# – 最常用的逻辑备份工具

# 2. pg_dumpall – 全实例备份
# – 备份整个数据库实例
# – 包含角色、表空间等全局对象
# – 只支持SQL文本格式
# – 适合迁移和克隆环境

# 3. pg_basebackup – 物理备份
# – 备份整个数据目录
# – 支持增量备份
# – 适合大型数据库
# – 恢复速度快

# 4. 第三方工具
# – pgBackRest
# – Barman
# – WAL-G
# – 提供更强大的备份管理功能

# 输出格式对比
| 格式 | 工具 | 特点 | 适用场景 |
|———|————-|————————|—————|
| plain | pg_dump | SQL文本,可读性强 | 小型数据库 |
| custom | pg_dump | 自定义格式,支持并行 | 中型数据库 |
| directory| pg_dump | 目录格式,支持并行 | 大型数据库 |
| tar | pg_dump | tar归档格式 | 归档传输 |

1.3 pg_dump常用参数说明

pg_dump常用参数:

  • -h/–host:数据库服务器主机名
  • -p/–port:数据库服务器端口
  • -U/–username:连接用户名
  • -d/–dbname:数据库名称
  • -F/–format:输出格式(p/c/d/t)
  • -f/–file:输出文件名
  • -t/–table:指定备份的表
  • -n/–schema:指定备份的Schema
  • -j/–jobs:并行工作进程数
  • -Z/–compress:压缩级别
风哥提示:pg_dump是PostgreSQL最常用的备份工具,熟练掌握其参数和用法对于数据库运维至关重要。建议根据数据库大小选择合适的输出格式和压缩级别。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 PostgreSQL备份策略规划

# PostgreSQL备份策略规划

# 1. 备份类型选择
# 小型数据库(< 10GB):pg_dump逻辑备份 # 中型数据库(10GB - 100GB):pg_dump + pg_basebackup # 大型数据库(> 100GB):pg_basebackup + WAL归档

# 2. 备份频率规划
# 全量备份:每天一次
# 增量备份:每小时一次(WAL归档)
# 表级备份:根据业务需求

# 3. 备份保留策略
# 日备份保留:7天
# 周备份保留:4周
# 月备份保留:12个月
# 年备份保留:3年

# 4. 备份验证策略
# 每周验证一次备份可用性
# 每月进行一次恢复演练
# 记录备份验证结果

# 5. 备份存储策略
# 本地存储:最近7天的备份
# 异地存储:所有备份的副本
# 云存储:重要备份的归档

2.2 PostgreSQL备份调度规划

PostgreSQL备份调度规划:

  • 全库备份:每天凌晨2:00执行
  • 表级备份:重要表每天备份多次
  • WAL归档:持续进行
  • 备份清理:每天凌晨4:00执行
  • 备份验证:每周日凌晨5:00执行

2.3 PostgreSQL备份存储规划

# PostgreSQL备份存储规划

# 1. 目录结构
/postgresql/backup/
├── daily/ # 日备份
│ ├── 2026-04-01/
│ ├── 2026-04-02/
│ └── 2026-04-03/
├── weekly/ # 周备份
│ ├── week01/
│ └── week02/
├── monthly/ # 月备份
│ ├── 2026-01/
│ └── 2026-02/
├── archive/ # WAL归档
│ └── 000000010000000000000001
└── scripts/ # 备份脚本
├── full_backup.sh
├── table_backup.sh
└── backup_clean.sh

# 2. 存储空间估算
# 日备份数据量 = 数据库大小 * 压缩率
# 保留空间 = 日备份数据量 * 保留天数 * 1.5

# 3. 存储介质选择
# 本地磁盘:高速访问,临时存储
# NAS存储:大容量,长期存储
# 云存储:异地容灾,归档存储

风哥教程针对风哥教程针对生产环境建议:备份是数据库安全的最后一道防线,必须确保备份的完整性和可用性。建议采用”3-2-1″备份策略:3份副本、2种介质、1份异地。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 PostgreSQL全库备份实战

3.1.1 SQL文本格式备份

# SQL文本格式备份
$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -F p -f /postgresql/backup/daily/fgedudb_$(date +%Y%m%d).sql

# 执行过程输出
Password:
$ ls -lh /postgresql/backup/daily/fgedudb_20260407.sql
-rw-r–r– 1 pgsql fgedudb 512M Apr 7 02:00 /postgresql/backup/daily/fgedudb_20260407.sql

# 查看备份文件内容
$ head -50 /postgresql/backup/daily/fgedudb_20260407.sql

— PostgreSQL database dump

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = ‘UTF8’;
SET standard_conforming_strings = on;


— Name: fgedu; Type: SCHEMA; Schema: -; Owner: fgedu

CREATE SCHEMA fgedu;

# 备份整个数据库实例(包含角色和表空间)
$ pg_dumpall -h fgedu.localhost -p 5432 -U fgedu -f /postgresql/backup/daily/all_databases_$(date +%Y%m%d).sql

# 查看备份文件大小
$ ls -lh /postgresql/backup/daily/all_databases_20260407.sql
-rw-r–r– 1 pgsql fgedudb 1.2G Apr 7 02:30 /postgresql/backup/daily/all_databases_20260407.sql

# 压缩备份
$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -F p | gzip > /postgresql/backup/daily/fgedudb_$(date +%Y%m%d).sql.gz

$ ls -lh /postgresql/backup/daily/fgedudb_20260407.sql.gz
-rw-r–r– 1 pgsql fgedudb 128M Apr 7 02:15 /postgresql/backup/daily/fgedudb_20260407.sql.gz

3.1.2 自定义格式备份

# 自定义格式备份(推荐)
$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -F c -f /postgresql/backup/daily/fgedudb_$(date +%Y%m%d).dump

$ ls -lh /postgresql/backup/daily/fgedudb_20260407.dump
-rw-r–r– 1 pgsql fgedudb 256M Apr 7 02:00 /postgresql/backup/daily/fgedudb_20260407.dump

# 自定义格式支持压缩
$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -F c -Z 9 -f /postgresql/backup/daily/fgedudb_$(date +%Y%m%d)_z9.dump

$ ls -lh /postgresql/backup/daily/fgedudb_20260407_z9.dump
-rw-r–r– 1 pgsql fgedudb 128M Apr 7 02:10 /postgresql/backup/daily/fgedudb_20260407_z9.dump

# 查看备份文件内容
$ pg_restore -l /postgresql/backup/daily/fgedudb_20260407.dump | head -50
;
; Archive created at 2026-04-07 02:00:00
; dbname: fgedudb
; TOC Entries: 256
; Compression: -1
;
; Selected TOC Entries:
;
3264; 1262 16384 DATABASE – fgedu fgedu
3; 2615 16385 SCHEMA – fgedu fgedu
3265; 0 0 COMMENT – SCHEMA fgedu fgedu

# 只备份结构(不含数据)
$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -F c –schema-only -f /postgresql/backup/daily/fgedudb_schema_$(date +%Y%m%d).dump

# 只备份数据(不含结构)
$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -F c –data-only -f /postgresql/backup/daily/fgedudb_data_$(date +%Y%m%d).dump

3.1.3 目录格式并行备份

# 目录格式并行备份(大数据库推荐)
$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -F d -j 4 -f /postgresql/backup/daily/fgedudb_$(date +%Y%m%d)_dir

$ ls -la /postgresql/backup/daily/fgedudb_20260407_dir/
total 524288
drwx—— 2 pgsql fgedudb 4096 Apr 7 02:00 .
drwxr-xr-x 3 pgsql fgedudb 4096 Apr 7 02:00 ..
-rw——- 1 pgsql fgedudb 16384 Apr 7 02:00 3264.dat.gz
-rw——- 1 pgsql fgedudb 32768 Apr 7 02:00 3265.dat.gz
-rw——- 1 pgsql fgedudb 262144 Apr 7 02:00 3266.dat.gz
-rw——- 1 pgsql fgedudb 256 Apr 7 02:00 toc.dat

# 查看备份大小
$ du -sh /postgresql/backup/daily/fgedudb_20260407_dir/
256M /postgresql/backup/daily/fgedudb_20260407_dir/

# 并行备份时间对比
# 单线程备份:30分钟
# 4线程并行备份:10分钟

# 带压缩的并行备份
$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -F d -j 4 -Z 9 -f /postgresql/backup/daily/fgedudb_$(date +%Y%m%d)_dir_z9

$ du -sh /postgresql/backup/daily/fgedudb_20260407_dir_z9/
128M /postgresql/backup/daily/fgedudb_20260407_dir_z9/

3.2 PostgreSQL表级备份实战

3.2.1 单表备份

# 单表备份
$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -t fgedu_orders -F c -f /postgresql/backup/daily/fgedu_orders_$(date +%Y%m%d).dump

$ ls -lh /postgresql/backup/daily/fgedu_orders_20260407.dump
-rw-r–r– 1 pgsql fgedudb 64M Apr 7 02:00 /postgresql/backup/daily/fgedu_orders_20260407.dump

# 多表备份
$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -t fgedu_orders -t fgedu_customers -t fgedu_products -F c -f /postgresql/backup/daily/fgedu_tables_$(date +%Y%m%d).dump

# 使用通配符备份表
$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -t ‘fgedu_order_*’ -F c -f /postgresql/backup/daily/fgedu_order_tables_$(date +%Y%m%d).dump

# 备份指定Schema
$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -n fgedu -F c -f /postgresql/backup/daily/fgedu_schema_$(date +%Y%m%d).dump

# 排除某些表
$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -T fgedu_logs -T fgedu_temp_* -F c -f /postgresql/backup/daily/fgedudb_no_logs_$(date +%Y%m%d).dump

# 备份表结构
$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -t fgedu_orders –schema-only -f /postgresql/backup/daily/fgedu_orders_schema.sql

$ cat /postgresql/backup/daily/fgedu_orders_schema.sql

— PostgreSQL database dump

SET statement_timeout = 0;
SET lock_timeout = 0;

CREATE TABLE fgedu_orders (
order_id SERIAL PRIMARY KEY,
order_no VARCHAR(50) NOT NULL,
customer_id INTEGER,
status VARCHAR(20),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX fgedu_orders_idx01 ON fgedu_orders (customer_id);
CREATE INDEX fgedu_orders_idx02 ON fgedu_orders (created_at);

3.2.2 条件备份数据

# 使用COPY命令导出条件数据
$ psql -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -c “\COPY (SELECT * FROM fgedu_orders WHERE created_at >= ‘2026-01-01’) TO ‘/postgresql/backup/daily/fgedu_orders_2026.csv’ WITH CSV HEADER”

$ ls -lh /postgresql/backup/daily/fgedu_orders_2026.csv
-rw-r–r– 1 pgsql fgedudb 32M Apr 7 02:00 /postgresql/backup/daily/fgedu_orders_2026.csv

# 使用查询导出数据
$ psql -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -c “\COPY (SELECT order_id, order_no, customer_id FROM fgedu_orders WHERE status = ‘completed’) TO ‘/postgresql/backup/daily/fgedu_orders_completed.csv’ WITH CSV HEADER”

# 导出为INSERT语句
$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -t fgedu_orders –column-inserts -f /postgresql/backup/daily/fgedu_orders_inserts.sql

$ head -20 /postgresql/backup/daily/fgedu_orders_inserts.sql

— PostgreSQL database dump

INSERT INTO fgedu_orders (order_id, order_no, customer_id, status, created_at) VALUES (1, ‘ORD20260101001’, 1001, ‘completed’, ‘2026-01-01 10:00:00’);
INSERT INTO fgedu_orders (order_id, order_no, customer_id, status, created_at) VALUES (2, ‘ORD20260101002’, 1002, ‘pending’, ‘2026-01-01 10:05:00’);

# 使用pg_dump导出特定条件的数据(通过视图)
fgedudb=# CREATE VIEW fgedu_orders_2026 AS SELECT * FROM fgedu_orders WHERE created_at >= ‘2026-01-01’;
CREATE VIEW

$ pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -t fgedu_orders_2026 -F c -f /postgresql/backup/daily/fgedu_orders_2026_view.dump

fgedudb=# DROP VIEW fgedu_orders_2026;
DROP VIEW

3.3 PostgreSQL数据恢复实战

3.3.1 恢复SQL文本备份

# 恢复SQL文本备份
$ psql -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -f /postgresql/backup/daily/fgedudb_20260407.sql

# 执行过程输出
SET
SET
SET
psql:/postgresql/backup/daily/fgedudb_20260407.sql:22: ERROR: relation “fgedu_orders” already exists

# 恢复到新数据库
$ createdb -h fgedu.localhost -p 5432 -U fgedu fgedudb_restore

$ psql -h fgedu.localhost -p 5432 -U fgedu -d fgedudb_restore -f /postgresql/backup/daily/fgedudb_20260407.sql

SET
SET
SET
CREATE SCHEMA
CREATE TABLE

# 恢复压缩的SQL备份
$ gunzip -c /postgresql/backup/daily/fgedudb_20260407.sql.gz | psql -h fgedu.localhost -p 5432 -U fgedu -d fgedudb_restore

# 恢复整个实例
$ psql -h fgedu.localhost -p 5432 -U fgedu -f /postgresql/backup/daily/all_databases_20260407.sql

# 只恢复特定表的数据
$ sed -n ‘/COPY fgedu_orders/,/^\./p’ /postgresql/backup/daily/fgedudb_20260407.sql | psql -h fgedu.localhost -p 5432 -U fgedu -d fgedudb

3.3.2 使用pg_restore恢复

# 使用pg_restore恢复自定义格式备份
$ pg_restore -h fgedu.localhost -p 5432 -U fgedu -d fgedudb_restore /postgresql/backup/daily/fgedudb_20260407.dump

# 恢复前先创建数据库
$ createdb -h fgedu.localhost -p 5432 -U fgedu fgedudb_restore

$ pg_restore -h fgedu.localhost -p 5432 -U fgedu -d fgedudb_restore /postgresql/backup/daily/fgedudb_20260407.dump

# 并行恢复
$ pg_restore -h fgedu.localhost -p 5432 -U fgedu -d fgedudb_restore -j 4 /postgresql/backup/daily/fgedudb_20260407.dump

# 只恢复结构
$ pg_restore -h fgedu.localhost -p 5432 -U fgedu -d fgedudb_restore –schema-only /postgresql/backup/daily/fgedudb_20260407.dump

# 只恢复数据
$ pg_restore -h fgedu.localhost -p 5432 -U fgedu -d fgedudb_restore –data-only /postgresql/backup/daily/fgedudb_20260407.dump

# 只恢复特定表
$ pg_restore -h fgedu.localhost -p 5432 -U fgedu -d fgedudb_restore -t fgedu_orders /postgresql/backup/daily/fgedudb_20260407.dump

# 查看备份内容列表
$ pg_restore -l /postgresql/backup/daily/fgedudb_20260407.dump > /tmp/toc.list

# 编辑toc.list选择要恢复的对象
$ vi /tmp/toc.list
; 取消注释要恢复的对象

# 使用过滤列表恢复
$ pg_restore -h fgedu.localhost -p 5432 -U fgedu -d fgedudb_restore -L /tmp/toc.list /postgresql/backup/daily/fgedudb_20260407.dump

# 恢复目录格式备份
$ pg_restore -h fgedu.localhost -p 5432 -U fgedu -d fgedudb_restore -j 4 /postgresql/backup/daily/fgedudb_20260407_dir

风哥提示:恢复数据前务必确认目标数据库状态,避免覆盖重要数据。建议先在测试环境验证恢复流程,确保生产环境恢复顺利。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 PostgreSQL自动备份脚本案例

#!/bin/bash
# pg_dump_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

# PostgreSQL自动备份脚本

# 配置变量
PGHOME=/postgresql/fgapp
PGHOST=fgedu.localhost
PGPORT=5432
PGUSER=fgedu
PGDATABASE=fgedudb
BACKUP_DIR=/postgresql/backup/daily
LOG_FILE=/postgresql/scripts/logs/pg_dump_backup.log
RETENTION_DAYS=7

# 日志函数
log_message() {
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – $1” >> $LOG_FILE
}

# 创建备份目录
create_backup_dir() {
BACKUP_DATE=$(date +%Y%m%d)
BACKUP_PATH=$BACKUP_DIR/$BACKUP_DATE
mkdir -p $BACKUP_PATH
chmod 750 $BACKUP_PATH
}

# 执行全库备份
do_full_backup() {
log_message “开始执行全库备份…”

local backup_file=$BACKUP_PATH/fgedudb_full.dump

$PGHOME/bin/pg_dump -h $PGHOST -p $PGPORT -U $PGUSER -d $PGDATABASE \
-F c -Z 6 -f $backup_file >> $LOG_FILE 2>&1

if [ $? -eq 0 ]; then
local size=$(ls -lh $backup_file | awk ‘{print $5}’)
log_message “全库备份完成: $backup_file, 大小: $size”
else
log_message “ERROR: 全库备份失败”
return 1
fi
}

# 执行表级备份
do_table_backup() {
log_message “开始执行重要表备份…”

for table in fgedu_orders fgedu_customers fgedu_products; do
local backup_file=$BACKUP_PATH/${table}.dump

$PGHOME/bin/pg_dump -h $PGHOST -p $PGPORT -U $PGUSER -d $PGDATABASE \
-t $table -F c -f $backup_file >> $LOG_FILE 2>&1

if [ $? -eq 0 ]; then
log_message “表备份完成: $table”
else
log_message “ERROR: 表备份失败: $table”
fi
done
}

# 清理过期备份
cleanup_old_backups() {
log_message “开始清理过期备份…”

find $BACKUP_DIR -type d -name “20*” -mtime +$RETENTION_DAYS -exec rm -rf {} \;

log_message “过期备份清理完成”
}

# 发送告警
send_alert() {
local message=$1
/postgresql/scripts/alert/send_dingtalk.sh “$message”
}

# 主函数
main() {
log_message “==========================================”
log_message “开始执行PostgreSQL备份”
log_message “==========================================”

create_backup_dir

if do_full_backup && do_table_backup; then
log_message “备份成功完成”
cleanup_old_backups
else
log_message “ERROR: 备份过程中出现错误”
send_alert “【告警】PostgreSQL备份失败,请检查日志”
fi

log_message “==========================================”
log_message “备份任务结束”
log_message “==========================================”
}

main

4.2 PostgreSQL并行备份案例

# 并行备份案例

# 场景:fgedudb数据库大小50GB,需要快速备份

# 1. 单线程备份时间测试
$ time pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -F c -f /postgresql/backup/test_single.dump

real 30m15.123s
user 25m30.456s
sys 4m45.678s

# 2. 4线程并行备份时间测试
$ time pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -F d -j 4 -Z 6 -f /postgresql/backup/test_parallel

real 10m25.456s
user 35m20.789s
sys 5m05.123s

# 3. 8线程并行备份时间测试
$ time pg_dump -h fgedu.localhost -p 5432 -U fgedu -d fgedudb -F d -j 8 -Z 6 -f /postgresql/backup/test_parallel8

real 6m15.789s
user 40m15.456s
sys 6m00.123s

# 4. 查看备份结果
$ du -sh /postgresql/backup/test_*
15G /postgresql/backup/test_single.dump
15G /postgresql/backup/test_parallel
15G /postgresql/backup/test_parallel8

# 5. 并行恢复测试
$ createdb -h fgedu.localhost -p 5432 -U fgedu fgedudb_test

$ time pg_restore -h fgedu.localhost -p 5432 -U fgedu -d fgedudb_test -j 4 /postgresql/backup/test_parallel

real 8m30.456s
user 5m20.789s
sys 3m10.123s

# 6. 验证恢复数据
$ psql -h fgedu.localhost -p 5432 -U fgedu -d fgedudb_test -c “SELECT count(*) FROM fgedu_orders”

count
——–
500000
(1 row)

4.3 PostgreSQL备份验证案例

#!/bin/bash
# backup_verify.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

# PostgreSQL备份验证脚本

PGHOME=/postgresql/fgapp
PGHOST=fgedu.localhost
PGPORT=5432
PGUSER=fgedu
BACKUP_FILE=$1
TEST_DB=fgedudb_verify_test
LOG_FILE=/postgresql/scripts/logs/backup_verify.log

log_message() {
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – $1” >> $LOG_FILE
}

# 验证备份文件
verify_backup_file() {
log_message “验证备份文件: $BACKUP_FILE”

if [ ! -f “$BACKUP_FILE” ]; then
log_message “ERROR: 备份文件不存在”
return 1
fi

# 检查文件大小
local size=$(ls -lh $BACKUP_FILE | awk ‘{print $5}’)
log_message “备份文件大小: $size”

# 检查备份内容
$PGHOME/bin/pg_restore -l $BACKUP_FILE > /dev/null 2>&1

if [ $? -eq 0 ]; then
log_message “备份文件格式正确”
else
log_message “ERROR: 备份文件格式错误”
return 1
fi
}

# 创建测试数据库
create_test_db() {
log_message “创建测试数据库: $TEST_DB”

$PGHOME/bin/dropdb -h $PGHOST -p $PGPORT -U $PGUSER $TEST_DB 2>/dev/null
$PGHOME/bin/createdb -h $PGHOST -p $PGPORT -U $PGUSER $TEST_DB
}

# 恢复测试
do_restore_test() {
log_message “开始恢复测试…”

$PGHOME/bin/pg_restore -h $PGHOST -p $PGPORT -U $PGUSER -d $TEST_DB $BACKUP_FILE >> $LOG_FILE 2>&1

if [ $? -eq 0 ]; then
log_message “恢复测试成功”
else
log_message “ERROR: 恢复测试失败”
return 1
fi
}

# 数据验证
verify_data() {
log_message “验证恢复数据…”

# 检查表数量
local table_count=$($PGHOME/bin/psql -h $PGHOST -p $PGPORT -U $PGUSER -d $TEST_DB -t -c ”
SELECT count(*) FROM information_schema.tables WHERE table_schema = ‘fgedu’;
” | tr -d ‘ ‘)

log_message “恢复表数量: $table_count”

# 检查数据量
local row_count=$($PGHOME/bin/psql -h $PGHOST -p $PGPORT -U $PGUSER -d $TEST_DB -t -c ”
SELECT sum(n_live_tup) FROM pg_stat_user_tables;
” | tr -d ‘ ‘)

log_message “恢复数据行数: $row_count”
}

# 清理测试数据库
cleanup_test_db() {
log_message “清理测试数据库…”
$PGHOME/bin/dropdb -h $PGHOST -p $PGPORT -U $PGUSER $TEST_DB
}

# 主函数
main() {
if [ -z “$BACKUP_FILE” ]; then
echo “Usage: $0
exit 1
fi

log_message “==========================================”
log_message “开始备份验证”
log_message “==========================================”

verify_backup_file && \
create_test_db && \
do_restore_test && \
verify_data

cleanup_test_db

log_message “==========================================”
log_message “备份验证完成”
log_message “==========================================”
}

main

风哥教程针对风哥教程针对生产环境建议:备份验证是确保备份可用性的关键步骤。建议每周进行一次备份验证,每月进行一次完整的恢复演练,确保在需要时能够成功恢复数据。from PostgreSQL视频:www.itpux.com

Part05-风哥经验总结与分享

5.1 PostgreSQL备份最佳实践

PostgreSQL备份最佳实践:

  • 定期备份:建立自动化的备份机制
  • 多种备份:结合逻辑备份和物理备份
  • 备份验证:定期验证备份可用性
  • 异地存储:备份文件存储到异地
  • 加密备份:敏感数据备份要加密
  • 文档记录:记录备份策略和恢复流程

5.2 PostgreSQL备份脚本库

# PostgreSQL备份脚本库

/postgresql/scripts/backup/
├── pg_dump_backup.sh # 全库备份脚本
├── pg_dump_table.sh # 表级备份脚本
├── pg_dump_schema.sh # Schema备份脚本
├── pg_dumpall.sh # 实例备份脚本
├── backup_verify.sh # 备份验证脚本
├── backup_clean.sh # 备份清理脚本
├── backup_report.sh # 备份报告脚本
└── conf/
└── backup.conf # 备份配置文件

5.3 PostgreSQL备份检查清单

# PostgreSQL备份检查清单

# 备份前检查
– [ ] 确认磁盘空间充足
– [ ] 确认备份目录权限正确
– [ ] 确认数据库连接正常
– [ ] 确认备份参数正确

# 备份中监控
– [ ] 监控备份进度
– [ ] 监控磁盘空间
– [ ] 监控系统资源
– [ ] 记录备份日志

# 备份后验证
– [ ] 验证备份文件完整性
– [ ] 验证备份文件大小
– [ ] 验证备份内容正确
– [ ] 记录备份信息

# 定期检查
– [ ] 检查备份保留策略
– [ ] 检查备份存储空间
– [ ] 检查备份恢复测试
– [ ] 检查备份文档更新

风哥提示:备份是数据库安全的最后一道防线,必须高度重视。建议建立完善的备份策略,定期验证备份可用性,确保在需要时能够成功恢复数据。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息