Introducción
PAPER & FORM vende láminas de papel y objetos de escritorio. Se acerca una migración a otro servicio y la propietaria necesita saber exactamente qué pedidos podrá recuperar una copia. No basta con tener un archivo: debe incluir cada pedido y sus artículos en un punto de recuperación claro.
Crearás un pedido pequeño, guardarás una copia PostgreSQL de formato personalizado y añadirás otro pedido para entender por qué queda fuera de ella. Basta con manejar lo básico de la terminal. La base, las herramientas y el sitio están preparados; no escribirás SQL ni instalarás software. Clientes, precios y pedidos son ficticios; no hay pagos ni correo electrónico.
Usa Original Shop para la tienda activa y Workstation para los comandos. Restored Copy es un destino independiente vacío que se usará en el siguiente laboratorio; no restaures allí en esta unidad. Cada unidad comienza con sus propios datos. Conserva el programa proporcionado y uploads/ sin cambios. Es un ejercicio de exportación lógica, no una recuperación completa ante desastres ni una recuperación a un instante determinado (PITR).
Registrar el pedido que debe entrar en la copia
En este paso registrarás un pedido real con sus artículos. Empieza en Original Shop. La franja azul identifica la base original, shop_source. Abre Explore the collection ↗. El catálogo ofrece Print pair a $18.00 por unidad y Desk tray a $26.00. Abre Orders en la navegación superior, selecciona R-101 y lee su línea: dos Print pair suman $36.00. Selecciona Download receipt ↓ y lee el texto guardado. Incluye referencia, cliente, artículo, cantidad y total. Regresa con PAPER & FORM.
Una base de datos guarda registros estructurados. Aquí, orders almacena la referencia y el cliente de cada pedido; order_items guarda sus artículos. Cada artículo apunta a su pedido principal. Conservar solo nombres o totales perdería la relación que necesita la tienda. La página y el recibo leen estas filas relacionadas reales.
Cambia a Workstation. pwd muestra el directorio actual; ls enumera sus archivos:
pwd
/home/labex/project/shop-backup
ls
Debes ver backups, shopctl y uploads. Guarda las exportaciones en backups/. uploads/packing-note.txt es un archivo ajeno a la tarea que debe permanecer intacto. Una exportación lógica no incluye archivos externos a la base.
./shopctl ejecuta el asistente preparado del directorio actual. Su acción identity muestra conexiones reales. Un rol es la cuenta de la base que determina los permisos. Un host y un puerto identifican el servicio. Ejecuta:
./shopctl identity
Localiza el origen shop_source con el rol cliente de solo lectura d09_reader y el destino shop_copy con el rol escribible d09_copy, ambos en 127.0.0.1:5432. Compartir servidor no los convierte en la misma base. El rol de la copia no puede conectarse al origen. El sitio usa otro rol para escribir en el original. Son límites de la práctica, no protección contra alguien con administración del sistema.
En Original Shop, abre Collection y baja hasta Place an order. Antes de enviar, lee Writing to: shop_source · ORIGINAL SHOP. Introduce exactamente:
| Campo | Valor |
|---|---|
| Reference | R-103 |
| Name | Rae |
| Item | Print pair |
| Quantity | 2 |
Selecciona Place order ↗. Se abre R-103, para Rae, con dos Print pair y total $36.00. Este pedido marca el límite y debe estar en la copia. El formulario original rechaza referencias desconocidas o exclusivas de la copia sin escribir registros. Enviar R-104 antes de tener un cutoff-kept.dump válido y protegido devuelve Keep the earlier point first y no escribe nada. Si querías R-103, vuelve a Collection y corrige la referencia. Esto protege el orden de esta práctica; una tienda de producción no suele esperar a un backup para aceptar pedidos. Si un R-103 existente tiene cliente, artículo o cantidad incorrectos, corrige únicamente ese registro reservado desde Workstation:
./shopctl correct source R-103
El asistente muestra el destino real y cambia solo R-103 a Rae / Print pair / 2. Rechaza las referencias originales de base y conserva otros pedidos, registros posteriores, archivos subidos y todos los archivos de copia. Es una corrección explícita del estudiante, nunca una acción de la comprobación. Corrige y vuelve a leer el registro antes de exportar. Si repetiste un clic y la referencia ya existe, verás Already recorded; abre Orders y revisa el registro en lugar de duplicarlo.
Regresa a Workstation. records muestra los datos relacionados reales; los últimos números son cantidad y precio unitario en centavos:
./shopctl records source
Busca R-103 | Rae | Print pair | 2 | 1800 y un total de $98.00 entre los tres pedidos. Añadiste el pedido previsto sin cambiar R-101 ni R-102.
Guardar un archivo consistente de formato personalizado
En este paso guardarás los tres pedidos confirmados. Un punto de recuperación es el estado capturado por la exportación, no el nombre ni la fecha de modificación del archivo. pg_dump de PostgreSQL crea una instantánea consistente: conserva las tablas relacionadas desde una misma vista de la base incluso si hay otros usuarios activos. En esta práctica termina R-103 antes de exportar y espera a que la exportación termine antes del siguiente pedido. El orden hace inequívoco el límite sin comparar relojes.
Permanece en Workstation. pg_dump exporta una base; pg_restore lee sus formatos de archivo. Comprueba las versiones instaladas:
pg_dump --version
pg_restore --version
Ambos deben indicar PostgreSQL 14 en este entorno. El servidor también es 14. Un pg_dump antiguo puede fallar con un servidor más nuevo; no ocultes un error de versión guardando un archivo vacío. Las herramientas compatibles ya están preparadas.
Vuelve a mostrar las conexiones antes de elegir el origen:
./shopctl identity
Los servicios de conexión de PostgreSQL son ajustes guardados. service=shop-source selecciona shop_source y su rol de solo lectura; service=shop-copy selecciona el destino independiente. --dbname elige esa conexión. Nombra siempre el servicio explícitamente en lugar de depender de valores predeterminados.
--format=custom crea el formato comprimido propio de PostgreSQL que requiere pg_restore, en vez de un script SQL de texto. --file nombra la salida. --no-privileges omite las concesiones de acceso del origen. En un archivo personalizado se ignora pg_dump --no-owner; la propiedad se omite después pasando --no-owner a pg_restore. Esa opción de restauración permite que el rol de destino sea propietario de los objetos. El comando lee el origen y solo escribe el archivo local indicado:
pg_dump --dbname=service=shop-source --format=custom --no-privileges --file=backups/cutoff.dump
Una exportación correcta normalmente no imprime nada. No introduzcas el siguiente pedido hasta que termine. Si aparece un error de conexión o archivo, revisa pwd, ./shopctl identity y la ruta de salida, y vuelve a intentarlo. Repetirlo reemplaza backups/cutoff.dump; hazlo solo mientras el origen conserve el estado límite deseado. Una exportación posterior captura datos posteriores.
pg_restore --list lee el índice sin importar nada:
pg_restore --list backups/cutoff.dump
Cerca del inicio busca Format: CUSTOM, dbname: shop_source y versiones compatibles del servidor exportado y cliente. Más abajo verás orders, order_items, sus datos, secuencias y restricciones. Son pruebas de estructura, no de que estén las filas comerciales correctas; restaurarlas y leerlas aporta una evidencia más sólida.
La comprobación prueba tu archivo real en una base desechable nueva, incluyendo el pedido límite y la relación con sus artículos. No restaura el sitio de Restored Copy. Conserva el archivo para el paso siguiente.
Antes de avanzar, lee el resultado y conserva el archivo verificado. cp duplica un archivo con otro nombre. chmod a-w quita el permiso de escritura a todos los usuarios para proteger ambos nombres de un sobrescrito accidental con pg_dump --file:
cp backups/cutoff.dump backups/cutoff-kept.dump
chmod a-w backups/cutoff.dump backups/cutoff-kept.dump
Hazlo solo después de aprobar la comprobación de la copia. Exportar directamente a cualquiera de los archivos protegidos ahora falla con Permission denied en lugar de sustituir el punto guardado. Si borras el nombre original, cp backups/cutoff-kept.dump backups/cutoff.dump recupera sus bytes. El archivo conservado es una segunda copia local contra errores normales, no protección ante desastres en otra ubicación.
Distinguir los pedidos posteriores del punto guardado
En este paso verás avanzar el origen mientras el archivo conserva su punto anterior. Abre Original Shop, entra en Collection y lee Writing to: shop_source · ORIGINAL SHOP antes de escribir. Envía:
| Campo | Valor |
|---|---|
| Reference | R-104 |
| Name | Sol |
| Item | Desk tray |
| Quantity | 1 |
El nuevo registro suma $26.00. Abre Orders y confirma R-101, R-102, R-103 y R-104. R-104 se confirmó después de terminar pg_dump, por lo que queda fuera de backups/cutoff.dump. Un backup no es una conexión viva que sigue recibiendo pedidos. No sobrescribas ahora el archivo límite con otra exportación.
En Workstation, vuelve a leer el origen:
./shopctl records source
Ahora aparece R-104 | Sol | Desk tray | 1 | 2600 y total $124.00. El origen sigue funcionando: no destruiste datos para provocar una recuperación. Volver a listar el archivo sigue mostrando la estructura original:
pg_restore --list backups/cutoff.dump
La comprobación restaura solo en una base de prueba desechable. Espera R-101 a R-103 y excluye R-104. Eso demuestra un punto de recuperación, no solo la existencia de un archivo. Deja Restored Copy vacía en esta unidad.
Si te equivocaste en R-104, ./shopctl correct source R-104 muestra el origen y corrige solo ese pedido existente a Sol / Desk tray / 1, conservando los anteriores. El formulario rechaza una referencia desconocida; corrígela y envía de nuevo.
Si borraste o reemplazaste cutoff.dump, recupera los bytes anteriores conservados, no una nueva instantánea futura. En Workstation, chmod u+w devuelve al propietario permiso de escritura sobre ese archivo; luego cp recupera su contenido y chmod a-w vuelve a protegerlo:
chmod u+w backups/cutoff.dump
cp backups/cutoff-kept.dump backups/cutoff.dump
chmod a-w backups/cutoff.dump
Si el archivo se borró, omite el primer comando y usa directamente la copia conservada. Después repite la comprobación. No borres R-104 ni retrocedas el origen: los registros posteriores deben permanecer. Si se han perdido todas las copias de un punto anterior, una nueva exportación lógica no puede reconstruir el pasado. Por eso el paso anterior comprueba y conserva una copia protegida antes de permitir que avance el origen. El siguiente laboratorio independiente proporciona ese mismo punto para concentrarte en restaurar con seguridad.
Resumen
Creaste un pedido real, exportaste un archivo PostgreSQL personalizado y consistente, y distinguiste ese punto guardado de un pedido posterior del original. La comprobación del archivo probó las relaciones restauradas en una base desechable. El siguiente laboratorio independiente abrirá el estado guardado como una copia utilizable de la tienda.


