pgsql备份恢复

备份需根据自身情况替换参数,使用前请在测试环境验证后使用

备份脚本

bash 复制代码
#!/bin/bash

# 添加备份元数据
PGPASSWORD="$PG_PASSWORD" pg_dumpall -h "$PG_HOST" -p "$PG_PORT" -U "$PG_USER" \
  --clean --if-exists | gzip > "$BACKUP_FILE"

# 同时生成备份信息
echo "备份时间: $DATE" > "${BACKUP_FILE}.info"
echo "PostgreSQL版本: $(psql -h $PG_HOST -p $PG_PORT -U $PG_USER -d postgres -t -c 'SHOW server_version;')" >> "${BACKUP_FILE}.info"

使用 --clean 选项自动清理现有对象。

1. 恢复备份文件

解压并恢复所有数据库

bash 复制代码
# 解压并恢复到数据库
gunzip -c pg_backup_2026-06-12_14-30-00.sql.gz | psql -h localhost -p 5432 -U postgres

或者分步操作

bash 复制代码
# 先解压
gunzip pg_backup_2026-06-12_14-30-00.sql.gz
# 会得到 pg_backup_2026-06-12_14-30-00.sql 文件

# 然后恢复
psql -h localhost -p 5432 -U postgres -f pg_backup_2026-06-12_14-30-00.sql

2. 恢复特定数据库

如果需要只恢复某个数据库:

bash 复制代码
# 先从备份中提取特定数据库
gunzip -c pg_backup_2026-06-12_14-30-00.sql.gz | grep -i "connect to your_database_name" -A 1000000 | psql -h localhost -p 5432 -U postgres -d your_database_name

3. 恢复前注意事项

  1. 目标数据库应该是空的,或者先删除现有数据库:

    sql 复制代码
    DROP DATABASE IF EXISTS database_name;
    CREATE DATABASE database_name;
  2. 或者使用 --clean 选项重新创建

    bash 复制代码
    pg_dumpall -h localhost -p 5432 -U postgres --clean | gzip > backup.sql.gz
  3. 恢复整个集群会覆盖所有数据库和角色

5. 查看备份内容(不恢复)

bash 复制代码
# 查看备份文件包含哪些数据库
gunzip -c pg_backup_2026-06-12_14-30-00.sql.gz | grep "^\\connect"

# 查看前100行
gunzip -c pg_backup_2026-06-12_14-30-00.sql.gz | head -100