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 bases de datos con dialecto de GoogleSQL y bases de datos con dialecto de PostgreSQL.
Para obtener más información, consulta Recuperación de un momento determinado.
Requisitos previos
En esta guía, se usan la base de datos y el esquema definidos en la guía de inicio rápido de Spanner. Puedes ejecutar el inicio rápido para crear la base de datos y el esquema, o bien modificar los comandos para usarlos con tu propia base de datos.
Configura el período de retención
Para establecer el período de retención de tu base de datos, haz lo siguiente:
Console
Ve a la página Instancias de Spanner en la consola deGoogle Cloud .
Haz clic en la instancia que contiene la base de datos para abrir su página de Descripción general.
Haz clic en la base de datos para abrir su página Descripción general.
Selecciona la pestaña Copia de seguridad/Restablecimiento.
Haz clic en el ícono de lápiz en el campo Período de retención de la versión.
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 se puede especificar 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 registrará como UpdateDatabaseDdl y se podrá ver en el Explorador de registros.
- Para volver al período de retención predeterminado de 1 hora, puedes establecer la opción de base de datos
version_retention_period
enNULL
para las bases de datos de GoogleSQL o enDEFAULT
para las bases de datos de PostgreSQL. - Cuando extiendes el período de retención, el sistema no completa las versiones anteriores de los datos. Por ejemplo, si extiendes el período de retención de una hora a 24 horas, debes esperar 23 horas para que el sistema acumule datos antiguos antes de poder recuperar datos de las últimas 24 horas.
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 retiene 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 de 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 su página de Descripción general.
Haz clic en la base de datos para abrir su página Descripción general.
Selecciona la pestaña Copia de seguridad/Restablecimientos para abrir la página Copia de seguridad/Restablecimientos 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
Puedes obtener estos campos llamando 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 necesaria. Asegúrate de que la marca de tiempo que especifiques sea más reciente que
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 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 cantidades pequeñas de datos, puedes imprimirlos en la consola o almacenarlos en la memoria. Para cantidades más grandes de datos, es posible que debas escribir en un archivo local.
Escribe 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
Para obtener más información, consulta cómo actualizar datos con DML o cómo actualizar datos con mutaciones.
De forma opcional, si deseas analizar 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 se debe recuperar.
Recupera una base de datos completa
Puedes recuperar toda la base de datos con Backup and Restore o Import and Export y especificar una marca de tiempo de recuperación.
Copia de seguridad y restablecimiento
Crea una copia de seguridad y configura
version_time
en la marca de tiempo de recuperación necesaria.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 en 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/Restablecimientos, 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 necesaria.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 Export database from an earlier point in time.
Para obtener instrucciones detalladas, consulta cómo exportar una base de datos.
gcloud
Usa la plantilla de Dataflow Spanner to 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
earliest_version_time
de la base de datos. Si los datos ya no existen en la marca de tiempo especificada, recibirás un error.
Importa 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 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 del almacenamiento de la base de datos sumando los bytes de transacción para el período necesario. Por ejemplo, la siguiente consulta calcula la cantidad de GiB escritos en los últimos 7 días (168 h) a partir de 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 búsqueda proporciona una estimación aproximada y puede ser inexacta 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, es posible que la consulta subestime el aumento de almacenamiento.
- La consulta incluye todas las operaciones de escritura, pero solo las operaciones de actualización crean versiones anteriores de los datos. Si tu carga de trabajo incluye muchas operaciones de inserción, es posible que la consulta sobreestime el aumento de almacenamiento.