BACKUP/RESTORE操作流程案例文档

说明:

本文介绍如何使用 BACKUP/RESTORE 功能来进行备份及恢复操作,举例流程可以作为辅助参考,详情请参考备份与恢复的文档,说明地址:BACKUP/RESTORE

总体流程:

  1. 先创建云端仓库用于备份与恢复(新老集群都要创建云端仓库,REPOSITORY名字要相同,BROKER Name需要对应集群的broker名称);
  2. 在老集群准备好需要进行迁移备份的表,Backup到云端仓库;
  3. 再从云端仓库Restore到新集群。

新集群当中不用事先创建好需要备份恢复的表,因为在进行Restore操作会自动创建。

具体步骤:

  1. 创建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名称。

根据情况可以创建不同类型的云端数据仓库,用于备份或恢复,目前支持的数据源有:

  1. TenCent Cos : 腾讯云对象存储。
  2. Apache HDFS: 社区版本 hdfs。
  3. Amazon S3: Amazon对象存储。
  4. Aliyun Oss:阿里云对象存储。

因为我们会选择不同的第三方云端来进行创建所需的备份仓库,所以需要第三方库的连接认证,这里需要我们修改 PROPERTIES 里的配置参数来进行连接,参见其中properties 的部分,具体见示例:

  1. 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"
);
  1. HDFS形式建库语句:
CREATE REPOSITORY `hdfs_RepositoryName`
WITH BROKER `hdfs_broker`
ON LOCATION "hdfs://hadoop-name-node:prot/*******/******/******/"
PROPERTIES
(
    "username" = "user",
    "password" = "password"
);
  1. 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"
);
  1. 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; 命令查看已经创建的仓库。
  • 在做数据迁移操作时,需要在源集群和目的集群创建完全相同的仓库,以便目的集群可以通过这个仓库,查看到源集群备份的数据快照。
  • 如果需要删除已经创建好的仓库,可以参考下方的文档指令 删除云端仓库
  1. 备份数据到云端仓库

  2. 该语句用于备份指定数据库下的数据。该命令为异步操作。提交成功后,需通过 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。
  1. 两种备份的案例为:

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

BACKUP SNAPSHOT example_db.snapshot_label1
TO example_repo
ON (example_tbl)
PROPERTIES ("type" = "full");
  1. 全量备份 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任务
  1. 查看云端仓库任务

  2. 可以通过 SHOW BACKUP FROM example_db; 获得example_db下最后一次BACKUP任务 ,查看云端仓库中已有的备份 ,该记录中仅显示最近一次 的BACKUP 任务。

  3. 各列含义如下:

名称 说明
Jobid 唯一作业id
SnapshotName 备份的名称
DoName 所属数据库
State 当前阶段
PENDING 提交作业后的初始状态
SNAPSHOTING 执行快照中
UPLOAD_ SNAPSHOT 快照完成 准备上传
UPLOADING 快照上传中
SAVE META 将作业元信息保存为本地文件
UPLOAD_INFO 上传作业元信息
FINISHED 作业成功
CreateTime 创建时间
SnapshotFinishedTime 快照完成时间
UploadFinishedTime 上传完成时间
FinishedTime 完成时间
UnfinishedTasks 未完成的任务
Progress 进展
TaskErrMsg 任务错误信息
Status 状态
Timeout 时长
  1. 恢复云端数据到集群

  2. 确认完快照信息后到新集群进行恢复操作,该语句用于将之前通过 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”:任务超时时间,默认为一天。单位秒。
  1. 两种种恢复的案例为:

  2. 从 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"
);
  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任务
  1. 查看最近恢复的job

  • SHOW RESTORE FROM 数据库名; 进行查看job任务,到此备份恢复完成。
  • 可简单执行count语句进行新老集群表数据条数对比,或者运用sum函数相加下后面的值看是否相等,来进行校验恢复是否成功。

其他

  1. 删除云端仓库

  • 该语句用于删除一个已创建的仓库。仅 root 或 superuser 用户可以删除仓库。

语法:

DROP REPOSITORY `repo_name`;

说明:

  • 删除仓库,仅仅是删除该仓库在StarRocks中的映射,不会删除实际的仓库数据。删除后,可以再次通过指定相同的 broker 和 LOCATION 映射到该仓库。
  1. 取消BACKUP任务

  • 该语句用于取消一个正在进行的 BACKUP 任务。

语法:

CANCEL BACKUP FROM db_name;
  1. 取消RESTORE 任务

  • 该语句用于取消一个正在进行的 RESTORE 任务。

语法:

CANCEL RESTORE FROM db_name;

注意:

  • 当取消处于 COMMIT 或之后阶段的恢复左右时,可能导致被恢复的表无法访问。此时只能通过再次执行恢复作业进行数据恢复。
1赞

2.x备份恢复到3.x会有什么问题吗?