备份与恢复
当前 SelectDB Cloud 还不支持 doris 提供的自动 backup/restore 功能,不过可以通过导入、导出来手动模拟备份恢复。如果数据非常重要,我们建议使用导出的方式将数据备份到兼容 S3 协议的存储服务上;之后再使用导入功能实现数据的恢复。
目前只支持导出 table 级别和 partition 级别的数据。目前尚未保证导出数据的一致性。
准备工作
- 准备 AK 和 SK,SelectDB Cloud 需要 AK 和 SK 在访问对象存储时进行验证
- 准备 REGION 和 ENDPOINT REGION 可以在创建桶的时候选择也可以在桶列表中查看到。
注意: 对象存储的 REGION 要和SelectDB Cloud 在同一 REGION 才能进行内网导入。
云存储系统可以相应的文档找到与 S3 兼容的相关信息。
数据导出
数据导出前,需要先备份数据所在 table 的建表语句(导入时需要使用到建表语句)。可以使用如下命令获得:
SHOW CREATE TABLE db.table
db
: 数据库名table
: 需要导出的表名
建表语句需要使用者自己负责保存。
数据是通过 EXPORT
命令导出到兼容 S3 协议的存储服务上的。EXPORT
是一个异步操作,该命令会提交一个 EXPORT JOB
到 SelectDB Cloud,任务提交成功后立即返回。执行后可以通过 SHOW EXPORT
查看导出进度。
EXPORT
命令使用方式如下:
EXPORT TABLE db.table
TO export_path
[opt_properties]
WITH S3
(
"AWS_ENDPOINT" = "AWS_ENDPOINT",
"AWS_ACCESS_KEY" = "AWS_ACCESS_KEY",
"AWS_SECRET_KEY"="AWS_SECRET_KEY",
"AWS_REGION" = "AWS_REGION"
)
db
: 数据库名table
: 需要导出的表名export_path
: 导出的文件路径。可以是目录,也可以是文件目录加文件前缀,建议使用后者。s3://bucket-name/dir/prefix_
opt_properties
: 可以用于指定一些导出参数,语法为:可以指定如下参数:PROPERTIES ("key" = "value")
label
: 指定此次导出作业的 label,当不指定时系统会随机生成一个 label。parallelism
: 导出作业的并发度,默认为1
。导出作业会开启parallelism
个线程去执行导出。(如果parallelism
大于tablets
个数,则parallelism
会被自动设置为tablets
个数)timeout
: 导出作业的超时时间,默认是 2 小时,单位为秒。
- S3 相关参数按照含义填写即可。S3 SDK 默认使用 virtual-hosted style 方式。但某些对象存储系统可能没开启或没支持 virtual-hosted style 方式的访问,此时我们可以添加 use_path_style 参数来强制使用 path style 方式,比如:
WITH S3 ( "AWS_ENDPOINT" = "AWS_ENDPOINT", "AWS_ACCESS_KEY" = "AWS_ACCESS_KEY", "AWS_SECRET_KEY"="AWS_SECRET_KEY", "AWS_REGION" = "AWS_REGION", "use_path_style" = "true" )
SHOW EXPORT
命令的执行请参考 SHOW-EXPORT (opens in a new tab)。
如果需要取消导出作业,请使用 CANCEL-EXPORT (opens in a new tab) 命令。
注意事项
- 不建议一次性导出大量数据。一个导出作业建议的导出数据量最大在几十 GB。过大的导出会导致更多的垃圾文件和更高的重试成本。如果表数据量过大,建议按照分区导出(见后文)。
- 如果导出作业运行失败,已经生成的文件不会被删除,需要用户手动删除。
- 导出作业会扫描数据,占用 IO 资源,可能会影响系统的查询延迟。
- 一个导出作业允许导出的分区数量最大为 2000,可以在 fe.conf 中添加参数
maximum_number_of_export_partitions
并重启 FE 来修改该配置。
数据导入
数据导入前需要先建好目标表,这个时候有如下几种场景:
- 如果目标表不存在,需要先执行导出阶段保存的建表语句
- 如果目标表已经存在,但是表 schema 与导出的数据不一致,需要先删除表再使用保存的建表语句建表
- 如果目标表已经存在,且表 schema 与导出前一致,那么需要清空表中的数据
TRUNCATE TABLE db.table
db
: 数据库名table
: 需要导出的表名
建好表后,就可以将数据从兼容 S3 协议的存储服务中导入到 SelectDB Cloud 中。数据导入是通过 S3 导入 (opens in a new tab) 完成的,该命令的使用方式如下:
LOAD LABEL [database.]label_name
(
DATA INFILE (file_path)
INTO TABLE table_name
)
WITH S3
(
"AWS_ENDPOINT" = "AWS_ENDPOINT",
"AWS_ACCESS_KEY" = "AWS_ACCESS_KEY",
"AWS_SECRET_KEY"="AWS_SECRET_KEY",
"AWS_REGION" = "AWS_REGION"
)
[opt_properties]
label_name
: 每个导入需要指定一个唯一的 Label。后续可以通过这个 label 来查看作业进度。file_path
: 需要导入的文件路径,在导出路径末尾加上*.csv
即可。假设导出路径为s3://bucket-name/dir/prefix_
,那么导入路径为s3://bucket-name/dir/prefix_*.csv
。opt_properties
: 指定导入的相关参数。目前支持以下参数:timeout
: 导入超时时间。默认为 4 小时。单位秒。exec_mem_limit
: 导入内存限制。默认为 2GB。单位为字节。load_parallelism
: 导入并发度,默认为1。调大导入并发度会启动多个执行计划同时执行导入任务,加快导入速度。send_batch_parallelism
: 用于设置发送批处理数据的并行度,如果并行度的值超过 BE 配置中的max_send_batch_parallelism_per_job
,那么作为协调点的 BE 将使用max_send_batch_parallelism_per_job
的值。
Partition 级别的导入、导出
前面介绍的导入导出方式暂不支持断点重试,因此如果表的数据非常大,那么中途碰到错误时的重试成本将非常大。如果数据始终导入最新的几个 partition 中,那么可以使用 partition 级别的导入、导出来实现增量导入、导出的功能。
只需要在表级导出数据的 SQL 上稍作修改,就能支持 partition 级别的数据导出:
EXPORT TABLE db.table
PARTITION (partition)
TO export_path
[opt_properties]
WITH S3
(
"AWS_ENDPOINT" = "AWS_ENDPOINT",
"AWS_ACCESS_KEY" = "AWS_ACCESS_KEY",
"AWS_SECRET_KEY"="AWS_SECRET_KEY",
"AWS_REGION" = "AWS_REGION"
)
partition
: 需要导出的 partition。
与导出类似,partition 级别的数据导入也需要稍稍修改表级导入数据的 SQL:
LOAD LABEL [database.]label_name
(
DATA INFILE (file_path)
INTO TABLE table_name
PARTITION (partition)
)
WITH S3
(
"AWS_ENDPOINT" = "AWS_ENDPOINT",
"AWS_ACCESS_KEY" = "AWS_ACCESS_KEY",
"AWS_SECRET_KEY"="AWS_SECRET_KEY",
"AWS_REGION" = "AWS_REGION"
)
[opt_properties]
partition
: 数据需要导入到哪个 partition? 不在 partition 范围内的数据将被忽略。
注意:导出的 partition 与导入的 partition 没有直接映射关系,但是我们建议在数据导入导出过程中保持表 partition 范围的一致。
由于导入过程是按照通配符进行文件匹配,如果需要支持按 partition 导入,那么需要将数据按照 partition 整理到不同目录中。比如有张名为 user_visit
的表需要导出,那么我们可以考虑使用下面的规则组织导出数据:
bucket/
db/
user_visit/
p1/
data_xxxx_0.csv
data_xxxx_1.csv
p2/
data_yyyy_0.csv
data_yyyy_1.csv
其中 p1
和 p2
是 partition 名。如果现在需要导出 p3
数据,那么对应的导出路径为:s3://bucket-name/db/user_visit/p3/data_
;对应 partition 的导入路径为:s3://bucket-name/db/user_visit/p3/data_*.csv
。