注意:说明:
注意:该功能适用于 Doris 1.2及后续版本。
一、MySQL
CREATE CATALOG jdbc_mysql PROPERTIES ( "type"="jdbc", "user"="root", "password"="********", "jdbc_url" = "jdbc:mysql://172.**.**.**:3306/demo", "driver_url" = "mysql-connector-java-5.1.47.jar", "driver_class" = "com.mysql.jdbc.Driver");
二、PostgreSQL
CREATE CATALOG jdbc_postgresql PROPERTIES ( "type"="jdbc", "user"="root", "password"="*******", "jdbc_url" = "jdbc:postgresql://172.**.**.**:5449/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。即映射关系如下:
| Doris | PostgreSQL |
| Catalog | Database |
| Database | Schema |
| Table | Table |
Doris 通过 SQL 语句来获得 PG user 能够访问的所有 schema 并将其映射为 Doris 的 database
select nspname from pg_namespace where has_schema_privilege('<UserName>', nspname, 'USAGE');
三、Oracle
CREATE CATALOG jdbc_oracle PROPERTIES ( "type"="jdbc", "user"="root", "password"="*********", "jdbc_url" = "jdbc:oracle:thin:@172.**.**.**:1521:helowin", "driver_url" = "ojdbc6.jar", "driver_class" = "oracle.jdbc.driver.OracleDriver");
映射 Oracle 时,Doris 的一个 Database 对应于 Oracle 中的一个 User。而 Doris 的 Database 下的 Table 则对应于 Oracle 中,该 User 下的有权限访问的 Table。即映射关系如下:
| Doris | Oracle |
| Catalog | Database |
| Database | User |
| Table | Table |
四、Clickhouse
CREATE CATALOG jdbc_clickhouse PROPERTIES ( "type"="jdbc", "user"="root", "password"="*******", "jdbc_url" = "jdbc:clickhouse://172.**.**.**:8123/demo", "driver_url" = "clickhouse-jdbc-0.4.6-all.jar", "driver_class" = "com.clickhouse.jdbc.ClickHouseDriver");
五、SQLServer
CREATE CATALOG sqlserver_catalog PROPERTIES ( "type"="jdbc", "user"="SA", "password"="*********", "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。即映射关系如下:
| Doris | SQLServer |
| Catalog | Database |
| Database | Schema |
| Table | Table |
六、Doris
JDBC Catalog 也支持连接另一个 Doris 数据库:
CREATE CATALOG doris_catalog PROPERTIES ( "type"="jdbc", "user"="root", "password"="*******", "jdbc_url" = "jdbc:mysql://172.**.**.**:9030?useSSL=false", "driver_url" = "mysql-connector-java-5.1.47.jar", "driver_class" = "com.mysql.jdbc.Driver");
目前 JDBC Catalog 连接一个 Doris 数据库只支持用5.x版本的 JDBC jar 包。如果使用8.x JDBC jar 包,可能会出现列类型无法匹配问题。
七、参数说明
| 参数 | 是否必须 | 默认值 | 说明 |
| user | 是 | – | 对应数据库的用户名 |
| password | 是 | – | 对应数据库的密码 |
| jdbc_url | 是 | – | JDBC 连接串 |
| driver_url | 是 | – | JDBC Driver Jar 包名称* |
| driver_class | 是 | – | JDBC Driver Class 名称 |
| only_specified_database | 否 | "false" | 指定是否只同步指定的 database |
| lower_case_table_names | 否 | "false" | 是否以小写的形式同步 JDBC 外部数据源的表名 |
| 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-5.1.47.jar。系统会从这个 http 地址下载 Driver 文件。仅支持无认证的 http 服务。
九、指定同步数据库
·only_specified_database:在 jdbc 连接时可以指定链接到哪个 database/schema,如:MySQL 中 jdbc_url 中可以指定 database,pg 的 jdbc_url 中可以指定 currentSchema。
·include_database_list:当 only_specified_database=true 时,指定需要同步的 database,以','分割。默认为'',即不做任何过滤,同步所有 database。db 名称是大小写敏感的
·exclude_database_list:当 only_specified_database=true 时,指定不需要同步的多个 database,以','分割。默认为'',即不做任何过滤,同步所有database。db 名称是大小写敏感的。
当 include_database_list 和 exclude_database_list 有重合的 database 配置时,exclude_database_list会优先生效。
如果使用该参数时连接 Oracle 数据库,要求使用 ojdbc8.jar 以上版本 jar 包。
十、数据查询
select * from mysql_catalog.mysql_database.mysql_table where t1 > 1000 and t2 ='term';
由于可能存在使用数据库内部的关键字作为字段名,为解决这种状况下仍能正确查询,所以在 SQL 语句中,会根据各个数据库的标准自动在字段名与表名上加上转义符。例如 MYSQL(“)、PostgreSQL("")、SQLServer([])、ORACLE(""),所以此时可能会造成字段名的大小写敏感,具体可以通过 explain sql,查看转义后下发到各个数据库的查询语句。
十一、MySQL
| MYSQL Type | Doris Type | Comment |
| BOOLEAN | BOOLEAN | – |
| TINYINT | TINYINT | – |
| SMALLINT | SMALLINT | – |
| MEDIUMINT | INT | – |
| INT | INT | – |
| BIGINT | BIGINT | – |
| UNSIGNED TINYINT | SMALLINT | Doris 没有 UNSIGNED 数据类型,所以扩大一个数量级 |
| UNSIGNED MEDIUMINT | INT | Doris 没有 UNSIGNED 数据类型,所以扩大一个数量级 |
| UNSIGNED INT | BIGINT | Doris 没有 UNSIGNED 数据类型,所以扩大一个数量级 |
| UNSIGNED BIGINT | LARGEINT | – |
| FLOAT | FLOAT | – |
| DOUBLE | DOUBLE | – |
| DECIMAL | DECIMAL | – |
| DATE | DATE | – |
| TIMESTAMP | DATETIME | – |
| DATETIME | DATETIME | – |
| YEAR | SMALLINT | – |
| TIME | STRING | – |
| CHAR | CHAR | – |
| VARCHAR | VARCHAR | – |
| TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB、TINYSTRING、STRING、MEDIUMSTRING、LONGSTRING、BINARY、VARBINARY、JSON、SET、BIT | STRING | – |
| Other | UNSUPPORTED | – |
十二、PostgreSQL
| POSTGRESQL Type | Doris Type | Comment |
| boolean | BOOLEAN | – |
| smallint/int2 | SMALLINT | – |
| integer/int4 | INT | – |
| bigint/int8 | BIGINT | – |
| decimal/numeric | DECIMAL | – |
| real/float4 | FLOAT | – |
| double precision | DOUBLE | – |
| smallserial | SMALLINT | – |
| serial | INT | – |
| bigserial | BIGINT | – |
| char | CHAR | – |
| varchar/text | STRING | – |
| timestamp | DATETIME | – |
| date | DATE | – |
| time | STRING | – |
| interval | STRING | – |
| point/line/lseg/box/path/polygon/circle | STRING | – |
| cidr/inet/macaddr | STRING | – |
| bit/bit(n)/bit varying(n) | STRING | bit 类型映射为 doris 的 STRING 类型,读出的数据是 true/false,而不是1/0 |
| uuid/JSONB | STRING | – |
| Other | UNSUPPORTED | – |
十三、Oracle
| ORACLE Type | Doris Type | Comment |
| number(p) / number(p,0) | TINYINT/SMALLINT/INT/BIGINT/LARGEINT | Doris会根据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/LARGEINT | s<0的情况下, Doris会将p设置为 p+|s|, 并进行和number(p) / number(p,0)一样的映射 |
| number | – | Doris 目前不支持未指定 p 和 s 的 oracle 类型 |
| decimal | DECIMAL | – |
| float/real | DOUBLE | – |
| DATE | DATETIME | – |
| TIMESTAMP | DATETIME | – |
| CHAR/NCHAR | STRING | – |
| VARCHAR2/NVARCHAR2 | STRING | – |
| LONG/ RAW/ LONG RAW/ INTERVAL | STRING | – |
| Other | UNSUPPORTED | – |
十四、SQLServer
| SQLServer Type | Doris Type | Comment |
| bit | BOOLEAN | – |
| tinyint | SMALLINT | SQLServer 的 tinyint 是无符号数,所以映射为 Doris 的 SMALLINT |
| smallint | SMALLINT | – |
| int | INT | – |
| bigint | BIGINT | – |
| real | FLOAT | – |
| float | DOUBLE | – |
| money | DECIMAL(19,4) | – |
| smallmoney | DECIMAL(10,4) | – |
| decimal/numeric | DECIMAL | – |
| date | DATE | – |
| datetime/datetime2/smalldatetime | DATETIMEV2 | – |
| char/varchar/text/nchar/nvarchar/ntext | STRING | – |
| binary/varbinary | STRING | – |
| time/datetimeoffset | STRING | – |
| Other | UNSUPPORTED | – |
十五、Clickhouse
| ClickHouse Type | Doris Type | Comment |
| Bool | BOOLEAN | – |
| String | STRING | – |
| Date/Date32 | DATEV2 | Jdbc Catlog 连接 ClickHouse 时默认使用 DATEV2类型 |
| DateTime/DateTime64 | DATETIMEV2 | Jdbc Catlog 连接 ClickHouse 时默认使用 DATETIMEV2类型 |
| Float32 | FLOAT | – |
| Float64 | DOUBLE | – |
| Int8 | TINYINT | – |
| Int16/UInt8 | SMALLINT | Doris 没有 UNSIGNED 数据类型,所以扩大一个数量级 |
| Int32/UInt16 | INT | Doris 没有 UNSIGNED 数据类型,所以扩大一个数量级 |
| Int64/Uint32 | BIGINT | Doris 没有 UNSIGNED 数据类型,所以扩大一个数量级 |
| Int128/UInt64 | LARGEINT | Doris 没有 UNSIGNED 数据类型,所以扩大一个数量级 |
| Int256/UInt128/UInt256 | STRING | Doris 没有这个数量级的数据类型,采用 STRING 处理 |
| DECIMAL | DECIMAL/DECIMALV3/STRING | 将根据 Doris DECIMAL 字段的(precision, scale)和 enable_decimal_conversion 开关选择用何种类型 |
| Enum/IPv4/IPv6/UUID | STRING | 在显示上 IPv4,IPv6会额外在数据最前面显示一个“/”,需要自己用 split_part 函数处理 |
| Array | ARRAY | Array 内部类型适配逻辑参考上述类型,不支持嵌套类型 |
| Other | UNSUPPORTED | – |