Proxmox Backup Server · 3 min
Un guardado cortado a medias dejó mi base de datos en una sexta parte, y así saqué un solo fichero de la copia del PBS
Tengo un pequeño sistema que guarda conversaciones en una base de datos de búsqueda por significado: un fichero de texto con los trozos (chunks.jsonl) y otro con sus vectores (vectors.npy). Cada media hora se actualiza con lo nuevo. Y tengo un vigilante que avisa si la base cambia de tamaño de forma rara.
Una noche saltó el aviso: «ha encogido: de 5.208 a 824 trozos». Se había perdido más del 80 % de golpe.
Qué había pasado
La cadena fue esta:
- Una actualización se cortó justo mientras guardaba. El guardado escribía directamente encima de los ficheros buenos, así que el de texto se quedó a medias.
- El fichero de texto y el de vectores ya no cuadraban: uno tenía menos entradas que el otro.
- La siguiente actualización vio el descuadre y aplicó su plan B: «rehacerlo todo». Pero lo rehízo con lo que quedaba en el fichero cortado.
- A partir de ahí, cada pasada daba por bueno el estado pequeño.
Lo peor no fue el corte, sino el plan B. Un «si algo no cuadra, lo regenero» suena prudente, pero si regeneras a partir de datos rotos, conviertes un fichero a medias en una pérdida total, y además la confirmas.
No llegué a saber qué cortó aquella actualización (no fue falta de memoria). Pero da igual: el diseño tenía que aguantar un corte, viniera de donde viniera.
Recuperar dos ficheros de la copia de un contenedor
El contenedor donde vive esto se copia cada día a un Proxmox Backup Server (PBS). La copia de esa misma mañana tenía los 5.208 trozos, bien cuadrados. Solo necesitaba dos ficheros, no restaurar el contenedor entero (que me habría hecho perder todo lo demás del día).
Aquí aparecieron las trampas:
- La descarga desde la web de Proxmox no sirve para binarios. El explorador de ficheros de la copia (y su equivalente por línea de comandos, el
file-restore/downloadde la API) me dio unvectors.npyque no se podía abrir. Para ficheros de texto pequeños puede valer; para binarios, no te fíes. - Montar la copia a mano fallaba por el cifrado y el índice.
- Lo que funcionó fue
proxmox-file-restore extract, ejecutado en el propio nodo Proxmox. Necesita que le indiques el repositorio del PBS y, si la copia está cifrada, la clave; los dos datos ya están en la configuración de almacenamiento del nodo. - Ojo con dónde deja los ficheros:
extractmete cada fichero dentro de una carpeta con su nombre. Pideschunks.jsonly te encuentraschunks.jsonl/chunks.jsonl. Si copias sin mirar, acabas con una carpeta donde esperabas un fichero.
Con los dos ficheros de la mañana en su sitio, lancé una actualización para añadir lo hablado durante el día: 5.242 trozos. Recuperado del todo. Los ficheros rotos los guardé aparte por si hacía falta investigar.
Lo que cambié para que un corte no vuelva a costar nada
- Guardar en un temporal y cambiarlo de golpe. El guardado escribe primero en ficheros temporales y, solo cuando están completos, los renombra encima de los buenos. Un renombrado dentro del mismo disco es instantáneo: o está el fichero viejo entero o el nuevo entero, nunca uno a medias.
- Copia del último estado bueno. Antes de cambiar nada, deja un
.bakde cada fichero. - Si algo no cuadra, parar. Ante un descuadre, la actualización ya no intenta rehacer nada: se detiene sin tocar los ficheros y avisa.
- Un freno de tamaño. Si una actualización fuera a dejar la base con más de un 10 % menos de trozos, no se guarda.
Lo que me llevé de esto
- Escribir encima del único fichero bueno es apostar a que nada se corte nunca. Temporal y renombrado: cuesta tres líneas.
- Los planes B automáticos del tipo «lo regenero todo» son peligrosos si parten de datos que ya pueden estar rotos. Ante la duda, parar y avisar es mejor que «arreglar».
- Ten un vigilante que avise de cambios de tamaño raros. Sin él, me habría enterado días después, cuando la copia buena ya hubiera caducado.
- Para sacar ficheros sueltos de una copia de contenedor del PBS:
proxmox-file-restore extracten el nodo, no la descarga de la web. Y mira dentro de la carpeta que te crea.