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

17 postgresql backup

我一直在为 Postgres 9.1 进行热备份工作一段时间,但遇到了一个一致的问题。在从服务器上重新启动 Postgres 后,pg_log 目录下的 pgstartup 日志文件和每日日志文件读取没有错误。但是,当我尝试使用 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
听地址 = '*'
端口 = 5432
max_wal_senders = 5
wal_keep_segments = 32

从服务器配置:

postgresql.conf:

hot_standby = 开

恢复.conf:

待机模式 = 开
primary_conninfo = host=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 logfile start

当日日志文件 postgresql-Thu.log 内容如下:

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

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

任何建议将不胜感激。

kgr*_*ttn 12

消息“数据库系统正在启动。” 不表示错误。它处于 FATAL 级别的原因是它始终将其记录在日志中,而不管 的设置如何log_min_messages

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

在 rsync 之后,你真的运行了你展示的内容吗?:

pgsql -c "选择 pg_stop_backup();";

因为据我所知,没有pgsql可执行文件,这会使备份未完成,并且从站永远不会退出恢复模式。另一方面,也许你真的运行了psql,因为否则我看不到奴隶会如何记录这样的成功消息:

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

和:

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

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

您提到的“成功。您现在可以开始...”消息由 生成initdb,不应作为设置从站的一部分运行;所以我想你可能对那里的东西感到困惑。我也担心这些明显相互矛盾的陈述:

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

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

log_line_prefix = '[%m] %p %q<%u %d %r> '
Run Code Online (Sandbox Code Playgroud)

recovery.conf脚本看起来很奇怪。您是从 master 的 pg_xlog 目录、slave 的活动 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脚本来说非常简单。

  • 当您写“注释掉 hot_standby=on”时,我认为您的意思是“删除了之前的 #-comment-mark,以实际启用 hot_standby”:) 如果不在 hot_standby 中,数据库将始终按照设计“启动”(它是热的)备用,准备故障转移,但不查询)。请注意,如果您在主服务器上没有 wal_level = hot_standby 的情况下进行了基本备份转储,然后在从服务器上打开了 hot_stanby,则必须重新转储并重新初始化从数据库以使 hot_standby 启动并运行。否则你会得到一些致命的错误。 (2认同)

小智 7

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

我补充说:

hot_standby = on

或者,更确切地说,更改#hot_standby = off为上述内容。(这是使用 9.5)