从原始物理文件中恢复postgreSQL数据库

34

我有以下问题,想知道是否可以解决。

我的客户拒绝购买备份计划来保护他公司主系统上的PostgreSQL数据库,因为他觉得太贵了。不出我所料,在停电期间,一些操作系统文件崩溃了,需要重新安装操作系统。

这位客户没有备份任何数据库,但是我设法保存了PostgreSQL主目录。我阅读到数据库以某种方式存储在postgres主文件夹的数据目录中。

我的问题是:仅通过数据文件夹是否有办法从中恢复数据库?我正在Windows环境(XP SP2)下使用PostgreSQL 8.2工作,并且需要在新服务器上重新安装PostgreSQL。 我需要在新环境中重新创建数据库,并将旧文件与新的数据库实例连接起来。我知道在SQL Server中可能是可行的,因为引擎存储数据库的方式,但我对Postgres一无所知。

有任何想法吗?非常感谢。

6个回答

25
如果整个数据文件夹都在手,只要架构相同,你就拥有所需的一切。在抹掉本机之前,在另一台机器上尝试恢复它,以防你没有复制某些东西。
只需将数据目录保存到磁盘中。在启动Postgres时,设置参数告诉它数据目录在哪里(参见:wiki.postgresql.org)。或者删除新安装的原始数据目录并将其副本放在其位置。

哇,这看起来非常简单,让我明天试一下,然后我会告诉你结果。谢谢你的快速回答 ;) - Alvos
2
就像其他人提到的那样,请记住复制的文件必须具有正确的权限。在Linux系统上,它们通常必须归属于postgres用户,因此类似sudo chown -R postgres:postgres /var/lib/postgresql这样的命令应该可以工作。 - Epigene
3
@KonradGarus 我尝试在Windows任务管理器中停止postgresql服务后替换数据文件夹,但是当我尝试打开我的psql shell时,它会崩溃并显示错误“无法连接到服务器。拒绝连接。服务器是否在本地主机上运行并接受端口5432的连接”。请帮忙解决。 - Ahtisham
1
这对我有用,但为了完全清楚:“整个数据文件夹”不仅指base/文件夹,而是包括base/的整个父文件夹。对于我的OS-X服务器来说是:/usr/local/var/postgresql@11/。 - PatrickReagan
1
尝试了一下,这甚至可以在使用Postgres 11的OS-X(10.13.6)和Ubuntu(18.04)之间运行。正如在此处其他地方所述,文件所有权需要与接收机器所期望的相匹配。 - PatrickReagan
显示剩余2条评论

12

这是可能的,你只需要将旧电脑中Postgres安装文件夹中的"data"文件夹复制到新电脑中,但需要记住几个事项。

首先,在复制文件之前,您必须停止Postgres服务器服务。所以,控制面板->管理工具->服务,找到Postgres服务并停止它。当您完成文件的复制和设置权限后,再启动它。

其次,您需要为数据文件设置权限。因为Postgres服务器实际上在另一个用户帐户上运行,如果您只是将文件复制到data文件夹中,则它将无法访问这些文件,因为它没有访问权限。所以,您需要将文件的所有权更改为“postgres”用户。我必须使用subinacl来完成此操作,请先安装它,然后像这样从命令提示符中使用它(首先导航到安装它的文件夹):

subinacl /subdirectories "C:\Program Files\PostgreSQL\8.2\data\*" /setowner=postgres

要改变文件夹的所有权,你也可以通过资源管理器来实现:首先你需要在“文件夹选项”中禁用“使用简单文件共享”,然后“安全”选项卡就会出现在文件夹属性对话框中,那里有设置权限和更改所有权的选项,但我无法通过这种方式完成操作。

现在,如果你手动启动服务后它仍然无法启动,通常可以在事件查看器(管理工具->事件查看器)中查看原因。Postgres将抛出一个错误事件,检查它将给您提供关于问题是什么的线索(有时它会抱怨postmaster.pid文件之类的,只需删除即可等等)。


它真的起作用了,我只有一个pg_hba.conf文件的问题,但是注释掉IPv6行就解决了,谢谢你,对我的糟糕英语感到抱歉。 - pabloferraz
这个有效 -> 我只有父目录的 data 文件夹。安装后 -> ==>0. 停止 pg 服务 ==>1. 将原始数据文件夹重命名为 _data。==>2. 将旧的 data 文件夹复制到安装文件夹 C:\Program Files\PostgreSQL\{old_version}。==>3. 打开 _data 文件夹的权限。==>4. 修改 data 文件夹的权限,复制所有来自 _data 文件夹的权限。==>5. 重新启动 pg 服务。==>6. 连接数据库。它应该可以工作! - Abhishek Shah

0
将数据库移动到另一个硬盘所示,我们只需要修改注册表和文件权限即可。通过修改注册表(如图1所示),PostgreSQL服务器就能知道数据的新位置。
修改注册表。

modify registry


0

0
问题很老,但我想分享一个我发现的有效方法。
如果您没有使用“pg_dump”备份,而您的旧数据是文件夹,请尝试以下步骤。 在Postgres数据库中,向“pg_database”表添加记录。使用管理程序或“insert into”。 进行必要的检查和更改以下插入查询,并运行它。
查询在工作后将返回OID。创建一个名为此数字的文件夹。一旦您已将旧数据复制到此文件夹中,该使用方法已准备就绪。


    /*
    ------------------------------------------
    *** Recover From Folder ***
    ------------------------------------------
    Check this table on your own system.
    Change the differences below.
    */
    INSERT INTO
      pg_catalog.pg_database(
      datname, datdba, encoding, datcollate, datctype, datistemplate, datallowconn,
      datconnlimit, datlastsysoid, datfrozenxid, datminmxid, dattablespace, datacl)
    VALUES(
                             -- Write Your collation  
      'NewDBname', 10, 6, 'Turkish_Turkey.1254', 'Turkish_Turkey.1254',
      False, True, -1, 12400, '536', '1', 1663, Null);

    /*
    Create a folder in the Data directory under the name below New OID.
    All old backup files in the directory "data\base\Old OID" are the directory with the new OID number
    Copy. The database is now ready for use.
    */
    select oid from pg_database a where a.datname = 'NewDBname';


好的,除了正确的表名:pg_catalog.pg_database。 - alijunior
没有生效——我在旧备份中有一个名为“25559”的文件夹,但当我创建一个新的数据库,甚至像上面那样尝试插入命令时,oid是16384。更名base / 25559-> base / 16384或将oid = 25559设置为where oid = 16384都无济于事。Postgresql 12,CENTOS 7。 - khanna

-6

我这样做了,但最棘手的部分是更改所有者权限:

  1. 从管理工具中进入服务
  2. 找到postgres服务并双击它
  3. 在登录选项卡中更改为本地系统
  4. 然后重新启动

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接