Parece que hacer backups es como llevar un paraguas en un día de lluvia: piensas que te va a salvar de todo. Pero si el paraguas tiene un agujero, igual te mojas. Con los backups y la restauración pasa lo mismo: si algo sale mal, puedes perder datos o, peor aún, acabar con una base de datos corrupta. Por eso es tan importante entender los errores y cómo evitarlos.
Problemas al restaurar datos
- Incompatibilidad de versiones de PostgreSQL
Uno de los problemas más comunes y molestos es intentar restaurar datos hechos en una versión de PostgreSQL en otra (por ejemplo, intentas restaurar un backup de la versión 11 en la 15). PostgreSQL no garantiza compatibilidad hacia atrás entre versiones.
¿Por qué pasa esto?
- El formato de los datos puede cambiar entre versiones.
- Algunas funciones y parámetros pueden ser eliminados o modificados.
¿Cómo evitarlo?
- Siempre haz backups usando
pg_dump, no copiando directamente los datos del directorio de PostgreSQL.pg_dumpcrea scripts SQL universales que puedes restaurar en cualquier versión compatible. - Revisa la compatibilidad de versiones antes de empezar la restauración. Puedes encontrar info en la documentación oficial de PostgreSQL.
Vamos con un ejemplo. Has hecho un backup con PostgreSQL 14:
pg_dump -U user -d my_database -f backup.sql
Ahora intentas restaurarlo en PostgreSQL 15:
psql -U user -d my_database -f backup.sql
Y te salen errores como:
ERROR: unrecognized configuration parameter "old_function"
Solución: actualiza la versión de PostgreSQL en el servidor o usa la utilidad pg_upgrade para migrar.
- Faltan archivos WAL necesarios
A veces la restauración desde un backup incremental o diferencial se corta de golpe — todo por archivos WAL (Write-Ahead Logging) que faltan. PostgreSQL los necesita para "aplicar" los cambios después del último backup completo. Si no están o están corruptos, la base no puede terminar la restauración.
Pasa, por ejemplo, si no activaste el archivado de archivos WAL, o si alguien borró la carpeta para liberar espacio. Así que si vas a usar backups incompletos, activa el archivado en postgresql.conf:
archive_mode = on
archive_command = 'cp %p /path/to/wal_archive/%f'
Y no te olvides de revisar de vez en cuando que el archivo de archivo realmente funciona y que los archivos están ahí y están bien. Es un pequeño precio por la tranquilidad de que la restauración no te va a fallar.
- Backup dañado
Tu archivo de backup puede estar dañado, lo que lo hace inútil para restaurar.
¿Por qué pasa esto?
- Se rompe la integridad del archivo durante la transferencia o almacenamiento.
- Un fallo inesperado durante la creación del backup.
¿Cómo evitarlo?
Usa compresión y checksums para comprobar la integridad del backup. Por ejemplo, crea un hash MD5 del archivo después de crearlo:
md5sum backup.sql > backup.sql.md5
Antes de restaurar, revisa siempre el archivo de backup:
md5sum -c backup.sql.md5
Problema y solución
Intentas restaurar un archivo dañado:
pg_restore -U user -d my_database backup.dump
Y ves esto:
pg_restore: fatal error: input file appears to be a text file, but you are using the 'pg_restore' command-line tool; try using psql instead
Solución: intenta abrir el archivo en un editor de texto y revisa si está entero. Si el daño es mínimo, puedes editar el archivo SQL a mano.
- Permisos de usuario insuficientes.
A veces al restaurar te salen errores por falta de privilegios, sobre todo si intentas restaurar con un usuario limitado.
¿Por qué pasa esto?
El usuario no tiene permisos para crear tablas, esquemas u objetos de la base de datos.
¿Cómo evitarlo?
Haz la restauración con un usuario que tenga los permisos necesarios:
pg_restore -U postgres -d my_database backup.dump
- Sobrescribir una base de datos existente
Otro error típico es restaurar una base de datos desde un backup cuando ya hay datos. Si por accidente "machacas" los registros existentes, no hay vuelta atrás.
¿Por qué pasa esto?
No usas la opción --clean, así que el nuevo backup se añade encima de los datos viejos.
¿Cómo evitarlo?
Al restaurar usa la opción --clean para borrar la estructura existente:
pg_restore --clean -U user -d my_database backup.dump
- Error de transacción incompleta
Al restaurar pueden surgir problemas con datos que se quedan colgados en una transacción incompleta. Esto pasa mucho en bases de datos grandes.
¿Por qué pasa esto?
La transacción se "rompió" por un fallo del servidor.
¿Cómo evitarlo?
Asegúrate de que el servidor PostgreSQL termina todas las transacciones limpias antes de restaurar. Si hay problemas, reinicia el servidor con:
sudo service postgresql restart
Formas de prevenir errores de restauración
Ya vimos cómo evitar problemas concretos, pero hay estrategias generales que te van a salvar de la mayoría:
Prueba la restauración regularmente. Crea una base de datos de pruebas y trata de restaurar ahí los datos.
Guarda varias copias de los backups. Usa un servicio en la nube, almacenamiento local y un servidor remoto.
Automatiza la creación de backups. Usa cron o herramientas similares para programar los backups.
Revisa la integridad de los archivos. Usa checksums para asegurarte de que el backup no está dañado.
Mantén sincronizadas las versiones de PostgreSQL. No dejes para después las actualizaciones de PostgreSQL, porque pueden causar problemas de compatibilidad en el futuro.
Casos reales y sus soluciones
Caso 1: Pérdida de archivos WAL. Tu servidor se apaga de golpe y ves que faltan los archivos WAL necesarios. En ese caso, la restauración es imposible sin un backup completo. La solución más simple: revisa regularmente la configuración del archivado de WAL.
Caso 2: Backup dañado. Subiste el backup al servidor, pero al revisarlo ves que el archivo está vacío. En estos casos usa un backup de otro almacenamiento o mira si puedes restaurar algo de la copia parcialmente dañada.
Caso 3: Incompatibilidad de versiones. Al migrar datos de PostgreSQL 12 a PostgreSQL 14 te salen errores. Migra los datos usando pg_dump y restáuralos con la nueva versión.
GO TO FULL VERSION