Doris数据备份与恢复

目录

一、基本原理

备份(Backup)

恢复(Restore)

二、应用实例

1、创建远程仓库

2、备份BACKUP

Examples:

3、SHOW BACKUP

4、SHOW SNAPSHOT

5、恢复 RESTORE

Examples:

6、SHOW RESTORE

7、CANCEL BACKUP

8、CANCEL RESTORE

9、DROP REPOSITORY

三、注意事项


Doris 支持将当前数据以文件的形式,通过 broker 备份到远端存储系统中,之后可以通过 恢复 命令,从远端存储系统中将数据恢复到任意 Doris 集群。

通过这个功能,可以达到两个目的:

  1. 数据备份:Doris 可以支持将数据定期的进行快照备份
  2. 数据迁移:Doris 可以根据数据备份的快照将数据恢复到新表或不同集群间的表

一、基本原理

备份(Backup)

备份操作是将指定表或分区的数据,直接以 Doris 存储的文件的形式,上传到远端仓库中进行存储。Backup命令为异步操作,提交成功后需要通过 SHOW BACKUP 命令查看进度,仅支持备份 OLAP 类型的表

当用户提交 Backup 请求后,系统内部会做如下操作:

1、快照及快照上传

快照阶段会对指定的表或分区数据文件进行快照,之后,备份都是对快照进行操作。在快照之后,对表进行的更改、导入等操作都不再影响备份的结果。快照只是对当前数据文件产生一个硬链,耗时很少。快照完成后,会开始对这些快照文件进行逐一上传,快照上传由各个 Backend 并发完成。

2、元数据准备及上传

数据文件快照上传完成后,FE 会首先将对应元数据写成本地文件,然后通过 broker 将本地元数据文件上传到远端仓库,完成最终备份作业。

恢复(Restore)

恢复操作需要指定一个远端仓库中已存在的备份,然后将这个备份的内容恢复到本地集群中,RESTORE 命令为异步操作,提交成功后,需通过 SHOW RESTORE 命令查看进度,仅支持恢复 OLAP 类型的表。

当用户提交 Restore 请求后,系统内部会做如下操作:

1、在本地创建对应的元数据

这一步首先会在本地集群中,创建恢复对应的表分区等结构,创建完成后,该表可见,但是不可访问

2、本地snapshot

这一步是将上一步创建的表做一个快照。这其实是一个空快照(因为刚创建的表是没有数据的),其目的主要是在 Backend 上产生对应的快照目录,用于之后接收从远端仓库下载的快照文件。

3、下载快照

远端仓库中的快照文件,会被下载到对应的上一步生成的快照目录中。这一步由各个 Backend 并发完成。

4、生效快照

快照下载完成后,我们要将各个快照映射为当前本地表的元数据。然后重新加载这些快照,使之生效,完成最终的恢复作业。

二、应用实例

1、创建远程仓库

创建一个远端仓库路径,用于备份或恢复,该命令需要借助 Broker 进程访问远端存储,仅 root 或 superuser 用户可以创建仓库,创建过了就不需要再创建。

实例:创建一个名为hdfs_repo的仓库,依赖与hdfs,数据根目录为hdfs://zjyprc-hadoop-5/user/h_miui_ad/ad_bi/doris_data_backup

CREATE REPOSITORY `hdfs_repo`
WITH BROKER `hdfs_broker`
ON LOCATION "hdfs://zjy/user/h_miui_ad/ad_bi/hdfs_broker"
PROPERTIES
(
   "username" = "user",
   "password" = "password"
);

2、备份BACKUP

语法:

BACKUP SNAPSHOT [db_name].{snapshot_name}
TO `repository_name`
ON (
    `table_name` [PARTITION (`p1`, ...)],
     ...
)
PROPERTIES ("key"="value", ...);

说明:

 1). 同一数据库下只能有一个正在执行的 BACKUP 或 RESTORE 任务。
 2). ON 子句中标识需要备份的表和分区,如果不指定分区,则默认备份该表的所有分区。
 3). PROPERTIES 目前支持以下属性:
                "type" = "full":表示这是一次全量更新(默认)。
                "timeout" = "3600":任务超时时间,默认为一天,单位秒。

Examples:

1. 全量备份 example_db 下的表 example_tbl 到仓库 example_repo 中:

BACKUP SNAPSHOT example_db.snapshot_label1
TO example_repo
ON (example_tbl)
PROPERTIES ("type" = "full");

2. 全量备份 example_db 下,表 example_tbl 的 p1, p2 分区,以及表 example_tbl2 到仓库 example_repo 中:

BACKUP SNAPSHOT example_db.snapshot_label2
TO example_repo
ON
(
    example_tbl PARTITION (p1,p2),
    example_tbl2
);

3、SHOW BACKUP

查看最近一次 backup 作业的执行情况(完整信息可以使用Mysql Client 运行 HELP SHOW BACKUP):

  • JobId:本次备份作业的 id。
  • SnapshotName:用户指定的本次备份作业的名称(Label)。
  • DbName:备份作业对应的 Database。
  • State:备份作业当前所在阶段:
    • PENDING:作业初始状态。
    • SNAPSHOTING:正在进行快照操作。
    • UPLOAD_SNAPSHOT:快照结束,准备上传。
    • UPLOADING:正在上传快照。
    • SAVE_META:正在本地生成元数据文件。
    • UPLOAD_INFO:上传元数据文件和本次备份作业的信息。
    • FINISHED:备份完成。
    • CANCELLED:备份失败或被取消。

