跳到主要内容
跳到主要内容

JDBC

JDBC Catalog 通过标准 JDBC 协议,连接其他数据源。

连接后,Doris 会自动同步数据源下的 Database 和 Table 的元数据,以便快速访问这些外部数据。

使用限制

支持 MySQL、PostgreSQL、Oracle、SQLServer、Clickhouse、Doris、SAP HANA、Trino/Presto、OceanBase

语法

CREATE CATALOG <catalog_name>
PROPERTIES ("key"="value", ...)

参数说明

参数必须默认值说明
user对应数据库的用户名
password对应数据库的密码
jdbc_urlJDBC 连接串
driver_urlJDBC Driver Jar 包名称
driver_classJDBC Driver Class 名称
lower_case_table_names"false"是否以小写的形式同步 jdbc 外部数据源的库名和表名
only_specified_database"false"指定是否只同步指定的 database
include_database_list""当 only_specified_database=true 时,指定同步多个 database,以','分隔。db 名称是大小写敏感的。
exclude_database_list""当 only_specified_database=true 时,指定不需要同步的多个 database,以','分割。db 名称是大小写敏感的。

驱动包路径

driver_url 可以通过以下三种方式指定:

  1. 文件名。如 mysql-connector-java-5.1.47.jar。需将 Jar 包预先存放在 FE 和 BE 部署目录的 jdbc_drivers/ 目录下。系统会自动在这个目录下寻找。该目录的位置,也可以由 fe.conf 和 be.conf 中的 jdbc_drivers_dir 配置修改。

  2. 本地绝对路径。如 file:///path/to/mysql-connector-java-5.1.47.jar。需将 Jar 包预先存放在所有 FE/BE 节点指定的路径下。

  3. Http 地址。如:https://doris-community-test-1308700295.cos.ap-hongkong.myqcloud.com/jdbc_driver/mysql-connector-java-8.0.25.jar。系统会从这个 http 地址下载 Driver 文件。仅支持无认证的 http 服务。

小写表名同步

lower_case_table_names 设置为 true 时,Doris 通过维护小写名称到远程系统中实际名称的映射,能够查询非小写的数据库和表

注意:

  1. 在 Doris 2.0.3 之前的版本,仅对 Oracle 数据库有效,在查询时,会将所有的库名和表名转换为大写,再去查询 Oracle,例如:

    Oracle 在 TEST 空间下有 TEST 表,Doris 创建 Catalog 时设置 lower_case_table_namestrue,则 Doris 可以通过 select * from oracle_catalog.test.test 查询到 TEST 表,Doris 会自动将 test.test 格式化成 TEST.TEST 下发到 Oracle,需要注意的是这是个默认行为,也意味着不能查询 Oracle 中小写的表名。

    对于其他数据库,仍需要在查询时指定真实的库名和表名。

  2. 在 Doris 2.0.3 及之后的版本,对所有的数据库都有效,在查询时,会将所有的库名和表名转换为真实的名称,再去查询,如果是从老版本升级到 2.0.3,需要 Refresh <catalog_name> 才能生效。

    但是,如果数据库或者表名只有大小写不同,例如 Dorisdoris,则 Doris 由于歧义而无法查询它们。

  3. 当 FE 参数的 lower_case_table_names 设置为 12 时,JDBC Catalog 的 lower_case_table_names 参数必须设置为 true。如果 FE 参数的 lower_case_table_names 设置为 0,则 JDBC Catalog 的参数可以为 truefalse,默认为 false。这确保了 Doris 在处理内部和外部表配置时的一致性和可预测性。

指定同步数据库

only_specified_database: 在 jdbc 连接时可以指定链接到哪个 database/schema, 如:mysql 中 jdbc_url 中可以指定 database, pg 的 jdbc_url 中可以指定 currentSchema。

include_database_list: 仅在only_specified_database=true时生效,指定需要同步的 database,以','分割,db 名称是大小写敏感的。

