还原数据和时间旅行

重要

此功能在以下区域中为公共预览版westuswestus2eastuseastus2centralussouthcentralusnortheuropewesteuropeaustraliaeastbrazilsouthcanadacentralcentralindiasoutheastasiauksouth

本页介绍如何使用子实例还原数据,并在 Lakebase 数据库实例上执行时间旅行。

何时应创建子实例?

在以下方案中,创建子实例非常有用:

  • 意外数据丢失恢复: 如果一个关键表在昨天上午 10:23 被删除,你可以生成一个设置为上午 10:22 的子实例,只提取缺失的数据并将其合并回来。
  • 测试和 QA 环境: 从过去 X 天内的任何点(由还原窗口定义)克隆类似生产的环境,以验证架构更改或运行集成测试。
  • 合规性和审核: 为内部审计、财务对账或取证分析,提供一个反映过去日期数据库状态的子实例。

什么是子实例?

子实例是原始数据库实例的复制/写入克隆。 它可以从当前时间点创建,也可以从 还原窗口中的历史时间点创建。 还原窗口指定可用于执行时间点恢复的时间范围(2-35 天)。 创建数据库实例时定义还原窗口。 可以在此还原窗口中的任何时间点创建子实例,而无需等待手动快照或完整数据库导出。

创建子实例后,它可用于查询,直到删除它。 与父还原窗口无关的自动过期时间不存在。 这可确保即使父节点的还原窗口已过期,您也始终可以访问创建子实例时的时点数据。

子实例与父实例隔离。 对子实例执行的任何读取或写入都不会影响源实例。 对子实例进行的修改使用写入时复制,以便更改存储为“delta”。 这会保持未修改的数据共享,并最大程度地减少额外的存储。

创建子实例来时间回溯和恢复数据

在以下方案中,创建子实例非常有用:

  • 意外数据丢失恢复: 如果一个关键表在昨天上午 10:23 被删除,你可以生成一个设置为上午 10:22 的子实例,只提取缺失的数据并将其合并回来。
  • 测试和 QA 环境: 从过去 X 天内的任何点(由还原窗口定义)克隆类似生产的环境,以验证架构更改或运行集成测试。
  • 合规性和审核: 为内部审计、财务对账或取证分析,提供一个反映过去日期数据库状态的子实例。

分步说明

步骤 1:(可选)在父数据库实例上配置还原窗口

还原窗口的有效值为 2 到 35 天(含)。 默认窗口为 7 天。 创建实例时,可以在数据库实例上指定还原窗口。 请参阅 “创建数据库实例”。

使用 UI 或 API 修改数据库实例的还原窗口:

UI

  1. 在工作区边栏中单击 “计算 ”。
  2. 单击 Lakebase Postgres 选项卡。
  3. 选择要更新的数据库实例。
  4. 单击右上角的 “编辑 ”。
  5. “还原”窗口(天)下,设置还原窗口的天数。
  6. 单击“ 保存”。

curl

curl -s -X PATCH --header "Authorization: Bearer ${DATABRICKS_TOKEN}" $DBR_URL/database/instances/my-instance -d '{"retention_window_in_days": 14}'

步骤 2:创建子实例

在选定的还原点,子实例的角色和权限与父实例的角色和权限相同。 这可能会导致用户具有与父实例中授予的权限不匹配的权限。 查看 Azure Databricks 标识角色 并撤销对子实例的任何过时特权。

在创建常规数据库实例时,启用从父级创建以创建子实例。 请参阅 “创建和管理数据库实例”。

UI

启用 “从父级创建 ”后,还需要指定两个参数:

  • 父实例名称: 要从中创建子数据库的父实例的名称。
  • 包含来自父级的数据直到: 你希望从中获取数据的具体历史时间点。
    • 当前时间点: 这会创建一个子实例,其中包含来自数据库实例的最新数据。
    • 特定日期和时间: 这会在数据库实例的还原窗口中在特定时间点创建子实例。 子实例包含该特定时间点的所有数据。
    • 特定日志序列号: 从还原窗口中的特定预写日志(WAL)日志序列号(LSN)创建子实例。 PostgreSQL 使用 WAL 来支持恢复,并将 LSN 分配给每个 WAL 记录。 子实例包含该 WAL LSN 上的所有数据。 有关 WAL 的详细信息,请参阅 WAL 内部。 若要获取当前的 LSN 值,请参阅 备份控制函数

