本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
迁移Apache Doris数据到云数据库 SelectDB 版的方式主要有通过OSS、Catalog和X2Doris三种。根据您的需要和业务场景,可以选择不同的方式进行数据迁移。本文为您介绍Apache Doris的离线数据迁移到云数据库 SelectDB 版的各个方式以及方式选择规则。
方式选择
根据不同的业务场景,选择合适您的迁移方式。具体的方式选择可以参考如下规则:
| 方式 | 适用场景 | 推荐原因 | 具体操作 | 
| 导出导入OSS | 数据存储在阿里云平台,且数据量大。 | 
 | |
| Catalog | 数据存储在阿里云平台,且数据量小。 说明  包括阿里云EMR集群等场景。 | 
 | |
| X2Doris | 
 | 
 | 
本文将以Catalog和导出导入OSS方式,详细介绍如何迁移Doris的离线数据到SelectDB。
通过导出导入OSS迁移
前提条件
准备工作
在OSS服务创建存储空间(Bucket)。如何创建,请参见控制台创建存储空间。
确保OSS存储空间(Bucket)与您的云数据库 SelectDB 版实例在同一地域。
本文示例中Bucket的名为test-selectdb。
步骤一:导出源数据
- 登录源集群。 - 自建Doris如何登录,请参见通过 MySQL 协议连接 - Apache Doris。 
- (可选)准备示例数据。 - 如果您已有目标数据,可跳过此步骤。 - 建库。 - 执行以下语句,创建数据库。 - CREATE DATABASE source_db;
- 建表。 - 执行以下语句,建表。 - CREATE TABLE IF NOT EXISTS source_tb ( `c1` int(11) NULL, `c2` string NULL, `c3` bigint NULL ) DISTRIBUTED BY HASH(c1) BUCKETS 20 PROPERTIES("replication_num" = "1");
- 写入示例数据。 - INSERT INTO source_tb VALUES (1, 'doris', 18), (2, 'nereids', 20), (3, 'pipelibe', 99999), (4, 'Apache', 122123455), (5, null, null);
- 验证写入数据。 - 您可通过以下语句,验证示例数据。 - SELECT * FROM `source_tb` limit 10;- 结果如下。 - +--------------+--------------+--------------+ | c1 | c2 | c3 | +--------------+--------------+--------------+ | 1 | doris | 18 | | 3 | pipelibe | 99999 | | 5 | | | | 2 | nereids | 20 | | 4 | Apache | 122123455 | +--------------+--------------+--------------+
 
