2011-03-07 47 views
16

estoy recibiendo un errorPostgreSQL: cabecera de página no válida en el bloque

ERROR: invalid page header in block 411 of relation "t_value_time" 

en mi base de datos PostgreSQL. Esto sigue sucediendo en diferentes máquinas. ¿Hay alguna manera de evitar que suceda, o al menos decirle a PSQL que ignore los datos en el bloque no válido y continúe?

Prefiero perder los datos del bloque y que se salte el archivo y lea el resto de los datos. ¿Hay alguna manera de decirle a PSQL que se salte este bloque?

Respuesta

2

¿El mismo bloque cada vez?

Según lo que he leído, la causa más común de bloques no válidos es el hardware. Red Hat tiene una utilidad, pg_filedump, que formatea "archivos de heap, índice y control de PostgreSQL en una forma legible por humanos". No creo que admitan ninguna versión de PostgreSQL superior a 8.4.0, pero podría estar equivocado.

Quiere probar que su hardware es bueno mediante el uso de discos duros, discos duros, RAM y diagnósticos NIC.

1

No hay una forma sencilla de hacerlo, pero es razonablemente fácil hacerlo simplemente editando el archivo de datos directamente (el reteléneo de la entrada pg_class da el nombre de archivo).

Solo copie un bloque de otra parte del archivo sobre el bloque incorrecto. Idealmente, sintetice un bloque vacío o actualice el que está sobrescribiendo para que no tenga tuplas válidas.

Una vez que tienes algo que no produce ese error, volca la tabla y vuelve a cargarla por seguridad.

0

estos son casi siempre problemas de hardware por cierto. Verifique y pruebe RAM, disco, CPU. Asegúrate de que tu entorno sea bueno (una mala entrada de energía puede causar problemas, al igual que un sobrecalentamiento). Esa es la mejor manera de prevenirlo. La mejor forma de abordarlo es la recuperación puntual desde una copia de seguridad básica.

23

ADVERTENCIA: ¡Perderá algunos datos!

Nos consiguieron superarlo (DEV estrellado VM) mediante la emisión:

database=# SET zero_damaged_pages = on; 
SET 
database=# VACUUM FULL damaged_table; 
WARNING: invalid page header in block xxx of relation base/yyy/zzz; zeroing out page 
[..] 
REINDEX TABLE damaged_table; 

Fix través pwkg.ork.

+2

Esta es la solución correcta. 'VACUUM FULL' y' REINDEX' no son estrictamente necesarios para borrar la advertencia. Cualquier operación que lea la página del disco y desencadene el error del "encabezado de página no válida" arreglará la página dañada (volviéndola a escribir con todos los ceros) si 'zero_damaged_pages' está activado, por lo que podría hacer una consulta que llegue a la mala página. – simonp

Cuestiones relacionadas