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

时间:2010-07-22 05:17:41

标签: database postgresql file recover

我有以下问题,我需要知道是否有办法解决它。

我有一个足够便宜的客户拒绝为运行他的公司的主系统上的postgreSQL数据库购买备份计划,而且我认为有一天会发生一些操作系统文件在停电和操作系统需要时崩溃要重新安装。

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

我的问题是:有没有办法只从数据文件夹中恢复数据库?我正在使用PostgreSQL 8.2在Windows环境(XP Service Pack 2)中工作,我需要在新服务器中重新安装PostgreSQL。我需要在新环境中重新创建数据库,并以某种方式将旧文件附加到新数据库实例。我知道在SQL Server中这是可能的,因为引擎存储数据库的方式,但我对postgres没有任何线索。

有什么想法吗?他们将非常感激。

6 个答案:

答案 0 :(得分:20)

如果您拥有整个数据文件夹,那么您拥有所需的一切(只要架构相同)。只需尝试将其恢复到另一台机器上,然后再将其擦除,以防您没有复制内容。

只需将数据目录保存到磁盘即可。启动Postgres时,设置参数告诉它数据目录的位置(参见:wiki.postgresql.org)。或者删除全新安装的原始数据目录并将副本放在其位置。

答案 1 :(得分:5)

这是可能的,您只需将“数据”文件夹(在Postgres安装文件夹中)从旧计算机复制到新计算机,但有几点需要注意。

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

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

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

(还应该可以从资源管理器中更改所有权:首先必须在“文件夹”选项中禁用“使用简单文件共享”,然后“安全”选项卡将出现在“文件夹属性”对话框中,并且有选项可供选择设置权限并更改所有权,但我无法这样做。)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

问题很老,但我想分享一个我发现的有效方法。

如果你没有备份" pg_dump"并且您的旧数据是文件夹,请尝试以下步骤。 在Postgres数据库中,将记录添加到" pg_database"表。使用经理程序或"插入"。 进行必要的检查并更改以下插入查询并运行它。

查询将在工作后返回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';

答案 4 :(得分:0)

move database to another hard drive所示。我们需要做的就是修改注册表和文件权限。通过修改注册表(如图1所示),PostgreSQL服务器可以知道数据的新位置。

修改注册表

modify registry

答案 5 :(得分:0)

如果您在安装到旧数据文件夹的过程中遇到权限问题或 icacls 之类的问题,请尝试我在姐妹网站上的解决方案。

https://superuser.com/a/1611934/1254226