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

Posted

技术标签:

【中文标题】从原始物理文件中恢复 postgreSQL 数据库【英文标题】:Recover postgreSQL databases from raw physical files 【发布时间】:2011-03-19 08:53:29 【问题描述】:

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

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

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

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

有什么想法吗?他们将不胜感激。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

修改注册表

【讨论】:

【参考方案3】:

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

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

【讨论】:

好吧,除了正确的表名:pg_catalog.pg_database 不起作用 - 我在旧备份中,文件夹“25559”,但是当我创建一个新数据库,甚至尝试像上面一样的 INSERT 命令时,oid 是 16384。既不重命名基地/25559 -> base/16384 也不设置 oid = 25559 其中 oid = 16384 有帮助。 Postgresql 12,CENTOS 7【参考方案4】:

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

    从管理工具转到服务 找到 postgres 服务并双击它 在登录选项卡更改为本地系统时 然后重启

【讨论】:

【参考方案5】:

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

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

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

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

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

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

【讨论】:

它确实有效,我只有 pg_hba.conf 文件有问题,但评论 IPv6 行就成功了,谢谢你,对不起我的英语不好。 这行得通 -> 我只有父目录的 data 文件夹。安装后-> ==> 0。停止 pg 服务 ==> 1。将原始数据文件夹重命名为_data。 ==> 2。将旧的data 文件夹复制到安装文件夹C:\Program Files\PostgreSQL\old_version。 ==> 3。 _data 文件夹的打开权限。 ==> 4。修改data 文件夹的权限,复制所有来自_data 文件夹的权限。 ==> 5。重新启动 pg 服务。 ==> 6。连接数据库。它应该工作!【参考方案6】:

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

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

【讨论】:

哇,看起来很简单,我明天试试,我会告诉你结果的。感谢您的快速回答;) 就像其他人提到的,记住复制的文件必须有正确的权限。在 linux 系统上,它们通常必须由 postgres 用户拥有,所以像 sudo chown -R postgres:postgres /var/lib/postgresql 这样的东西应该可以工作。 @KonradGarus 我尝试从 Windows 中的任务管理器停止 postgresql 服务后替换数据文件夹,但是当我尝试打开我的 psql shell 时它崩溃并出现错误“无法连接到服务器。连接被拒绝。服务器是否在本地主机上运行并接受端口 5432 上的连接”。请帮忙 这对我有用,但要完全清楚:“整个数据文件夹”不仅意味着 base/ 文件夹,还意味着包括 base/ 的整个父文件夹。对于我的 OS-X 服务器是:/usr/local/var/postgresql@11/ 为了好玩:这甚至适用于从 OS-X (10.13.6) 到 Ubuntu (18.04),都使用 postgres 11。正如此处其他地方所述,文件所有权需要与接收机器正在等待。

以上是关于从原始物理文件中恢复 postgreSQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

pg_restore - 从一个由 pg_dump 创建的备份文件中恢复 PostgreSQL 数据库。

从物理文件恢复 MySQL 数据库

postgresql卸载后之前的数据怎么恢复

Google Drive API-在还原原始文件夹之前,从垃圾桶还原的文件恢复原始文件夹

从mac中删除了PostgreSQL用户,如何恢复?

RDS for MySQL 物理备份文件恢复到自建数据库