恢复删除表。
深入探索
如需查看包含此代码示例的详细文档,请参阅以下内容:
代码示例
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。如需了解详情,请参阅 BigQuery Go API 参考文档。
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: %w", 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
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。如需了解详情,请参阅 BigQuery Java API 参考文档。
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.CopyJobConfiguration;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.Table;
import com.google.cloud.bigquery.TableId;
import org.threeten.bp.Instant;
// Sample to undeleting a table
public class UndeleteTable {
public static void main(String[] args) {
// TODO(developer): Replace these variables before running the sample.
String datasetName = "MY_DATASET_NAME";
String tableName = "MY_TABLE_TABLE";
String recoverTableName = "MY_RECOVER_TABLE_TABLE";
undeleteTable(datasetName, tableName, recoverTableName);
}
public static void undeleteTable(String datasetName, String tableName, String recoverTableName) {
try {
// Initialize client that will be used to send requests. This client only needs to be created
// once, and can be reused for multiple requests.
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
// Record the current time. We'll use this as the snapshot time
// for recovering the table.
long snapshotEpoch = Instant.now().toEpochMilli();
// ...
// "Accidentally" delete the table.
bigquery.delete(TableId.of(datasetName, tableName));
// Construct the restore-from tableID using a snapshot decorator.
String snapshotTableId = String.format("%s@%d", tableName, snapshotEpoch);
// Construct and run a copy job.
CopyJobConfiguration configuration =
CopyJobConfiguration.newBuilder(
// Choose a new table ID for the recovered table data.
TableId.of(datasetName, recoverTableName),
TableId.of(datasetName, snapshotTableId))
.build();
Job job = bigquery.create(JobInfo.of(configuration));
job = job.waitFor();
if (job.isDone() && job.getStatus().getError() == null) {
System.out.println("Undelete table recovered successfully.");
} else {
System.out.println(
"BigQuery was unable to copy the table due to an error: \n"
+ job.getStatus().getError());
return;
}
} catch (BigQueryException | InterruptedException e) {
System.out.println("Table not found. \n" + e.toString());
}
}
}
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。如需了解详情,请参阅 BigQuery Node.js API 参考文档。
// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();
async function undeleteTable() {
// Undeletes "my_table_to_undelete" from "my_dataset".
/**
* TODO(developer): Uncomment the following lines before running the sample.
*/
// const datasetId = "my_dataset";
// const tableId = "my_table_to_undelete";
// const recoveredTableId = "my_recovered_table";
/**
* TODO(developer): Choose an appropriate snapshot point as epoch milliseconds.
* For this example, we choose the current time as we're about to delete the
* table immediately afterwards.
*/
const snapshotEpoch = Date.now();
// Delete the table
await bigquery
.dataset(datasetId)
.table(tableId)
.delete();
console.log(`Table ${tableId} deleted.`);
// Construct the restore-from table ID using a snapshot decorator.
const snapshotTableId = `${tableId}@${snapshotEpoch}`;
// Construct and run a copy job.
await bigquery
.dataset(datasetId)
.table(snapshotTableId)
.copy(bigquery.dataset(datasetId).table(recoveredTableId));
console.log(
`Copied data from deleted table ${tableId} to ${recoveredTableId}`
);
}
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档。
import time
from google.cloud import bigquery
# Construct a BigQuery client object.
client = bigquery.Client()
# TODO(developer): Choose a table to recover.
# table_id = "your-project.your_dataset.your_table"
# TODO(developer): Choose a new table ID for the recovered table data.
# recovered_table_id = "your-project.your_dataset.your_table_recovered"
# TODO(developer): Choose an appropriate snapshot point as epoch
# milliseconds. For this example, we choose the current time as we're about
# to delete the table immediately afterwards.
snapshot_epoch = int(time.time() * 1000)
# ...
# "Accidentally" delete the table.
client.delete_table(table_id) # Make an API request.
# Construct the restore-from table ID using a snapshot decorator.
snapshot_table_id = "{}@{}".format(table_id, snapshot_epoch)
# Construct and run a copy job.
job = client.copy_table(
snapshot_table_id,
recovered_table_id,
# Must match the source and destination tables location.
location="US",
) # Make an API request.
job.result() # Wait for the job to complete.
print(
"Copied data from deleted table {} to {}".format(table_id, recovered_table_id)
)
后续步骤
如需搜索和过滤其他 Google Cloud 产品的代码示例,请参阅 Google Cloud 示例浏览器。