从文件系统备份中恢复 PostgreSQL 数据库

Sea*_*ton 4 postgresql disaster-recovery

我有一个 PostgreSQL 8.3 数据目录备份。我需要将此备份中的数据库复制到新的 PostgreSQL 实例中。由于旧服务器的问题,我无法对数据库进行 pg_dump。

我已经弄清楚哪个目录是有问题的数据库。例如,在 MySQL 中,您通常要做的就是关闭服务器,复制目录并重新启动它,数据库将可用。现在这不适用于 PostgreSQL,我怀疑这是因为该数据库未在 global/pg_database 文件中列出。这个文件似乎是在 PostgreSQL 启动时自动生成的,所以我如何告诉系统数据库在那里?

Ber*_*aug 16

请注意,在 PostgreSQL 中,您的集群数据目录是一个独立的单元,无法按照此处的文档可靠地分段恢复。

您最好的希望是使用旧服务器的完整数据目录并在其上启动服务器,然后从您从那里获得的数据库转储中恢复:

  1. 获取适合新主机上配置的 postgresql.conf(通过旧文件中的文件(您在此处更改)和新数据目录来定位自己)
  2. 找出旧安装的 PostgreSQL 超级用户的用户名 - 很可能是 postgres。
  3. 在新主机上创建此用户名(UNIX 用户),除非它已经存在。
  4. 将旧数据目录提供给(chown)该用户,除非 uid 与旧服务器上的 uid 匹配。
  5. 在旧数据目录中配置 pg_hba.conf 以允许从本地用户连接到相同的 postgres 用户名(这通常是默认值,但请检查)。
  6. 以与旧数据目录的超级用户同名的 UNIX 用户身份运行旧数据库集群,例如用户 postgres:
    须藤 -u postgres postgres -D old_data_directory
    
    

    或与苏:

    su postgres postgres -D old_data_directory
  7. 转储旧数据库,再次使用通常的用户名 postgres:
    sudo -u postgres pg_dump -p /path/to/socket/for/old/directory database_name > dump_file.sql
    
    

    与上面类似的 su 成为 postgres

  8. 使 dump_file.sql 适应新服务器的用户名等;在那里创建具有适当所有权的空数据库
  9. 将数据库扫描到新服务器:
    sudo -u postgres psql -p /path/to/socket/for/new/directory new_database_name
    
    

    再一次,使用类似于上面的 su 获得 postgres 权限

这应该能让你做好准备,或者至少展示一条通往那里的好途径。