exclude_database_list: 仅在only_specified_database=true时生效,指定不需要同步的多个 database,以','分割,db 名称是大小写敏感的。

include_database_listexclude_database_list 有重合的 database 配置时,exclude_database_list会优先生效。

如果使用该参数时连接 oracle 数据库,要求使用 ojdbc8.jar 以上版本 jar 包。

数据查询

示例

select * from mysql_catalog.mysql_database.mysql_table where k1 > 1000 and k3 ='term';
提示

由于可能存在使用数据库内部的关键字作为字段名,为解决这种状况下仍能正确查询,所以在 SQL 语句中,会根据各个数据库的标准自动在字段名与表名上加上转义符。例如 MYSQL(``)、PostgreSQL("")、SQLServer([])、ORACLE(""),所以此时可能会造成字段名的大小写敏感,具体可以通过 explain sql,查看转义后下发到各个数据库的查询语句。

谓词下推

  1. 当执行类似于 where dt = '2022-01-01' 这样的查询时,Doris 能够将这些过滤条件下推到外部数据源,从而直接在数据源层面排除不符合条件的数据,减少了不必要的数据获取和传输。这大大提高了查询性能,同时也降低了对外部数据源的负载。

  2. enable_func_pushdown 设置为 true,会将 where 之后的函数条件也下推到外部数据源,目前仅支持 MySQL、ClickHouse、Oracle,如遇到 MySQL、ClickHouse、Oracle 不支持的函数,可以将此参数设置为 false,目前 Doris 会自动识别部分 MySQL 不支持的函数以及 ClickHouse、Oracle 支持的函数进行下推条件过滤,可通过 explain sql 查看。

目前不会下推的函数有:

MYSQL
DATE_TRUNC
MONEY_FORMAT

目前会下推的函数有:

ClickHouse
FROM_UNIXTIME
UNIX_TIMESTAMP
Oracle
NVL

行数限制

如果在查询中带有 limit 关键字,Doris 会将其转译成适合不同数据源的语义。

数据写入

在 Doris 中建立 JDBC Catalog 后,可以通过 insert into 语句直接写入数据,也可以将 Doris 执行完查询之后的结果写入 JDBC Catalog,或者是从一个 JDBC Catalog 将数据导入另一个 JDBC Catalog。

示例

insert into mysql_catalog.mysql_database.mysql_table values(1, "doris");
insert into mysql_catalog.mysql_database.mysql_table select * from table;

事务

Doris 的数据是由一组 batch 的方式写入 JDBC Catalog 的,如果中途导入中断,之前写入数据可能需要回滚。所以 JDBC Catalog 支持数据写入时的事务,事务的支持需要通过设置 session variable: enable_odbc_transcation

set enable_odbc_transcation = true; 

事务保证了 JDBC 外表数据写入的原子性,但是一定程度上会降低数据写入的性能,可以考虑酌情开启该功能。

使用指南

MySQL

创建示例

  • mysql 5.7

    CREATE CATALOG jdbc_mysql PROPERTIES (
    "type"="jdbc",
    "user"="root",
    "password"="123456",
    "jdbc_url" = "jdbc:mysql://127.0.0.1:3306/demo",
    "driver_url" = "mysql-connector-java-5.1.47.jar",
    "driver_class" = "com.mysql.jdbc.Driver"
    )
  • mysql 8

    CREATE CATALOG jdbc_mysql PROPERTIES (
    "type"="jdbc",
    "user"="root",
    "password"="123456",
    "jdbc_url" = "jdbc:mysql://127.0.0.1:3306/demo",
    "driver_url" = "mysql-connector-java-8.0.25.jar",
    "driver_class" = "com.mysql.cj.jdbc.Driver"
    )

层级映射

DorisMySQL
CatalogMySQL Server
DatabaseDatabase
TableTable

类型映射

