Doris Schema Change 常见问题分析

在这里插入图片描述

1. 什么是 Schema Change

Schema Change 是在数据库中修改表结构的一种操作,例如添加列、删除列、更改列类型等。

⚠️Schema Change 限制⚠️

  • 一张表在同一时间只能有一个 Schema Change 作业在运行。
  • 分区列和分桶列不能修改。
  • 如果聚合表中有 REPLACE 方式聚合的 Value 列,则不允许删除 Key 列。
  • Unique 表不允许删除 Key 列。
  • 在新增聚合类型为 SUM 或者 REPLACE 的 Value 列时,该列的默认值对历史数据没有含义。
  • 因为历史数据已经失去明细信息,所以默认值的取值并不能实际反映聚合后的取值。
  • 当修改列类型时,除 Type 以外的字段都需要按原列上的信息补全。
  • 注意,除新的列类型外,如聚合方式,Nullable 属性,以及默认值都要按照原信息补全。
  • 不支持修改聚合类型、Nullable 属性和默认值。

2. 定位 Schema Change 问题需要的信息

  1. 版本信息:最好精确到 commit 号。
select @@version_comment;
  1. 日志文件
    • FE 日志目录下的 fe.logfe.audit.log,以获取最近的 Schema Change 语句。
    • BE 日志目录下的 be.INFO
  2. 表结构:获取表的当前结构。
show create table table_name;
  1. 内存状态:如果是 FE OOM 问题,需要 dump FE 内存进行分析。
a. 获取FE进行的pidz
b. dump文件获取:执行jmap -dump:format=b,file=heapdump.phrof pidz

3. 常见 Schema Change 问题及解决方案

3.1 BE 内存不足导致 Schema Change 失败

错误描述
errCode = 2, detailMessage = rollup tasks failed on same tablet reach threshold [[ALTER], signature: 3404761, backendId: 294163, tablet id: 3404761], reason=task type: ALTER, status_code: MEM_LIMIT_EXCEEDED, status_message: [(xx.xx.xx.xx)[MEM_LIMIT_EXCEEDED]PreCatch error code:11, [E11] Allocator mem tracker check failed, [MEM_LIMIT_EXCEEDED]failed alloc size 64.00 KB, memory tracker limit exceeded, tracker label:EngineAlterTabletTask#baseTabletId=3375343:newTabletId=3404761, type:schema_change, limit 2.00 GB, peak used 2.00 GB, current used 2.00 GB. backend xx.xx.xx.xx process memory used 12.22 GB. can modify `memory_limitation_per_thread_for_schema_change_bytes` in be.conf to change limit, details see be.INFO.
解决方案
  1. 查看相关配置项 memory_limitation_per_thread_for_schema_change_bytes(默认为 2GB)。
  2. 检查对应 Tablet 的数据大小和 Rowset 分布:
    curl http://xx.xx.xx.xx:8040/api/compaction/show?tablet_id=${tablet_id}
    
  3. 调整 memory_limitation_per_thread_for_schema_change_bytes 为大于最大 Rowset 大小的值。
  4. 在 2.0/2.1 版本中,内存限制是自适应的,可以通过日志来看:
    grep "start alter tablet" be.INFO | grep mem_limit
    
  5. 如果自适应内存仍不足,将 memory_limitation_per_thread_for_schema_change_bytes 调大,同时将 alter_tablet_worker_count 设为 1,避免占用过多内存。

3.2 Schema Change 耗时过长导致 -235 错误

问题定位
  1. 判断是否正在进行 Schema Change:

    • be.WARNING 日志中找到 -235 对应的 Tablet ID。
  2. 使用以下命令查看 Tablet 状态:

    curl -X POST -H "Content-Type: application/json" -d '{"stmt":  "show tablet ${tablet_id}"}' http://xx.xx.xx.xx:8030/api/show/db
    

    如果表名前缀为 _doris_shadow_,说明是新建的 Tablet。结果示例:

    [["default_cluster:avi","base_blocks","month_202405","__doris_shadow_base_blocks","10839","471528","476493","891940","true","7","0","SHOW PROC '/dbs/10839/471528/partitions/476493/891940/892915';"]],"meta":[{"name":"DbName","type":"VARCHAR"},{"name":"TableName","type":"VARCHAR"},{"name":"PartitionName","type":"VARCHAR"},{"name":"IndexName","type":"VARCHAR"},{"name":"DbId","type":"VARCHAR"},{"name":"TableId","type":"VARCHAR"},{"name":"PartitionId","type":"VARCHAR"},{"name":"IndexId","type":"VARCHAR"},{"name":"IsSync","type":"VARCHAR"},{"name":"Order","type":"VARCHAR"},{"name":"QueryHits","type":"VARCHAR"},{"name":"DetailCmd","type":"VARCHAR"}],"type":"result_set"},"count":0} 
    
