31

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

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

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

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

有任何想法吗?他们将不胜感激。

4

6 回答 6

22

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

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

于 2010-07-22T05:42:30.507 回答
9

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

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

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

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

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

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

于 2011-05-26T10:07:08.553 回答
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';

于 2017-05-13T14:55:54.300 回答
0

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

修改注册表

修改注册表

于 2020-12-14T03:36:29.427 回答
0

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

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

于 2020-12-22T17:13:19.147 回答
-5

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

  1. 从管理工具转到服务
  2. 找到 postgres 服务并双击它
  3. 在登录选项卡更改为本地系统
  4. 然后重新启动
于 2014-11-26T10:57:06.037 回答