MYSQL TypeDoris TypeComment
BOOLEANTINYINT
TINYINTTINYINT
SMALLINTSMALLINT
MEDIUMINTINT
INTINT
BIGINTBIGINT
UNSIGNED TINYINTSMALLINTDoris 没有 UNSIGNED 数据类型,所以扩大一个数量级
UNSIGNED MEDIUMINTINTDoris 没有 UNSIGNED 数据类型,所以扩大一个数量级
UNSIGNED INTBIGINTDoris 没有 UNSIGNED 数据类型,所以扩大一个数量级
UNSIGNED BIGINTLARGEINT
FLOATFLOAT
DOUBLEDOUBLE
DECIMALDECIMAL
UNSIGNED DECIMAL(p,s)DECIMAL(p+1,s) / STRING如果 p+1>38, 将使用 Doris STRING 类型
DATEDATE
TIMESTAMPDATETIME
DATETIMEDATETIME
YEARSMALLINT
TIMESTRING
CHARCHAR
VARCHARVARCHAR
JSONJSON
SETSTRING
BITBOOLEAN/STRINGBIT(1) 会映射为 BOOLEAN,其他 BIT 映射为 STRING
TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXTSTRING
BLOB、MEDIUMBLOB、LONGBLOB、TINYBLOBSTRING
TINYSTRING、STRING、MEDIUMSTRING、LONGSTRINGSTRING
BINARY、VARBINARYSTRING
OtherUNSUPPORTED

PostgreSQL

创建示例

CREATE CATALOG jdbc_postgresql PROPERTIES (
"type"="jdbc",
"user"="root",
"password"="123456",
"jdbc_url" = "jdbc:postgresql://127.0.0.1:5432/demo",
"driver_url" = "postgresql-42.5.1.jar",
"driver_class" = "org.postgresql.Driver"
);

层级映射

映射 PostgreSQL 时,Doris 的一个 Database 对应于 PostgreSQL 中指定 Catalog 下的一个 Schema(如示例中 jdbc_url 参数中 "demo"下的 Schemas)。而 Doris 的 Database 下的 Table 则对应于 PostgreSQL 中,Schema 下的 Tables。即映射关系如下:

DorisPostgreSQL
CatalogDatabase
DatabaseSchema
TableTable
提示

Doris 通过 sql 语句 select nspname from pg_namespace where has_schema_privilege('<UserName>', nspname, 'USAGE'); 来获得 PG user 能够访问的所有 schema 并将其映射为 Doris 的 database

类型映射

POSTGRESQL TypeDoris TypeComment
booleanBOOLEAN
smallint/int2SMALLINT
integer/int4INT
bigint/int8BIGINT
decimal/numericDECIMAL
real/float4FLOAT
double precisionDOUBLE
smallserialSMALLINT
serialINT
bigserialBIGINT
charCHAR
varchar/textSTRING
timestampDATETIME
dateDATE
json/josnbJSON
timeSTRING
intervalSTRING
point/line/lseg/box/path/polygon/circleSTRING
cidr/inet/macaddrSTRING
bitBOOLEAN/STRINGbit(1) 会映射为 BOOLEAN,其他 bit 映射为 STRING
uuidSTRING
OtherUNSUPPORTED

Oracle

创建示例

CREATE CATALOG jdbc_oracle PROPERTIES (
"type"="jdbc",
"user"="root",
"password"="123456",
"jdbc_url" = "jdbc:oracle:thin:@127.0.0.1:1521:helowin",
"driver_url" = "ojdbc8.jar",
"driver_class" = "oracle.jdbc.driver.OracleDriver"
);

层级映射

映射 Oracle 时,Doris 的一个 Database 对应于 Oracle 中的一个 User。而 Doris 的 Database 下的 Table 则对应于 Oracle 中,该 User 下的有权限访问的 Table。即映射关系如下:

DorisOracle
CatalogDatabase
DatabaseUser
TableTable

注意: 当前不支持同步 Oracle 的 SYNONYM TABLE

类型映射