解决方案
  1. 临时增大 max_tablet_version_num(默认值为 2000):
    curl -X POST xxx.xxx.xxx.xxx:8040/api/update_config?max_tablet_version_num=20000
    
    同时修改 be.conf 中的配置,完成后可恢复默认值。

3.3 Schema Change 长时间处于等待水位线状态

错误描述

Schema change 一直处于 waiting_txn 状态。

//执行下面命令查看状态
show alter table column

Schema change 会等待 双写节点前所有的事务完成 才开始数据的转换. 因为有未决事务, 所以一直等待。由于stream load 是 2PC的,在发起第一阶段的时候挂了,就会需要等待 stream load 超时之后才能让 schema change 开始执行。

解决方案
  1. 获取冲突事务信息:

    • be.INFO 中查找对应的 txn_id
  2. 中止事务:

    curl -X PUT --location-trusted -u user:passwd  -H "txn_id:xxx" -H "txn_operation:abort"  http://fe_host:http_port/api/{db}/{table}/_stream_load_2pc
    

3.4 Schema Change 导致 FE OOM

错误描述

执行 schema change 的时候,FE 内存快速上涨并且OOM

解决方案
  1. JAVA_OPTS 中修改参数,将内存使用情况dump 出来:
    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path>
    
  2. 使用工具(如 jprofiler)分析内存开销,定位问题。
  3. 临时解决方案:
    • 如果 FE 能正常重启,直接取消任务。
    • 如果不能正常重启,先停止所有 BE,然后重启 FE 并取消任务。

3.5 Schema Change 任务过多

问题描述

Schema change job 默认会保持 7 天。Schema Change 任务的历史记录占用大量内存。

  history_job_keep_max_second = 7 * 24 * 3600
解决方案
  1. 调整历史记录保留时间,在启动时临时调小该值,完成任务后恢复。

注:如果提前预知到自己需要执行大量schema change,可以先把history_job_keep_max_second 调小,在执行完之后再恢复。

4. 总结

Schema Change 是 Doris 中非常关键的功能,其复杂性也带来了许多潜在问题。通过精准定位问题根因,并结合上述方法进行优化,可解决大部分问题。如果有任何疑问或者问题,可以随时联系我或者Doris社区的同学~

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

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

相关文章

Qt Designer and Python: Build Your GUI

1.install pyside6 2.pyside6-designer.exe 发送到桌面快捷方式 在Python安装的所在 Scripts 文件夹下找到此文件。如C:\Program Files\Python312\Scripts 3. 打开pyside6-designer 设计UI 4.保存为simple.ui 文件&#xff0c;再转成py文件 用代码执行 pyside6-uic.exe simpl…

Centos7系统php8编译安装ImageMagick/Imagick扩展教程整理

Centos7系统php8编译安装ImageMagick/Imagick扩展教程整理 安装php8安装ImageMagick1、下载ImageMagick2、解压并安装3、查看是否安装成功 安装imagick扩展包 安装php8 点我安装php8 安装ImageMagick 1、下载ImageMagick wget https://www.imagemagick.org/download/ImageMa…

数据中台解决方案

数据中台概述 数据中台是数字化转型的基础&#xff0c;它不仅仅是一个平台&#xff0c;而是一套可持续让企业数据用起来的机制。这套机制涵盖了数据的采集、治理、开发到数据服务的全过程&#xff0c;旨在通过数据复用能力的提升&#xff0c;灵活支撑前端业务。数据中台通过“…

Linux——rzsz工具

rzsz这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件. 安装完毕之后可以通过拖拽的方式将文件上传过去. 安装rzsz工具 rz&#xff1a;从Windows机器上传到远程Linux机器&#xff08;或者直接把文件托进Xshell中&#xff09; sz&#xff1a;将文件从Linux远…

SpringBoot基础概念介绍-数据源与数据库连接池

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 毛毛张今天介绍的SpringBoot中的基础概念-数据源与数据库连接池&#xff0c;同时介绍SpringBoot整合两种连接池的教程 文章目录 1 数据库与数据库管理系统2 JDBC与数…

MyBatis框架基础学习及入门案例(2)

目录 一、数据库建表(tb_user)以及添加数据。 &#xff08;1&#xff09;数据库与数据表说明。 &#xff08;2&#xff09;字段与数据说明。 二、创建模块(或工程)、导入对应所需依赖坐标。 三、编写MyBatis核心主配置文件。(解决JDBC中"硬编码"问题) &#xff08;1&…

js小游戏---2048(附源代码)

一、游戏页面展示 开始游戏&#xff1a; 游戏结束&#xff1a; 二、游戏如何操作 通过监听键盘的操作&#xff0c;进行移动变化 键盘上下左右键控制页面中所有模块同时向键入的方向移动&#xff0c;如果有两块一样的方块&#xff0c;就进行合并&#xff0c;并且在键盘每操作…

美格智能AIMO智能体+DeepSeek-R1模型,AI应用的iPhone时刻来了

