Diario
Secciones
Ajustes de lectura
Ninguna voz para este idioma en este navegador.
Más voces
Código y términos técnicos en inglés
Desactivado: la voz de la página lo lee todo, sin pausa entre dos voces.
Ninguna voz para este idioma en este navegador.
Más voces
Más voces: Microsoft Edge ofrece voces naturales en línea, y Windows (Configuración › Hora e idioma › Voz), macOS y Android instalan otras.
Progreso
Sección titulada «Progreso»- Misión y un plan de 13 lecciones
- Código: scripts SQL ejecutados por
psql, programas C# y Java, todos comparados con su salida esperada porcheck.sh - CI:
postgresql-aurora-examples.ymllo ejecuta todo contra PostgreSQL en Linux y compila los programas en Windows y macOS; primer paso en verde el 2026-09-16 - Lección 1: un contenedor,
psql, bases de datos, esquemas y roles - Lección 2: tipos y modelado
- Lección 3: CTE, ventanas,
LATERAL, upserts yMERGE - Lección 4: PostgreSQL desde C# y Java
- Lección 5: índices y planes
- Lección 6: transacciones y MVCC
- Lección 7: JSON y búsqueda
- Lección 8: funciones, extensiones y pgvector
- Lección 9: particionado
- Lección 10: replicación, en tres clústeres dentro del contenedor del curso
- Lección 11: copias de seguridad, recuperación a un momento dado y
pg_upgrade - Lección 12: Aurora, según la documentación, y una conmutación por error desde C# y Java
- Lección 13: migrar desde SQL Server, a mano, con un programa y con pgloader; DMS, Babelfish y los costes según la documentación
- El curso está completo
- Todo lo relativo a AWS: cada sección de Aurora sigue por verificar
PostgreSQL 18.6 en un contenedor, Npgsql 10.0.3, pgjdbc 42.7.13, pgvector 0.8.6, pgloader compilado desde las fuentes, y SQL Server 2025 para la migración. La mayoría de las filas son un driver, una herramienta o un valor por defecto que hace algo distinto de lo que dicen la documentación o el otro driver; dos tratan de GuitarAlchemist/ga y de la propia documentación de AWS. Nada se ha reportado aguas arriba.
No hay tabla de experimentos. El diario no registra ninguna hipótesis antes de sus mediciones: las cinco reconstrucciones del índice HNSW, el umbral del objetivo de estadísticas y los tiempos de los drivers son mediciones cuya explicación se escribió después del número, y convertirlas ahora en experimentos sería inventar el supuesto al revés.
| Esperado | Lo que pasa | Dónde | Medición | Estado |
|---|---|---|---|---|
CREATE FUNCTION … BEGIN ATOMIC …; END es un solo comando, ya que sus puntos y coma están dentro del cuerpo |
Npgsql corta el texto del comando en el punto y coma del cuerpo, como entre dos sentencias, y el servidor rechaza el comando truncado | Npgsql 10.0.3, NpgsqlCommand sin parámetros |
42601: syntax error at end of input. Funciona en un NpgsqlBatch, con Npgsql.EnableSqlRewriting desactivado, o con parámetros posicionales. pgjdbc 42.7.13 reconoce BEGIN ATOMIC y no corta |
Reproducido, no reportado 2026-09-16 |
pgloader migra una columna money de SQL Server sin perder dígitos, o avisa |
Conserva dos decimales, en silencio: lee money con convert(varchar(40), [col], 0), y el estilo 0 trunca |
pgloader construido desde 231ab86, mssql-schema.lisp, líneas 212-217 |
0.0125 pasó a 0.01, sin error ni aviso. La misma ejecución perdió la restricción CHECK y convirtió INCLUDE (Conclusion) en una columna de clave |
Reproducido, no reportado 2026-09-16 |
Target Session Attributes=standby se acepta con un solo host, como pgjdbc acepta targetServerType=secondary |
Npgsql rechaza la cadena de conexión de entrada; pgjdbc la acepta y falla más tarde, al conectar | Npgsql 10.0.3, pgjdbc 42.7.13 | NotSupportedException: Target Session Attributes other then Any is only supported with multiple hosts |
Por diseño en ambos, de forma distinta 2026-09-15 |
PowerShell pasa -Duser.timezone=Asia/Tokyo a java como un solo argumento |
PowerShell 7.6 lo sigue cortando en el punto | PowerShell 7.6 | Could not find or load main class .timezone=Asia.Tokyo |
Reproducido; entre comillas, funciona 2026-09-15 |
Un DateTime de tipo no especificado da las mismas filas sea cual sea la zona horaria de la sesión |
No lanza excepción, como se esperaba, pero se envía como timestamp y se convierte en la zona horaria de la sesión |
Npgsql 10.0.3 | 82 ejecuciones o 59, según Timezone. Un DateTimeOffset con un desfase de −4 horas sí lanza ArgumentException |
Por diseño 2026-09-15 |
SET statement_timeout = '2s' termina un INSERT que espera a un standby síncrono detenido |
La espera no se interrumpe; la sentencia queda bloqueada hasta que se cancela desde fuera | PostgreSQL 18.6, replicación síncrona entre los clústeres del contenedor del curso | Diez minutos, hasta pg_cancel_backend; el aviso dice que la transacción “has already committed locally” |
Por diseño: la confirmación ya es local y solo queda la espera. El script cancela ahora la espera desde otra sesión 2026-09-16 |
pg_rewind rebobina el antiguo primario degradado contra el nuevo |
El antiguo primario ya había reciclado el segmento de WAL que pg_rewind necesita |
pg_rewind 18, el node1 del contenedor del curso |
could not open file "node1/pg_wal/000000010000000000000002" |
Reproducido; wal_keep_size = 128MB conserva el segmento 2026-09-16 |
pg_upgrade --check de un clúster 17 por defecto a un clúster 18 por defecto pasa |
initdb 18 activa las sumas de comprobación por defecto, así que los dos valores por defecto ya no coinciden |
pg_upgrade 18, initdb 18 |
Se detuvo en “old cluster does not use data checksums but the new one does” | Por diseño, valor por defecto cambiado; --no-data-checksums en el clúster nuevo 2026-09-16 |
Un índice GIN jsonb_path_ops es más pequeño que uno jsonb_ops, como la documentación dice que es lo habitual |
Con estos documentos es algo más grande | PostgreSQL 18.6, los documentos de CI copiados | 1.752 kB para jsonb_path_ops frente a 1.688 kB para jsonb_ops |
Reproducido; «lo habitual» no es «siempre» 2026-09-16 |
| Una búsqueda de vecinos más cercanos con filtro devuelve las diez filas pedidas | El recorrido HNSW reúne sus candidatos antes del filtro, ninguno lo pasa, y la consulta no devuelve nada | pgvector 0.8.6, enable_seqscan = off |
Ninguna fila donde se pedían diez: 40 candidatos, ninguno es una tríada. Reconstruir el índice cinco veces dio las mismas 40 distancias cada vez | Por diseño; hnsw.iterative_scan = strict_order devuelve las diez, y la lección lo activa 2026-09-16 |
Un script ejecutado con sqlcmd -i imprime lo mismo que las mismas sentencias con -Q |
Con -i, todo resultado que sigue a un error no capturado desaparece, cuando el error es la primera sentencia de un lote que sigue a un lote con resultados |
sqlcmd 18.6 contra SQL Server 2025 CU9 |
-Q imprimía los resultados; -i los perdía |
Reproducido, no reportado; los scripts capturan sus errores con TRY … CATCH 2026-09-16 |
Microsoft.Data.SqlClient abre una conexión desde el proyecto C# del curso |
Se niega, porque el proyecto activa InvariantGlobalization |
Microsoft.Data.SqlClient 7.0.3, OpenAsync |
Globalization Invariant Mode is not supported. |
Por diseño; el programa de migración tiene su propio proyecto 2026-09-16 |
| Un convertidor que une una lista en una cadena relee todos los elementos guardados | StringSplitOptions.RemoveEmptyEntries al releer elimina un nombre alternativo vacío |
GuitarAlchemist/ga, los convertidores de valores de MusicalKnowledgeDbContext.cs, en tres copias |
Tres nombres guardados, dos releídos | Corregido upstream por #734, fusionada el 2026-09-24, en las tres copias 2026-09-15, 2026-09-24 |
| Las páginas de AWS coinciden en una fecha de fin de vida | Dos guías dan dos fechas, y también discrepan sobre un modo por defecto | la guía de CloudWatch y el historial de la guía de usuario de Aurora | Performance Insights termina el 31 de julio de 2026 en una y el 30 de noviembre de 2025 en la otra; Database Insights está en modo Standard por defecto en una y Advanced en la otra | Reproducido en la documentación; no reportado 2026-09-16 |
2026-09-15 — Versiones
Sección titulada «2026-09-15 — Versiones»- La página de versiones de PostgreSQL indica 18.6 como versión menor actual de PostgreSQL 18, con soporte hasta el 14 de noviembre de 2030. PostgreSQL 19 está en beta. El curso fija la etiqueta de imagen
postgres:18.6-trixiey anota su digest en la página de misión. - La versión de Aurora PostgreSQL más reciente en las notas de versión de AWS es 18.4.1, del 21 de agosto de 2026. Su tabla de extensiones da
btree_gist1.6; PostgreSQL 18.6 en la imagen ofrece 1.8. - Clientes: Npgsql 10.0.3 y su proveedor EF Core 10.0.3, que requiere EF Core 10.0.4 o posterior; pgjdbc 42.7.13, HikariCP 7.1.0.
pgvectorno está en la imagen oficial: la lección 8 necesitará otra imagen o una compilación.
2026-09-15 — Arrancar el servidor
Sección titulada «2026-09-15 — Arrancar el servidor»- El primer arranque de la imagen ejecuta un servidor temporal para crear el clúster, que escucha solo en el socket Unix.
pg_isreadypor el socket respondía «accepting connections» durante ese intervalo, y el comando siguiente se topaba con un servidor que se estaba apagando.pg_isready -h 127.0.0.1pasa por TCP.server.shy el health check del servicio de CI lo usan. - Los errores de
psqlsalían antes que los resultados de las instrucciones anteriores en las salidas guardadas:psqlusa un búfer para la salida estándar, no para la de errores.server.shejecutapsqlbajostdbuf -o0, dentro del contenedor, con ambos flujos fusionados allí. - Cada script se ejecuta con
TimeZone=UTC,DateStyle=ISO, MDYylc_messages=C, fijados enPGOPTIONS, y cada consulta tiene unORDER BY.\conninfomuestra el identificador del proceso servidor, que cambia en cada ejecución: los scripts no lo usan.
2026-09-15 — Modelar el historial de CI
Sección titulada «2026-09-15 — Modelar el historial de CI»- Un rango cerrado
[started_at, completed_at]para los pasos hacía que se solaparan 2798 pares de pasos del mismo job: las horas de GitHub van al segundo, y un paso empieza en el segundo en que termina el anterior. Los rangos semiabiertos[)lo resuelven, pero 857 de los 2204 pasos se convierten en rangos vacíos, que pierden sus límites. La tabla conserva ambas marcas de tiempo y deriva el rango como columna generada almacenada. - Un
CHECKcuyo mensaje de error incluíanow()daba una salida distinta en cada ejecución; las filas de prueba usan fechas fijas. WITH TIESdevolvía las filas empatadas en un orden distinto de una ejecución a otra: unORDER BYexterno fija el orden.
2026-09-15 — Hallazgos en Guitar Alchemist
Sección titulada «2026-09-15 — Hallazgos en Guitar Alchemist»Nada de esto se ha comunicado al proyecto; son notas, con las consultas que los reproducen en las lecciones.
GA.Knowledge.Service.csprojreferenciaGA.Business.Config.fsprojdos veces, en las líneas 26 y 31, en el commit32f143c. La clave primaria dega.project_refsrechaza la segunda (lección 2).MusicalKnowledgeDbContext.csexiste en tres copias que solo difieren en su namespace, enCommon/GA.Data.EntityFramework/,Common/GA.Data.EntityFramework/Data/yCommon/GA.Infrastructure/Persistence/EntityFramework/. No encontré ninguna llamada aAddDbContextoUseSqlitepara él en ese commit, aunque hay servicios que lo inyectan.- Sus convertidores de valores guardan las listas como cadenas unidas y las vuelven a leer con
StringSplitOptions.RemoveEmptyEntries: un nombre alternativo vacío se pierde. Tres nombres guardados, dos leídos (lección 4). - En
IconicChords.yaml, tres digitaciones no tocan sus clases de altura declaradas: Blackbird no toca si y añade do♯, mi y la; la digitación Hendrix no tiene si; la digitación del Mu Major,Cadd9(no3), toca mi (lección 3, ejercicio 1). - Versiones de paquetes:
Microsoft.Extensions.Hostingse referencia en 5 versiones yMongoDB.Driveren 5; 16 paquetes tienen un máximo textual que no es su versión más alta; 13 versiones distintas no son números simples, entre ellas las flotantes0.*y8.*-*(lección 3). - Dos proyectos se llaman
GaApi.Tests.csproj, enTests/Apps/GaApi.TestsyTests/GaApi.Tests.
2026-09-15 — Los drivers
Sección titulada «2026-09-15 — Los drivers»- Npgsql: un
DateTimeconKind=Unspecifiedno lanzó una excepción, como esperaba, sino que se envió comotimestampy se convirtió en la zona horaria de la sesión: 82 ejecuciones o 59 segúnTimezone. UnDateTimeOffsetcon un desfase de −4 horas lanzaArgumentException. pg_prepared_statementscontaba la propia consulta de recuento una vez preparada; una expresión regular que no coincide con su propio texto corrigió el recuento.- EF Core construye un modelo una vez por tipo de contexto: dos configuraciones de la misma entidad en una sola clase de contexto, elegidas por un argumento del constructor, daban dos veces el primer modelo. Una subclase por configuración.
- pgjdbc envía la zona horaria de la JVM como
TimeZonede la sesión, así quegetStringsobre untimestamptzdependía de la máquina.check.shejecuta Java con-Duser.timezone=America/Toronto. - PowerShell 7.6 sigue cortando
-Duser.timezone=Asia/Tokyoen el punto: Java respondía «Could not find or load main class .timezone=Asia.Tokyo». Entre comillas, funciona. - Npgsql rechaza
Target Session Attributes=standbycon un solo host:NotSupportedException: Target Session Attributes other then Any is only supported with multiple hosts. pgjdbc aceptatargetServerType=secondarycon un host y falla al conectarse. - Una ejecución de
l04-timings: 478 comandosINSERTen un segundo aproximadamente, unNpgsqlBatchen 5 a 7 ms, unCOPYbinario en unos 50 ms. Ejecuciones anteriores ese mismo día tardaron hasta 2,2 segundos en el bucle deINSERT.
2026-09-16 — Planes que dan la misma salida en cada ejecución
Sección titulada «2026-09-16 — Planes que dan la misma salida en cada ejecución»EXPLAIN ANALYZEsobre el historial de pasos de 440 800 filas daba filas distintas por nodo de una ejecución a otra: los workers paralelos repartían las filas de forma distinta cada vez.max_parallel_workers_per_gather = 0para las lecciones que muestran planes.- Las estimaciones del planificador cambiaban tras cada
ANALYZE, que lee una muestra aleatoria de 30 000 filas con el objetivo de estadísticas por defecto. Con 1500, la muestra es de 450 000 filas, más que la tabla, y las estimaciones son exactas y estables. - La línea
Buffersrepartía las páginas entrehityreadsegún lo que las instrucciones anteriores dejaban en memoria. La función auxiliar de planes las suma en un solo número; el total no cambió tras reiniciar el contenedor. - PostgreSQL 18 imprime
BufferssinBUFFERS, los recuentos de filas con dos decimales, eIndex Searches. xminimprimía-1para la primera versión de fila: el ID de transacción guardado con\gsetse tomaba después delINSERT. Ahora se toma justo antes.pg_stat_user_tablesmostraba cero actualizaciones HOT justo después de las actualizaciones: las estadísticas se envían como mucho una vez por segundo.pg_stat_force_next_flush()corrige el recuento.
2026-09-16 — Dos sesiones en un programa
Sección titulada «2026-09-16 — Dos sesiones en un programa»- Un programa no puede esperar a que vuelva la instrucción bloqueada de B. Los programas C# y Java la lanzan, y una tercera conexión consulta
pg_stat_activityhasta que B espera un bloqueo, conpg_blocking_pidsnombrando a A. - En el ejemplo de deadlock, cualquiera de las dos sesiones podía ser la cancelada, según cuál esperara primero
deadlock_timeout. A tiene 10 segundos y B 100 ms: B detecta siempre el ciclo, y se cancela.
2026-09-16 — JSON y búsqueda
Sección titulada «2026-09-16 — JSON y búsqueda»- Un
tsvectorgenerado almacenado cuya configuración venía de otra columna generada fue rechazado: una columna generada no puede referirse a otra. La configuración es una columna normal, fijada por elINSERT. - Un índice de trigramas sobre las 478 filas de
ga.package_refsnunca se usaba, ni siquiera conenable_seqscan = off: el índice de la clave primaria era más barato. El ejemplo usa los 88 160 nombres de pasos de los documentos copiados. - Sobre estos documentos,
jsonb_path_opssalió algo más grande quejsonb_ops, 1752 kB frente a 1688 kB, lo contrario de lo que la documentación dice que es habitual. - La frase
"prepared statements"coincidió conpg_prepared_statementsen este diario: el analizador de búsqueda de texto corta en los guiones bajos.
2026-09-16 — Funciones y pgvector
Sección titulada «2026-09-16 — Funciones y pgvector»- Hallazgo, Npgsql 10.0.3. Un único
CREATE FUNCTION … BEGIN ATOMIC SELECT …; ENDen unNpgsqlCommandsin parámetros falla con42601: syntax error at end of input. Npgsql corta el texto del comando en el punto y coma de dentro del cuerpo, como hace con varias instrucciones. El mismo texto funciona en unNpgsqlBatch, con el switchNpgsql.EnableSqlRewritingafalse, o en un comando con parámetros posicionales. pgjdbc 42.7.13 detectaBEGIN ATOMICy no corta; una funciónBEGIN ATOMICseguida de otra instrucción en un soloexecutefalla entonces por tener varios comandos en una sentencia preparada. No comunicado a ninguno de los dos proyectos. - La imagen oficial no tiene pgvector. Los scripts de pgvector se ejecutan sobre
pgvector/pgvector:0.8.6-pg18-trixie, un servidor cada vez en el puerto 5432; la CI lo ejecuta como un segundo servicio, sin puerto. - Con
enable_seqscan = off, una consulta de vecinos más cercanos filtrada por tríadas no devolvía ninguna fila, donde se pedían diez: el escaneo HNSW devuelve 40 candidatos, ninguno de ellos una tríada.hnsw.iterative_scan = strict_orderdevuelve las diez. Reconstruí el índice cinco veces: las distancias de los 40 candidatos fueron las mismas cada vez. - Los vectores de clases de intervalo de los acordes icónicos muestran que el acorde Elektra es el acorde Petrushka transpuesto una tercera mayor hacia arriba, y que el acorde Foxy Lady es la inversión del acorde Joni Mitchell, cuya transposición es el acorde Debussy.
2026-09-16 — Aurora, según la documentación
Sección titulada «2026-09-16 — Aurora, según la documentación»- Aurora PostgreSQL 18.4 incluye pgvector 0.8.2, mientras que el curso ejecuta 0.8.6.
pageinspectno está en la tabla de extensiones de Aurora PostgreSQL 18. - Las páginas de AWS no coinciden sobre el fin de vida de Performance Insights: 31 de julio de 2026 en la guía de CloudWatch, 30 de noviembre de 2025 en el historial de la Aurora User Guide. Tampoco coinciden sobre si Database Insights usa por defecto el modo Standard o el Advanced.
max_standby_streaming_delay: 30 segundos en la páginaLock:Relation, 14 000 ms en la tabla de parámetros de Aurora PostgreSQL 14.
2026-09-16 — Particionado
Sección titulada «2026-09-16 — Particionado»- Una clave primaria solo sobre
idse rechaza en una tabla particionada porstarted_at; con(id, started_at)se acepta, y se comprueba partición a partición. DETACH PARTITION … CONCURRENTLYno está permitido mientras la tabla tiene una partición por defecto, y una partición por defecto que contiene una fila de octubre impide crear la partición de octubre.- El particionado por hash de 64 nombres de job dio a una partición 2,1 veces las filas de otra.
- Un procedimiento que imprimía un
regclassdespués deDROP TABLEimprimía el OID a secas: el aviso tiene que ir antes del borrado.
2026-09-16 — Varios servidores en un contenedor
Sección titulada «2026-09-16 — Varios servidores en un contenedor»- El curso ejecuta un contenedor cada vez. Las lecciones 10 y 11 arrancan pequeños clústeres dentro de él con
initdbypg_ctl, en los puertos 5433 a 5436, conshared_buffers = 32MB; la CI ejecuta los mismos scripts dentro de su contenedor de servicio. - Un script reescrito en Windows mediante el modo texto de Python acabó con finales de línea CRLF, y
bash -sen el contenedor falló en sus primeras líneas. Los archivos escritos connewline=''conservan LF. - Los clústeres de la imagen ponen su socket Unix en
/var/run/postgresql, no en/tmp: conPGHOST=/tmp, cadapsqlfallaba, y cada bucle de espera agotaba sus 30 segundos. SET statement_timeout = '2s'no terminó unINSERTque esperaba a un standby síncrono detenido: esperó diez minutos, hasta que lo cancelé conpg_cancel_backend. El script cancela ahora la espera desde otra sesión; el aviso dice que la transacción «has already committed locally».pg_rewindfalló primero concould not open file "node1/pg_wal/000000010000000000000002": el antiguo primario había reciclado el segmento que necesitaba.wal_keep_size = 128MBlo conserva.- Las estadísticas de conflictos de PostgreSQL 18 cuentan el conflicto
insert_existsde un suscriptor que tenía su propia fila; el apply worker reintenta hasta que se borra la fila.
2026-09-16 — Copias de seguridad y pg_upgrade
Sección titulada «2026-09-16 — Copias de seguridad y pg_upgrade»pg_upgrade --checkde un clúster 17 a un clúster 18 nuevo se detuvo en «old cluster does not use data checksums but the new one does»:initdb18 activa los checksums por defecto.--no-data-checksumsen el clúster nuevo lo resuelve.pg_upgrade18 conservó las seis estadísticas de columna deci.runs, no sus estadísticas extendidas;vacuumdb --analyze-only --missing-stats-onlylas reconstruyó.- La actualización necesita los binarios de PostgreSQL 17:
check.shinstalapostgresql-17desde el repositorio apt que la imagen ya usa, así que la versión menor del lado antiguo no está fijada. Las salidas solo muestran la versión mayor.
2026-09-16 — Una conmutación por error desde los drivers
Sección titulada «2026-09-16 — Una conmutación por error desde los drivers»ops/12-cluster.sharranca un primario y un standby en el contenedor del curso, publicados en los puertos 5433 y 5434. Los programas detienen el primario medianteCOPY … TO PROGRAM 'pg_ctl … -W stop'y promueven el standby conpg_promote().- En la conexión abierta antes del fallo, pgjdbc informa de
57P01, «terminating connection due to administrator command», y Npgsql «Exception while reading from stream» en Windows a través de Docker Desktop, pero unaPostgresExceptioncon57P01en la CI en Linux: la primera ejecución de la CI falló en esa línea. El programa C# imprime ahora elFullStatede la conexión,Brokenen ambos casos. - Ambos drivers guardan en caché el estado de los hosts durante 10 segundos por defecto, y sin embargo una escritura justo después de la promoción encontró el nuevo primario en los dos. No he rastreado por qué en su código fuente.
2026-09-16 — Aurora, lecciones 9 a 12
Sección titulada «2026-09-16 — Aurora, lecciones 9 a 12»- El volumen de clúster máximo: 256 TiB para Aurora PostgreSQL 15.13, 16.9, 17.5 y posteriores en la tabla de versiones de la página de cuotas, 128 TiB en la tabla de cuotas de la misma página, 256 TiB sin condición en la descripción general.
- El calendario de versiones da a PostgreSQL 18 una «community release date» del 26 de febrero de 2026, la fecha de 18.3; PostgreSQL 18.0 se publicó el 25 de septiembre de 2025.
- La página de actualizaciones de versión mayor dice que las estadísticas del optimizador no se transfieren, mientras que
pg_upgrade18 transfiere la mayoría. - Los Blue/Green Deployments y zero-ETL todavía no tienen columna de Aurora PostgreSQL 18 en sus tablas de versiones; RDS Proxy sí, desde 18.3.
- El AWS Advanced .NET Data Provider Wrapper existe, 2.2.0 en GitHub, con un dialecto Npgsql, pero la lista de drivers de AWS de la Aurora User Guide no lo menciona.
2026-09-16 — Migrar desde SQL Server
Sección titulada «2026-09-16 — Migrar desde SQL Server»- El curso está completo: 13 lecciones. SQL Server 2025 CU9 arrancó en unos segundos en su contenedor y usaba unos 450 MB en reposo; la CI lo ejecuta como contenedor de servicio junto a PostgreSQL.
sqlcmd18.6 (mssql-tools18en la imagen) descartaba todos los resultados posteriores a un error no capturado en un script ejecutado con-i, cuando el error era la primera instrucción de un lote que venía después de un lote con resultados;-Qcon las mismas instrucciones los imprimía. Los scripts capturan sus errores conTRY … CATCH.Microsoft.Data.SqlClient7.0.3 lanzóGlobalization Invariant Mode is not supported.enOpenAsyncen el proyecto C# del curso, que activaInvariantGlobalization. El programa de migración tiene su propio proyecto.- Npgsql truncó los ticks de
datetimeoffset(7)a microsegundos (.9999999a.999999); pgloader los redondeó (10:06:00.9999999 -04:00a14:06:01). - pgloader, con la imagen construida desde
231ab86, convirtió un valormoneyde0.0125en0.01, sin error ni aviso: leemoneyconconvert(varchar(40), [col], 0), y el estilo 0 conserva dos decimales (mssql-schema.lisp, líneas 212-217). También omitió la restricciónCHECKy convirtióINCLUDE (Conclusion)en una columna de clave. - El
IDENT_CURRENTde SQL Server era 6 con tres filas: dos inserts fallidos y una fila borrada habían consumido valores. - Documentación de AWS consultada el mismo día: DMS no incluye SQL Server 2025 entre sus orígenes; la tabla de parámetros y la página de collations de Babelfish dan dos collations de servidor por defecto distintas, y la página de collations sigue diciendo que PostgreSQL no admite
LIKEsobre collations no deterministas; el Babelfish de código abierto se queda en PostgreSQL 17.7 y no tiene imagen de contenedor. - La página web de precios de SQL Server 2025 de Microsoft rechazó las peticiones automatizadas; los precios vienen de su hoja de precios en PDF.
2026-09-24 — Correcciones upstream
Sección titulada «2026-09-24 — Correcciones upstream»- #734, fusionada el 2026-09-24, corrige los convertidores de listas: los 11 convertidores de listas de cadenas de las tres copias de
MusicalKnowledgeDbContextdividen sinRemoveEmptyEntries, y una columna vacía se relee como una lista vacía. Su prueba falla en los 11 con el código antiguo. Queda un límite, y la PR lo dice: una lista que solo contiene una cadena vacía se relee todavía como una lista vacía, porque las dos guardan el mismo valor de columna.
Por verificar
Sección titulada «Por verificar»- Los comandos de Linux y macOS de las lecciones 1 y 4, en esos sistemas.
- Cada sección «En Aurora»:
pg_read_filey el requisito deCONNECTparards_superuser,btree_gist1.6, el error de solo lectura en una réplica, TLS por defecto, los tokens IAM con el proveedor de contraseña periódico de Npgsql, la fijación de RDS Proxy con elDISCARD ALLde Npgsql y con las sentencias preparadas a nivel de protocolo, ypg_is_in_recovery()en una Aurora Replica. - Las lecciones 5 a 8 en Aurora: el valor por defecto de
shared_buffersen Aurora PostgreSQL 18 y la razón de que sea mayor, la gestión de planes de consulta en 18.4,hot_standby_feedbackfrenandoVACUUMen el writer, el valor por defecto demax_standby_streaming_delay, las extensiones de confianza bajords.allowed_extensions, y los escaneos iterativos de pgvector 0.8.2. - Las lecciones 9 a 12 en Aurora: pg_partman 5.4.3 en 18.4, la replicación lógica tras
rds.logical_replication, las estadísticas tras una actualización mayor a 18, los Blue/Green Deployments y zero-ETL en 18, los rangos y la pausa automática de Aurora Serverless en 18, si las conexiones inactivas de un pool impiden la pausa automática, RDS Proxy con las solicitudes de cancelación, y la duración de una conmutación por error vista desde Npgsql y pgjdbc. - Por qué Npgsql y pgjdbc encontraron enseguida el standby promovido pese a sus cachés de estado de hosts de 10 segundos.
- La lección 13 en AWS: DMS con un origen SQL Server 2025, si la validación de DMS informa de los valores
datetimeoffset(7)truncados a microsegundos, la collation de servidor por defecto de Babelfish y cómo trata los siete comportamientos de esta lección, los precios de la AWS Price List publicada el 2026-09-11, y si RDS factura una instancia SQL Server de 2 vCPU por 4 vCPU de licencia.