Error de respaldo en caliente de PostgreSQL 9.1: el sistema de base de datos se está iniciando

16

He estado trabajando en una copia de seguridad en caliente para Postgres 9.1 por un tiempo y me he encontrado con un problema constante. Después de reiniciar Postgres en el servidor esclavo, el archivo de registro pgstartup y el archivo de registro diario en el directorio pg_log se lee sin errores. Sin embargo, cuando intento ingresar a la base de datos usando el comando psql, aparece el error:

FATAL: el sistema de base de datos se está iniciando.

El archivo recovery.conf tampoco se convierte en recovery.done. He investigado ampliamente este error y constantemente encuentro la misma respuesta: la base de datos no se ha cerrado limpiamente antes de intentar reiniciar Postgres. Las únicas formas en que he reiniciado Postgres es a través de los comandos service postgresql-9.1 restarto /etc/init.d/postgresql-9.1 restart. Después de recibir este error, elimino todos los procesos e intento nuevamente reiniciar la base de datos y sigo recibiendo el mismo error. No sé a dónde ir desde aquí y cómo solucionar este problema. A continuación se muestra el proceso exacto que he realizado para completar la copia de seguridad en caliente.

Configuraciones del servidor maestro:

pg_hba.conf, agregó la línea:

host replication postgres IPAddressOfSlaveServer trust

postgresql.conf:

wal_level = hot_standby
max_wal_senders = 5
listen_address = '*'
puerto = 5432
max_wal_senders = 5
wal_keep_segments = 32

Configuraciones del servidor esclavo:

postgresql.conf:

hot_standby = on

recovery.conf:

standby_mode = on
primary_conninfo = host = IPAddressOfMasterServer
puerto = 5432
usuario = postgres
restore_command = 'cp /var/lib/pgsql/9.1/data/pg_xlog/%f "% p"'

Después de configurar ambos servidores

Me cambio al usuario postgres en el servidor maestro y ejecuto los comandos:

psql -c "Seleccione pg_start_backup ('etiqueta', verdadero);";
rsync -a -v -e ssh /var/lib/pgsql/9.1/data esclavo: /var/lib/pgsql/9.1/data \
        --excluye postmaster.pid
pgsql -c "seleccione pg_stop_backup ();";

Después de sincronizar la base de datos con el servidor esclavo

Reinicio el servidor esclavo y el inicio no falla. El pgstartup.log lee:

Éxito. Ahora puede iniciar el servidor de bases de datos usando:

    /usr/pgsql-9.1/bin/postgres -D /var/lib/pgsql/9.1/data
o
    /usr/pgsql/9.1/bin/pg_ctl -D /var/lib/pgsql/9.1/data -l logfile start

el archivo de registro del día actual, postgresql-Thu.log, lee:

Registro: apagado
Registro: el sistema de base de datos está apagado
Registro: el sistema de base de datos se cerró en recuperación en 2012-4-10
Registro: entrar en modo de espera
Registro: archivo de registro restaurado "logFileName" del archivo
Registro: estado de recuperación constante alcanzado en 0 / BF0000B0
Registro: rehacer comienza en 0 / BF000020
Registro: archivo de registro restaurado "logFileName" del archivo
Registro: pageaddr inesperado 0/85000000 en el archivo de registro 0, segmento 192, desplazamiento 0
Registro: pageaddr inesperado 0/85000000 en el archivo de registro 0, segmento 192, desplazamiento 0
Registro: replicación de transmisión conectada correctamente a la primaria

Investigué pageaddr inesperado y de los archivos de postgres, tengo entendido que es bastante normal y una de las formas esperadas para detectar el final de WAL.

Cualquier consejo sería muy apreciado.

Ola Ström
fuente

Respuestas:

11

El mensaje "El sistema de base de datos se está iniciando". no indica un error La razón por la que está en el nivel FATAL es para que siempre llegue al registro, independientemente de la configuración de log_min_messages:

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

Después del rsync, ¿realmente ejecutaste lo que muestras ?:

pgsql -c "seleccione pg_stop_backup ();";