ORACLE TypeDoris TypeComment
number(p) / number(p,0)TINYINT/SMALLINT/INT/BIGINT/LARGEINTDoris 会根据 p 的大小来选择对应的类型:p < 3 -> TINYINT; p < 5 -> SMALLINT; p < 10 -> INT; p < 19 -> BIGINT; p > 19 -> LARGEINT
number(p,s), [ if(s>0 && p>s) ]DECIMAL(p,s)
number(p,s), [ if(s>0 && p < s) ]DECIMAL(s,s)
number(p,s), [ if(s<0) ]TINYINT/SMALLINT/INT/BIGINT/LARGEINTs<0 的情况下,Doris 会将 p 设置为 p+|s|,并进行和 number(p) / number(p,0) 一样的映射
numberDoris 目前不支持未指定 p 和 s 的 oracle 类型
decimalDECIMAL
float/realDOUBLE
DATEDATETIME
TIMESTAMPDATETIME
CHAR/NCHARSTRING
VARCHAR2/NVARCHAR2STRING
LONG/ RAW/ LONG RAW/ INTERVALSTRING
OtherUNSUPPORTED

SQLServer

创建示例

CREATE CATALOG jdbc_sqlserve PROPERTIES (
"type"="jdbc",
"user"="SA",
"password"="Doris123456",
"jdbc_url" = "jdbc:sqlserver://localhost:1433;DataBaseName=doris_test",
"driver_url" = "mssql-jdbc-11.2.3.jre8.jar",
"driver_class" = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
);

层级映射

映射 SQLServer 时,Doris 的一个 Database 对应于 SQLServer 中指定 Database(如示例中 jdbc_url 参数中的 "doris_test")下的一个 Schema。而 Doris 的 Database 下的 Table 则对应于 SQLServer 中,Schema 下的 Tables。即映射关系如下:

DorisSQLServer
CatalogDatabase
DatabaseSchema
TableTable

类型映射

SQLServer TypeDoris TypeComment
bitBOOLEAN
tinyintSMALLINTSQLServer 的 tinyint 是无符号数,所以映射为 Doris 的 SMALLINT
smallintSMALLINT
intINT
bigintBIGINT
realFLOAT
floatDOUBLE
moneyDECIMAL(19,4)
smallmoneyDECIMAL(10,4)
decimal/numericDECIMAL
dateDATE
datetime/datetime2/smalldatetimeDATETIMEV2
char/varchar/text/nchar/nvarchar/ntextSTRING
time/datetimeoffsetSTRING
timestampSTRING读取二进制数据的十六进制显示,无实际意义
OtherUNSUPPORTED

Doris

JDBC Catalog 也支持连接另一个 Doris 数据库:

  • mysql 5.7 Driver

    CREATE CATALOG jdbc_doris PROPERTIES (
    "type"="jdbc",
    "user"="root",
    "password"="123456",
    "jdbc_url" = "jdbc:mysql://127.0.0.1:9030?useSSL=false",
    "driver_url" = "mysql-connector-java-5.1.47.jar",
    "driver_class" = "com.mysql.jdbc.Driver"
    )
  • mysql 8 Driver

    CREATE CATALOG jdbc_doris PROPERTIES (
    "type"="jdbc",
    "user"="root",
    "password"="123456",
    "jdbc_url" = "jdbc:mysql://127.0.0.1:9030?useSSL=false",
    "driver_url" = "mysql-connector-java-8.0.25.jar",
    "driver_class" = "com.mysql.cj.jdbc.Driver"
    )

类型映射

Doris TypeJdbc Catlog Doris TypeComment
BOOLEANBOOLEAN
TINYINTTINYINT
SMALLINTSMALLINT
INTINT
BIGINTBIGINT
LARGEINTLARGEINT
FLOATFLOAT
DOUBLEDOUBLE
DECIMALV3DECIMALV3/STRING将根据 DECIMAL 字段的(precision, scale)选择用何种类型
DATEDATE
DATETIMEDATETIME
CHARCHAR
VARCHARVARCHAR
STRINGSTRING
TEXTSTRING
HLLHLL查询 HLL 需要设置return_object_data_as_binary=true
ArrayArrayArray 内部类型适配逻辑参考上述类型,不支持嵌套复杂类型
BITMAPBITMAP查询 BITMAP 需要设置return_object_data_as_binary=true
OtherUNSUPPORTED

