如何在 BigQuery 中获取最新的架构更改并在 7 天内恢复已删除的列

How to fetch the latest schema change in BigQuery and restore deleted column within 7 days

现在我通过以下命令获取列:

SELECT COLUMN_NAME, DATA_TYPE 
   FROM `Dataset`.INFORMATION_SCHEMA.COLUMN_FIELD_PATHS 
WHERE table_name="User"

但是如果我使用命令删除一个列:Alter TABLE user drop column blabla,根据官方文档,该列实际上并没有在 7 天内删除。如果我使用上面的命令,该列仍然存在于架构中。只是我无法将数据插入此类列并在 GCP 控制台中查看此类列。这种不一致确实会引起问题。

如果我想编写bash脚本来监控架构变化并根据它做一些操作。

我的问题是

  1. 如何在扳手中获取反映最近删除的列的正确模式?
  2. 如果列没有真正删除,有什么方法可以轻松恢复吗?
  1. 如果您想获取最近删除的列,您可以尝试通过 Cloud Logging 进行搜索。我不确定 Spanner 支持哪些工具,但如果您想使用 Bash,您可以使用 gcloud 来获取日志。尽管解析输出并获取所需信息会很困难。

    下面使用的命令获取了 google.cloud.bigquery.v2.JobService.InsertJob 的日志,因为 ALTER TABLE 被认为是 InsertJob,并根据显示 drop 的实际查询对其进行过滤。我使用的正则表达式并不严格(为了举例),我建议更新正则表达式更严格。

    gcloud logging read 'protoPayload.methodName="google.cloud.bigquery.v2.JobService.InsertJob" AND protoPayload.metadata.jobChange.job.jobConfig.queryConfig.query=~"Alter table .*drop.*"'
    

    上述命令的示例片段(列 PADDING 已从查询中删除):

    如果您有 Bash 以外的选项,我建议您创建一个 BQ sink for your logging,您可以在那里执行查询并获取这些信息。您还可以使用 Python、NodeJS 等客户端库在接收器中查询或直接在 GCP 日志记录中查询。

  2. 按照这个SO answer, you can use the time travel feature of BQ查询删除的列。答案还解释了 BQ 在 7 天内保留已删除列的行为以及立即删除该列的解决方法。查看用于检索已删除列的实际查询以及删除先前提供的列的解决方法 link.