- 备份目标数据所在表的建表语句。 - 您可通过 - SHOW CREATE TABLE语句查看目标表的建表语句,并备份。示例如下。- SHOW CREATE TABLE source_tb ;- 结果如下。 - +-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | source_tb | CREATE TABLE `source_tb` ( `c1` int NULL, `c2` text NULL, `c3` bigint NULL ) ENGINE=OLAP DUPLICATE KEY(`c1`) DISTRIBUTED BY HASH(`c1`) BUCKETS 20 PROPERTIES ( "file_cache_ttl_seconds" = "0", "is_being_synced" = "false", "storage_medium" = "hdd", "storage_format" = "V2", "inverted_index_storage_format" = "V2", "light_schema_change" = "true", "disable_auto_compaction" = "false", "enable_single_replica_compaction" = "false", "group_commit_interval_ms" = "10000", "group_commit_data_bytes" = "134217728" ); | +-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 返回行数: [1], 耗时: [22ms]
- 导出数据至OSS。 - 通过EXPORT指令导出数据至OSS。 - 语法如下。 - EXPORT TABLE table_name [PARTITION (p1[,p2])] [WHERE] TO export_path [opt_properties] WITH S3 [s3_properties];- 参数说明如下。 - 参数名称 - 是否必填 - 参数说明 - table_name - 是 - 当前要导出的表的表名。 - partition - 否 - 指定导出表的某些指定分区。 - where - 否 - 指定导出满足条件的表数据。 - export_path - 是 - 导出的文件路径。 - 可以是目录,也可以是文件目录加文件前缀,如 - s3://path/to/my_file_。- opt_properties - 否 - 用于指定一些导出参数。详情请参见opt_properties语法与参数说明。 - s3_properties - 是 - 用于配置S3协议相关属性。详情请参s3_properties语法与参数说明。 - opt_properties语法如下。 - [PROPERTIES ("key"="value", ...)]- 可以指定如下参数。 - 参数名称 - 是否必填 - 参数说明 - label - 否 - 指定此次Export任务的label,当不指定时系统会随机生成一个label。 - column_separator - 否 - 指定导出的列分隔符。 - 默认为 - \t,支持多字节。该参数只用于csv文件格式。- line_delimiter - 否 - 指定导出的行分隔符。 - 默认为 - \n,支持多字节。该参数只用于csv文件格式。- columns - 否 - 指定导出表的某些列。 - format - 否 - 指定导出作业的文件格式。 - 支持的格式有parquet、orc、csv、csv_with_names和csv_with_names_and_types。 - 默认为csv格式。 - max_file_size - 否 - 导出作业单个文件大小限制。如果结果超过这个值,将切割成多个文件。 - 取值范围:[5 MB, 2 GB] 
- 默认值:1 GB 
 - 当指定导出为ORC文件格式(即format_as参数为ORC)时,实际切分文件的大小是 - ceil (max_file_size/64) * 64MB。- parallelism - 否 - 导出作业的并发度,默认为1。 - 导出作业会开启parallelism个数的线程去执行 - select into outfile语句。(如果parallelism个数大于表的tablets个数,系统会自动把parallelism设置为tablets个数大小,即每一个- select into outfile语句负责一个tablets)。- delete_existing_files - 否 - 是否删除目标路径下的所有文件。 - false(默认值):不删除目标路径下的文件。 - true:先删除 - export_path所指定目录下的所有文件,然后导出数据到该目录下。例如:- "file_path" = "/user/tmp",则会删除- "/user/"下所有文件及目录。
- "file_path" = "/user/tmp/",则会删除- "/user/tmp/"下所有文件及目录。
 警告- 指定 - delete_existing_files = true是一个危险的操作,建议只在测试环境中使用。
- 若要使用delete_existing_files参数,您可以向阿里云客服提工单,SelectDB技术团队在fe.conf配置文件中添加配置 - enable_delete_existing_files = true,并重启FE后,delete_existing_files才会生效。
 - with_bom - 否 - 默认为false,若指定为true,则导出的文件编码为带有BOM的UTF-8编码(只对csv相关的文件格式生效)。 - timeout - 否 - 导出作业的超时时间,默认为2小时,单位是秒。 - s3_properties语法如下。 - ("key"="value"[,...])- 可以指定如下参数。 - 参数名称 - 是否必选 - 参数说明 - s3.endpoint - 是 - 使用S3协议目标的endpoint。 - 本文示例为使用阿里云OSS迁移,则此处为访问OSS数据的 - Endpoint。如何获取,请参见OSS地域和访问域名。重要- 请确保OSS存储空间(Bucket)与您的云数据库 SelectDB 版实例在同一地域。 - s3.access_key - 是 - 使用S3协议目标的用户身份密钥。 - 本文示例为使用阿里云OSS迁移,此处为访问OSS的RAM用户的 - Accesskey ID。- s3.secret_key - 是 - 使用S3协议目标的用户加密认证字符串。 - 本文示例为使用阿里云OSS迁移,此处为访问OSS的RAM用户的 - AccessKey Secret。- s3.region - 是 - 使用S3协议目标的Region。 - 本文示例为使用阿里云OSS迁移,此处为阿里云OSS的地域。如何获取,请参见OSS地域和访问域名。 - use_path_style - 否 - 默认为 - false。- S3 SDK默认使用Virtual-hosted Style方式。 - 但某些对象存储系统可能没开启或没支持Virtual-hosted Style方式的访问,您可以通过添加 - use_path_style参数来强制使用Path Style方式。说明- URI目前支持三种方案(schema): - http://、- https://和- s3://。- 如果使用 - http://或- https://,则会根据- use_path_style参数来决定是否使用Path Style方式访问S3协议目标。