导语&#xff1a; 当AI大模型从云端下沉至终端设备&#xff0c;一场关于效率、隐私与智能化的革命悄然展开。作为全球领先的无线通信模组及解决方案提供商&#xff0c;美格智能凭借其高算力AI模组矩阵与端侧大模型部署经验&#xff0c;结合最新发布的AIMO智能体产品&#xff0…

C语言的灵魂——指针(1)

指针是C语言的灵魂&#xff0c;有了指针C语言才能完成一些复杂的程序&#xff1b;没了指针就相当于C语言最精髓的部分被去掉了&#xff0c;可见指针是多么重要。废话不多讲我们直接开始。 指针 一&#xff0c;内存和地址二&#xff0c;编址三&#xff0c;指针变量和地址1&#…

物业巡更系统助推社区管理智能化与服务模式创新的研究与应用

内容概要 在现代社区管理中&#xff0c;物业巡更系统扮演着至关重要的角色。首先&#xff0c;我们先来了解一下这个系统的概念与发展背景。物业巡更系统&#xff0c;顾名思义&#xff0c;是一个用来提升物业管理效率与服务质量的智能化工具。随着科技的发展&#xff0c;传统的…

关于CAN(FD)转以太网详细介绍

一、功能描述 CANFD 完全向下兼容 CAN &#xff0c;以下统称 CAN(FD) 。 SG-CAN(FD)NET-210 是一款用来把 CANFD 总线数据转为网口数据的设备。 网口支持 TCP Sever 、 TCP Client 、 UDP Sever 、 UDP Client 四种模式。 可以通过软件配置和 Web 网页配置。 两路…

用Python和PyQt5打造一个股票涨幅统计工具

在当今的金融市场中&#xff0c;股票数据的实时获取和分析是投资者和金融从业者的核心需求之一。无论是个人投资者还是专业机构&#xff0c;都需要一个高效的工具来帮助他们快速获取股票数据并进行分析。本文将带你一步步用Python和PyQt5打造一个股票涨幅统计工具&#xff0c;不…

Centos类型服务器等保测评整/etc/pam.d/system-auth

修改服务器配置文件/etc/pam.d/system-auth&#xff0c;但是&#xff0c;把一下配置放在password的配置第一行才会生效 执行命令&#xff1a;配置口令要求&#xff1a;大小写字母、数字、特殊字符组合、至少8位&#xff0c;包括强制设置root口令&#xff01; sed -i 14a pas…

At coder beginner contest 290AB

A12435 思路&#xff1a;只有4中情况:A1,A2翻转&#xff0c;其他正常&#xff0c;A2A3翻转其他正常.....为了下标与数字对应我开了6个空间&#xff0c;然后从1开始循环&#xff0c;到4截止&#xff0c;因为循环中有i1害怕数组越界&#xff0c;如果索引出的数与下标不相等了&…

Vue3 + TS 实现批量拖拽 文件夹和文件 组件封装

一、html 代码&#xff1a; 代码中的表格引入了 vxe-table 插件 <Tag /> 是自己封装的说明组件 表格列表这块我使用了插槽来增加扩展性&#xff0c;可根据自己需求&#xff0c;在组件外部做调整 <template><div class"dragUpload"><el-dial…

STM32完全学习——RT-thread在STM32F407上移植

一、写在前面 关于源码的下载&#xff0c;以及在KEIL工程里面添加操作系统的源代码&#xff0c;这里就不再赘述了。需要注意的是RT-thread默认里面是会使用串口的&#xff0c;因此需要额外的进行串口的初始化&#xff0c;有些人可能会问&#xff0c;为什么不直接使用CubMAX直接…

JVM深入学习(一)

目录 一.JVM概述 1.1 为什么要学jvm&#xff1f; 1.2 jvm的作用 1.3 jvm内部构造 二.JVM类加载 2.1类加载过程 2.2类加载器 2.3类加载器的分类 2.4双亲委派机制 三.运行时数据区 堆空间区域划分&#xff08;堆&#xff09; 为什么分区(代)&#xff1f;&#xff08…

Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题

一、整个前言 在基于 Ruoyi 框架进行系统开发的过程中&#xff0c;我们常常会遇到各种有趣且具有挑战性的问题。今天&#xff0c;我们就来深入探讨一个在实际开发中较为常见的问题&#xff1a;当连续快速发送 Post 请求时&#xff0c;前端会弹出 “数据正在处理&#xff0c;请…

002-SpringBoot整合AI(Alibaba)

SpringBoot整合AI 一、引入依赖二、配置application.yml三、获取 api-key四、编写 controller五、起服务调用 一、引入依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><vers…

安宝特方案 | 智能培训:安宝特AR如何提升企业技能培训的效率与互动性

随着企业不断推进数字化转型&#xff0c;传统培训方式已无法满足现代企业对高效、灵活培训的需求。尤其在技术更新频繁、工艺流程复杂、员工流动性大的环境中&#xff0c;传统培训模式的局限性愈加明显。为了提升培训质量、降低培训成本&#xff0c;并帮助员工迅速掌握新技能&a…