doris: MySQL

Doris JDBC Catalog 支持通过标准 JDBC 接口连接 MySQL 数据库。本文档介绍如何配置 MySQL 数据库连接。

使用须知​

要连接到 MySQL 数据库,您需要

  • MySQL 5.7, 8.0 或更高版本

  • MySQL 数据库的 JDBC 驱动程序,您可以从 Maven 仓库下载最新或指定版本的 MySQL JDBC 驱动程序。推荐使用 MySQL Connector/J 8.0.31 及以上版本。

  • Doris 每个 FE 和 BE 节点和 MySQL 服务器之间的网络连接,默认端口为 3306。

连接 MySQL​

CREATE CATALOG mysql PROPERTIES ("type"="jdbc","user"="root","password"="secret","jdbc_url" = "jdbc:mysql://example.net:3306","driver_url" = "mysql-connector-j-8.3.0.jar","driver_class" = "com.mysql.cj.jdbc.Driver"
)

备注

jdbc_url 定义要传递给 MySQL JDBC 驱动程序的连接信息和参数。 支持的 URL 的参数可在 MySQL 开发指南 中找到。

连接安全​

如果您使用数据源上安装的全局信任证书配置了 TLS,则可以通过将参数附加到在 jdbc_url 属性中设置的 JDBC 连接字符串来启用集群和数据源之间的 TLS。

例如,对于 MySQL Connector/J 8.0 版,使用 sslMode 参数通过 TLS 保护连接。默认情况下,该参数设置为 PREFERRED,如果服务器启用,它可以保护连接。您还可以将此参数设置为 REQUIRED,如果未建立 TLS,则会导致连接失败。

您可以在通过在 jdbc_url 中添加 sslMode 参数来配置它:

“jdbc_url”=“jdbc:mysql://example.net:3306/?sslMode=REQUIRED”

有关 TLS 配置选项的更多信息,请参阅 MySQL JDBC 安全文档。

层级映射​

映射 MySQL 时,Doris 的一个 Database 对应于 MySQL 中的一个 Database。而 Doris 的 Database 下的 Table 则对应于 MySQL 中,该 Database 下的 Tables。即映射关系如下:

DorisMySQL
CatalogMySQL Server
DatabaseDatabase
TableTable

类型映射​

MySQL 到 Doris 类型映射​

MYSQL TypeDoris TypeComment
BOOLEANTINYINT
TINYINTTINYINT
SMALLINTSMALLINT
MEDIUMINTINT
INTINT
BIGINTBIGINT
UNSIGNED TINYINTSMALLINT
UNSIGNED MEDIUMINTINT
UNSIGNED INTBIGINT
UNSIGNED BIGINTLARGEINT
FLOATFLOAT
DOUBLEDOUBLE
DECIMALDECIMAL
UNSIGNED DECIMAL(p,s)DECIMAL(p+1,s) / STRING
DATEDATE
TIMESTAMPDATETIME
DATETIMEDATETIME
YEARSMALLINT
TIMESTRING
CHARCHAR
VARCHARVARCHAR
JSONSTRING
SETSTRING
ENUMSTRING
BITBOOLEAN/STRING
TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXTSTRING
BLOB,MEDIUMBLOB,LONGBLOB,TINYBLOBSTRING
BINARY,VARBINARYSTRING
OtherUNSUPPORTED

提示

  • Doris 不支持 UNSIGNED 数据类型,所以 UNSIGNED 数据类型会被映射为 Doris 对应大一个数量级的数据类型。
  • UNSIGNED DECIMAL(p,s) 会被映射为 DECIMAL(p+1,s) 或 STRING。注意在此类型被映射为 String 时,只能支持查询,不能对 MySQL 进行写入操作。
  • 为了更好的读取与计算性能均衡,Doris 会将 JSON 类型映射为 STRING 类型。
  • Doris 不支持 BIT 类型,BIT 类型会在 BIT(1) 时被映射为 BOOLEAN,其他情况下映射为 STRING。
  • Doris 不支持 YEAR 类型,YEAR 类型会被映射为 SMALLINT。
  • Doris 不支持 TIME 类型,TIME 类型会被映射为 STRING。

时间戳类型处理​

