跳到主要内容

恢复

本指南介绍如何使用 Doris 的 RESTORE 语句,从已有 Repository 中的备份快照恢复数据库、表或分区,并跟踪恢复作业的执行情况。适用于数据回滚、迁移到新集群、跨库复制以及单表/分区级数据修复等场景。

适用场景

场景推荐方式说明
恢复整个快照到当前数据库恢复快照到当前数据库最常用,将快照中的全部对象恢复到当前 USE 的数据库
恢复整个快照到其他数据库恢复快照到指定数据库用于跨库迁移或在另一个数据库下复制一份数据
仅恢复快照中的某张表从快照恢复单个表只需要回滚或迁移特定一张表时使用
恢复指定分区或在恢复时为表重命名从快照恢复分区和表支持只恢复部分分区,以及恢复后通过 AS 重命名表,避免覆盖现有对象

前提条件

  • 拥有 管理员 权限以执行恢复操作。
  • 已有可用的备份快照,备份操作请参考备份
  • 已知备份所在的 Repository 名称(示例中使用 example_repo)。

恢复流程总览

  1. 在目标 Repository 中查询可用快照,获取快照名与备份时间戳。
  2. 根据业务需求,选择整库、跨库、单表或分区级别的 RESTORE 语句执行恢复。
  3. 通过 SHOW RESTORE 查看恢复作业的状态与进度,确认恢复完成。

1. 获取快照的备份时间戳

执行恢复前,需要先确定快照名(Label)以及备份完成时的时间戳。以下 SQL 用于查看名为 example_repo 的 Repository 中的现有备份:

mysql> SHOW SNAPSHOT ON example_repo;
+--------------------+---------------------+--------+
| Snapshot | Timestamp | Status |
+--------------------+---------------------+--------+
| exampledb_20241225 | 2022-04-08-15-52-29 | OK |
+--------------------+---------------------+--------+
1 row in set (0.15 sec)

输出列含义:

列名说明
Snapshot快照的 Label,由备份时指定
Timestamp快照完成时生成的时间戳,作为 RESTOREbackup_timestamp 入参
Status快照在 Repository 中的状态,OK 表示可用

2. 从快照恢复

根据要恢复的对象范围与目标位置,从下列四种方式中选择一种执行。

方式 1:恢复快照到当前数据库

将名为 example_repo 的 Repository 中、Label 为 restore_label1、时间戳为 2022-04-08-15-52-29 的快照恢复到当前数据库:

RESTORE SNAPSHOT `restore_label1`
FROM `example_repo`
PROPERTIES
(
"backup_timestamp"="2022-04-08-15-52-29"
);

方式 2:恢复快照到指定数据库

将上述快照恢复到名为 destdb 的数据库,可用于跨库迁移或在另一个数据库下保留一份数据副本:

RESTORE SNAPSHOT destdb.`restore_label1`
FROM `example_repo`
PROPERTIES
(
"backup_timestamp"="2022-04-08-15-52-29"
);

方式 3:从快照恢复单个表

example_repo 中 Label 为 restore_label1、时间戳为 2022-04-08-15-52-29 的快照中,仅恢复表 backup_tbl 到当前数据库:

RESTORE SNAPSHOT `restore_label1`
FROM `example_repo`
ON ( `backup_tbl` )
PROPERTIES
(
"backup_timestamp"="2022-04-08-15-52-29"
);

方式 4:从快照恢复分区和表

example_repo 中的备份快照 snapshot_2 恢复表 backup_tbl 的分区 p1p2,以及表 backup_tbl2,到当前数据库 example_db1,并将 backup_tbl2 重命名为 new_tbl,快照时间戳为 2018-05-04-17-11-01

RESTORE SNAPSHOT `restore_label1`
FROM `example_repo`
ON
(
`backup_tbl` PARTITION (`p1`, `p2`),
`backup_tbl2` AS `new_tbl`
)
PROPERTIES
(
"backup_timestamp"="2022-04-08-15-55-43"
);

关键参数说明

参数说明
SNAPSHOT <label>本次恢复作业的 Label,用于在 SHOW RESTORE 中识别该作业
FROM <repo>备份所在的 Repository 名称
ON ( ... )可选;指定要恢复的对象,可包含表名、PARTITION (...) 子句以及 AS <new_name> 重命名子句。省略时恢复快照内的全部对象
PROPERTIES("backup_timestamp"=...)必填;要恢复的快照时间戳,对应 SHOW SNAPSHOT 输出中的 Timestamp

3. 查看恢复作业的执行情况

通过 SHOW RESTORE 查看当前数据库下的恢复作业状态与各阶段耗时:

    mysql> SHOW RESTORE\G;
*************************** 1. row ***************************
JobId: 17891851
Label: snapshot_label1
Timestamp: 2022-04-08-15-52-29
DbName: default_cluster:example_db1
State: FINISHED
AllowLoad: false
ReplicationNum: 3
RestoreObjs: {
"name": "snapshot_label1",
"database": "example_db",
"backup_time": 1649404349050,
"content": "ALL",
"olap_table_list": [
{
"name": "backup_tbl",
"partition_names": [
"p1",
"p2"
]
}
],
"view_list": [],
"odbc_table_list": [],
"odbc_resource_list": []
}
CreateTime: 2022-04-08 15:59:01
MetaPreparedTime: 2022-04-08 15:59:02
SnapshotFinishedTime: 2022-04-08 15:59:05
DownloadFinishedTime: 2022-04-08 15:59:12
FinishedTime: 2022-04-08 15:59:18
UnfinishedTasks:
Progress:
TaskErrMsg:
Status: [OK]
Timeout: 86400
1 row in set (0.01 sec)

关键字段含义:

字段说明
JobId恢复作业的内部 ID
Label / Timestamp本次恢复对应的快照 Label 与备份时间戳
DbName目标数据库
State作业当前状态,FINISHED 表示恢复成功
RestoreObjs本次恢复包含的对象,包括表名、分区列表、视图与外表等
CreateTime 等时间字段作业创建、元数据准备、快照拉取、下载、最终完成的时间点,可用于排查耗时瓶颈
Status错误状态,[OK] 表示无异常;非 OK 时结合 TaskErrMsg 排查
Timeout作业超时时间,单位为秒