En esta página, se describen las consideraciones clave y los pasos que debes seguir cuando migres de Spanner a otra base de datos de dialecto de PostgreSQL si deseas mover una aplicación de Spanner o Google Cloud. También puedes usar la información de esta página si necesitas comprender o demostrar la viabilidad de mover tu base de datos, por ejemplo, para la planificación de desastres de salida forzada.
La interfaz de PostgreSQL de Spanner es la mejor opción para las aplicaciones que necesitan la opción de implementarse en otro entorno compatible con PostgreSQL, ya sea en Google Cloudo en otro lugar. Con una sintaxis familiar y clientes estándar del ecosistema de PostgreSQL, la interfaz de PostgreSQL permite que los desarrolladores y operadores usen sus conocimientos y habilidades existentes de PostgreSQL.
Usa el mismo procesamiento de consultas, coordinación de transacciones, almacenamiento distribuido y la misma infraestructura de red que el dialecto de GoogleSQL. Si necesitas una base de datos que admita la portabilidad, no estás renunciando a los beneficios de escalabilidad, coherencia o relación precio-rendimiento principales de Spanner cuando seleccionas la interfaz de PostgreSQL.
Obtén más información sobre las diferencias entre los dialectos PostgreSQL y Google SQL en Spanner.
A grandes rasgos, estos son los pasos:
- Quita las extensiones específicas de Spanner de las consultas y las sentencias DDL
- Migra el esquema
- Migra los datos
- Migra la aplicación
Consideraciones específicas de Spanner
La interfaz de PostgreSQL de Spanner admite consultas de PostgreSQL de forma predeterminada, por lo que la mayoría de las consultas de SQL que se ejecutan en una base de datos de dialecto PostgreSQL de Spanner tienen el mismo comportamiento que otras bases de datos compatibles con PostgreSQL. Con este enfoque, es probable que la cantidad de cambios de SQL y de acceso a los datos necesarios para mover una aplicación de una plataforma a otra sea baja. Esto hace que el proceso de portabilidad sea más rápido, más fácil y menos propenso a errores que una base de datos similar de dialecto de GoogleSQL.
Además de la amplia compatibilidad con PostgreSQL, la interfaz de PostgreSQL ofrece una serie de extensiones específicas de Spanner. Si usas estas extensiones en tus aplicaciones, deberás quitarlas o asignarlas a funciones de PostgreSQL de forma manual. Algunos ejemplos notables se proporcionan en las extensiones de sintaxis de consulta y las extensiones de administración de esquemas (DDL).
Extensiones de sintaxis de consulta
La interfaz de PostgreSQL de Spanner proporciona una serie de extensiones específicas de Spanner. La mayoría usa el prefijo spanner.
para la identificación. En la siguiente tabla, se enumeran estas extensiones y las
acciones que podrías necesitar realizar antes de que la misma aplicación se pueda ejecutar en una
base de datos de PostgreSQL.
Tipo de extensión | Extensiones específicas | Acciones que debes realizar antes de la migración |
Funciones específicas de Spanner |
|
Busca las funciones con el prefijo spanner. y quita estas llamadas.
|
Extensiones de tipo |
|
Quita la sintaxis VECTOR LENGTH o considera usar pgvector.
|
Sintaxis de las consultas | No es necesario realizar ninguna acción, ya que las sugerencias se representan dentro de los comentarios.
Para obtener más información sobre las consideraciones de rendimiento, consulta Migración de consultas. |
|
Procedimientos del sistema almacenados | Quita las llamadas a spanner.cancel_query() .
De manera opcional, puedes reemplazar las llamadas por un equivalente de PostgreSQL. |
|
Operaciones SET/SHOW | Se puede ignorar, ya que PostgreSQL no tiene ningún parámetro incorporado que comience con spanner. , por lo que establecer variables con ese prefijo no tiene ningún impacto en el comportamiento esperado. |
Extensiones de administración de esquemas (DDL)
Spanner ofrece una variedad de extensiones relacionadas con la administración de datos, como se describe en la página del lenguaje de definición de datos (DDL).
Extensión | Acciones que debes realizar antes de la migración |
Tablas intercaladas
Ubican datos relacionados de muchos a uno en el almacenamiento físico, lo que hace que las uniones entre ellos sean mucho más eficientes. |
Quita la cláusula INTERLEAVE IN . |
Marcas de tiempo de confirmación
Permite almacenar de forma atómica la marca de tiempo de confirmación de una transacción en una columna. |
Reemplaza SPANNER.COMMIT_TIMESTAMP por un tipo de marca de tiempo de PostgreSQL y administra la configuración de la marca de tiempo en tu aplicación, o bien quita esa columna.
|
Recuperación de un momento determinado
Brinda protección contra escrituras o eliminaciones accidentales. |
Quita todas las sentencias DDL que establezcan spanner.version_retention_period .
|
Tiempo de actividad (TTL)
Solicita la eliminación automática de registros según la antigüedad. |
Quita la cláusula TTL INTERVAL . Considera aprovechar un cron o una tarea programada para borrar periódicamente los datos desactualizados.
filas.
|
Opciones del optimizador
Establece opciones para minimizar cualquier posibilidad de regresión de rendimiento cuando cambian el optimizador de consultas o las estadísticas. |
Quita las sentencias DDL que establecen opciones de optimizador. |
Flujos de cambios
Observan y transmiten los cambios de datos de una base de datos de Spanner (inserciones, actualizaciones y eliminaciones) casi en tiempo real. |
Quita todas las sentencias DDL relacionadas con los flujos de cambios. |
Líder predeterminado
Te permite especificar el líder de tu base de datos en configuraciones de regiones dobles y múltiples. |
Quita todas las sentencias DDL que establezcan spanner.default_leader .
|
Partición geográfica
Te permite segmentar y almacenar aún más las filas en tu tabla de base de datos en diferentes configuraciones de instancias. |
Quita todas las sentencias DDL relacionadas con el particionamiento geográfico. |
Secuencias
Spanner solo admite la secuencia bit_reversed_positive . |
Reemplaza bit_reversed_positive por una secuencia disponible en PostgreSQL. |
Migración del esquema
Puedes exportar un esquema de base de datos de dialecto de PostgreSQL en la sintaxis de PostgreSQL. En el caso de las bases de datos configuradas para usar la interfaz de PostgreSQL, puedes lograrlo con psql
mediante PGAdapter, el proxy de sidecar que te permite usar controladores o bibliotecas cliente estándar de PostgreSQL para conectarte a Spanner:
psql -v ON_ERROR_STOP=1 \
--host "$PGADAPTER_HOST" \
--port "$PGADAPTER_PORT" \
--dbname "$SPANNER_DATABASE" \
-qAtX \
-c "show database ddl"
También puedes usar el siguiente comando gcloud
para generar el esquema como una secuencia de comandos SQL compatible con PostgreSQL:
gcloud spanner databases ddl describe databasename
Si la base de datos usa extensiones de esquema específicas de Spanner, como las que se analizan en Extensiones de administración de esquemas, se enumeran cuando ejecutas este comando. Debes quitarlos antes de migrar el esquema a PostgreSQL.
Migración de datos
La interfaz de PostgreSQL de Spanner admite las extensiones COPY TO STDIN
y STDOUT
de PostgreSQL con PGAdapter. Esta es una forma de cargar datos en Spanner y sacarlos de él. Obtén más información sobre el comando COPY
en la documentación de la herramienta de línea de comandos psql para Spanner.
Esta secuencia de comandos exporta cantidades menores de datos (se recomienda para menos de 100 GB de datos) de la interfaz de PostgreSQL de Spanner a la nueva base de datos de PostgreSQL:
psql -h pgadapter-host -c "COPY $TABLE TO STDOUT BINARY" | \
psql -h postgresql-host -c "COPY $TABLE FROM STDIN BINARY"
Para tablas más grandes (mayores o iguales a 100 GB de datos), puedes iniciar una exportación de Dataflow a una plantilla de CSV.
Puedes realizar migraciones de datos en tiempo real con el conector Debezium Kafka para transmitir actualizaciones de Spanner a PostgreSQL. Puedes personalizarlo aún más si usas la API de Spanner Change Streams para acceder directamente a las transmisiones de captura de datos modificados (CDC).
Migración de consultas
La interfaz de PostgreSQL para Spanner implementa gran parte de la sintaxis, las funciones y los operadores de consulta de PostgreSQL más comunes.
Si usas sugerencias en tus consultas, no es necesario que las vuelvas a escribir, ya que las sugerencias de consulta en Spanner se definen en comentarios compatibles con PostgreSQL:
SELECT s.FirstName, s.LastName,
s.SingerInfo, a.AlbumTitle, a.Charts
FROM Singers AS s
LEFT OUTER JOIN/*@JOIN_METHOD=APPLY_JOIN*/ Albums AS a
ON s.SingerId = a.SingerId;
El planificador de consultas de Spanner procesa estos comentarios, pero una base de datos de PostgreSQL los ignora, por lo que puedes incluirlos o quitarlos.
Para lograr un rendimiento óptimo en el entorno nuevo, es posible que las consultas y el esquema de la base de datos (como los índices) deban optimizarse para el entorno nuevo. Te recomendamos que ejecutes verificaciones de comparativas para confirmar esto de manera empírica.
Migración de aplicaciones
En lo que respecta a la conectividad desde tus aplicaciones, tu estrategia de migración depende de las opciones iniciales que se tomaron cuando configuraste tu aplicación para usar Spanner, como si usas controladores de PostgreSQL, controladores de Spanner o bibliotecas cliente de Spanner. En esta sección, se describen las consideraciones de cada opción.
Controladores de PostgreSQL
Spanner admite clientes comunes de PostgreSQL con PGAdaper, un proxy ligero que traduce el protocolo de red de PostgreSQL a las APIs de consulta de gRPC de bajo nivel de Spanner. Si usas uno de estos, el cambio a un destino de PostgreSQL diferente implica actualizar la cadena de conexión para que apunte directamente a la nueva base de datos de PostgreSQL en lugar del proxy de PGAdapter. Este enfoque proporciona un buen rendimiento y una gran compatibilidad, por lo que es una buena opción cuando la portabilidad es una preocupación principal. La mayoría de las consultas que se ejecutan en la interfaz de PostgreSQL de Spanner funcionan de la misma manera en otros entornos de PostgreSQL. Sin embargo, lo contrario no es necesariamente cierto. PostgreSQL admite sintaxis y funciones que Spanner no admite.
Controladores de Spanner
Estos controladores son implementaciones específicas de Spanner para lenguajes y frameworks de aplicaciones comunes. Por ejemplo, el controlador de JDBC (Java) de Spanner implementa la misma API que el controlador de JDBC de PostgreSQL, por lo que las aplicaciones que usan el controlador de JDBC de Spanner pueden actualizar su proceso de compilación para vincular el controlador de PostgreSQL integrado equivalente cuando quieran ejecutar la aplicación con PostgreSQL. Esta opción es mejor si ya usas Spanner o si buscas una solución de alto rendimiento que aproveche las funciones de Spanner, como la API de Mutations, que no se expondría con un controlador de PostgreSQL integrado. Si necesitas compatibilidad total con los controladores integrados y la portabilidad de valores, considera usar los controladores integrados de PostgreSQL con PGAdapter para garantizar cierto nivel de portabilidad de la aplicación.
Para obtener más información, consulta Controladores y ORM de PostgreSQL.
Bibliotecas cliente de Spanner
Spanner también ofrece varias bibliotecas cliente idiomáticas que proporcionan acceso directo a Spanner sin implementar o pasar por una interfaz estandarizada de PostgreSQL. Estos clientes proporcionan el máximo acceso a las funciones específicas de Spanner, pero no son compatibles con la API de los controladores de PostgreSQL. Estas opciones ofrecen el nivel más alto de rendimiento de las funciones, pero son menos portátiles que las opciones mencionadas anteriormente.
¿Qué sigue?
- Aprende a elegir entre PostgreSQL y Google SQL.
- Sigue la guía de inicio rápido para crear una base de datos de PostgreSQL y, luego, interactuar con ella.
- Obtén más información sobre la compatibilidad de Spanner con el lenguaje PostgreSQL.
- Obtén información sobre PGAdapter.
- Obtén más información sobre el repositorio de GitHub de PGAdapter.
- Revisa los problemas conocidos en la interfaz de PostgreSQL.