在 JDBC 类型 Catalog 读取数据时,BE 的 Java 部分使用 JVM 时区。JVM 时区默认为 BE 部署机器的时区,这会影响 JDBC 读取数据时的时区转换。

为了确保时区一致性,建议在 be.conf 的 JAVA_OPTS 中设置 JVM 时区与 Doris session 的 time_zone 一致。

读取 MySQL 的 TIMESTAMP 类型时,请在 JDBC URL 中添加参数:connectionTimeZone=LOCAL 和 forceConnectionTimeZoneToSession=true。这些参数适用于 MySQL Connector/J 8 以上版本,可确保读取的时间为 Doris BE JVM 时区,而非 MySQL session 时区。

查询优化​

谓词下推​

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

  2. 当变量 enable_ext_func_pred_pushdown 设置为 true,会将 where 之后的函数条件也下推到外部数据源,Doris 会自动识别部分 MySQL 不支持的函数,可通过 explain sql 查看。

    当前 Doris 默认不会下推到 MySQL 的函数如下

    Function
    DATE_TRUNC
    MONEY_FORMAT
    NEGATIVE

    当您发现还有其他函数不支持下推时,可以通过 fe.conf 配置 jdbc_mysql_unsupported_pushdown_functions 来指定不支持下推的函数。如:jdbc_mysql_unsupported_pushdown_functions=func1,func2

行数限制​

如果在查询中带有 limit 关键字,Doris 会将 limit 下推到 MySQL,以减少数据传输量。

转义字符​

Doris 会在下发到 MySQL 的查询语句中,自动在字段名与表名上加上转义符:(``),以避免字段名与表名与 MySQL 内部关键字冲突。

连接异常排查​

  • Communications link failure The last packet successfully received from the server was 7 milliseconds ago.

    • 原因:
      • 网络问题:
        • 网络不稳定或连接中断。
        • 客户端和服务器之间的网络延迟过高。
      • MySQL 服务器设置
        • MySQL 服务器可能配置了连接超时参数,例如 wait_timeout 或 interactive_timeout,导致连接超时被关闭。
      • 防火墙设置
        • 防火墙规则可能阻止了客户端与服务器之间的通信。
      • 连接池设置
        • 连接池中的配置 connection_pool_max_life_time 可能导致连接被关闭或回收,或者未及时探活
      • 服务器资源问题
        • MySQL 服务器可能资源不足,无法处理新的连接请求。
      • 客户端配置
        • 客户端 JDBC 驱动配置错误,例如 autoReconnect 参数未设置或设置不当。
    • 解决
      • 检查网络连接:
        • 确认客户端和服务器之间的网络连接稳定,避免网络延迟过高。
      • 检查 MySQL 服务器配置:
        • 查看并调整 MySQL 服务器的 wait_timeout 和 interactive_timeout 参数,确保它们设置合理。
      • 检查防火墙配置:
        • 确认防火墙规则允许客户端与服务器之间的通信。
      • 调整连接池设置:
        • 检查并调整连接池的配置参数 connection_pool_max_life_time,确保小于 MySQL 的 wait_timeout 和 interactive_timeout 参数并大于执行时间最长的 SQL
      • 监控服务器资源:
        • 监控 MySQL 服务器的资源使用情况,确保有足够的资源处理连接请求。
      • 优化客户端配置:
        • 确认 JDBC 驱动的配置参数正确,例如 autoReconnect=true,确保连接能在中断后自动重连。
  • java.io.EOFException MESSAGE: Can not read response from server. Expected to read 819 bytes, read 686 bytes before connection was unexpectedly lost.

    • 原因:连接被 MySQL Kill 或者 MySQL 宕机
    • 解决:检查 MySQL 是否有主动 kill 连接的机制,或者是否因为查询过大查崩 MySQL

