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 como 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 sentencia 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 la opción de base de datos
version_retention_period
enNULL
para las bases de datos de Google SQL o enDEFAULT
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 anteriores.
Obtén el período de retención y la fecha de la versión más antigua
El recurso Database incluye 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.
Haz clic en la base de datos para abrir la página Descripción general.
Selecciona la pestaña Copia de seguridad/Restablecimiento para abrir la página Copia de seguridad/Restablecimiento 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, llama a describe databases o list databases. 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 una lectura inactiva.
Almacena los resultados de la consulta. Esto es obligatorio 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. Para cantidades mayores de datos, es posible que debas escribir 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 forma opcional, si deseas realizar un análisis de los datos recuperados antes de volver a escribirlos, puedes crear una tabla temporal de forma manual 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 desde esta tabla temporal y escribirlos en la tabla que se debe recuperar.
Recupera una base de datos completa
Puedes recuperar toda la base de datos con 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
en 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 Copias de seguridad/restablecimientos, haz clic en Crear.
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 instancias en la consola de Cloud.
En la pestaña Copia de seguridad/Restablecimiento, selecciona una copia de seguridad y haz clic en Restablecer.
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 Cómo restablecer 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 instancias 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 [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 sean coherentes de forma 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 instancias en la consola de Cloud.
En la pestaña Importar/Exportar, haz clic en Importar.
Para obtener instrucciones detalladas, consulta Cómo importar archivos Avro de Spanner.
gcloud
Usa la plantilla de Dataflow [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 versiones de una base de datos, puedes estimar el aumento esperado en el uso de almacenamiento de la base de datos sumando los bytes de transacción durante el 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 tiene en cuenta la marca de tiempo 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.