- 如果使用 - s3://,则会使用Virtual-hosted Style方式访问S3协议目标。
 - 示例如下。 - EXPORT TABLE source_tb -- 导出source_tb表中的数据 TO "s3://test-selectdb/test/" -- 将数据导出至OSS名为test-selectdb的bucket中的test文件夹中 PROPERTIES ( "label" = "test_export", -- 任务标签 "format" = "orc", -- 文件存储格式为orc "max_file_size" = '2048MB', -- 文件分割大小 'parallelism' = '10' -- 导出并发数为10 ) WITH s3 ( "s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com", -- 访问OSS bucket的网址 "s3.region" = "oss-cn-hangzhou", -- OSS 所属地域 "s3.secret_key"="yourAccessKeySecret", -- 访问OSS的RAM用户的secret key "s3.access_key" = "LTAI****************" -- -- 访问OSS的RAM用户的access key );
- 验证导出是否成功。 - 您可通过以下两种方式,查看数据导出情况。 - 通过指令查看。 - 可在连接了Doris的客户端,执行以下语句,查看导出情况。 - SHOW export;- 导出成功:当结果中State为FINISHED时,表示导出数据成功。 
- 导出失败:当结果中State为CANCELLED时,表示导出数据失败。您可通过ErrorMsg中的内容,进一步排查失败的原因。 
 
- 通过OSS查看。 - 登录OSS管理控制台,查看指定导出路径是否有对应文件生成。 
 
步骤二:导入数据至目标表
- 登录目标集群。如何登录,请参见通过DMS连接云数据库SelectDB版实例。 
- 创建目标表。 
- 建库。 - (可选)建库。 - 如果您已有目标库,可跳过此步骤。 - 执行以下语句,创建数据库。 - CREATE DATABASE aim_db;
- 建表。 - 执行导出数据中备份的建表语句。 - 本示例中的建表语句如下。 - CREATE TABLE IF NOT EXISTS aim_tb ( `c1` int(11) NULL, `c2` string NULL, `c3` bigint NULL ) ENGINE=OLAP DUPLICATE KEY(`c1`) DISTRIBUTED BY HASH(c1) BUCKETS 20 PROPERTIES("replication_num" = "1");
 
- 导入数据。 - 使用S3 load 导入OSS数据至SelectDB。有关 - S3 load语法以及更多示例,请参见OSS Load。- 示例如下。 - LOAD LABEL label_1 -- labelname 随机取一个,job唯一标识符 ( DATA INFILE("s3://test-selectdb/test/59ab2e9dc4ec4c04-9e50e45a6fda2c8e_0.orc") -- 上个步骤中导出数据文件在OSS中的路径 INTO TABLE aim_tb -- 待导入数据的表名 FORMAT AS ORC -- 导入文件的格式,与导出数据时的格式一致 ) WITH S3 ( "AWS_PROVIDER" = "OSS", "AWS_REGION" = "oss-cn-hangzhou", -- OSS bucket 所属地域 "AWS_ENDPOINT" = "oss-cn-hangzhou-internal.aliyuncs.com", -- 访问OSS bucket的网址 "AWS_ACCESS_KEY" = "LTAI****************", -- 访问OSS的RAM用户的access key "AWS_SECRET_KEY"="yourAccessKeySecret" -- 访问OSS的RAM用户的secret key ) PROPERTIES ( "timeout" = "3600" -- 导入超时时间 );
- 验证导入结果。 - 您可通过以下两种方式,查看导入结果。 - 通过指令查看。 - 可在连接了SelectDB的客户端,执行以下语句,查看导出情况。 - SHOW load;- 导入成功:当结果中State为FINISHED时,表述导出数据成功。 
- 通过查看目标表。示例语句如下。 - SELECT * FROM `aim_tb` limit 10;- 结果如下。 - +--------------+--------------+--------------+ | c1 | c2 | c3 | +--------------+--------------+--------------+ | 1 | doris | 18 | | 3 | pipelibe | 99999 | | 5 | | | | 2 | nereids | 20 | | 4 | Apache | 122123455 | +--------------+--------------+--------------+- 与步骤一:导出源数据中需要导入的表数据一致,导入成功。 
 
