说明:
本文介绍如何使用 BACKUP/RESTORE 功能来进行备份及恢复操作,举例流程可以作为辅助参考,详情请参考备份与恢复的文档,说明地址:BACKUP/RESTORE。
总体流程:
- 先创建云端仓库用于备份与恢复(新老集群都要创建云端仓库,REPOSITORY名字要相同,BROKER Name需要对应集群的broker名称);
- 在老集群准备好需要进行迁移备份的表,Backup到云端仓库;
- 再从云端仓库Restore到新集群。
新集群当中不用事先创建好需要备份恢复的表,因为在进行Restore操作会自动创建。
具体步骤:
-
创建REPOSITORY远端仓库
通过 CREATE REPOSITORY
创建远端仓库,该语句用于创建仓库。仓库用于属于备份或恢复。仅 root 或 superuser 用户可以创建仓库。
CREATE [READ ONLY] REPOSITORY `repo_name`
WITH [BROKER `broker_name`]
ON LOCATION `repo_location`
PROPERTIES ("key"="value", ...);
说明:
- 仓库的创建,依赖于已存在的 broker 或者其他协议访问云存储
- 根据对象存储的类型不同,PROPERTIES 有所不同,具体见示例。
- BROKER名称可以通过
show broker
来进行查看集群的Broker名称。
根据情况可以创建不同类型的云端数据仓库,用于备份或恢复,目前支持的数据源有:
- TenCent Cos : 腾讯云对象存储。
- Apache HDFS: 社区版本 hdfs。
- Amazon S3: Amazon对象存储。
- Aliyun Oss:阿里云对象存储。
因为我们会选择不同的第三方云端来进行创建所需的备份仓库,所以需要第三方库的连接认证,这里需要我们修改 PROPERTIES
里的配置参数来进行连接,参见其中properties 的部分,具体见示例:
- Cos形式建库语句:
CREATE REPOSITORY `Cos_RepositoryName`
WITH BROKER `brokerName`
ON LOCATION "cosn://*****************"
PROPERTIES
(
"fs.cosn.userinfo.secretId" = "*************************",
"fs.cosn.userinfo.secretKey" = "******************************",
"fs.cosn.bucket.endpoint_suffix" = "cos.ap-beijing.myqcloud.com"
);
- HDFS形式建库语句:
CREATE REPOSITORY `hdfs_RepositoryName`
WITH BROKER `hdfs_broker`
ON LOCATION "hdfs://hadoop-name-node:prot/*******/******/******/"
PROPERTIES
(
"username" = "user",
"password" = "password"
);
- S3形式建库语句:
CREATE REPOSITORY `s3_RepositoryName`
WITH BROKER `hdfs_broker`
ON LOCATION "s3a://xxx"
PROPERTIES
(
"fs.s3a.access.key" = "xxx",
"fs.s3a.secret.key" = "yyy",
"fs.s3a.endpoint" = "s3-ap-northeast-1.amazonaws.com"
);
- Oss形式建库语句:
CREATE REPOSITORY `Oss_RepositoryName `
WITH BROKER `brokerName`
ON LOCATION "oss://**************"
PROPERTIES
(
"fs.oss.accessKeyId" = "xxxxxxxxxxxxxxxxxxxxxxxxxx",
"fs.oss.accessKeySecret" = "yyyyyyyyyyyyyyyyyyyy",
"fs.oss.endpoint" = "oss-cn-shenzhen-internal.aliyuncs.com"
);
说明:
- 一个集群可以创建多个仓库。只有拥有 ADMIN 权限的用户才能创建仓库。
- 任何用户都可以通过
SHOW REPOSITORIES;
命令查看已经创建的仓库。 - 在做数据迁移操作时,需要在源集群和目的集群创建完全相同的仓库,以便目的集群可以通过这个仓库,查看到源集群备份的数据快照。
- 如果需要删除已经创建好的仓库,可以参考下方的文档指令 删除云端仓库。
-
备份数据到云端仓库
-
该语句用于备份指定数据库下的数据。该命令为异步操作。提交成功后,需通过 SHOW BACKUP 命令查看进度。仅支持备份 OLAP 类型的表。
BACKUP SNAPSHOT [db_name].{snapshot_name}
TO `repository_name`
[ON|EXCLUDE] (
`table_name` [PARTITION (`p1`, ...)],
...
)
PROPERTIES ("key"="value", ...);
说明:
- 同一数据库下只能有一个正在执行的 BACKUP 或 RESTORE 任务。
- 备份操作会备份指定表或分区的基础表及物化视图,并且仅备份一副本。
- 备份操作的效率取决于数据量、Compute Node 节点数量以及文件数量。备份数据分片所在的每个 Compute Node 都会参与备份操作的上传阶段。节点数量越多,上传的效率越高,文件数据量只涉及到的分片数,以及每个分片中文件的数量。如果分片非常多,或者分片内的小文件较多,都可能增加备份操作的时间。
- ON 子句中标识需要备份的表和分区。如果不指定分区,则默认备份该表的所有分区
- EXCLUDE 子句中标识不需要备份的表和分区。备份除了指定的表或分区之外这个数据库中所有表的所有分区数据。
- PROPERTIES 目前支持以下属性:
- “type” = “full”:表示这是一次全量更新(默认,当前仅支持full)
- “timeout” = “3600”:任务超时时间,默认为一天。单位秒,最小只能调整为10min。
-
两种备份的案例为:
-
全量备份 example_db 下的表 example_tbl 到仓库 example_repo 中:
BACKUP SNAPSHOT example_db.snapshot_label1
TO example_repo
ON (example_tbl)
PROPERTIES ("type" = "full");
- 全量备份 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 任务,可以参考下方的文档指令 取消BACKUP任务。
-
查看云端仓库任务
-
可以通过
SHOW BACKUP FROM example_db;
获得example_db下最后一次BACKUP任务 ,查看云端仓库中已有的备份 ,该记录中仅显示最近一次 的BACKUP 任务。 -
各列含义如下:
名称 | 说明 |
---|---|
Jobid | 唯一作业id |
SnapshotName | 备份的名称 |
DoName | 所属数据库 |
State | 当前阶段 |
PENDING | 提交作业后的初始状态 |
SNAPSHOTING | 执行快照中 |
UPLOAD_ SNAPSHOT | 快照完成 准备上传 |
UPLOADING | 快照上传中 |
SAVE META | 将作业元信息保存为本地文件 |
UPLOAD_INFO | 上传作业元信息 |
FINISHED | 作业成功 |
CreateTime | 创建时间 |
SnapshotFinishedTime | 快照完成时间 |
UploadFinishedTime | 上传完成时间 |
FinishedTime | 完成时间 |
UnfinishedTasks | 未完成的任务 |
Progress | 进展 |
TaskErrMsg | 任务错误信息 |
Status | 状态 |
Timeout | 时长 |
-
恢复云端数据到集群
-
确认完快照信息后到新集群进行恢复操作,该语句用于将之前通过 BACKUP 命令备份的数据,恢复到指定数据库下。该命令为异步操作。提交成功后,需通过
SHOW RESTORE
命令查看进度。仅支持恢复 OLAP 类型的表。
语法:
RESTORE SNAPSHOT [db_name].{snapshot_name}
FROM `repository_name`
[ON|EXCLUDE] (
`table_name` [PARTITION (`p1`, ...)] [AS `tbl_alias`],
...
)
PROPERTIES ("key"="value", ...);
说明:
- 同一数据库下只能有一个正在执行的 BACKUP 或 RESTORE 任务。
- ON 子句中标识需要恢复的表和分区。如果不指定分区,则默认恢复该表的所有分区。所指定的表和分区必须已存在于仓库备份中。
- EXCLUDE 子句中标识不需要恢复的表和分区。除了所指定的表或分区之外仓库中所有其他表的所有分区将被恢复。
- 可以通过 AS 语句将仓库中备份的表名恢复为新的表。但新表名不能已存在于数据库中。分区名称不能修改。
- 可以将仓库中备份的表恢复替换数据库中已有的同名表,但须保证两张表的表结构完全一致。表结构包括:表名、列、分区、Rollup等等。
- 可以指定恢复表的部分分区,系统会检查分区 Range 或者 List 是否能够匹配。
- PROPERTIES 目前支持以下属性:
- “backup_timestamp” = “2022-06-01-12-09-14”:指定了恢复对应备份的哪个时间版本,必填。查看backup_timestamp语句为:
SHOW SNAPSHOT ON 云端仓库名;
- “replication_num” = “3”:指定恢复的表或分区的副本数。默认为3。若恢复已存在的表或分区,则副本数必须和已存在表或分区的副本数相同。同时,必须有足够的 host 容纳多个副本。
- “timeout” = “3600”:任务超时时间,默认为一天。单位秒。
- “backup_timestamp” = “2022-06-01-12-09-14”:指定了恢复对应备份的哪个时间版本,必填。查看backup_timestamp语句为:
-
两种种恢复的案例为:
-
从 example_repo 中恢复备份 snapshot_1 中的表 backup_tbl 到数据库 example_db1,时间版本为 “2022-06-01-12-09-14”。恢复为 1 个副本:
RESTORE SNAPSHOT example_db1.`snapshot_1`
FROM `example_repo`
ON ( `backup_tbl` )
PROPERTIES
(
"backup_timestamp"="2022-06-01-12-09-14",
"replication_num" = "1"
);
- 从 example_repo 中恢复备份 snapshot_2 中的表 backup_tbl 的分区 p1,p2,以及表 backup_tbl2 到数据库 example_db1,并重命名为 new_tbl,时间版本为 “2022-06-01-12-09-14”。默认恢复为 3 个副本:
RESTORE SNAPSHOT example_db1.`snapshot_2`
FROM `example_repo`
ON
(
`backup_tbl` PARTITION (`p1`, `p2`),
`backup_tbl2` AS `new_tbl`
)
PROPERTIES
(
"backup_timestamp"="2022-06-01-12-09-14"
);
说明:
- 同一数据库下只能有一个正在执行的恢复操作。
- 可以将仓库中备份的表恢复替换数据库中已有的同名表,但须保证两张表的表结构完全一致。表结构包括:表名、列、分区、物化视图等等。
- 当指定恢复表的部分分区时,系统会检查分区范围是否能够匹配。
- 恢复操作的效率:在集群规模相同的情况下,恢复操作的耗时基本等同于备份操作的耗时。如果想加速恢复操作,可以先通过设置
replication_num
参数,仅恢复一个副本,之后在通过调整副本数:ALTER TABLE将副本补齐。 - 如果需要取消正在执行的RESTORE 任务,可以参考下方的文档指令 取消RESTORE任务。
-
查看最近恢复的job
-
SHOW RESTORE FROM 数据库名;
进行查看job任务,到此备份恢复完成。 - 可简单执行count语句进行新老集群表数据条数对比,或者运用sum函数相加下后面的值看是否相等,来进行校验恢复是否成功。
其他
-
删除云端仓库
- 该语句用于删除一个已创建的仓库。仅 root 或 superuser 用户可以删除仓库。
语法:
DROP REPOSITORY `repo_name`;
说明:
- 删除仓库,仅仅是删除该仓库在StarRocks中的映射,不会删除实际的仓库数据。删除后,可以再次通过指定相同的 broker 和 LOCATION 映射到该仓库。
-
取消BACKUP任务
- 该语句用于取消一个正在进行的 BACKUP 任务。
语法:
CANCEL BACKUP FROM db_name;
-
取消RESTORE 任务
- 该语句用于取消一个正在进行的 RESTORE 任务。
语法:
CANCEL RESTORE FROM db_name;
注意:
- 当取消处于 COMMIT 或之后阶段的恢复左右时,可能导致被恢复的表无法访问。此时只能通过再次执行恢复作业进行数据恢复。