En esta página, se describe cómo usar la recuperación de un momento determinado (PITR) para retener y recuperar datos en Spanner.
Para obtener más información, consulta Recuperación de un momento determinado.
Requisitos previos
En esta guía, se usa la base de datos y el esquema según se define en la guía de inicio rápido de Spanner. Puedes ejecutar la guía de inicio rápido para crear la base de datos y el esquema o modificar los comandos para usarlos con tu propia base de datos.
Configura el período de retención
Para configurar el período de retención de la base de datos, haz lo siguiente:
Console
Ve a la página Instancias de Spanner en la consola de Google Cloud.
Haz clic en la instancia que contiene la base de datos para abrir la página Descripción general de esa instancia.
Haz clic en la base de datos para abrir la página Descripción general.
Selecciona la pestaña Backup/Restore.
Haz clic en el ícono de lápiz en el campo Período de retención de versiones.
Ingresa una cantidad y una unidad de tiempo para el período de retención y, luego, haz clic en Actualizar.
gcloud
Actualiza el esquema de la base de datos con la instrucción ALTER DATABASE. Por ejemplo:
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER DATABASE `example-db` SET OPTIONS (version_retention_period="7d");'
Para ver el período de retención, obtén el DDL de tu base de datos:
gcloud spanner databases ddl describe example-db --instance=test-instance
Esta es la salida:
ALTER DATABASE example-db SET OPTIONS (
version_retention_period = '7d'
);
...
Bibliotecas cliente
C#
C++
Go
Java
Node.js
PHP
Python
Ruby
Notas de uso:
- El período de retención debe ser de entre 1 hora y 7 días, y puede especificarse en días, horas, minutos o segundos. Por ejemplo, los valores
1d
,24h
,1440m
y86400s
son equivalentes. - Si habilitaste el registro para la API de Spanner en tu proyecto, el evento se registra como UpdateDatabaseDdl y se puede ver en el Explorador de registros.
- Para volver al período de retención predeterminado de 1 hora, puedes configurar el
Opción de base de datos
version_retention_period
paraNULL
para GoogleSQL bases de datos, oDEFAULT
para las bases de datos de PostgreSQL. - Cuando extiendes el período de retención, el sistema no reabastece versiones anteriores de datos. Por ejemplo, si extiendes el período de retención de 1 h a 24 h, debes esperar 23 h para que el sistema acumule datos antiguos antes de poder recuperar datos de 24 h en el pasado.
Obtén el período de retención y la fecha de la versión más antigua
El recurso Database incluye los siguientes dos campos:
version_retention_period
: Es el período en el que Spanner conserva todas las versiones de los datos de la base de datos.earliest_version_time
: Es la marca de tiempo más antigua en la que se pueden leer versiones anteriores de los datos desde la base de datos. Spanner actualiza este valor de forma continua y se vuelve obsoleto en el momento en que se consulta. Si usas este valor para recuperar datos, asegúrate de tener en cuenta el tiempo desde el momento en que se consulta el valor hasta el momento en que inicias la recuperación.
Console
Ve a la página Instancias de Spanner en la consola de Google Cloud.
Haz clic en la instancia que contiene la base de datos para abrir la página Descripción general de esa instancia.
Haz clic en la base de datos para abrir la página Descripción general.
Selecciona la pestaña Backup/Restore para abrir la página Backup/Restore y mostrar el período de retención.
Haz clic en Crear para abrir la página Crear una copia de seguridad y mostrar la hora de la versión más antigua.
gcloud
Para obtener estos campos, puedes llamar a describe databases o enumerar bases de datos. Por ejemplo:
gcloud spanner databases describe example-db --instance=test-instance
Esta es la salida:
createTime: '2020-09-07T16:56:08.285140Z'
earliestVersionTime: '2020-10-07T16:56:08.285140Z'
name: projects/my-project/instances/test-instance/databases/example-db
state: READY
versionRetentionPeriod: 3d
Recupera una parte de tu base de datos
Realiza una lectura inactiva y especifica la marca de tiempo de recuperación deseada. Asegúrate de que la marca de tiempo que especifiques sea más reciente que la
earliest_version_time.
de la base de datos.gcloud
Usa execute-sql. Por ejemplo:
gcloud spanner databases execute-sql example-db --instance=test-instance --read-timestamp=2020-09-11T10:19:36.010459-07:00 --sql='SELECT * FROM SINGERS'
Bibliotecas cliente
Consulta cómo realizar lecturas inactivas.
Almacena los resultados de la consulta. Esto es necesario porque no puedes volver a escribir los resultados de la consulta en la base de datos en la misma transacción. Para pequeñas cantidades de datos, puedes imprimir en la consola o almacenarlos en la memoria. Si se trata de grandes cantidades de datos, es posible que debas escribirlos en un archivo local.
Vuelve a escribir los datos recuperados en la tabla que se debe recuperar. Por ejemplo:
gcloud
gcloud spanner rows update --instance=test-instance --database=example-db --table=Singers --data=SingerId=1,FirstName='Marc'
Para obtener más información, consulta cómo actualizar datos con gcloud.
Bibliotecas cliente
Consulta cómo actualizar datos con DML o cómo actualizar datos con mutaciones.
De manera opcional, si deseas realizar un análisis de los datos recuperados antes de volver a escribirlos, puedes crear manualmente una tabla temporal en la misma base de datos, escribir primero los datos recuperados en esta tabla temporal, realizar el análisis y, luego, leer los datos que deseas recuperar de esta tabla temporal y escribirlos en la tabla que debe recuperarse.
Recupera una base de datos completa
Para recuperar toda la base de datos, puedes usar las opciones Copia de seguridad y restablecimiento o Importar y exportar, y especificar una marca de tiempo de recuperación.
Copia de seguridad y restablecimiento
Crea una copia de seguridad y establece
version_time
con la marca de tiempo de recuperación deseada.Console
Ve a la página Detalles de la base de datos en la consola de Cloud.
En la pestaña Backup/Restore, haz clic en Create.
Marca la casilla Crear copia de seguridad desde un momento anterior.
gcloud
gcloud spanner backups create example-db-backup-1 --instance=test-instance \ --database=example-db --retention-period=1y --version-time=2021-01-22T01:10:35Z --async
Para obtener más información, consulta Crea una copia de seguridad con gcloud.
Bibliotecas cliente
C#
C++
Go
Java
Node.js
PHP
Python
Ruby
Restablece la copia de seguridad a una base de datos nueva. Ten en cuenta que Spanner conserva la configuración del período de retención de la copia de seguridad en la base de datos restablecida.
Console
Ve a la página Detalles de la instancia en la consola de Cloud.
En la pestaña Backup/Restore, selecciona una copia de seguridad y haz clic en Restore.
gcloud
gcloud spanner databases restore --async \ --destination-instance=destination-instance --destination-database=example-db-restored \ --source-instance=test-instance --source-backup=example-db-backup-1
Para obtener más información, consulta Restablece una base de datos a partir de una copia de seguridad.
Bibliotecas cliente
C#
C++
Go
Java
Node.js
PHP
Python
Ruby
Importación y exportación
Exporta la base de datos y especifica el parámetro
snapshotTime
en la marca de tiempo de recuperación deseada.Console
Ve a la página Detalles de la instancia en la consola de Cloud.
En la pestaña Importar/Exportar, haz clic en Exportar.
Marca la casilla Exportar base de datos desde un momento anterior.
Para obtener instrucciones detalladas, consulta Cómo exportar una base de datos.
gcloud
Usa la plantilla de Dataflow de [Spanner] a Avro](/dataflow/docs/guides/templates/provided-batch#cloud_spanner_to_gcs_avro) para exportar la base de datos.
gcloud dataflow jobs run JOB_NAME \ --gcs-location='gs://cloud-spanner-point-in-time-recovery/Import Export Template/export/templates/Cloud_Spanner_to_GCS_Avro' --region=DATAFLOW_REGION --parameters='instanceId=test-instance,databaseId=example-db,outputDir=YOUR_GCS_DIRECTORY,snapshotTime=2020-09-01T23:59:40.125245Z'
Notas de uso:
- Puedes hacer un seguimiento del progreso de tus trabajos de importación y exportación en la consola de Dataflow.
- Spanner garantiza que los datos exportados tendrán coherencia externa y transaccional en la marca de tiempo especificada.
- Especifica la marca de tiempo en formato RFC 3339. Por ejemplo, 2020-09-01T23:59:30.234233Z.
- Asegúrate de que la marca de tiempo que especifiques sea más reciente que la
earliest_version_time
de la base de datos. Si los datos ya no existen en la marca de tiempo especificada, recibirás un error.
Importar a una base de datos nueva
Console
Ve a la página Detalles de la instancia en la consola de Cloud.
En la pestaña Importar/Exportar, haz clic en Importar.
Para obtener instrucciones detalladas, consulta Importa archivos Avro de Spanner.
gcloud
Usa la plantilla de Dataflow de [Cloud Storage] Avro a Spanner](/dataflow/docs/guides/templates/provided-batch#gcs_avro_to_cloud_spanner) para importar los archivos Avro.
gcloud dataflow jobs run JOB_NAME \ --gcs-location='gs://cloud-spanner-point-in-time-recovery/Import Export Template/import/templates/GCS_Avro_to_Cloud_Spanner' \ --region=DATAFLOW_REGION \ --staging-location=YOUR_GCS_STAGING_LOCATION \ --parameters='instanceId=test-instance,databaseId=example-db,inputDir=YOUR_GCS_DIRECTORY'
Estima el aumento de almacenamiento
Antes de aumentar el período de retención de la versión de una base de datos, puedes estimar el aumento esperado en el uso del almacenamiento de la base de datos si sumas los bytes de transacción del período deseado. Por ejemplo, la siguiente consulta calcula la cantidad de GiB escrito en los últimos 7 días (168 h) mediante la lectura de las tablas de estadísticas de transacciones.
GoogleSQL
SELECT
SUM(bytes_per_hour) / (1024 * 1024 * 1024 ) as GiB
FROM (
SELECT
((commit_attempt_count - commit_failed_precondition_count - commit_abort_count) * avg_bytes) AS bytes_per_hour,
interval_end
FROM
spanner_sys.txn_stats_total_hour
ORDER BY
interval_end DESC
LIMIT
168);
PostgreSQL
SELECT
bph / (1024 * 1024 * 1024 ) as GiB
FROM (
SELECT
SUM(bytes_per_hour) as bph
FROM (
SELECT
((commit_attempt_count - commit_failed_precondition_count - commit_abort_count) * avg_bytes) AS bytes_per_hour,
interval_end
FROM
spanner_sys.txn_stats_total_hour
ORDER BY
interval_end DESC
LIMIT
168)
sub1) sub2;
Ten en cuenta que la consulta proporciona una estimación aproximada y puede ser imprecisa por varios motivos:
- La consulta no considera la timestamp que se debe almacenar para cada versión de los datos antiguos. Si tu base de datos consta de muchos tipos de datos pequeños, la consulta puede subestimar el aumento de almacenamiento.
- La consulta incluye todas las operaciones de escritura, pero solo las operaciones de actualización crean versiones antiguas de los datos. Si tu carga de trabajo incluye muchas operaciones de inserción, la consulta puede sobreestimar el aumento de almacenamiento.