curl

使用数据库实例的最新数据创建子实例。

curl -s -X POST --header "Authorization: Bearer ${DATABRICKS_TOKEN}" $DBR_URL/database/instances -d '{"name": "test", "capacity": "CU_2", "parent_instance_ref": {"name": "test-child"}}'

使用 UTC 指定的特定日期和时间创建包含数据的子实例。

curl -s -X POST --header "Authorization: Bearer ${DATABRICKS_TOKEN}" $DBR_URL/database/instances -d '{"name": "test", "capacity": "CU_2", "parent_instance_ref": {"name": "test-child", "branch_timestamp":"2025-05-23T17:21:00Z"}}'

使用数据库实例的特定 WAL LSN 中的数据创建子实例。

curl -s -X POST --header "Authorization: Bearer ${DATABRICKS_TOKEN}" $DBR_URL/database/instances -d '{"name": "test", "capacity": "CU_2", "parent_instance_ref": {"name": "test-child", "lsn":"0/2A156E"}}'

Python SDK

from databricks.sdk import WorkspaceClient
from databricks.sdk.service.database import DatabaseInstance

# Initialize the Workspace client
w = WorkspaceClient()

parent_instance_name = "test-child"
instance_name = "test"

# Create a child instance using the most recent data from a database instance.
instance = w.database.create_database_instance(
    DatabaseInstance(
        name="my-database-instance",
        capacity="CU_1",
        parent_instance_ref={
            "name": parent_instance_name
        }
    )
)

# Create a child instance with data from a specific date and time, specified in UTC.
instance = w.database.create_database_instance(
    DatabaseInstance(
        name=instance_name,
        capacity="CU_1",
        parent_instance_ref={
            "name": parent_instance_name,
            "branch_timestamp": "2025-05-23T17:21:00Z"
        }
    )
)

# Create a child instance with data from a specific WAL LSN of a database instance.
instance = w.database.create_database_instance(
    DatabaseInstance(
        name=instance_name,
        capacity="CU_1",
        parent_instance_ref={
            "name": parent_instance_name,
            "lsn": "0/2A156E"
        }
    )
)

CLI

# Create a database instance from the most recent data of a parent instance
databricks database create-database-instance my-database-instance \
  --capacity CU_1 \
  --parent-instance-ref '{"name": "my-parent-instance"}'

# Create a database instance from a specific date and time, specified in UTC
databricks database create-database-instance \
  --json '{
    "name": "my-database-instance",
    "capacity": "CU_2",
    "parent_instance_ref": {
      "name": "my-parent-instance",
      "branch_timestamp": "2025-05-23T17:21:00Z"
    }
  }'

# Create a database instance from a specific WAL LSN of a parent instance
databricks database create-database-instance \
  --json '{
    "name": "my-database-instance",
    "capacity": "CU_2",
    "parent_instance_ref": {
      "name": "my-parent-instance",
      "lsn": "0/2A156E"
    }
  }'

步骤 3(可选):还原数据

在特定时间点创建子实例后,可以将子实例中的数据还原回生产实例。 这对于从意外数据丢失或损坏中恢复非常有用。

还原数据:

  1. 使用首选 PostgreSQL 客户端或连接方法连接到子实例。 请参阅 “连接”和“查询”。
  2. 编写脚本,将所需数据从子实例复制到生产实例。 该脚本应执行以下作:
    • 从子实例中查询所需的特定表或数据
    • 在生产实例中插入或更新数据
    • 根据需要处理任何冲突或数据转换
  3. 首先测试一小部分数据的还原作,以确保正确性。
  4. 运行完整还原脚本,将所有必需的数据复制回生产环境。
  5. 成功还原数据并验证生产实例是否正确后,请删除子实例。 若要删除实例,请参阅 “删除实例”。

局限性

  • 一次只能为数据库实例创建一个子实例。
  • 除非删除子实例,否则无法删除父实例。
  • 子实例专为短期测试或恢复用途而设计。 对子级或父级进行大量修改可能会导致系统削弱数据共享能力,并为子级维持一个完整的副本。 存储使用量和成本可能会增加,以匹配独立数据库实例的使用量。