pg_resetwal

pg_resetwal — restablece el registro de escritura anticipada (WAL) y otra información de control de un clúster de bases de datos PostgreSQL

Synopsis

pg_resetwal [ -f | --force ] [ -n | --dry-run ] [option...] [ -D | --pgdata ]datadir

Descripción

pg_resetwal limpia el registro de escritura anticipada (WAL) y, opcionalmente, restablece otra información de control almacenada en el archivo pg_control. A veces es necesaria esta función si estos archivos se han corrompido. Solo debe usarse como último recurso, cuando el servidor no se inicia debido a dicha corrupción.

Algunas opciones, como --wal-segsize (véase más abajo), también se pueden usar para modificar ciertos parámetros globales de un clúster de bases de datos sin la necesidad de volver a ejecutar initdb. Esto se puede hacer de forma segura en un clúster de bases de datos que por lo demás esté sano, si no se utiliza ninguno de los modos peligrosos que se mencionan a continuación.

Si se utiliza pg_resetwal en un directorio de datos donde el servidor se ha apagado de forma limpia y el archivo de control está sano, no tendrá ningún efecto sobre el contenido del sistema de bases de datos, excepto que se limpiarán los archivos WAL que ya no se utilicen. Cualquier otro uso es potencialmente peligroso y debe hacerse con gran cuidado. pg_resetwal requerirá que se especifique la opción -f (fuerza) antes de trabajar en un directorio de datos en un estado de apagado no limpio o con un archivo de control dañado.

Después de ejecutar este comando en un directorio de datos con un WAL dañado o un archivo de control dañado, debería ser posible iniciar el servidor, pero ten en cuenta que la base de datos podría contener datos inconsistentes debido a transacciones confirmadas parcialmente. Deberías exportar (dump) inmediatamente tus datos, ejecutar initdb y restaurar. Después de la restauración, comprueba si hay inconsistencias y repáralas según sea necesario.

Si pg_resetwal se queja de que no puede determinar datos válidos para pg_control, puedes obligarlo a continuar de todos modos especificando la opción -f (fuerza). En este caso, se sustituirán los datos faltantes por valores plausibles. Se puede esperar que la mayoría de los campos coincidan, pero es posible que se necesite ayuda manual para los campos del siguiente OID, el siguiente ID de transacción y época, el siguiente ID de multitransacción y su desplazamiento, y la ubicación de inicio de WAL. Estos campos se pueden establecer utilizando las opciones que se analizan a continuación. Si no eres capaz de determinar los valores correctos para todos estos campos, aún se puede usar -f, pero la base de datos recuperada debe tratarse con aún más sospecha de lo habitual: es imperativa una exportación e importación inmediatas. No ejecutes ninguna operación de modificación de datos en la base de datos antes de exportar, ya que es probable que cualquier acción de este tipo empeore la corrupción.

Esta utilidad solo la puede ejecutar el usuario que instaló el servidor, porque requiere acceso de lectura/escritura al directorio de datos.

Opciones

datadir
-D datadir
--pgdata=datadir

Especifica la ubicación del directorio de la base de datos. Por razones de seguridad, debes especificar el directorio de datos en la línea de comandos. pg_resetwal no utiliza la variable de entorno PGDATA.

-f
--force

Fuerza a pg_resetwal a proceder incluso en situaciones donde podría ser peligroso, como se explicó anteriormente. Específicamente, esta opción es obligatoria para proceder si el servidor no se había apagado de forma limpia o si pg_resetwal no puede determinar datos válidos para pg_control.

-n
--dry-run

La opción -n/--dry-run indica a pg_resetwal que muestre los valores reconstruidos a partir de pg_control y los valores que están a punto de cambiarse, y luego termine sin modificar nada. Esta es principalmente una herramienta de depuración, pero puede ser útil como una comprobación de cordura antes de permitir que pg_resetwal proceda de verdad.

-V
--version

Muestra la información de versión y termina.