Clickhouse

创建示例

CREATE CATALOG jdbc_clickhouse PROPERTIES (
"type"="jdbc",
"user"="root",
"password"="123456",
"jdbc_url" = "jdbc:clickhouse://127.0.0.1:8123/demo",
"driver_url" = "clickhouse-jdbc-0.4.2-all.jar",
"driver_class" = "com.clickhouse.jdbc.ClickHouseDriver"
);

层级映射

DorisClickHouse
CatalogClickHouse Server
DatabaseDatabase
TableTable

类型映射

ClickHouse TypeDoris TypeComment
BoolBOOLEAN
StringSTRING
Date/Date32DATE
DateTime/DateTime64DATETIME
Float32FLOAT
Float64DOUBLE
Int8TINYINT
Int16/UInt8SMALLINTDoris 没有 UNSIGNED 数据类型,所以扩大一个数量级
Int32/UInt16INTDoris 没有 UNSIGNED 数据类型,所以扩大一个数量级
Int64/Uint32BIGINTDoris 没有 UNSIGNED 数据类型,所以扩大一个数量级
Int128/UInt64LARGEINTDoris 没有 UNSIGNED 数据类型,所以扩大一个数量级
Int256/UInt128/UInt256STRINGDoris 没有这个数量级的数据类型,采用 STRING 处理
DECIMALDECIMALV3/STRING将根据 DECIMAL 字段的(precision, scale)选择用何种类型
Enum/IPv4/IPv6/UUIDSTRING
ArrayARRAYArray 内部类型适配逻辑参考上述类型,不支持嵌套类型
OtherUNSUPPORTED

SAP HANA

创建示例

CREATE CATALOG jdbc_hana PROPERTIES (
"type"="jdbc",
"user"="SYSTEM",
"password"="SAPHANA",
"jdbc_url" = "jdbc:sap://localhost:31515/TEST",
"driver_url" = "ngdbc.jar",
"driver_class" = "com.sap.db.jdbc.Driver"
)

层级映射

DorisSAP HANA
CatalogDatabase
DatabaseSchema
TableTable

类型映射

SAP HANA TypeDoris TypeComment
BOOLEANBOOLEAN
TINYINTTINYINT
SMALLINTSMALLINT
INTERGERINT
BIGINTBIGINT
SMALLDECIMALDECIMALV3
DECIMALDECIMALV3/STRING将根据 Doris DECIMAL 字段的(precision, scale)选择用何种类型
REALFLOAT
DOUBLEDOUBLE
DATEDATE
TIMESTRING
TIMESTAMPDATETIME
SECONDDATEDATETIME
VARCHARSTRING
NVARCHARSTRING
ALPHANUMSTRING
SHORTTEXTSTRING
CHARCHAR
NCHARCHAR

Trino/Presto

创建示例

  • Trino

    CREATE CATALOG jdbc_trino PROPERTIES (
    "type"="jdbc",
    "user"="hadoop",
    "password"="",
    "jdbc_url" = "jdbc:trino://localhost:9000/hive",
    "driver_url" = "trino-jdbc-389.jar",
    "driver_class" = "io.trino.jdbc.TrinoDriver"
    );
  • Presto

    CREATE CATALOG jdbc_presto PROPERTIES (
    "type"="jdbc",
    "user"="hadoop",
    "password"="",
    "jdbc_url" = "jdbc:presto://localhost:9000/hive",
    "driver_url" = "presto-jdbc-0.280.jar",
    "driver_class" = "com.facebook.presto.jdbc.PrestoDriver"
    );

层级映射