常见问题​

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

    Doris 进行 MySQL Catalog 查询时,由于 MySQL 之中默认的 utf8 编码为 utf8mb3,无法表示需要 4 字节编码的 emoji 表情。这里需要将 MySQL 的编码修改为 utf8mb4,以支持 4 字节编码。

    可全局修改配置项

    修改 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
    

  2. 读取 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,convertToNull,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 类型的列按照可空类型处理,这样就可以正常读取了。

  3. 读取 MySQL Catalog 或其他 JDBC Catalog 时,出现加载类失败

    如以下异常:

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

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

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

    如果出现如下报错:

    ERROR 1105 (HY000): errCode = 2, detailMessage = PoolInitializationException: Failed to initialize pool: Communications link failureThe 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 failureThe 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"

  5. 查询 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 配置。

  6. 查询 MySQL 的过程中,如果发现和在 MySQL 库的查询结果不一致的情况

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

    MySQL 行为:
    select count(c_1) from table where c_1 = "aaa"; 未区分字符串大小,所以结果为:2Doris 行为:
    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 数据库时指定校对规则来区分大小写:

    [mysqld]
    character-set-server=utf8
    collation-server=utf8_bin
    [client]
    default-character-set=utf8
    [mysql]
    default-character-set=utf8
    

  7. 查询 MySQL 的时候,出现长时间卡住没有返回结果,或着卡住很长时间并且 fe.warn.log 中出现出现大量 write lock 日志,可以尝试在 URL 添加 socketTimeout,例如:jdbc:mysql://host:port/database?socketTimeout=30000,防止 JDBC 客户端 在被 MySQL 关闭连接后无限等待。

  8. 在使用 MySQL Catalog 的过程中发现 FE 的 JVM 内存或 Threads 数持续增长不减少,并可能同时出现 Forward to master connection timed out 报错

    打印 FE 线程堆栈 jstack fe_pid > fe.js,如果出现大量 mysql-cj-abandoned-connection-cleanup 线程,说明是 MySQL JDBC 驱动的问题。

    按照如下方式处理:

    1. 升级 MySQL JDBC 驱动到 8.0.31 及以上版本
    2. 在 FE 和 BE conf 文件的 JAVA_OPTS 中增加 -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true 参数,禁用 MySQL JDBC 驱动的连接清理功能,并重启集群

    注意: 如果 Doris 的版本在 2.0.13 及以上(2.0 Release),或 2.1.5 及以上(2.1 Release)则无需增加该参数,因为 Doris 已经默认禁用了 MySQL JDBC 驱动的连接清理功能。只需更换 MySQL JDBC 驱动版本即可。但是需要重启 Doris 集群来清理掉之前的 Threads。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28878.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMake学习笔记(一):工程的新建和如何将源文件生成二进制文件

cmake是我们在工作过程中比较常见的一个工具,该系列文章是自己用来学习的笔记。目前只是记录下自己学习cmake的过程中的一些重要的知识点,其是以项目需求为导向并非完整的cmake的学习路线和系统,同样也并非适合所有的人。 1.生成一个可执行文…

libcoap在Ubuntu下的编译(基于CMake)

引言 libcoap 是一个开源的轻量级 C 语言库,用于实现 CoAP(Constrained Application Protocol,受限应用协议)。CoAP 是一种专为资源受限设备设计的轻量级通信协议,适用于物联网(IoT)和嵌入式系…

Docker新手入门(持续更新中)

一、定义 快速构建、运行、管理应用的工具。 Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用。 所谓镜像,就是将应用所需的函数库、依赖、配置等应用一起打包得到的。 所谓容器,为每个镜像的应用进程创建…

蓝桥杯C组真题——巧克力

题目如下 思路 代码及解析如下 谢谢观看

SLAM评估工具安装及使用EVO(Ubuntu20.04安装evo)--缺少 onnx 库还有Pandas 版本不兼容解决

介绍一下我的是ubuntu20.04.机载电脑是orinnx,通过源码烧写的系统。 首先打开终端,输入 pip install evo --upgrade --no-binary evo 安装过程中出现如下问题 缺少 onnx 库还有Pandas 版本不兼容, ONNX(Open Neural Network E…

在虚拟机上安装hadoop

在虚拟机上安装 Hadoop 是一个常见的实验环境搭建过程。以下是详细的步骤和注意事项: 前面的课程我们已经准备好了三台虚拟设备球供我们学习大数据技术,今天我们将使用其中的一台设备来运行第一个hadoop 程序。 运行第一个 hadoop程序 要运行 hadoop 程序…

Redis 常见数据类型

官方文档 RedisCommands 1)Redis 的命令有上百个,如果纯靠死记硬背比较困难,但是如果理解 Redis 的一些机制,会发现这些命令有很强的通用性。 2)Redis 不是万金油,有些数据结构和命令必须在特定场景下使用…

