Cómo pasar de VSAM a Postgres rompe contratos de clave ocultos
Pasar de VSAM a Postgres con seguridad exige conservar bytes KSDS, índices alternativos, orden de lectura y comportamiento de procesos batch.

Una clave KSDS de VSAM y una clave primaria de Postgres pueden identificar el mismo registro de negocio y, aun así, imponer contratos diferentes. Si las trata como equivalentes, las pantallas en línea pueden parecer correctas hasta que un programa nocturno recorra los registros en un orden que nadie documentó, un índice alternativo devuelva los duplicados de otra manera o una clave reescrita cambie qué registro viene después.
Mover los bytes es la parte fácil. La migración solo funciona cuando se descubren todas las rutas de acceso y se reproduce su comportamiento observable antes de mejorar el esquema. Eso incluye detalles incómodos: relleno a longitud fija, orden EBCDIC, inicios con clave parcial, claves alternativas duplicadas, actualizaciones que mantienen varios índices y comportamiento de fin de archivo tras cambios concurrentes. He visto equipos probar llamadas CRUD y dar el trabajo por terminado mientras todos sus procesos batch aún dependían de la personalidad física del KSDS.
Una clave KSDS es un contrato de acceso, no una columna
Una clave primaria de Postgres expresa unicidad e identidad de fila dentro de una tabla relacional. Una clave primaria KSDS también determina la posición en la secuencia lógica, el acceso por clave, la posición del recorrido y los estados que espera el código de la aplicación. Esas funciones se solapan, pero no son iguales.
En un KSDS, la clave es un campo fijo ubicado en un desplazamiento y con una longitud de bytes declarados dentro de cada registro. VSAM compara ese campo según los datos y el entorno que recibe. Los programas suelen construir la clave en working storage, rellenarla, mover a ella valores de presentación o empaquetados y pasarla a operaciones de archivo COBOL o comandos CICS. Los bytes forman parte de la interfaz aunque el copybook les dé un nombre de negocio cómodo.
Una PRIMARY KEY de Postgres exige que todos los valores sean únicos y no nulos, y Postgres la respalda con un índice B-tree único. Eso no dice si '00123 ' equivale a '00123', si los bytes EBCDIC se ordenan como el texto UTF-8 ni si una llamada puede iniciar un recorrido solo con la parte inicial de una clave de negocio compuesta. Por eso una definición relacional limpia puede ser incorrecta para la aplicación migrada.
Mantenga separadas tres identidades durante el análisis. La clave del registro es la secuencia exacta de bytes heredada. La identidad de negocio es lo que la organización dice que representa el registro, como cuenta más fecha de vigencia. La identidad de base de datos es la clave elegida para referencias y actualizaciones en Postgres. A veces las tres pueden converger. No fuerce ese resultado antes de que las pruebas lo respalden.
La documentación de IBM sobre conjuntos de datos ordenados por clave describe registros ordenados por su campo de clave y accesibles de forma directa o secuencial. La documentación de PostgreSQL define una clave primaria como una restricción de unicidad y valor no nulo que también crea un índice. Leídos juntos, ambos manuales muestran la brecha: VSAM documenta comportamiento de acceso alrededor de un registro; Postgres documenta una restricción relacional alrededor de un valor. El diseño de compatibilidad debe cubrir lo que falta.
Inventaríe las llamadas, no solo el catálogo del clúster
El catálogo muestra qué clústeres base, índices alternativos y rutas existen. No indica qué programas dependen de ellos, qué formas de clave construyen esos programas ni qué hacen después de un inicio fallido. Construya el inventario desde el código, JCL, definiciones de transacciones, copybooks y observaciones de producción.
Busque en COBOL READ, START, READ NEXT, READ PREVIOUS, REWRITE y DELETE para cada descripción de archivo. Busque en CICS READ, STARTBR, READNEXT, READPREV, RESETBR, ENDBR, WRITE, REWRITE y DELETE, y anote DATASET, RIDFLD, KEYLENGTH, GENERIC, GTEQ y los tokens de recorrido. Localice pasos JCL que usan IDCAMS, SORT o utilidades para copiar, descargar, combinar y validar el clúster. Incluya Assembler, PL/I, REXX y scripts del planificador si tocan los mismos datos.
Para cada operación, capture cinco datos:
- La ruta usada: clúster base o ruta con nombre de índice alternativo.
- Los bytes exactos de clave y la longitud declarada o proporcionada.
- La operación y regla de posición, incluidas exacta, mayor o igual, siguiente y anterior.
- La forma esperada del resultado, el estado y el tratamiento de duplicados.
- El consumidor posterior, sobre todo un paso batch o una extracción.
No agrupe varias llamadas en una sola fila porque nombren el mismo archivo. Una consulta CICS que lee un número exacto de cliente y un trabajo COBOL nocturno que comienza en un prefijo de sucursal ejercen contratos diferentes. El segundo también puede depender del orden de duplicados bajo una clave alternativa, aunque nadie pretendiera publicar ese orden.
El tráfico de producción grabado ayuda con los comandos en línea, pero no cubre el comportamiento planificado ni ramas de recuperación poco frecuentes. Combínelo con descubrimiento estático de llamadas y al menos un ciclo batch completo. Si el cierre de mes usa otra ruta JCL, captúrela también. La meta es una tabla finita de contratos de acceso que dirija las pruebas, no un documento de arquitectura en prosa que cada persona interprete de forma distinta.
La igualdad de bytes y la de texto divergen muy pronto
Conserve los bytes originales de la clave hasta demostrar que el valor decodificado tiene el mismo comportamiento de igualdad y orden. Convertir caracteres es un cambio semántico, no una tarea de limpieza.
Piense en una clave de cliente de diez bytes con un código de región en mayúsculas, un número rellenado con ceros y espacios finales. Un cargador podría decodificar EBCDIC, quitar espacios, convertir el número y almacenar (region text, customer_no integer). La nueva representación parece mejor. También puede borrar diferencias que produce el programa antiguo, cambiar comparaciones de valores mal formados y perder los bytes exactos necesarios para explicar un fallo de paridad.
La intercalación añade otra trampa. El orden del texto en Postgres sigue la intercalación elegida para la base de datos o columna, mientras un recorrido heredado observa el orden que generan los bytes codificados y el entorno VSAM. Letras, números, espacios, signos, minúsculas que superaron la validación y caracteres nacionales pueden quedar en otra posición. ORDER BY key_text no demuestra compatibilidad hasta que las pruebas lo confirman con claves representativas y adversas.
Una tabla de aterrizaje conservadora mantiene la identidad sin procesar junto a los campos analizados:
CREATE TABLE customer_landing (
legacy_key bytea PRIMARY KEY,
record_image bytea NOT NULL,
region_code text,
customer_no bigint,
loaded_at timestamptz NOT NULL DEFAULT clock_timestamp(),
CHECK (octet_length(legacy_key) = 10)
);
CREATE UNIQUE INDEX customer_business_identity
ON customer_landing (region_code, customer_no)
WHERE region_code IS NOT NULL AND customer_no IS NOT NULL;
La clave bruta permite una búsqueda sin pérdidas y ofrece un identificador estable para diagnóstico. Las columnas analizadas sostienen el modelo previsto. El índice único parcial prueba una hipótesis de negocio sin fingir que todos los registros históricos están limpios. Si la hipótesis falla durante la carga, ha encontrado datos que exigen una regla explícita, no una molestia que conviene ocultar con ON CONFLICT DO NOTHING.
Para una clave bruta compatible con texto puede usar una función fija de normalización y una intercalación binaria, pero documente cada transformación y pruebe su inversa. Para datos mixtos o zonificados, bytea suele ser la primera representación honesta. Puede retirarla más tarde, cuando las pruebas de paridad demuestren que ninguna llamada observa la diferencia. Eliminar pruebas antes de alcanzar la paridad invierte el orden correcto.
Los índices alternativos tienen semántica propia
Un índice alternativo no es solo un índice secundario de Postgres. Es otra ruta de acceso con su propia extracción de clave, regla de unicidad, gestión de duplicados y orden de recorrido, que los programas utilizan mediante una ruta.
IDCAMS puede definir un índice alternativo con claves únicas o no únicas. Con claves alternativas no únicas, varios registros base comparten el mismo valor alternativo. Una llamada puede posicionarse en ese valor y recorrer los registros coincidentes. Un índice sencillo de Postgres sobre surname acelera la búsqueda, pero no define un orden determinista entre apellidos iguales. El planificador puede devolver empates en otro orden después de vacuum, reconstrucciones del índice, cambios de plan o movimientos de datos. SQL no promete ningún orden sin un ORDER BY que resuelva los empates.
Modele cada ruta alternativa de forma explícita. Suponga que la aplicación heredada recorre pólizas por código de agente y que, dentro de cada agente, ha observado históricamente el orden de la clave base. Codifique ambas partes en el índice y la consulta de compatibilidad:
CREATE INDEX policy_by_agent_legacy
ON policy (agent_key_bytes, legacy_key);
SELECT legacy_key, record_image
FROM policy
WHERE (agent_key_bytes, legacy_key) >= ($1::bytea, $2::bytea)
AND agent_key_bytes = $1::bytea
ORDER BY agent_key_bytes, legacy_key
LIMIT $3;
No suponga el orden secundario. Mídalo contra la ruta de origen, incluidos grupos duplicados creados en secuencias distintas y registros cuya clave alternativa cambió después de crearse. Si el orden observado depende de un detalle interno de VSAM que no puede o no debe reproducir, declare la incompatibilidad y cambie el consumidor con una versión controlada. Un ORDER BY sin explicación añadido durante la migración solo cambia una dependencia oculta por otra.
Las actualizaciones requieren atención especial. Si un REWRITE cambia un campo de clave alternativa, VSAM mantiene el índice según su definición y configuración de actualización. En Postgres, una columna generada, un trigger o la ruta de escritura de la aplicación debe actualizar el valor correspondiente de forma atómica con el registro. Si un servicio escribe el campo analizado y otro importa imágenes brutas, centralice la derivación de claves en una función probada. Dos implementaciones acabarán discrepando en el relleno o los bytes no válidos.
Inventaríe también las rutas que existen pero parecen sin uso. Algunas son herramientas de recuperación o extracciones de auditoría que solo se ejecutan después de un fallo. Márquelas como inactivas con pruebas; no las elimine en silencio porque treinta días de trazas en línea no mostraron llamadas.
El estado del recorrido exige una regla de cursor explícita
Desde el punto de vista de la llamada, un recorrido VSAM mantiene estado. Las consultas SQL trabajan con conjuntos, así que el sustituto debe definir posición y continuación sin confiar en el estado de la conexión ni en paginación por desplazamiento.
START o STARTBR puede pedir una clave exacta, un prefijo genérico o la primera clave mayor o igual que los bytes proporcionados. Las llamadas siguientes y anteriores avanzan con respecto a esa posición. Las aplicaciones dependen del comportamiento de los límites: si el inicio devuelve un registro, solo establece posición, informa que no existe o deja el recorrido al final del archivo. El adaptador debe reproducir el contrato que utiliza realmente cada llamada.
Use paginación por claves con la tupla completa del orden heredado. Para un recorrido hacia delante sobre (alternate_key, base_key), devuelva ambos valores en un cursor opaco y reanude con una comparación estricta:
SELECT alternate_key, legacy_key, record_image
FROM customer
WHERE (alternate_key, legacy_key) > ($1::bytea, $2::bytea)
ORDER BY alternate_key, legacy_key
LIMIT $3;
Para un inicio mayor o igual, use >= solo en la solicitud inicial. Las continuaciones usan > para no repetir la última fila. El recorrido inverso cambia tanto la comparación como el orden. La paginación por desplazamiento es incorrecta porque inserciones y borrados anteriores desplazan la ventana, y porque un desplazamiento grande obliga a Postgres a recorrer filas que la aplicación ya consumió.
Las claves parciales necesitan límites a nivel de bytes, no un LIKE 'ABC%' improvisado. Para un prefijo binario fijo, calcule un límite inferior igual al prefijo con el sufijo mínimo y un límite superior exclusivo igual al siguiente prefijo posible. Si no existe siguiente prefijo porque todos los bytes son máximos, use solo el inferior y verifique el prefijo en las claves devueltas. Reúna esta lógica en un adaptador y pruebe casos vacíos, de ceros, máximos y con espacios internos.
La concurrencia obliga a elegir una política. Un recorrido VSAM largo y una secuencia de solicitudes SQL sin estado pueden ver de otra manera las inserciones o eliminaciones. Decida si el sustituto mantiene una transacción repeatable read, materializa una lista de trabajo o acepta una vista cambiante con continuación por claves. Iguale el comportamiento de origen que exige el proceso de negocio, no una imagen teórica de VSAM. Mantener una transacción de base de datos durante la sesión de pantalla de una persona suele ser un mal intercambio; materializar claves para un batch acotado suele funcionar bien.
En el batch nocturno el orden se vuelve lógica de negocio
Los programas batch suelen usar la entrada ordenada como flujo de control. El programa detecta un cambio de clave, vuelca totales, abre otro grupo de informe, arrastra el registro anterior o combina dos archivos avanzando la clave menor. Si cambia el orden, cambia el cálculo aunque todos los registros hayan llegado.
Un fallo típico empieza de forma inocente. La migración exporta todas las filas desde Postgres, los recuentos y sumas de comprobación coinciden, y la API en línea supera las pruebas de clave exacta. A la 1:00, un trabajo lee pólizas por sucursal a través de una ruta alternativa. Las claves de sucursal iguales llegan en otro orden de clave base. El programa empareja cada póliza con el siguiente registro de transacción mediante una combinación de una sola pasada. Un registro ahora se compara como menor que la clave de transacción guardada, entra en una rama de excepción e impide cuadrar el total de control. La base de datos está disponible, pero el batch sigue roto.
Otro fallo nace del orden implícito de SQL. Una persona prueba SELECT ... FROM policy WHERE status = 'A' y ve orden de clave primaria porque el plan elegido recorre un índice. Más adelante, las estadísticas de producción favorecen un recorrido secuencial. Las mismas filas llegan en orden físico. PostgreSQL siempre ha dejado claro que no hay orden garantizado sin ORDER BY; la prueba aprobó por accidente un plan, no un contrato.
Convierta cada secuencia consumida en un producto de datos explícito. Anote la ruta de origen, tupla completa de orden, codificación, regla de desempate y límite de snapshot. La consulta de extracción debe declarar todos esos puntos. Si históricamente el batch lee una generación congelada creada en un paso anterior, no lo apunte a tablas activas esperando que el aislamiento de transacciones produzca el mismo corte. Cree una tabla de staging para la ejecución o exporte bajo un snapshot declarado.
Un artefacto de paridad útil compara secuencias ordenadas, no solo hashes sin orden:
run_id: 2026-08-14-nightly
path: POLICY.BY.BRANCH
snapshot_cutoff: 2026-08-14T01:00:00Z
record_count: 184203
first_key_hex: C1F0F0F0F0F0F0F1
last_key_hex: E9F9F9F9F9F9F9F9
rolling_digest: sha256:<digest>
first_mismatch_position: <none|integer>
source_key_hex: <hex when mismatched>
target_key_hex: <hex when mismatched>
El formato muestra dónde terminó la igualdad, que es lo que una persona de ingeniería necesita de madrugada. Genere un resumen sobre bytes de clave y registro con prefijo de longitud para que los límites de campo no colisionen. Conserve recuentos y totales por grupo donde el batch use cambios de control. Una sola suma de todo el archivo indica que algo cambió; no señala qué contrato de acceso falló.
El comportamiento de las escrituras importa tanto como las lecturas
Las escrituras deben conservar la inmutabilidad de la clave, el rechazo de duplicados, el mantenimiento de índices y la traducción de estados en una sola transacción. Una migración puede copiar bien los datos y aun así dañar el recorrido de mañana si la primera actualización en línea sigue reglas distintas.
Muchas aplicaciones KSDS no cambian la clave primaria durante un REWRITE; borran el registro y escriben uno nuevo. Una API relacional puede permitir sin pensar UPDATE ... SET id = .... Decida si la capa de compatibilidad rechaza cambios de clave o implementa las consecuencias heredadas de borrar y crear, incluidos índices alternativos y auditoría. No deje la decisión a un ORM.
Traduzca de forma deliberada los fallos esperados. Clave primaria duplicada, clave alternativa única duplicada, registro inexistente, actualización obsoleta y fin del recorrido son resultados de la aplicación, no errores internos genéricos. Los valores SQLSTATE de Postgres son útiles dentro del adaptador, pero exponerlos a llamadas de la época de COBOL cambia ramas que pueden controlar reintentos o mensajes de operación. Cree una tabla pequeña de correspondencias y pruebe el estado exacto de cada operación.
El bloqueo también difiere. Una transacción de origen puede leer para actualizar, modificar el registro y reescribirlo dentro de una unidad de trabajo. El destino necesita una regla equivalente, normalmente SELECT ... FOR UPDATE seguido de una actualización con comprobación de versión. Para clientes desconectados, una columna de versión optimista puede impedir que una pantalla antigua sobrescriba un registro nuevo. Es una modernización, pero debe producir el estado visible que espera la llamada heredada hasta que esta cambie.
La escritura doble en VSAM y Postgres es una recomendación de seguridad popular, y no aconsejo convertirla en la opción predeterminada. Dos sistemas con restricciones y orden distintos crean un tercer problema de conciliación, sobre todo cuando un fallo parcial cambia una clave alternativa en un solo lado. Un registro capturado de cambios con repetición y retraso medido puede justificarse para el corte. Un periodo abierto de escritura doble oculta quién manda. Es preferible un solo escritor en un límite declarado, con una vuelta atrás ensayada que restablezca al escritor anterior y repita los cambios aceptados.
Construya la paridad sobre operaciones, secuencias y fallos
La comparación por registro es necesaria, pero no basta. El sistema de paridad debe ejecutar las operaciones de las aplicaciones, observar secuencias ordenadas y comparar el comportamiento ante fallos.
Cree datos de prueba incómodos para ambos sistemas: bytes mínimos y máximos de clave, espacios iniciales y finales, texto numérico con ceros iniciales, claves alternativas duplicadas, campos opcionales ausentes, codificaciones históricas no válidas, claves junto al límite de un prefijo y registros reescritos cuyo valor alternativo cambia. Añada después un pequeño generador aleatorio. La cobertura aleatoria nunca debe sustituir casos con nombre que explican un fallo.
Para cada contrato de acceso, ejecute esta secuencia:
- Cargue imágenes de registro idénticas en el origen de prueba y el modelo de aterrizaje de destino.
- Ejecute las operaciones exactas, mayor o igual, por prefijo, siguiente y anterior que el inventario considera válidas.
- Compare bytes de clave, bytes de registro, estado, orden y condiciones de final devueltas.
- Aplique escrituras, reescrituras, cambios de clave alternativa y borrados; después repita las lecturas.
- Ejecute el batch consumidor y compare informes, totales de control, rechazos y datos de reinicio.
Trate el tráfico de producción grabado como otro conjunto de prueba, después de eliminar o proteger campos sensibles conforme a las reglas del cliente. CodeHero verifica el comportamiento reescrito mediante un sistema de paridad contra tráfico de producción grabado, y el análisis del código completo ayuda porque el contrato atraviesa COBOL, JCL, utilidades y copybooks en vez de vivir en una sola carpeta. Eso no elimina la necesidad de casos sintéticos de límite ni de ejecuciones batch completas.
Defina la aceptación por ruta. Una búsqueda exacta puede exigir salida y estado idénticos a nivel de bytes. Un informe modernizado puede permitir cambios de formato, pero exigir los mismos miembros de grupo y totales. Un defecto corregido necesita una diferencia aprobada, no una excepción escondida en el comparador. Guarde esas decisiones junto a la prueba para que una limpieza posterior del esquema no borre por accidente una regla de compatibilidad.
Ejecute pruebas de rendimiento con las mismas formas de acceso. Una consulta que entrega la primera página correcta después de recorrer la tabla completa fallará bajo carga batch. Inspeccione EXPLAIN (ANALYZE, BUFFERS) con tamaños representativos, verifique que los índices compuestos corresponden a comparaciones y orden, y pruebe claves alternativas sesgadas donde un valor tiene muchos registros. La corrección va primero, pero un recorrido que pierde su ventana nocturna es incorrecto en producción.
El estado de reinicio forma parte del contrato de datos
Un corte batch debe conservar desde dónde puede reanudarse el trabajo, no solo qué filas contiene la base nueva. Los trabajos heredados suelen guardar la última clave, un recuento, un total de control, un nombre de generación o una señal del planificador cuyo sentido depende de la secuencia de origen. Si el destino cambia esa secuencia, el mismo punto de control puede saltar filas o procesarlas dos veces.
Empiece siguiendo los datos de reinicio a través de todo el flujo. Un programa COBOL puede guardar la última sucursal y póliza terminadas en un archivo pequeño, mientras las reglas de disposición JCL deciden si sobrevive a un abend. Un paso posterior quizá borre el punto solo después de copiar informes y validar totales. Mover los datos principales a Postgres sin reproducir esos límites de confirmación convierte un fallo recuperable en una repetición incierta.
Nunca traduzca una posición de registro de origen a un desplazamiento de Postgres. Las direcciones relativas de bytes y posiciones de intervalo de control pertenecen a la implementación VSAM, y los desplazamientos SQL son inestables cuando cambian las filas. Convierta el estado de reinicio a la tupla lógica completa, por ejemplo (branch_key_bytes, policy_key_bytes), además de la identidad de ejecución y el límite del snapshot. Reanude con una comparación estricta después de la última tupla confirmada. Si el programa antiguo relee a propósito el registro del punto y lo detecta como duplicado, conserve esa regla en el adaptador en vez de cambiar en silencio >= por >.
La escritura del punto de control y los efectos de negocio que protege necesitan un único límite atómico. Cuando un batch actualice Postgres directamente, guarde sus filas de resultado, totales y cursor siguiente en la misma transacción cuando sea viable. Cuando genere archivos para pasos posteriores, escriba salidas ligadas a la ejecución y publíquelas solo tras confirmar la base. Avanzar el cursor antes de que el archivo llegue a su ubicación final crea un hueco; publicar la salida antes de confirmar el cursor crea un duplicado al reiniciar.
Pruebe la interrupción, no se limite a debatirla. Termine el proceso de destino tras la primera fila, en medio de un grupo de claves alternativas duplicadas, justo antes de un total de grupo, después de confirmar la base pero antes de publicar la salida y durante la limpieza final del punto. Reinicie desde el estado capturado y compare los artefactos finales con una ejecución de origen sin interrupciones. El trabajo intermedio no siempre tiene que ser idéntico byte a byte, pero registros aceptados, rechazos, totales y salida publicada deben coincidir con el contrato declarado.
La vuelta atrás del corte exige la misma disciplina. Registre una marca máxima de cambios aceptados, detenga o bloquee escritores, deje terminar el trabajo en curso y demuestre qué sistema controla las escrituras antes de abrir la ventana batch. Si la vuelta devuelve el control a VSAM, repita solo cambios posteriores a su marca confirmada y compruebe luego las rutas alternativas. Una instrucción vaga de devolver el tráfico no cubre transacciones en cola, extracciones publicadas a medias ni puntos creados con el orden del destino.
Entregue a operaciones un manual con pruebas concretas: propiedad de escritura, marcas máximas de origen y destino, identificadores batch activos, última tupla confirmada, estado de publicación y comando o consulta que verifica cada valor. Ensáyelo con las mismas dependencias del planificador que en producción. El peor momento para descubrir que un archivo de reinicio contiene una clave de texto recortada es después del primer abend en destino.
Modernice solo cuando se sostenga la frontera de compatibilidad
El primer modelo Postgres seguro puede parecer menos elegante que el final. Las claves brutas, imágenes de registro, índices explícitos de compatibilidad y adaptadores conservan pruebas mientras se demuestra el comportamiento. Cuando la paridad se sostiene, modernice detrás de esa frontera con cambios medidos.
Un destino útil suele tener tres capas. La capa de aterrizaje guarda sin pérdidas los bytes importados y metadatos de origen. La capa de compatibilidad implementa lecturas, recorridos, estados y extracciones ordenadas heredadas. La capa de dominio expone tablas relacionales tipadas y API para código nuevo. Pueden compartir una base, pero sus contratos son distintos. Los servicios nuevos no deberían interpretar bytes brutos de copybooks, ni las llamadas antiguas acceder directamente a tablas cuyas claves aún cambian.
Elija la clave primaria duradera según la propiedad. Si la clave heredada es estable, compacta e identifica de verdad la entidad, conservarla puede ser razonable. Si incorpora atributos mutables, códigos de tipo sobrecargados o relleno de presentación, use una clave sustituta y conserve la heredada con una restricción única. Las claves foráneas deben apuntar a la identidad que permanece estable cuando el negocio corrige un código. Es una decisión del modelo, no una regla absoluta sobre claves naturales o sustitutas.
Retire la compatibilidad una dependencia cada vez. Cambie un consumidor a una API de dominio con orden documentado, ejecute ambas rutas por paridad y elimine después su ruta heredada del inventario. Solo cuando ninguna llamada necesite orden de bytes debe plantearse borrar índices de clave bruta o imágenes de registro. El almacenamiento es barato frente a reconstruir por qué un trabajo de fin de año ordenaba 9 antes que A.
El plan de migración debe nombrar al batch nocturno como consumidor de primera clase, con responsable, ventana de prueba, procedimiento de reinicio y límite de vuelta atrás. Si solo dice que el KSDS se convierte en tabla, no describe el trabajo. Un plan fiable indica qué contratos de bytes se conservan, qué comportamientos cambian de forma intencionada y qué prueba demuestra cada decisión antes de que el clúster antiguo deje de ser el sistema oficial.
Preguntas frecuentes
¿Puede una clave KSDS de VSAM convertirse directamente en clave primaria de Postgres?
A veces, pero solo después de que igualdad de bytes, unicidad, orden y reglas de actualización superen las pruebas de paridad. Conserve los bytes originales durante la migración aunque cree también una identidad tipada más limpia.
¿Por qué importa el orden EBCDIC después de convertir a UTF-8?
La lógica batch y de recorrido puede observar la antigua secuencia de bytes, mientras el texto de Postgres usa una intercalación sobre caracteres decodificados. Los mismos valores visibles pueden llegar en otro orden y activar distintos cambios de control.
¿Cómo deben guardarse claves alternativas VSAM duplicadas en Postgres?
Use un índice no único que incluya la clave alternativa y un desempate comprobado contra el origen. Consulte con ORDER BY sobre la tupla completa; un índice sobre el valor alternativo no define el orden de duplicados.
¿Basta con igualar recuentos y sumas de comprobación en una migración VSAM?
No. Esas comprobaciones omiten orden, posición, códigos de estado, claves parciales y mantenimiento posterior de índices. Compare resultados ordenados de operaciones y ejecute el batch real que consume los datos.
¿Qué sustituye a STARTBR y READNEXT en Postgres?
Un adaptador de compatibilidad suele convertirlos en consultas por claves sobre la tupla completa del orden heredado. La inicial establece posición exacta o mayor o igual; las posteriores reanudan estrictamente después de la última tupla.
¿Debe una migración recortar espacios de las claves VSAM?
No en la representación sin pérdidas. Puede añadir columnas normalizadas para el negocio, pero eliminar el relleno antes de la paridad puede unir claves de bytes distintas y cambiar límites de orden.
¿Puede Postgres devolver filas en orden de clave primaria sin ORDER BY?
Puede parecerlo en una prueba, pero SQL no garantiza ese orden. Cambios de plan, vacuum o reescrituras de tabla pueden producir otra secuencia. Todo consumidor que dependa del orden necesita un ORDER BY explícito.
¿Conviene escribir a VSAM y Postgres a la vez durante el corte?
Solo con un diseño definido de conciliación y una transición corta de propiedad. Para la mayoría, un escritor declarado, captura de cambios, repetición y vuelta atrás ensayada crean menos fallos ambiguos.
¿Cómo se prueba el recorrido VSAM con claves parciales?
Construya límites inferior y superior en bytes y compare casos de frontera con el origen. Incluya prefijos vacíos, espacios, ceros, valores máximos, ausencias y duplicados en ambos extremos.
¿Cuándo puede eliminarse la imagen bruta del registro VSAM?
Solo después de que todas las llamadas hayan abandonado la compatibilidad y las pruebas conservadas demuestren que el modelo tipado cubre el comportamiento necesario. Hasta entonces, la imagen bruta es la prueba para diagnosticar fallos de conversión y paridad.