-?
--help

Muestra la ayuda y termina.

Las siguientes opciones solo son necesarias cuando pg_resetwal no puede determinar los valores adecuados leyendo pg_control. Los valores seguros se pueden determinar como se describe a continuación. Para los valores que toman argumentos numéricos, se pueden especificar valores hexadecimales utilizando el prefijo 0x. Ten en cuenta que estas instrucciones solo se aplican con el tamaño de bloque estándar de 8 kB.

-c xid,xid
--commit-timestamp-ids=xid,xid

Establece manualmente los IDs de transacción más antiguo y más reciente para los cuales se puede recuperar el tiempo de confirmación.

Se puede determinar un valor seguro para el ID de transacción más antiguo para el cual se puede recuperar el tiempo de confirmación (primera parte) buscando el nombre de archivo numéricamente más pequeño en el directorio pg_commit_ts bajo el directorio de datos. Por el contrario, un valor seguro para el ID de transacción más reciente para el cual se puede recuperar el tiempo de confirmación (segunda parte) se puede determinar buscando el nombre de archivo numéricamente más grande en el mismo directorio. Los nombres de archivo están en hexadecimal.

-e xid_epoch
--epoch=xid_epoch

Establece manualmente la época del siguiente ID de transacción.

La época del ID de transacción no se almacena en realidad en ningún lugar de la base de datos excepto en el campo establecido por pg_resetwal, por lo que cualquier valor funcionará en lo que respecta a la propia base de datos. Es posible que tengas que ajustar este valor para asegurarte de que los sistemas de replicación como Slony-I y Skytools funcionen correctamente; si es así, se debería poder obtener un valor adecuado a partir del estado de la base de datos replicada de destino (downstream).

-l walfile
--next-wal-file=walfile

Establece manualmente la ubicación de inicio de WAL especificando el nombre del siguiente archivo de segmento WAL.

El nombre del siguiente archivo de segmento WAL debe ser mayor que cualquier nombre de archivo de segmento WAL que exista actualmente en el directorio pg_wal bajo el directorio de datos. Estos nombres también están en hexadecimal y tienen tres partes. La primera parte es el timeline ID y por lo general debe mantenerse igual. Por ejemplo, si 00000001000000320000004A es la entrada más grande en pg_wal, utiliza -l 00000001000000320000004B o superior.

Ten en cuenta que al utilizar tamaños de segmento WAL no predeterminados, los números en los nombres de los archivos WAL son diferentes de los LSN reportados por las funciones y vistas del sistema. Esta opción toma un nombre de archivo WAL, no un LSN.

Note

pg_resetwal examina por sí mismo los archivos en pg_wal y elige una configuración predeterminada para -l posterior al último nombre de archivo existente. Por lo tanto, el ajuste manual de -l solo debería ser necesario si tienes conocimiento de archivos de segmento WAL que no están presentes actualmente en pg_wal, como entradas en un archivo fuera de línea (offline); o si el contenido de pg_wal se ha perdido por completo.

-m mxid,xid
--multixact-ids=mxid,mxid

Establece manualmente el ID de multitransacción siguiente y más antiguo.

Se puede determinar un valor seguro para el siguiente ID de multitransacción (primera parte) puede ser determinado buscando el nombre de archivo numéricamente más grande en el directorio pg_multixact/offsets bajo el directorio de datos, sumando uno y luego multiplicando por 65536 (0x10000). Por el contrario, un valor seguro para el ID de multitransacción más antiguo (segunda parte de -m) se puede determinar buscando el nombre de archivo numéricamente más pequeño en el mismo directorio y multiplicando por 65536. Los nombres de archivo están en hexadecimal, por lo que la forma más fácil de hacer esto es especificar el valor de la opción en hexadecimal y añadir cuatro ceros al final.

-o oid
--next-oid=oid

Establece manualmente el siguiente OID.