通过Catalog迁移
前提条件
- 确保Doris实例和SelectDB实例的网络处于互通状态。 - Doris实例和SelectDB实例处于同一VPC下。如果不在同一VPC下,请先解决网络互通问题。如何操作,请参见如何解决SelectDB实例与数据源网络互通问题? 
- 已将Doris实例IP添加至SelectDB的白名单。具体操作,请参见设置白名单。 
- 若Doris实例存在白名单机制,已将SelectDB实例所在网段IP添加至Doris实例的白名单中。 - 获取SelectDB实例VPC地址的IP,请参见如何查看云数据库 SelectDB 版实例所属VPC的IP网段? 
- 获取SelectDB实例公网的IP地址,通过 - ping命令访问SelectDB实例的公网地址,获取其对应的 IP 地址。
 
 
- SelectDB版本不能低于Doris版本。 说明- SelectDB是基于Doris构建的云原生实时数仓,二者的版本关系,可参见内核发布记录。 
- 了解什么是Catalog,以及Catalog的基本操作。更多详情,请参见湖仓一体。 
示例环境
本示例将Doris的数据库doris_db中表doris_t的数据迁移到SelectDB 数据库test_db中表test_doris2SelectDB中。在实际使用中,请根据您的实际情况修改对应参数。示例环境如下:
- 目标库:test_db 
- 目标表:test_doris2SelectDB 
- 源数据库:doris_db 
- 源数据表:doris_t 
源数据准备示例
登录您的源数据Doris,进行以下操作。
- 创建数据库。 - CREATE DATABASE doris_db;
- 创建表。 - CREATE TABLE doris_t ( id int, name string, age int ) DISTRIBUTED BY HASH(id) BUCKETS 4 PROPERTIES("replication_num" = "1");
- 插入数据。 - INSERT INTO doris_t VALUES (1, 'Alice', 25), (2, 'Bob', 30), (3, 'Charlie', 35), (4, 'David', 40), (5, 'Eve', 45);
操作步骤
- 连接SelectDB实例。具体操作,请参见通过MySQL客户端连接云数据库SelectDB版实例。 
- 创建Doris JDBC的Catalog。 - CREATE CATALOG doris_catalog PROPERTIES ( "type"="jdbc", "user"="root", "password"="123456", "jdbc_url" = "jdbc:mysql://127.0.0.1:9030/doris_db", "driver_url" = "mysql-connector-java-8.0.25.jar", "driver_class" = "com.mysql.cj.jdbc.Driver" )- 参数 - 必选 - 默认值 - 说明 - user - 是 - 无 - Doris数据库的账号。 - password - 是 - 无 - Doris数据库账号的密码。 - jdbc_url - 是 - 无 - JDBC连接串。需要包含Doris数据库的连接地址。 - 格式: - jdbc:mysql://<host>:<port>/<database>- host:Doris数据库的IP地址。 
- port:Doris数据库的端口号。 
- database:需要访问的数据库名称。 
 - 示例: - jdbc:mysql://127.0.0.1:9030/doris_db- driver_url - 是 - 无 - JDBC Driver的Jar包名称。 说明- 推荐使用 - mysql-connector-java-8.0.25.jar。
