2010-07-22 52 views
16

我有以下问题,我需要知道是否有办法解决它。从原始物理文件恢复postgreSQL数据库

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

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

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

任何想法?他们将非常感激。

回答

14

如果您拥有整个数据文件夹,则您拥有所需的所有内容(只要架构相同)。只需在将其擦除之前尝试将其恢复到另一台机器上,以防您没有复制任何内容。

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

+0

哇,这看起来很容易,明天让我试试看,我会让你知道结果。感谢您的快速答案;) – Alvos 2010-07-22 05:47:28

+0

我试过了,它应该工作,但我认为数据文件夹已损坏,因为它没有工作。它应该当数据文件夹是好的,但。我将交易文件作为备份,恢复历史数据需要更长的时间,但我认为我能够恢复所有内容。它只会花费比我希望的更多的时间。感谢您的帮助。我在测试环境中尝试了您的解决方案,它确实有效。 – Alvos 2010-07-24 15:36:54

+0

谢谢:)。它运行良好。您只需记住帐户的密码是旧安装的密码,而不是新密码。 – Nordes 2011-10-18 08:53:24

5

这是可能的,你只需要将旧的计算机中的“data”文件夹(在Postgres安装文件夹内)复制到新的计算机上,但需要记住一些事项。

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

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

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

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

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

+0

它确实有效,我只对pg_hba.conf文件有问题,但评论IPv6线路的确有窍门,谢谢你,并为我的坏英语感到抱歉。 – pabloferraz 2016-07-01 15:10:22

0

我这样做,但最棘手的部分是改变人的许可:

  1. 去服务来自的执政工具
  2. 找到
  3. 在日志选项卡上的变化Postgres的服务,并双击它到本地系统
  4. 然后重新启动
0

的问题是很老了,但是我想分享的有效方法T我找到了帽子。

如果您没有使用“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_catalog(
     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'; 

+0

没问题,除非是正确的表名:pg_catalog.pg_database – alijunior 2018-01-26 15:33:57