No existe una forma comparativamente fácil de determinar un siguiente OID que esté más allá del más grande de la base de datos, pero afortunadamente no es crítico configurar correctamente el parámetro del siguiente OID.

-O mxoff
--multixact-offset=mxoff

Establece manualmente el siguiente desplazamiento (offset) de multitransacción.

Se puede determinar un valor seguro buscando el nombre de archivo numéricamente más grande en el directorio pg_multixact/members bajo el directorio de datos, sumando uno y luego multiplicando por 52352 (0xCC80). Los nombres de archivo están en hexadecimal. No hay una receta simple como la de añadir ceros para otras opciones.

-u xid
--oldest-transaction-id=xid

Establece manualmente el ID de transacción no congelada (unfrozen) más antiguo.

Se puede determinar un valor seguro buscando el nombre de archivo numéricamente más pequeño en el directorio pg_xact bajo el directorio de datos y luego multiplicando por 1048576 (0x100000). Ten en cuenta que los nombres de archivo están en hexadecimal. Por lo general, es más fácil especificar el valor de la opción también en hexadecimal. Por ejemplo, si 0007 es la entrada más pequeña en pg_xact, funcionará -u 0x700000 (cinco ceros al final proporcionan el multiplicador adecuado).

-x xid
--next-transaction-id=xid

Establece manualmente el siguiente ID de transacción.

Se puede determinar un valor seguro buscando el nombre de archivo numéricamente más grande en el directorio pg_xact bajo el directorio de datos, sumando uno y luego multiplicando por 1048576 (0x100000). Ten en cuenta que los nombres de archivo están en hexadecimal. Por lo general, es más fácil especificar el valor de la opción también en hexadecimal. Por ejemplo, si 0011 es la entrada más grande en pg_xact, funcionará -x 0x1200000 (cinco ceros al final proporcionan el multiplicador adecuado).

--char-signedness=option

Establece manualmente el tipo char con o sin signo predeterminado. Los valores posibles son signed y unsigned.

Para un clúster de bases de datos actualizado por pg_upgrade desde una versión de PostgreSQL anterior a la 18, el valor seguro sería la propiedad con o sin signo predeterminada para el tipo char de la plataforma que ejecutaba el clúster antes de esa actualización. Para todos los demás clústeres, signed sería el valor seguro. Sin embargo, esta opción es exclusivamente para su uso con pg_upgrade y normalmente no debería usarse manualmente.

--wal-segsize=wal_segment_size

Establece el nuevo tamaño del segmento WAL, en megabytes. El valor debe establecerse en una potencia de 2 entre 1 y 1024 (megabytes). Véase la misma opción de initdb para más información.

Esta opción también se puede utilizar para cambiar el tamaño del segmento WAL de un clúster de bases de datos existente, evitando la necesidad de volver a ejecutar initdb.

Note

Aunque pg_resetwal establecerá la dirección de inicio de WAL más allá del último archivo de segmento WAL existente, algunos cambios en el tamaño del segmento pueden hacer que se reutilicen nombres de archivos WAL anteriores. Se recomienda utilizar -l junto con esta opción para establecer manualmente la dirección de inicio de WAL si la superposición de nombres de archivos WAL causa problemas con tu estrategia de archivado.

Entorno

PG_COLOR

Especifica si se debe usar color en los mensajes de diagnóstico. Los valores posibles son always, auto y never.

Notas

Este comando no debe utilizarse cuando el servidor se está ejecutando. pg_resetwal se negará a iniciarse si encuentra un archivo de bloqueo del servidor en el directorio de datos. Si el servidor se cayó, es posible que haya quedado un archivo de bloqueo; en ese caso, puedes eliminar el archivo de bloqueo para permitir que pg_resetwal se ejecute. Pero antes de hacerlo, asegúrate por partida doble de que no haya ningún proceso del servidor todavía activo.

pg_resetwal funciona únicamente con servidores de la misma versión principal.

Véase también

pg_controldata