4、SHOW SNAPSHOT

查看远端仓库中已存在的备份。

如执行 SHOW SNAPSHOT ON `doris_data_bakup_repo` :

Doris数据备份与恢复_第1张图片

5、恢复 RESTORE

语法:

RESTORE SNAPSHOT [db_name].{snapshot_name}
FROM `repository_name`
ON (
     `table_name` [PARTITION (`p1`, ...)] [AS `tbl_alias`],
      ...
   )
PROPERTIES ("key"="value", ...);

说明:
1. 同一数据库下只能有一个正在执行的 BACKUP 或 RESTORE 任务。
2. ON 子句中标识需要恢复的表和分区,如果不指定分区,则默认恢复该表的所有分区。所指定的表和分区必须已存在于仓库备份中。
3. 可以通过 AS 语句将仓库中备份的表名恢复为新的表,但新表名不能已存在于数据库中,分区名称不能修改。
4. 可以将仓库中备份的表恢复替换数据库中已有的同名表,但须保证两张表的表结构完全一致。表结构包括:表名、列、分区、Rollup等等。
5. 可以指定恢复表的部分分区,系统会检查分区 Range 是否能够匹配。
6. PROPERTIES 目前支持以下属性:

  • "backup_timestamp" = "2018-05-04-16-45-08":指定了恢复对应备份的哪个时间版本,必填。该信息可以通过`SHOW SNAPSHOT ON repo;` 语句获得。
  • "replication_num" = "3":指定恢复的表或分区的副本数。默认为3。若恢复已存在的表或分区,则副本数必须和已存在表或分区的副本数相同。同时,必须有足够的 host 容纳多个副本。
  • "timeout" = "3600":任务超时时间,默认为一天,单位秒。
  • "meta_version" = 40:使用指定的 meta_version 来读取之前备份的元数据。注意,该参数作为临时方案,仅用于恢复老版本 Doris 备份的数据。最新版本的备份数据中已经包含 meta version,无需再指定。

Examples:

1. 从 example_repo 中恢复备份 snapshot_1 中的表 backup_tbl 到数据库 example_db1,时间版本为 "2018-05-04-16-45-08"。恢复为 1 个副本:

RESTORE SNAPSHOT example_db1.`snapshot_1`
FROM `example_repo`
ON ( `backup_tbl` )
PROPERTIES
(
    "backup_timestamp"="2018-05-04-16-45-08",
    "replication_num" = "1"
);

2.从 example_repo 中恢复备份 snapshot_2 中的表 backup_tbl 的分区 p1,p2,以及表 backup_tbl2 到数据库 example_db1,并重命名为 new_tbl,时间版本为 "2018-05-04-17-11-01"。默认恢复为 3 个副本:              

RESTORE SNAPSHOT example_db1.`snapshot_2`
FROM `example_repo`
ON
(
    `backup_tbl` PARTITION (`p1`, `p2`),
    `backup_tbl2` AS `new_tbl`
)
PROPERTIES
(
    "backup_timestamp"="2018-05-04-17-11-01"
);

6、SHOW RESTORE

查看最近一次 restore 作业的执行情况。

State:恢复作业当前所在阶段:

  • PENDING:作业初始状态。
  • SNAPSHOTING:正在进行本地新建表的快照操作。
  • DOWNLOAD:正在发送下载快照任务。
  • DOWNLOADING:快照正在下载。
  • COMMIT:准备生效已下载的快照。
  • COMMITTING:正在生效已下载的快照。
  • FINISHED:恢复完成。
  • CANCELLED:恢复失败或被取消。

7、CANCEL BACKUP

取消当前正在执行的备份作业。

8、CANCEL RESTORE

取消当前正在执行的恢复作业。

9、DROP REPOSITORY

删除已创建的远端仓库。删除仓库,仅仅是删除该仓库在 Doris 中的映射,不会删除实际的仓库数据。

三、注意事项

  1. 备份恢复相关的操作目前只允许拥有 ADMIN 权限的用户执行。
  2. 一个 Database 内,只允许有一个正在执行的备份或恢复作业。
  3. 备份和恢复都支持最小分区(Partition)级别的操作,当表的数据量很大时,建议按分区分别执行,以降低失败重试的代价。
  4. 因为备份恢复操作,操作的都是实际的数据文件,所以当一个表的分片过多,或者一个分片有过多的小版本时,可能即使总数据量很小,依然需要备份或恢复很长时间。用户可以通过 SHOW PARTITIONS FROM table_name 和 SHOW TABLET FROM table_name 来查看各个分区的分片数量,以及各个分片的文件版本数量,来预估作业执行时间。文件数量对作业执行的时间影响非常大,所以建议在建表时,合理规划分区分桶,以避免过多的分片。
  5. 当通过 SHOW BACKUP 或者 SHOW RESTORE 命令查看作业状态时,有可能会在 TaskErrMsg 一列中看到错误信息,但只要 State 列不为 CANCELLED,则说明作业依然在继续,这些 Task 有可能会重试成功。当然,有些 Task 错误,也会直接导致作业失败。           

你可能感兴趣的:(Doris,doris)