如何退出数据库恢复模式(当前锁定为只读模式)

时间:2019-05-07 04:30:29

标签: postgresql recovery

前一段时间已建立一个从数据库,用于备份或复制远程数据库。但是,我无法再使用基于Delphi的ETL向数据库写入数据(该ETL可用于另一对数据库,但迄今为止,从未用于该特定数据库对)。复制数据库是由离开公司的其他人建立的。我可以肯定地确定已将其设置为复制数据库,但是此后离开的员工告诉我,复制永远不会出于无关的原因而工作。使用ETL,我们可以(使用SQL查询)从一个数据库读取并写回到复制数据库,或者应该能够,因为它目前是只读的。

我尝试过:

  1. VACUUM之类的维护
  2. 尝试删除表和整个数据库
  3. 从主数据库还原完整备份

这些都不起作用,并且我被告知数据库是只读的。

我查看了postgresql.conf,并检查了hot_standby,所以我认为(但不是100%确信)数据库处于某种复制模式(我从未接触过)复制是Postgres支持的,所以我不知道。)

我在pg_hba.conf中检查了权限,并发现其中有一些用于复制的凭据。我不确定这是否会激活数据库的“复制模式”,或者仅表示这些凭据仅用于复制。

我已经使用了数月的日志文件(自从大约5个月前我们的IT部门升级了整个网络以来,这一直没有起作用)。我看到下面显示的日志文件内容,反复重复了几个月。请注意,pg_hba.conf文件中列出了下面显示的IP地址,因此凭据有效。

该数据库处于恢复模式,如我所发现的那样:

select pg_is_in_recovery();

这向我解释了为什么它是只读的,但是为什么我不能还原数据库,或者只是简单地转储整个数据库并重新启动(这是备份,因此丢失/恢复不是问题)?

我很想尝试修改recovery.conf文件(存在),但是我读/相信,一旦开始恢复(就我而言,已经恢复),修改文件将无效。

我使用的是Postgres的旧版本:9.2.9

这里的任何帮助将不胜感激,因为我已经为此进行了超过一天的努力。

日志文件条目(示例):

FATAL:  could not connect to the primary server:
FATAL:  no pg_hba.conf entry for replication connection from host "192.168.20.2", user "postgres", SSL off

FATAL:  could not connect to the primary server: server closed the connection unexpectedly
        This probably means the server terminated abnormally before or while processing the request.

几个选项对我有用:

  1. 将数据库从只读复制数据库转换为标准的读/写数据库,或者
  2. 转储/删除整个数据库,以便我可以创建一个具有写功能的新数据库。

1 个答案:

答案 0 :(得分:1)

似乎已经为两个数据库集群设置了复制功能,但是其中一台计算机上的配置更改中断了复制(更改了主pg_hba.conf,更改了IP地址,...)。

这是您所需解决方案的出路:

  1. 使备用数据库退出恢复模式:运行

    /path/to/pg_ctl promote -D /path/to/data/directory
    

    以备用身份作为操作系统用户postgres

  2. 标记备用数据库:使用rm -rf(或操作系统上的等效目录)删除备用数据库上的数据目录。杀死所有PostgreSQL进程。

    然后使用initdb在相同位置创建一个新的数据库集群。