映射 Trino 时,Doris 的 Database 对应于 Trino 中指定 Catalog(如示例中 jdbc_url 参数中的 "hive")下的一个 Schema。而 Doris 的 Database 下的 Table 则对应于 Trino 中 Schema 下的 Tables。即映射关系如下:

DorisTrino/Presto
CatalogCatalog
DatabaseSchema
TableTable

类型映射

Trino/Presto TypeDoris TypeComment
booleanBOOLEAN
tinyintTINYINT
smallintSMALLINT
integerINT
bigintBIGINT
decimalDECIMAL/DECIMALV3/STRING将根据 DECIMAL 字段的(precision, scale)选择用何种类型
realFLOAT
doubleDOUBLE
dateDATE
timestampDATETIME
varcharTEXT
charCHAR
arrayARRAYArray 内部类型适配逻辑参考上述类型,不支持嵌套类型
othersUNSUPPORTED

OceanBase

创建示例

CREATE CATALOG jdbc_oceanbase PROPERTIES (
"type"="jdbc",
"user"="root",
"password"="123456",
"jdbc_url" = "jdbc:oceanbase://127.0.0.1:2881/demo",
"driver_url" = "oceanbase-client-2.4.2.jar",
"driver_class" = "com.oceanbase.jdbc.Driver"
)
提示

Doris 在连接 OceanBase 时,会自动识别 OceanBase 处于 MySQL 或者 Oracle 模式,层级对应和类型映射参考 MySQLOracle

查看 JDBC Catalog

可以通过 SHOW CATALOGS 查询当前所在 Doris 集群里所有 Catalog:

SHOW CATALOGS;

通过 SHOW CREATE CATALOG 查询某个 Catalog 的创建语句:

SHOW CREATE CATALOG <catalog_name>;

删除 JDBC Catalog

可以通过 DROP CATALOG 删除某个 Catalog:

DROP CATALOG <catalog_name>;

查询 JDBC Catalog

  1. 通过 SWITCH 切换当前会话生效的 Catalog:

    SWITCH <catalog_name>;
  2. 通过 SHOW DATABASES 查询当前 Catalog 下的所有库:

    SHOW DATABASES FROM <catalog_name>;
    SHOW DATABASES;
  3. 通过 USE 切换当前会话生效的 Database:

    USE <database_name>;

    或者直接通过 USE <catalog_name>.<database_name>; 切换当前会话生效的 Database

  4. 通过 SHOW TABLES 查询当前 Catalog 下的所有表:

    SHOW TABLES FROM <catalog_name>.<database_name>;
    SHOW TABLES FROM <database_name>;
    SHOW TABLES;
  5. 通过 SELECT 查询当前 Catalog 下的某个表的数据:

    SELECT * FROM <table_name>;

时区

由于某些外部数据源的时间类型是带有时区信息的,而 Doris 的时间类型是不带时区信息的,所以在查询外部数据源的时间类型时,需要注意时区的问题。

读取数据时,是通过 BE 的 Java 部分来读取的,所以读取时的时区是 BE 的 JVM 时区,而 JVM 时区默认为 BE 所部署机器的时区。

这个 JVM 时区会影响 JDBC 读取数据时的时区,如果外部数据源的时间类型是带有时区信息的,那么读取时会根据 JVM 时区进行转换。

如果 JVM 时区和 Doris session 的时区不一致,建议在 be.conf 的 JAVA_OPTS 中设置 JVM 时区和 Doris session 中的 time_zone 保持一致。

注意:

对于 MySQL 数据源,在读取 timestamp 类型时,需要在 JDBC URL 中设置时区参数 connectionTimeZone=LOCALforceConnectionTimeZoneToSession=true

这样在读取 MySQL 的 timestamp 类型时,会读取为 Doris 的 BE JVM 时区,而不是 MySQL session 的时区。

注意上述两个 url 参数只对 mysql 8 以上的 jdbc driver 有效。