Dado que, hasta donde yo sé, no hay pgsqlejecutable, eso dejaría la copia de seguridad incompleta, y el esclavo nunca saldría del modo de recuperación. Por otro lado, tal vez realmente corriste psql, porque de lo contrario no veo cómo el esclavo habría registrado mensajes de éxito como:

Registro: estado de recuperación constante alcanzado en 0 / BF0000B0

y:

Registro: replicación de transmisión conectada correctamente a la primaria

¿Intentaste conectarte con el esclavo en este momento? ¿Que pasó?

Se genera el mensaje "Éxito. Ahora puede comenzar ..." que menciona initdb, que no debe ejecutarse como parte de la configuración de un esclavo; así que creo que puedes estar confundido acerca de algo allí. También me preocupan estas declaraciones aparentemente conflictivas:

Las únicas formas en que he reiniciado Postgres es a través del servicio postgresql-9.1 restart o /etc/init.d/postgresql-9.1 restart command. Después de recibir este error, elimino todos los procesos e intento nuevamente reiniciar la base de datos ...

¿Intentó detener el servicio a través del script de servicio? ¿Que pasó? Podría ayudar a comprender los registros si antepone líneas con más información. Usamos:

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

El recovery.confguión se ve extraño. ¿Está copiando desde el directorio pg_xlog del maestro, el directorio pg_xlog activo del esclavo o un directorio de archivo?

kgrittn
fuente
8

También tuve algunos problemas con esto, excepto que estaba en 9.3, no 9.1. De todos modos, la solución resultó ser bastante trivial:

El postgresql.confarchivo se estaba copiando del maestro al esclavo, y lo estaba dejando sin modificar en el esclavo. Pensé que todo lo que tenía que hacer era agregar un recovery.confarchivo y todo funcionaría (bueno, lo hizo, pero no pude iniciar sesión en el servidor esclavo replicado, pero estaba siendo replicado).

Edité el postgresql.confarchivo del esclavo y:

  • comentó el archive_mode=on
  • archivecomando comentado ; y
  • Comentado hot_standby=on

Eso lo hizo: pude hacer que la base de datos sea un servidor de solo lectura listo para aceptar consultas de solo lectura.

Hay un script llamado pg_basebackupque creará el directorio bootstrap para el esclavo. Este es el directorio de datos con la base de datos. Debe modificar el postgresql.confarchivo antes de que pueda usarse como esclavo como se describe, algo bastante simple para un pg_basebackupscript de publicación .

Greg
fuente
1
Cuando escribe "comentado hot_standby = on" Supongo que quiere decir "quitó la marca # -comment-antes, para habilitar realmente hot_standby" :) Si no está en hot_standby, la base de datos siempre estará "iniciando" por diseño (es cálido en espera, listo para la conmutación por error, pero sin consultar). Tenga en cuenta que si realizó el volcado de respaldo base sin tener wal_level = hot_standby en el maestro y luego activó hot_stanby en el esclavo, tendrá que volver a volcar y reiniciar el db esclavo para que hot_standby se ponga en funcionamiento. De lo contrario, obtendrá algunos errores fatales.
Frederik Struck-Schøning
hot_standby = on es obligatorio, debe estar allí
Abhilash Mishra
7

Curiosamente, resolví esto de la manera opuesta a la de Paul.

Yo añadí:

hot_standby = on

o, más bien, cambiado #hot_standby = offa lo anterior. (Esto estaba usando 9.5)

usuario41734
fuente
1

Tengo esto en los registros:

MSK FATAL:  the database system is starting up

Para arreglar el inicio infinito del servidor, haga esto: Detenga el servicio (si existe), elimine el proceso 'postgres' (generalmente existe). Ejecute esto en la consola:

pg_resetxlog.exe -D ../Data -f

Este problema aparece porque el directorio xLog tiene datos que no se deben escribir antes de que se cierre el servicio. Y luego, al iniciar el servicio, intenta corregir esos datos. A veces se congela el inicio y nunca termina. Comando en la parte superior, limpie estos datos no fijados, que aplican el servicio para comenzar solo con datos fijos. Tal vez se perderán algunas partes de los datos no fijados, pero el servidor de la base de datos se ejecutará normalmente y las aplicaciones podrán acceder a ellas.

Andrew Zolotarev
fuente