En esta página se describen las consideraciones clave y los pasos que debes seguir para migrar de Spanner a otra base de datos con dialecto PostgreSQL si quieres sacar 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 migrar tu base de datos, por ejemplo, para la planificación de desastres en caso de salida forzada.
La interfaz 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. Gracias a la sintaxis familiar y a los clientes estándar del ecosistema de PostgreSQL, la interfaz de PostgreSQL permite a los desarrolladores y operadores usar sus conocimientos y habilidades de PostgreSQL.
Usa el mismo procesamiento de consultas, coordinación de transacciones, almacenamiento distribuido e infraestructura de red que el dialecto GoogleSQL. Si necesitas una base de datos que admita la portabilidad, no tendrás que renunciar a las ventajas principales de escalabilidad, coherencia o relación calidad-precio de Spanner al seleccionar la interfaz de PostgreSQL.
Consulta más información sobre las diferencias entre los dialectos PostgreSQL y GoogleSQL en Spanner.
A grandes rasgos, estos son los pasos que debe seguir:
- Quitar extensiones específicas de Spanner de las consultas y las instrucciones DDL
- Migrar el esquema
- Migrar los datos
- Migrar la aplicación
Consideraciones específicas de Spanner
La interfaz PostgreSQL de Spanner admite consultas de PostgreSQL de forma predeterminada, por lo que la mayoría de las consultas SQL que se ejecutan en una base de datos con dialecto PostgreSQL de Spanner tienen el mismo comportamiento que otras bases de datos compatibles con PostgreSQL. Con este enfoque, es probable que el número de cambios en SQL y en el acceso a los datos que se necesiten para migrar una aplicación de una plataforma a otra sea bajo. Esto hace que el proceso de portabilidad sea más rápido, sencillo y menos propenso a errores que una base de datos con un dialecto de GoogleSQL similar.
Además de la amplia compatibilidad con PostgreSQL, la interfaz de PostgreSQL ofrece varias extensiones específicas de Spanner. Si usas estas extensiones en tus aplicaciones, tendrás que eliminarlas o asignarlas a funciones de PostgreSQL manualmente. Algunos ejemplos destacados se indican en las secciones Extensiones de sintaxis de consulta y Extensiones de gestión de esquemas (DDL).
Extensiones de sintaxis de consulta
La interfaz PostgreSQL de Spanner proporciona varias 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 puede que tengas que llevar a cabo para que la misma aplicación se pueda ejecutar en una base de datos PostgreSQL.
Tipo de extensión | Extensiones específicas | Qué hacer antes de la migración |
Funciones específicas de Spanner |
|
Busca las funciones que tengan el prefijo spanner. y elimina estas llamadas.
|
Escribir extensiones |
|
Quita la sintaxis VECTOR LENGTH o plantéate usar pgvector.
|
Sintaxis de consulta | No es necesario que hagas nada, ya que las sugerencias se representan en los comentarios.
Para obtener más información sobre las consideraciones de rendimiento, consulta Migración de consultas. |
|
Procedimientos del sistema almacenados | Eliminar llamadas a spanner.cancel_query() .
También puedes sustituir las llamadas por un equivalente de PostgreSQL. |
|
Operaciones SET/SHOW | Se puede ignorar, ya que PostgreSQL no tiene ningún parámetro integrado que empiece por spanner. , por lo que definir variables con ese prefijo no tiene ningún impacto en el comportamiento esperado. |
Extensiones de gestión de esquemas (DDL)
Spanner ofrece una serie de extensiones relacionadas con la gestión de datos, tal como se describe en la página Lenguaje de definición de datos (DDL).
Extensión | Qué hacer antes de la migración |
Tablas intercaladas
Coloca en el mismo lugar los 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. |
Sustituye SPANNER.COMMIT_TIMESTAMP por un tipo de marca de tiempo de PostgreSQL y gestiona la configuración de la marca de tiempo en tu aplicación o elimina esa columna.
|
Recuperación a un momento dado
Ofrece protección frente a eliminaciones o escrituras accidentales. |
Elimina las instrucciones DDL que definan
spanner.version_retention_period .
|
Tiempo de vida (TTL)
Solicita la eliminación automática de registros en función de su antigüedad. |
Quita la cláusula TTL INTERVAL . Te recomendamos que utilices un cron o una tarea programada para eliminar periódicamente el contenido obsoleto.
filas.
|
Opciones del optimizador
Define opciones para minimizar cualquier posible regresión del rendimiento cuando cambien el optimizador de consultas o las estadísticas. |
Elimina las instrucciones DDL que definan opciones del optimizador. |
Flujos de cambios
Monitoriza y transmite los cambios de datos de una base de datos de Spanner (inserciones, actualizaciones y eliminaciones) casi en tiempo real. |
Elimina las instrucciones DDL relacionadas con los flujos de cambios. |
Líder predeterminado
Te permite especificar el líder de tu base de datos en configuraciones de dos y varias regiones. |
Elimina las instrucciones DDL que definan spanner.default_leader .
|
Particiones geográficas
Te permite segmentar y almacenar filas en la tabla de tu base de datos en diferentes configuraciones de instancia. |
Elimina las instrucciones DDL relacionadas con la partición geográfica. |
Secuencias
Spanner solo admite la secuencia bit_reversed_positive . |
Sustituye bit_reversed_positive por una secuencia disponible en PostgreSQL. Elimina las instrucciones DDL que definan spanner.default_sequence_kind . |
Grupos de localidades
Te permite definir una estrategia de grupo de columnas para almacenar columnas por separado o usar el almacenamiento por niveles. |
Elimina las instrucciones DDL relacionadas con los grupos de localidad. |
Índices de búsqueda
Te permite definir índices para realizar búsquedas de texto completo. |
Elimina las instrucciones DDL relacionadas con los índices de búsqueda. |
Migración de esquemas
Puede exportar un esquema de base de datos de dialecto PostgreSQL en sintaxis PostgreSQL. En las bases de datos configuradas para usar la interfaz de PostgreSQL, puedes hacerlo con psql
mediante PGAdapter, el proxy sidecar que te permite usar controladores o bibliotecas de cliente de PostgreSQL estándar 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 describen en Extensiones de gestión de esquemas, se mostrarán cuando ejecutes este comando. Debes eliminarlas antes de migrar el esquema a PostgreSQL.
Migración de datos
La interfaz PostgreSQL de Spanner admite las extensiones COPY TO STDIN
y STDOUT
de PostgreSQL mediante PGAdapter. Esta es una de las formas de cargar datos en Spanner y de extraerlos. Consulta 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 más pequeñas de datos (recomendado para menos de 100 GB de datos) desde la interfaz PostgreSQL de Spanner a la nueva base de datos PostgreSQL:
psql -h pgadapter-host -c "COPY $TABLE TO STDOUT BINARY" | \
psql -h postgresql-host -c "COPY $TABLE FROM STDIN BINARY"
En el caso de las tablas más grandes (con 100 GB de datos o más), puedes iniciar una exportación de Dataflow a una plantilla CSV.
Puedes realizar migraciones de datos activos con el conector Kafka de Debezium para transmitir actualizaciones de Spanner a PostgreSQL. Puedes personalizarlo aún más si usas la API Change Streams de Spanner para acceder directamente a los flujos de captura de datos de cambios (CDC).
Migración de consultas
La interfaz 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 tienes que volver a escribirlas, 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 eliminarlos.
Para conseguir un rendimiento óptimo en el nuevo entorno, es posible que las consultas y el esquema de la base de datos (como los índices) deban optimizarse para el nuevo entorno. Te recomendamos que hagas pruebas de rendimiento para confirmarlo de forma empírica.
Migración de aplicaciones
En lo que respecta a la conectividad de tus aplicaciones, tu estrategia de migración depende de las decisiones iniciales que hayas tomado al configurar tu aplicación para usar Spanner, como si usas controladores de PostgreSQL, controladores de Spanner o bibliotecas de cliente de Spanner. En esta sección se describen las consideraciones de cada opción.
Controladores de PostgreSQL
Spanner admite clientes comunes de PostgreSQL mediante PGAdapter, un proxy ligero que traduce el protocolo de conexión de PostgreSQL a las APIs de consulta gRPC de bajo nivel de Spanner. Si usas uno de estos, para cambiar a otro destino de PostgreSQL, debes actualizar tu cadena de conexión para que apunte directamente a la nueva base de datos de PostgreSQL en lugar de al proxy PGAdapter. Este enfoque ofrece un buen rendimiento y una gran compatibilidad, por lo que es adecuado cuando la portabilidad es una prioridad. La mayoría de las consultas que se ejecutan en la interfaz PostgreSQL de Spanner funcionan igual en otros entornos de PostgreSQL. Sin embargo, no tiene por qué ser así, ya que 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 JDBC (Java) de Spanner implementa la misma API que el controlador JDBC de PostgreSQL, por lo que las aplicaciones que usan el controlador 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 la más adecuada si ya usas Spanner o si buscas una solución de alto rendimiento que aproveche las funciones de Spanner, como la API Mutations, que no se expondría con un controlador de PostgreSQL integrado. Si necesitas una compatibilidad total con los controladores integrados y la portabilidad de valores, te recomendamos que utilices los controladores integrados de PostgreSQL con PGAdapter para asegurar un cierto nivel de portabilidad de la aplicación.
Para obtener más información, consulta Controladores y ORMs de PostgreSQL.
Bibliotecas de cliente de Spanner
Spanner también ofrece varias bibliotecas de cliente idiomáticas que proporcionan acceso directo a Spanner sin implementar ni usar 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 mayor nivel de rendimiento de las funciones, pero son menos portátiles que las opciones mencionadas anteriormente.
Siguientes pasos
- Consulta cómo elegir entre PostgreSQL y GoogleSQL.
- Sigue la guía de inicio rápido para crear una base de datos PostgreSQL e interactuar con ella.
- Más información sobre la compatibilidad con el lenguaje PostgreSQL de Spanner
- Consulta información sobre PGAdapter.
- Consulta información sobre el repositorio de GitHub de PGAdapter.
- Consulta los problemas conocidos de la interfaz de PostgreSQL.