SelectDB Cloud
开发指南
备份与恢复

备份与恢复

当前 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

其中 p1p2 是 partition 名。如果现在需要导出 p3 数据,那么对应的导出路径为:s3://bucket-name/db/user_visit/p3/data_;对应 partition 的导入路径为:s3://bucket-name/db/user_visit/p3/data_*.csv

© 2023 北京飞轮数据科技有限公司 京ICP备2022004029号 | Apache、Apache Doris 以及相关开源项目名称均为 Apache 基金会商标