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 usan la base de datos y el esquema como se definen en la guía de inicio rápido de Cloud Spanner. Puedes ejecutar la guía de inicio rápido para crear la base de datos y el esquema, o modificar los comandos y usarlos en 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:
Consola
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.
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
Nodo
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 Cloud Spanner en tu proyecto, el evento se registra como UpdateDatabaseDdl y se puede ver en el Explorador de registros.
- Si quieres volver al período de retención predeterminado de 1 hora, puedes configurar la opción de base de datos
version_retention_period
comoNULL
para las bases de datos de Google SQL 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 los 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 Cloud 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. Cloud 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 que transcurre desde el momento en que se consulta el valor hasta el momento en que inicias la recuperación.
Consola
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 fecha de la versión más antigua.
gcloud
Para obtener estos campos, llama a describe bases de datos o enumera las 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
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. Para grandes cantidades de datos, es posible que debas escribir en un archivo local.
Vuelve a escribir los datos recuperados en la tabla que deben recuperarse. 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 mediante DML o cómo actualizar datos mediante mutaciones.
Opcionalmente, si deseas realizar un análisis de los datos recuperados antes de volver a escribir, puedes crear manualmente una tabla temporay en la misma base de datos, escribir primero los datos recuperados en esta tabla temporal, hacer 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
en la marca de tiempo de recuperación deseada.Consola
Ve a la página Detalles de la base de datos en la consola de Cloud.
En la pestaña Copia de seguridad/restablecimiento, haz clic en Crear.
Marca la casilla Crear una 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
Nodo
PHP
Python
Ruby
Restablece de 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.
Consola
Ve a la página Detalles de la instancia 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 Restablece una base de datos a partir de una copia de seguridad.
Bibliotecas cliente
C#
C++
Go
Java
Nodo
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.Consola
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 Cloud Spanner a 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:
- Puede hacer un seguimiento del progreso de sus trabajos de importación y exportación en la consola de Dataflow.
- Cloud 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.
Importa a una nueva base de datos.
Consola
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 Cloud Spanner.
gcloud
Usa la plantilla de Dataflow Cloud Storage Avro a 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'
Estimar 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. Para ello, suma los bytes de transacción del período deseado. Por ejemplo, la siguiente consulta calcula la cantidad de GiB escritos 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 inexacta por algunos motivos:
- La consulta no considera la marca de tiempo que debe almacenarse 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 datos. Si tu carga de trabajo incluye muchas operaciones de inserción, la consulta puede sobreestimar el aumento de almacenamiento.