Todos nos hemos encontrado o nos encontraremos finalizando un proyecto en GCP y hemos hecho limpieza en BigQuery de tablas auxiliares o temporales con las que realizamos pruebas antes de utilizar los datos de producción y hemos borrado sin querer una tabla que no debíamos o hemos modificado sus datos, viéndonos en la necesidad de tener que restaurar de nuevo toda la información a partir de una nueva carga de datos (en el mejor de los casos) o incluso perdiendo datos si por ejemplo era una tabla con datos históricos acumulados que ya no se pueden volver a regenerar y almacenar.
Ahora veremos con ejemplos dos formas de restaurar una tabla en BigQuery:
Cómo restaurar una tabla usando Snapshots
Un snapshot básicamente es una foto de la tabla en un momento concreto, siendo el recurso más recomendable para usar con tablas con datos históricos que no pueden regenerarse en caso de pérdida, si nuestro sistema origen de la información no registra el historial de los cambios producidos y únicamente tenemos el dato «vivo» (como por ejemplo el número de trabajadores de una empresa a la que damos servicio, que puede ir variando continuamente).
Para crear un snapshot de una tabla podemos ejecutar la siguiente consulta:
CREATE SNAPSHOT TABLE `project.snapshot.prueba_snapshot_saved`
CLONE `project.snapshot.prueba_snapshot`
Con esto crearemos un snapshot sin fecha de caducidad, pero es mas usual hacerlas con fecha de vencimiento, entonces la consulta se quedaría de la siguiente forma:
CREATE SNAPSHOT TABLE `project.snapshot.prueba_snapshot_saved`
CLONE `project.snapshot.prueba_snapshot`
OPTIONS (expiration_timestamp = TIMESTAMP 'TIMESTAMP_VALUE')
Teniendo en cuenta que ‘TIMESTAMP_VALUE’ tendrá un valor de fecha, por ejemplo ‘2023-04-05’.
Estas consultas suelen estar programadas para que se ejecuten cada cierto periodo de tiempo, por ejemplo cada mes a día 1 con vencimiento el ultimo día de mes.
CREATE SNAPSHOT TABLE `project.snapshot.prueba_snapshot_saved`
CLONE `project.snapshot.prueba_snapshot`
OPTIONS (
expiration_timestamp = TIMESTAMP(DATE_SUB(DATE_TRUNC(DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH), MONTH), INTERVAL 1 DAY)))
)
Para restaurar una tabla utilizando un snapshot será tan fácil como dirigirnos al dataset donde lo guardamos antes, seleccionar el snapshot y pulsar el botón de RESTABLECER, donde elegiremos en qué dataset lo restauraremos y con opción a reemplazar la tabla si se necesitase.
Cómo restaurar una tabla mediante comandos
En el caso de que no hayamos realizado snapshots podemos restaurar una tabla en BigQuery utilizando los comando de Cloud Shell si esta tabla no se eliminó hace mas de 7 días.
Para abrir la consola de Cloud Shell nos dirigiremos a la parte superior derecha y pulsaremos en el recuadro con el símbolo >_
Introduciremos el siguiente comando
bq cp "dataset.tabla"@-"milisegundos" "dataset.tabla_restaurada"
Sustituyendo «dataset.tabla» por el nombre de la tabla (y su dataset) que hemos eliminado , «dataset.tabla_restaurada» por el nombre que deseamos para la tabla recuperada y «milisegundos» por el valor correspondiente al tiempo que correspondería, desde el momento actual, al punto temporal que queremos tomar para restaurar la borrar la tabla. Por ejemplo si queremos recuperar la tabla, tal y como estaba hace 1 minuto:
bq cp dataset.tabla@-60000 dataset.tabla_restaurada
Al ejecutar el comando nos saltara una ventana para autorizar el uso del Cloud Shell, le daremos a Autorizar
Después si estamos ejecutando el comando para hacer la recuperación sobre una tabla ya existente nos pedirá si queremos reemplazarla, indicaremos Y en caso afirmativo y N en caso contrario
Con este comando no solo podremos restaurar una tabla borrada sino que podremos también restaurar un estado anterior de la tabla, en caso de realizar un delete, update o insert erróneo. Es decir, podrás recuperar una versión anterior (con el límite del máximo de 7 días admitidos), simplemente con indicar el tiempo atrás al que deseas «viajar».
Enlaces de interés
Para obtener más información te dejo los siguientes enlaces oficiales de Google