常见问题

  1. 除了 MySQL,Oracle,PostgreSQL,SQLServer,ClickHouse,SAP HANA,Trino/Presto,OceanBase 是否能够支持更多的数据库

    目前 Doris 只适配了 MySQL,Oracle,PostgreSQL,SQLServer,ClickHouse,SAP HANA,Trino/Presto,OceanBase. 关于其他的数据库的适配工作正在规划之中,原则上来说任何支持 JDBC 访问的数据库都能通过 JDBC 外表来访问。如果您有访问其他外表的需求,欢迎修改代码并贡献给 Doris。

  2. 读写 MySQL 外表的 emoji 表情出现乱码

    Doris 进行 jdbc 外表连接时,由于 mysql 之中默认的 utf8 编码为 utf8mb3,无法表示需要 4 字节编码的 emoji 表情。这里需要在建立 mysql 外表时设置对应列的编码为 utf8mb4,设置服务器编码为 utf8mb4,JDBC Url 中的 characterEncoding 不配置.(该属性不支持 utf8mb4,配置了非 utf8mb4 将导致无法写入表情,因此要留空,不配置)

    可全局修改配置项

    修改 mysql 目录下的 my.ini 文件(linux 系统为 etc 目录下的 my.cnf 文件)
    [client]
    default-character-set=utf8mb4

    [mysql]
    设置 mysql 默认字符集
    default-character-set=utf8mb4

    [mysqld]
    设置 mysql 字符集服务器
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    init_connect='SET NAMES utf8mb4

    修改对应表与列的类型
    ALTER TABLE table_name MODIFY colum_name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    ALTER TABLE table_name CHARSET=utf8mb4;
    SET NAMES utf8mb4
  3. 读取 MySQL date/datetime 类型出现异常

    ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.6)[INTERNAL_ERROR]UdfRuntimeException: get next block failed: 
    CAUSED BY: SQLException: Zero date value prohibited
    CAUSED BY: DataReadException: Zero date value prohibited

    这是因为 JDBC 中对于该非法的 Date/DateTime 默认处理为抛出异常,可以通过参数 zeroDateTimeBehavior控制该行为。

    可选参数为:EXCEPTION,CONVERT_TO_NULL,ROUND, 分别为:异常报错,转为 NULL 值,转为 "0001-01-01 00:00:00";

    需要在创建 Catalog 的 jdbc_url 把 JDBC 连接串最后增加 zeroDateTimeBehavior=convertToNull ,如 "jdbc_url" = "jdbc:mysql://127.0.0.1:3306/test?zeroDateTimeBehavior=convertToNull" 这种情况下,JDBC 会把 0000-00-00 或者 0000-00-00 00:00:00 转换成 null,然后 Doris 会把当前 Catalog 的所有 Date/DateTime 类型的列按照可空类型处理,这样就可以正常读取了。

  4. 读取 MySQL 外表或其他外表时,出现加载类失败

    如以下异常:

    failed to load driver class com.mysql.jdbc.driver in either of hikariconfig class loader

    这是因为在创建 catalog 时,填写的 driver_class 不正确,需要正确填写,如上方例子为大小写问题,应填写为 "driver_class" = "com.mysql.jdbc.Driver"

  5. 读取 MySQL 出现通信链路异常

    如果出现如下报错:

    ERROR 1105 (HY000): errCode = 2, detailMessage = PoolInitializationException: Failed to initialize pool: Communications link failure

    The last packet successfully received from the server was 7 milliseconds ago. The last packet sent successfully to the server was 4 milliseconds ago.
    CAUSED BY: CommunicationsException: Communications link failure

    The last packet successfully received from the server was 7 milliseconds ago. The last packet sent successfully to the server was 4 milliseconds ago.
    CAUSED BY: SSLHandshakeExcepti

    可查看 be 的 be.out 日志

    如果包含以下信息:

    WARN: Establishing SSL connection without server's identity verification is not recommended. 
    According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set.
    For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'.
    You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

    可在创建 Catalog 的 jdbc_url 把 JDBC 连接串最后增加 ?useSSL=false ,如 "jdbc_url" = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false"

  6. 使用 JDBC 查询 MYSQL 大数据量时,如果查询偶尔能够成功,偶尔会报如下错误,且出现该错误时 MYSQL 的连接被全部断开,无法连接到 MYSQL SERVER,过段时间后 mysql 又恢复正常,但是之前的连接都没了:

    ERROR 1105 (HY000): errCode = 2, detailMessage = [INTERNAL_ERROR]UdfRuntimeException: JDBC executor sql has error:
    CAUSED BY: CommunicationsException: Communications link failure
    The last packet successfully received from the server was 4,446 milliseconds ago. The last packet sent successfully to the server was 4,446 milliseconds ago.

    出现上述现象时,可能是 Mysql Server 自身的内存或 CPU 资源被耗尽导致 Mysql 服务不可用,可以尝试增大 Mysql Server 的内存或 CPU 配置。

  7. 使用 JDBC 查询 MYSQL 的过程中,如果发现和在 MYSQL 库的查询结果不一致的情况

    首先要先排查下查询字段中是字符串否存在有大小写情况。比如,Table中有一个字段c_1中有"aaa"和"AAA"两条数据,如果在初始化MYSQL数据库时未指定区分字符串 大小写,那么MYSQL默认是不区分字符串大小写的,但是在Doris中是严格区分大小写的,所以会出现以下情况:

    Mysql行为:
    select count(c_1) from table where c_1 = "aaa"; 未区分字符串大小,所以结果为:2

    Doris行为:
    select count(c_1) from table where c_1 = "aaa"; 严格区分字符串大小,所以结果为:1

    如果出现上述现象,那么需要按照需求来调整,方式如下:

    在MYSQL中查询时添加“BINARY”关键字来强制区分大小写:select count(c_1) from table where BINARY c_1 = "aaa"; 或者在MYSQL中建表时候指定: CREATE TABLE table ( c_1 VARCHAR(255) CHARACTER SET binary ); 或者在初始化MYSQL数据库时指定校对规则来区分大小写: character-set-server=UTF-8 和 collation-server=utf8_bin。

  8. 读取 SQLServer 出现通信链路异常

    ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.6)[CANCELLED][INTERNAL_ERROR]UdfRuntimeException: Initialize datasource failed:
    CAUSED BY: SQLServerException: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption.
    Error: "sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
    unable to find valid certification path to requested target". ClientConnectionId:a92f3817-e8e6-4311-bc21-7c66

    可在创建 Catalog 的 jdbc_url 把 JDBC 连接串最后增加 encrypt=false ,如 "jdbc_url" = "jdbc:sqlserver://127.0.0.1:1433;DataBaseName=doris_test;encrypt=false"

  9. 读取 Oracle 出现 Non supported character set (add orai18n.jar in your classpath): ZHS16GBK 异常

    下载 orai18n.jar 并放到 Doris FE 的 lib 目录以及 BE 的 lib/java_extensions 目录 (Doris 2.0 之前的版本需放到 BE 的 lib 目录下) 下即可。

    从 2.0.2 版本起,可以将这个文件放置在 FE 和 BE 的 custom_lib/ 目录下(如不存在,手动创建即可),以防止升级集群时因为 lib 目录被替换而导致文件丢失。

  10. 通过 jdbc catalog 读取 Clickhouse 数据出现NoClassDefFoundError: net/jpountz/lz4/LZ4Factory 错误信息

    可以先下载lz4-1.3.0.jar包,然后放到 DorisFE lib 目录以及 BE 的 lib/lib/java_extensions目录中(Doris 2.0 之前的版本需放到 BE 的 lib 目录下)。

    从 2.0.2 版本起,可以将这个文件放置在 FE 和 BE 的 custom_lib/ 目录下(如不存在,手动创建即可),以防止升级集群时因为 lib 目录被替换而导致文件丢失。