Restaurer les tables supprimées

Ce document explique comment restaurer (ou annuler la suppression) d'une table supprimée dans BigQuery. Vous pouvez restaurer une table supprimée pendant la période spécifiée pour l'ensemble de données, y compris les suppressions explicites et implicites dues à l'expiration de la table. Vous pouvez également configurer la période temporelle.

Pour savoir comment restaurer un ensemble de données ou un instantané supprimé, consultez les ressources suivantes :

La période temporelle peut durer entre deux et sept jours. Une fois la période temporelle écoulée, BigQuery fournit une période de sécurité pendant laquelle les données supprimées sont automatiquement conservées pendant sept jours supplémentaires. Une fois la période de sécurité écoulée, il n'est plus possible de restaurer une table, quelle que soit la méthode utilisée, y compris pour ouvrir une demande d'assistance.

Avant de commencer

Assurez-vous de disposer des autorisations IAM (Identity and Access Management) nécessaires pour restaurer une table supprimée.

Si vous restaurez une table à partir d'un ensemble de données supprimé, vous devez recréer l'ensemble de données dans la même région où il était initialement stocké. Si vous recréez l'ensemble de données dans une autre région, la restauration de la table à l'aide de la fonctionnalité temporelle échoue.

Rôles requis

Pour obtenir les autorisations nécessaires à la restauration d'une table supprimée, demandez à votre administrateur de vous attribuer le rôle utilisateur BigQuery (roles/bigquery.user) IAM sur le projet. Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Restaurer une table

Vous pouvez restaurer une table à partir des données de l'historique en copiant les données de l'historique dans une nouvelle table. La copie des données de l'historique fonctionne même si la table a été supprimée ou a expiré, tant que vous la restaurez pendant la durée de la période temporelle.

Lorsque vous restaurez une table à partir de données historiques, tags de la table source ne sont pas copiés dans la table de destination. Les informations de partitionnement de la table ne sont pas non plus copiées dans la table de destination. Pour recréer le schéma de partitionnement de la table d'origine, vous pouvez afficher la requête de création de table initiale dans Cloud Logging et utiliser ces informations pour partitionner la table restaurée.

Vous ne pouvez restaurer qu'une table entière. Vous ne pouvez pas restaurer des partitions individuelles. Par exemple, la copie d'une partition à l'aide d'un décorateur de partition tel que bq cp mydataset.mytable$20260712@1418864998000 mydataset.mytable_restored n'est pas possible.

Vous pouvez restaurer une table supprimée, mais toujours dans la période temporelle , en copiant la table dans une nouvelle table, à l'aide du décorateur d'heure @<time>. Vous ne pouvez pas interroger une table supprimée, même si vous utilisez un décorateur d'heure. Vous devez d'abord la restaurer.

Utilisez la syntaxe suivante avec le décorateur d'heure @<time> :

  • tableid@TIMETIME correspond au nombre de millisecondes écoulées depuis l'époque Unix.
  • tableid@-TIME_OFFSET, où TIME_OFFSET est le décalage relatif par rapport à l'heure actuelle, en millisecondes.
  • tableid@0 : spécifie les données de l'historique les plus anciennes disponibles.

Pour restaurer une table, sélectionnez l'une des options suivantes :

Console

Vous ne pouvez pas annuler la suppression d'une table à l'aide de la Google Cloud console.

bq

  1. Dans la Google Cloud console, activez Cloud Shell.

    Activer Cloud Shell

    En bas de la Google Cloud console, une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement shell dans lequel Google Cloud CLI est déjà installé, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.

  2. Pour restaurer une table, commencez par déterminer un horodatage UNIX (en millisecondes) correspondant à la période d'existence de la table. Vous pouvez utiliser la commande Linux date pour générer l'horodatage Unix à partir d'une valeur d'horodatage standard :

    date -d '2023-08-04 16:00:34.456789Z' +%s000
    
  3. Exécutez ensuite la bq copy commande avec le @<time> décorateur de fonctionnalité temporelle pour effectuer l'opération de copie de table.

    Par exemple, saisissez la commande suivante pour copier la table mydataset.mytable au moment 1418864998000 dans une nouvelle table mydataset.newtable.

    bq cp mydataset.mytable@1418864998000 mydataset.newtable
    

    (Facultatif) Spécifiez l'option --location et définissez la valeur correspondant à votre emplacement.

    Vous pouvez également spécifier un décalage relatif. L'exemple suivant copie la version d'une table d'il y a une heure :

    bq cp mydataset.mytable@-3600000 mydataset.newtable
    

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Go.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

import (
	"context"
	"fmt"
	"time"

	"cloud.google.com/go/bigquery"
)

// deleteAndUndeleteTable demonstrates how to recover a deleted table by copying it from a point in time
// that predates the deletion event.
func deleteAndUndeleteTable(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	ds := client.Dataset(datasetID)
	if _, err := ds.Table(tableID).Metadata(ctx); err != nil {
		return err
	}
	// Record the current time.  We'll use this as the snapshot time
	// for recovering the table.
	snapTime := time.Now()

	// "Accidentally" delete the table.
	if err := client.Dataset(datasetID).Table(tableID).Delete(ctx); err != nil {
		return err
	}

	// Construct the restore-from tableID using a snapshot decorator.
	snapshotTableID := fmt.Sprintf("%s@%d", tableID, snapTime.UnixNano()/1e6)
	// Choose a new table ID for the recovered table data.
	recoverTableID := fmt.Sprintf("%s_recovered", tableID)

	// Construct and run a copy job.
	copier := ds.Table(recoverTableID).CopierFrom(ds.Table(snapshotTableID))
	copier.WriteDisposition = bigquery.WriteTruncate
	job, err := copier.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}

	ds.Table(recoverTableID).Delete(ctx)
	return nil
}

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.