VBA信息获取与处理第五节:如何在单个工作表中查找某个给定值

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

永磁同步电机无速度算法--改进滑模观测器SMO(边界层法)

一、原理介绍 根据滑模观测器的定义,其切换函数是一个拥有高频切换特性的不连续项,为了进一步减小系统的抖振,将符号函数替换为Sigmoid函数,该函数为一种连续、光滑的切换函数,对抖振有良好的抑制效果,其数…

基于SpringBoot+mybatis+layui就业管理系统设计和实现

基于SpringBootmybatislayui就业管理系统设计和实现 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统 &…

​《开源高仿Windows 12网页版:零安装体验未来操作系统界面》​​

📌 大家好,我是智界工具库,致力于分享好用实用且智能的软件以及在JAVA语言开发中遇到的问题,如果本篇文章对你有所帮助请帮我点个小赞小收藏吧,谢谢喲!😘😘😘 博主声…

docker 安装达梦数据库(离线)

docker安装达梦数据库,官网上已经下载不了docker版本的了,下面可通过百度网盘下载 通过网盘分享的文件:dm8_20240715_x86_rh6_rq_single.tar.zip 链接: https://pan.baidu.com/s/1_ejcs_bRLZpICf69mPdK2w?pwdszj9 提取码: szj9 上传到服务…

HTML第三节

一.初识CSS 1.CSS定义 A.内部样式表 B.外部样式表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…

【大模型系列篇】国产开源大模型DeepSeek-V3技术报告解析

DeepSeek-V3技术报告 目录 DeepSeek-V3技术报告 1. 摘要 2. 引言 3. DeepSeek V3 架构 3.1 基础架构 3.1.1. 多头潜在注意力 3.1.2. DeepSeekMoE和无辅助损失的负载均衡 3.2 多令牌预测 4. 基础设施 4.1 计算集群 4.2 训练框架 4.2.1. DualPipe算法与计算通信协同优…

linux的文件系统及文件类型

目录 一、Linux支持的文件系统 二、linux的文件类型 2.1、普通文件 2.2、目录文件 2.3、链接文件 2.4、字符设备文件: 2.5、块设备文件 2.6、套接字文件 2.7、管道文件 三、linux的文件属性 3.1、关于权限部分 四、Linux的文件结构 五、用户主目录 5.1、工作目录…

rabbitmq-amqp事务消息+消费失败重试机制+prefetch限流

1. 安装和配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <arti…

web高可用集群项目(数据库主从同步、文件共享存储、nginx动静分离+负载均衡+高可用)

一、项目环境 二、环境准备 主机名IP地址备注openEuler-1192.168.121.11主负载调度器openEuler-2192.168.121.12副负载调度器openEuler-3192.168.121.13web-1&#xff08;静态&#xff09;openEuler-4192.168.121.14web-2&#xff08;静态&#xff09;openEuler-5192.168.121.…

企业工程项目管理系统源码:Java版源码解析

一、项目概述 鸿鹄工程项目管理系统是基于Spring Cloud、Spring Boot、Mybatis、Vue和ElementUI技术栈&#xff0c;采用前后端分离架构构建的工程管理软件。它旨在应对企业快速发展中的管理挑战&#xff0c;提升工程管理效率&#xff0c;减轻工作负担&#xff0c;加速信息处理…

深度学习五大模型:CNN、Transformer、BERT、RNN、GAN详细解析

卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09; 原理 &#xff1a;CNN主要由卷积层、池化层和全连接层组成。卷积层通过卷积核在输入数据上进行卷积运算&#xff0c;提取局部特征&#xff1b;池化层则对特征图进行下采样&#xff0c;降低特征维度&…

vtk 3D坐标标尺应用 3D 刻度尺

2d刻度尺 : vtk 2D 刻度尺 2D 比例尺-CSDN博客 简介&#xff1a; 3D 刻度尺&#xff0c;也是常用功能&#xff0c;功能强大 3D 刻度尺 CubeAxesActor vtkCubeAxes调整坐标轴的刻度、原点和显示效果&#xff0c;包括关闭小标尺、固定坐标轴原点&#xff0c;以及设置FlyMode模…