文章目录
RESOTRE数据恢复
一、RESTORE数据恢复原理
二、RESTORE 数据恢复语法
三、RESOTRE数据恢复案例
1、在 Doris 集群中创建 mydb_recover 库
2、执行如下命令恢复数据
3、查看 restore 作业的执行情况
四、注意事项
RESOTRE数据恢复
Doris 支持BACKUP方式将当前数据以文件的形式,通过 broker 备份到远端存储系统中。之后可以通过 RESOTRE命令进行恢复,从远端存储系统中将数据恢复到任意 Doris 集群。通过这个功能,Doris 可以支持将数据定期的进行快照备份。也可以通过这个功能,在不同集群间进行数据迁移。该功能需要 Doris 版本 0.8.2+,使用该功能,需要部署对应远端存储的 broker。如 BOS、HDFS 等。
一、RESTORE数据恢复原理
恢复操作需要指定一个远端仓库中已存在的备份,然后将这个备份的内容恢复到本地集群中。当用户提交 Restore 请求后,系统内部会做如下操作:
1、在本地创建对应的元数据
这一步首先会在本地集群中,创建恢复对应的表分区等结构。创建完成后,该表可见,但是不可访问。
2、本地snapshot
这一步是将上一步创建的表做一个快照。这其实是一个空快照(因为刚创建的表是没有数据的),其目的主要是在 Backend 上产生对应的快照目录,用于之后接收从远端仓库下载的快照文件。
3、下载快照
远端仓库中的快照文件,会被下载到对应的上一步生成的快照目录中。这一步由各个 Backend 并发完成。
4、生效快照
快照下载完成后,我们要将各个快照映射为当前本地表的元数据。然后重新加载这些快照,使之生效,完成最终的恢复作业。
二、RESTORE 数据恢复语法
RESTORE 语句用于将之前通过 BACKUP 命令备份的数据,恢复到指定数据库下。该命令为异步操作。提交成功后,需通过 SHOW RESTORE 命令查看进度。仅支持恢复 OLAP 类型的表。
RESTORE语法如下:
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" = "2018-05-04-16-45-08":指定了恢复对应备份的哪个时间版本,必填。该信息可以通过 SHOW SNAPSHOT ON repo; 语句获得。
- "replication_num" = "3":指定恢复的表或分区的副本数。默认为3。若恢复已存在的表或分区,则副本数必须和已存在表或分区的副本数相同。同时,必须有足够的 host 容纳多个副本。
- "reserve_replica" = "true":默认为 false。当该属性为 true 时,会忽略 replication_num 属性,恢复的表或分区的副本数将与备份之前一样。支持多个表或表内多个分区有不同的副本数。
- "reserve_dynamic_partition_enable" = "true":默认为 false。当该属性为 true 时,恢复的表会保留该表备份之前的'dynamic_partition_enable'属性值。该值不为true时,则恢复出来的表的'dynamic_partition_enable'属性值会设置为false。
- "timeout" = "3600":任务超时时间,默认为一天。单位秒。
- "meta_version" = 40:使用指定的 meta_version 来读取之前备份的元数据。注意,该参数作为临时方案,仅用于恢复老版本 Doris 备份的数据。最新版本的备份数据中已经包含 meta version,无需再指定。
三、RESOTRE数据恢复案例
由于这里没有额外的Doris集群,这里不能演示Doris数据跨集群迁移。这里我们将之前通过BACKUP 备份的数据恢复到新的Doris库中。具体操作步骤如下:
1、在 Doris 集群中创建 mydb_recover 库
mysql> create database mydb_recover;
mysql> use mydb_recover;
2、执行如下命令恢复数据
#获取backup_timestamp
mysql> show snapshot on hdfs_mydb_repo;
+-----------------+---------------------+--------+
| Snapshot | Timestamp | Status |
+-----------------+---------------------+--------+
| snapshot_label1 | 2023-06-30-21-42-40 | OK |
+-----------------+---------------------+--------+
#恢复数据
RESTORE SNAPSHOT `snapshot_label1`
FROM `hdfs_mydb_repo`
ON ( `tbl1`,`tbl2` )
PROPERTIES
(
"backup_timestamp"="2023-06-30-21-42-40",
"replication_num" = "1"
);
3、查看 restore 作业的执行情况
mysql> show restore\G;
*************************** 1. row ***************************
JobId: 46735
Label: snapshot_label1
Timestamp: 2023-06-30-21-42-40
DbName: default_cluster:mydb_recover
State: FINISHED
AllowLoad: false
ReplicationNum: 1
ReplicaAllocation: tag.location.default: 1
ReserveReplica: false
ReserveDynamicPartitionEnable: false
RestoreObjs: {
"name": "snapshot_label1",
"database": "mydb",
"backup_time": 1680183760410,
"content": "ALL",
"olap_table_list": [
{
"name": "tbl2",
"partition_names": [
"p1",
"p2",
"p3"
]
},
{
"name": "tbl1",
"partition_names": [
"p1",
"p2",
"p3"
]
}
],
"view_list": [],
"odbc_table_list": [],
"odbc_resource_list": []
}
CreateTime: 2023-06-30 21:49:24
MetaPreparedTime: 2023-06-30 21:49:27
SnapshotFinishedTime: 2023-06-30 21:49:30
DownloadFinishedTime: 2023-06-30 21:49:36
FinishedTime: 2023-06-30 21:49:42
UnfinishedTasks:
Progress:
TaskErrMsg:
Status: [OK]
Timeout: 86400
四、注意事项
- 如果恢复作业是一次覆盖操作(指定恢复数据到已经存在的表或分区中),那么从恢复作业的 COMMIT 阶段开始,当前集群上被覆盖的数据有可能不能再被还原。此时如果恢复作业失败或被取消,有可能造成之前的数据已损坏且无法访问。这种情况下,只能通过再次执行恢复操作,并等待作业完成。因此,我们建议,如无必要,尽量不要使用覆盖的方式恢复数据,除非确认当前数据已不再使用。
- RESTORE报错:[20181: invalid md5 of downloaded file:/data/doris.HDD/snapshot/20230607095111.862.86400/19962/668322732/19962.hdr, expected: f05b63cca5533ea0466f62a9897289b5, get: d41d8cd98f00b204e9800998ecf8427e],该错误是由于备份和恢复的表的副本数不一致导致的,执行恢复命令时需指定副本个数。
- RESTORE报错:[COMMON_ERROR, msg: Could not set meta version to 97 since it is lower than minimum required version 100],该错误是由于备份和恢复不是同一个版本导致的,使用指定的 meta_version 来读取之前备份的元数据。注意,该参数作为临时方案,仅用于恢复老版本 Doris 备份的数据。最新版本的备份数据中已经包含 meta version,无需再指定,针对上述错误具体解决方案指定meta_version = 100。
- 📢博客主页:https://lansonli.blog.csdn.net
- 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
- 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
- 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