本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
迁移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) * 64
MB。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。