- 若希望使用其他Jar包,支持工单咨询。 
 - driver_class - 是 - 无 - JDBC Driver的Class名称。 - 推荐设置为 - com.mysql.cj.jdbc.Driver。- lower_case_table_names 说明- 4.0版本改名为lower_case_meta_names - 否 - "false" - 指定是否以小写的形式同步JDBC外部数据源的库名和表名。 - true:通过维护小写名称到远程系统中实际名称的映射,能够查询非小写的数据库和表。此时,库表列名都会被转换为小写。 - false:不能查询非小写的数据库和表。 重要- 对于SelectDB 3.0版本。 - 当 FE 参数的 - lower_case_table_names设置为- 1或- 2时, Catalog 的- lower_case_table_names参数必须设置为- true。
- 当 FE 参数的 - lower_case_table_names设置为- 0,则 Catalog 的参数可以为- true或- false。
 
- 对于SelectDB 4.0版本。 - 当 FE 的 - lower_case_table_names参数为- 0或- 2时,库名表名列名都不会被转换。
- 当 FE 的 - lower_case_table_names参数为- 1时,表名会被转换为小写,库名和列名不会被转换。
 
 - only_specified_database - 否 - "false" - 指定是否只同步指定的Database。 - true:只同步 JDBC URL 中指定的数据源的 Database。 - false:同步 JDBC URL 中所有的 Database。 - include_database_list - 否 - "" - 当 - only_specified_database=true时,指定同步多个Database,以英文逗号分隔。Database名称大小写敏感。- exclude_database_list - 否 - "" - 当 - only_specified_database=true时,指定不需要同步的多个Database,以英文逗号分隔。Database名称大小写敏感。- meta_names_mapping - 否 - "" - 如果外部数据源存在名称相同只有大小写不同的情况,例如 DORIS 和 doris,Doris 由于歧义而在查询 Catalog 时报错,此时需要配置 - meta_names_mapping参数来解决冲突。- 具体操作,请参见小写名称同步。 重要- 此参数仅适用于SelectDB4.0版本。 
- 查看Catalog。 - SHOW CATALOGS; --查看CATALOG是否创建成功- 查询结果如下。 - +--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+ | CatalogId | CatalogName | Type | IsCurrent | CreateTime | LastUpdateTime | Comment | +--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+ | 436009309195 | doris_catalog | jdbc | | 2024-08-06 17:09:08.058 | 2024-07-19 18:04:37 | | | 0 | internal | internal | yes | UNRECORDED | NULL | Doris internal catalog | +--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+
- (可选)切换至External Catalog doris_catalog目录下。 - 您可以像使用Internal Catalog一样,对External Catalog doris_catalog的数据进行查看和访问。 说明- 目前,云数据库 SelectDB 版对External Catalog中的数据只支持读操作。 - SWITCH doris_catalog;
- (可选)切换内部的catalog internal目录下。 - 如果您没有执行第4步,跳过此步骤。 - SWITCH internal;
- (可选)创建数据。 - 如果您已经创建了目标数据库,可跳过此步骤。 - CREATE database test_db;
- 切换至目标数据库。 - USE test_db;
- 创建表。 - 如果您已经有了目标表,请检查目标列类型与Doris源数据列类型是否一一对应。 - 如果您还没有目标表,创建表时,目标列类型需与Doris源数据列类型一一对应。 - 列映射详情,请参见类型映射。 - CREATE TABLE test_doris2SelectDB ( id int, name string, age int ) DISTRIBUTED BY HASH(id) BUCKETS 4 PROPERTIES("replication_num" = "1");
- 迁移数据。 - INSERT INTO test_doris2SelectDB SELECT * FROM doris_catalog.doris_db.doris_t;
- 查看数据导入情况。 - SELECT * FROM test_doris2SelectDB;
增量数据迁移说明
实际生产环境中,Doris数据主要分为离线数据和增量数据。由于Doris数据迁移到SelectDB,通常的使用场景是拷贝一份数据到数据仓库进行查询加速,因此对于增量数据的迁移,可以考虑以下两种方式:
- 在生产Doris数据时并行写入一份数据到SelectDB。 
- 通过周期性作业读取Doris中的分区数据写入SelectDB。