目录
一、基本原理
备份(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 集群。
通过这个功能,可以达到两个目的:
备份操作是将指定表或分区的数据,直接以 Doris 存储的文件的形式,上传到远端仓库中进行存储。Backup命令为异步操作,提交成功后需要通过 SHOW BACKUP 命令查看进度,仅支持备份 OLAP 类型的表。
当用户提交 Backup 请求后,系统内部会做如下操作:
1、快照及快照上传
快照阶段会对指定的表或分区数据文件进行快照,之后,备份都是对快照进行操作。在快照之后,对表进行的更改、导入等操作都不再影响备份的结果。快照只是对当前数据文件产生一个硬链,耗时很少。快照完成后,会开始对这些快照文件进行逐一上传,快照上传由各个 Backend 并发完成。
2、元数据准备及上传
数据文件快照上传完成后,FE 会首先将对应元数据写成本地文件,然后通过 broker 将本地元数据文件上传到远端仓库,完成最终备份作业。
恢复操作需要指定一个远端仓库中已存在的备份,然后将这个备份的内容恢复到本地集群中,RESTORE 命令为异步操作,提交成功后,需通过 SHOW RESTORE 命令查看进度,仅支持恢复 OLAP 类型的表。
当用户提交 Restore 请求后,系统内部会做如下操作:
1、在本地创建对应的元数据
这一步首先会在本地集群中,创建恢复对应的表分区等结构,创建完成后,该表可见,但是不可访问。
2、本地snapshot
这一步是将上一步创建的表做一个快照。这其实是一个空快照(因为刚创建的表是没有数据的),其目的主要是在 Backend 上产生对应的快照目录,用于之后接收从远端仓库下载的快照文件。
3、下载快照
远端仓库中的快照文件,会被下载到对应的上一步生成的快照目录中。这一步由各个 Backend 并发完成。
4、生效快照
快照下载完成后,我们要将各个快照映射为当前本地表的元数据。然后重新加载这些快照,使之生效,完成最终的恢复作业。
创建一个远端仓库路径,用于备份或恢复,该命令需要借助 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"
);
语法:
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":任务超时时间,默认为一天,单位秒。
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
);
查看最近一次 backup 作业的执行情况(完整信息可以使用Mysql Client 运行 HELP SHOW BACKUP):
查看远端仓库中已存在的备份。
如执行 SHOW SNAPSHOT ON `doris_data_bakup_repo` :
语法:
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 目前支持以下属性:
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"
);
查看最近一次 restore 作业的执行情况。
State:恢复作业当前所在阶段:
取消当前正在执行的备份作业。
取消当前正在执行的恢复作业。
删除已创建的远端仓库。删除仓库,仅仅是删除该仓库在 Doris 中的映射,不会删除实际的仓库数据。
SHOW PARTITIONS FROM table_name
和 SHOW TABLET FROM table_name
来查看各个分区的分片数量,以及各个分片的文件版本数量,来预估作业执行时间。文件数量对作业执行的时间影响非常大,所以建议在建表时,合理规划分区分桶,以避免过多的分片。SHOW BACKUP
或者 SHOW RESTORE
命令查看作业状态时,有可能会在 TaskErrMsg
一列中看到错误信息,但只要 State
列不为 CANCELLED
,则说明作业依然在继续,这些 Task 有可能会重试成功。当然,有些 Task 错误,也会直接导致作业失败。