PostgreSQL 9.1热备份错误:数据库系统正在启动


16

我一直在为Postgres 9.1进行热备份,并且遇到了一个一致的问题。在从属服务器上重新启动Postgres后,pgstartup日志文件和pg_log目录下的每日日志文件将正确读取。但是,当我尝试使用psql命令进入数据库时​​,出现错误:

严重:数据库系统正在启动。

recovery.conf文件也不会变为recovery.done。我已经广泛研究了此错误,并始终找到相同的响应:在尝试重新启动Postgres之前,尚未彻底关闭数据库。我重新启动Postgres的唯一方法是通过service postgresql-9.1 restartor /etc/init.d/postgresql-9.1 restart命令。收到此错误后,我将终止所有进程,然后再次尝试重新启动数据库,但仍然收到相同的错误。我不知道从哪里去以及如何解决此问题。以下是完成热备份的确切过程。

主服务器配置:

pg_hba.conf,添加以下行:

主机复制postgres IPAddressOfSlaveServer信任

postgresql.conf:

wal_level = hot_standby
max_wal_senders = 5
listen_address ='*'
端口= 5432
max_wal_senders = 5
wal_keep_segments = 32

从服务器配置:

postgresql.conf:

hot_standby =开启

recovery.conf:

Standby_mode =开
primary_conninfo =主机= IPAddressOfMasterServer
端口= 5432
用户= postgres
restore_command ='cp /var/lib/pgsql/9.1/data/pg_xlog/%f“%p”'

配置两个服务器之后

我更改为主服务器上的postgres用户并运行以下命令:

psql -c“选择pg_start_backup('label',true);”;
rsync -a -v -e ssh /var/lib/pgsql/9.1/data slave:/var/lib/pgsql/9.1/data \
        -排除postmaster.pid
pgsql -c“选择pg_stop_backup();”;

与从属服务器同步数据库后

我重新启动从属服务器,并且启动不会失败。pgstartup.log读取:

成功。现在,您可以使用以下命令启动数据库服务器:

    /usr/pgsql-9.1/bin/postgres -D /var/lib/pgsql/9.1/data
要么
    /usr/pgsql/9.1/bin/pg_ctl -D /var/lib/pgsql/9.1/data -l日志文件启动

当前日志文件postgresql-Thu.log读取:

日志:正在关闭
日志:数据库系统已关闭
日志:2012年4月10日恢复时数据库系统已关闭
日志:进入待机模式
日志:从存档中恢复日志文件“ logFileName”
日志:在0 / BF0000B0处达到一致的恢复状态
日志:重做从0 / BF000020开始
日志:从存档中恢复日志文件“ logFileName”
日志:日志文件0(段192)中的意外pageaddr 0/85000000,偏移量0
日志:日志文件0(段192)中的意外pageaddr 0/85000000,偏移量0
日志:流复制成功连接到主数据库

我研究了意料之外的pageaddr,并从postgres档案中进行了研究,据我了解,这是正常现象,也是检测WAL结束的预期方法之一。

任何建议将不胜感激。

Answers:


11

消息“数据库系统正在启动。” 不表示错误。它处于致命级别的原因是,无论设置为什么,它都将始终记录到日志中log_min_messages

http://www.postgresql.org/docs/9.1/interactive/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-何时

rsync之后,您是否真的运行了显示的内容?:

pgsql -c“选择pg_stop_backup();”;

据我所知,由于没有pgsql可执行文件,因此备份将无法完成,并且从站将永远不会退出恢复模式。另一方面,也许您确实运行过psql,因为否则我看不到从站如何记录如下成功消息:

日志:在0 / BF0000B0处达到一致的恢复状态

和:

日志:流复制成功连接到主数据库

您此时是否尝试连接到从站?发生了什么?

您提到的“成功。您现在可以开始...”消息是由生成的initdb,不应将其作为设置从属服务器的一部分运行。所以我认为您可能对那里的某些东西感到困惑。我还担心以下这些明显矛盾的陈述:

重新启动Postgres的唯一方法是通过服务postgresql-9.1 restart或/etc/init.d/postgresql-9.1重新启动命令。收到此错误后,我将杀死所有进程,然后再次尝试重新启动数据库...

您是否尝试通过服务脚本停止服务?发生了什么?如果为行添加更多信息,这可能有助于理解日志。我们用:

log_line_prefix = '[%m] %p %q<%u %d %r> '

recovery.conf脚本看起来很奇怪。您要从主站的pg_xlog目录,从站的活动pg_xlog目录或存档目录进行复制?


8

我也有一些问题,除了我是9.3,而不是9.1。无论如何,该修复程序显得微不足道:

postgresql.conf文件正在从主服务器复制到从属服务器,而在从属服务器上则保持不变。我以为您要做的就是添加一个recovery.conf文件,并且一切都会正常进行(很好,但是我无法登录到复制的从属服务器,但是正在复制)。

我编辑了从属postgresql.conf文件,并:

  • 评论了 archive_mode=on
  • 注释掉archive命令;和
  • 注释掉 hot_standby=on

做到了:我能够使数据库成为准备接受只读查询的只读服务器。

有一个名为的脚本pg_basebackup,它将为从服务器创建引导目录。这是其中包含数据库的数据目录。您需要先修改postgresql.conf文件,然后才能按所述将其用作从站,这对于发布pg_basebackup脚本而言非常简单。


1
当您编写“ commented out hot_standby = on”时,我想您的意思是“之前删除了#-comment-mark,以实际启用hot_standby” :)如果不在hot_standby中,则数据库将始终按设计“启动”(这很温暖)备用,准备进行故障转移,但不进行查询)。请注意,如果在主机上没有进行wal_level = hot_standby的情况下进行了基础备份转储,然后在从属服务器上启用了hot_stanby,则必须重新转储并重新初始化从属数据库,以使hot_standby能够启动并运行。否则,您将得到一些致命错误。
FrederikStruck-Schøning18年

hot_standby = on是必需的,它必须在此处
Abhilash Mishra

7

有趣的是,我以与保罗相反的方式解决了这个问题。

我补充说:

hot_standby = on

或改为#hot_standby = off上述内容。(这使用的是9.5)


1

我在日志中得到了这个:

MSK FATAL:  the database system is starting up

要修复服务器的无限启动,请执行以下操作:停止服务(如果存在),终止进程“ postgres”(通常存在)。在控制台中运行此命令:

pg_resetxlog.exe -D ../Data -f

之所以会出现这种用法,是因为xLog目录包含一个数据,该数据在服务关闭之前不会写入。然后在服务启动时,他尝试修复该数据。有时,它冻结启动,并且永不停止。.向上的命令清除此未修复的数据,该数据将服务应用到仅以修复的数据开始。也许未修复数据的某些部分将丢失,但是数据库服务器将正常运行,并且可以由应用程序访问。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.