DDL 超时,应该如何解决 | OceanBase 用户问题集萃

news2024/11/16 6:30:46

问题背景

在OceanBase的社区问答里常看到有用户发帖提出DDL超时的问题, 如“执行 DDL 超时,为何调大超时时间不生效?” 。但很多帖子的回答都没有完美解决。因此,这里把相关的解决思路在这里分享给大家。

帖子里对这类问题的描述都很简单:就是执行了一条 DDL,然后超时了,再然后把 ob_query_timeout 从默认的 10000000 微秒调整到了一个很大的时间,最后执行这条 DDL,结果又是超时。

DDL 超时时间

就当前 OceanBase 的产品设计而言,超时机制主要包括两个纬度:控制语句超时的 ob_query_timeout 和控制事务超时的 ob_trx_timeout,看上去用户只需要关注这俩超时时间就够了。不过 ob_query_timeout 这个超时时间的名字起的过于通俗,很容易让人误解为会影响所有 query 的超时时间。

实际还有两个超时时间可能也需要部分用户了解下,一个是系统变量 ob_pl_block_timeout,因为 PL 内部可能会包含多条 query,例如:

create procedure test(x bigint, y bigint)
begin
   insert /*+trans_param('enable_early_lock_release', 'true')*/ into elr_b (c1, c2) values (x, y);
   update elr_a set c2 = c2 + 1 where c1 = 1;
   commit;
end

在 PL 的执行过程中,任何超时的判断,均会以该系统变量为准。这个时间的默认值是十年左右,一般情况下用户对这个超时时间都只会有调小的需求。

obclient [test]> show variables like 'ob_pl_block_timeout';
+---------------------+------------------+
| Variable_name       | Value            |
+---------------------+------------------+
| ob_pl_block_timeout | 3216672000000000 |
+---------------------+------------------+
1 row in set (0.069 sec)

另一个超时时间就是经常被用户反复问到的 DDL 超时时间,这个超时时间不受 ob_query_timeout 的影响,而是受一个叫 _ob_ddl_timeout 的隐藏系统变量的控制,变量名开头有一个下划线,表明它是一个隐藏的配置项,一般也不需要进行修改。

因为是隐藏配置项,所以没找到特别详细的官方文档。在代码里搜索关键字,可以看到对这个 _ob_ddl_timeout 的描述:影响范围是集群级别,默认值是 1000 秒,修改完成后动态生效。

// src/share/parameter/ob_parameter_seed.ipp
// ddl 超时时间
DEF_TIME(_ob_ddl_timeout, OB_CLUSTER_PARAMETER, "1000s", "[1s,)",
    "the config parameter of ddl timeout"
    "Range: [1s, +∞)",
    ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE));

对整个集群生效的变量,一般都是需要登录 sys 租户进行配置的,咱们登录 sys 租户看一眼。

obclient [oceanbase]> select name, data_type, value from oceanbase.__all_sys_parameter where name = '_ob_ddl_timeout';
Empty set (0.059 sec)

发现信息是空的。猜测大概率是因为这个集群里从来没有修改过这个 _ob_ddl_timeout 值,这张表只记录修改过默认值的变量,咱们修改下试试看。

obclient [oceanbase]> alter system set _ob_ddl_timeout = '1234s';
Query OK, 0 rows affected (0.046 sec)

obclient [oceanbase]> select name,data_type,value from oceanbase.__all_sys_parameter where name = '_ob_ddl_timeout';
+-----------------+-----------+-------+
| name            | data_type | value |
+-----------------+-----------+-------+
| _ob_ddl_timeout | varchar   | 1234s |
+-----------------+-----------+-------+
1 row in set (0.002 sec)

obclient [oceanbase]> alter system set _ob_ddl_timeout = '1h';
Query OK, 0 rows affected (0.035 sec)

obclient [oceanbase]> select name,data_type,value from oceanbase.__all_sys_parameter where name = '_ob_ddl_timeout';
+-----------------+-----------+-------+
| name            | data_type | value |
+-----------------+-----------+-------+
| _ob_ddl_timeout | varchar   | 1h    |
+-----------------+-----------+-------+
1 row in set (0.007 sec)

obclient [oceanbase]> alter system set _ob_ddl_timeout = '1d';
Query OK, 0 rows affected (0.019 sec)

obclient [oceanbase]> select name,data_type,value from oceanbase.__all_sys_parameter where name = '_ob_ddl_timeout';
+-----------------+-----------+-------+
| name            | data_type | value |
+-----------------+-----------+-------+
| _ob_ddl_timeout | varchar   | 1d    |
+-----------------+-----------+-------+
1 row in set (0.002 sec)

obclient [oceanbase]> alter system set _ob_ddl_timeout = '1m';
Query OK, 0 rows affected (0.019 sec)

obclient [oceanbase]> select name,data_type,value from oceanbase.__all_sys_parameter where name = '_ob_ddl_timeout';
+-----------------+-----------+-------+
| name            | data_type | value |
+-----------------+-----------+-------+
| _ob_ddl_timeout | varchar   | 1m    |
+-----------------+-----------+-------+
1 row in set (0.001 sec)

好了,看来和猜想一致,调整成非默认值就能查到了。

1000 秒的时间已经足够长,一般不需要进行调整。如果执行的 DDL 超时了,大多都是因为用户并发执行了一大批 DDL,大部分类型的 DDL 在 OceanBase 里暂时都还是串行处理的,所以排队时间可能会超过这个 _ob_ddl_timeout(这种情况在用户压测时偶尔会遇到)。还有一种情况就是用户执行的 DDL 真的超级复杂,1000 秒就是处理不完(这种情况还真没遇到过)。

问答贴里“执行 DDL 超时,为何调大超时时间不生效?” 的问题,如果执行时间真的是到了 1000 秒的话,到这里基本就可以告一段落了,结论是调大 _ob_ddl_timeout 就好了。

特殊的 DDL 超时时间

有一些用户看到这里可能会有疑问,就是对于一些会受表中数据量影响的 DDL,例如创建索引、创建外键约束、创建 check 约束等,是不是需要有特殊的超时逻辑?

因为这些 DDL 会对表中已有的存量数据进行检查,或者需要把这些存量数据写入到一张新表中,所以执行时间显然不可控。这个默认的 _ob_ddl_timeout 只有 1000 秒,肯定不够用。是不是对于这类特殊的 DDL,应该把超时时间的默认值改成 INT64_MAX 之类的超长超时时间?

OceanBase 看上去也确实是这样做的,只不过它把这类特殊 DDL 的超时时间写成了 102 年。看代码里的注释说原因是为了防止对 INT64_MAX 做加法导致计算结果溢出。

// deps/oblib/src/lib/ob_define.h
// The maximum time set by the user through hint/set session.ob_query_timeout/set session.ob_tx_timeout is 102 years
// The purpose of this is to avoid that when the user enters a value that is too large, adding the current timestamp causes the MAX_INT64 to overflow
const int64_t OB_MAX_USER_SPECIFIED_TIMEOUT =  102L * 365L * 24L * 60L * 60L * 1000L * 1000L;

至于为什么是 102 年,猜测是因为马云很久以前曾提出过一个阿里巴巴要活 102 年的愿望,从 1999 年开始横跨三个世纪,所以 OceanBase 的研发同学特意在代码里埋下了一个彩蛋。

对超时时间日志易用性的期待

看用户发的问答帖,发现大家在遇到超时问题之后,基本都是尝试性地逐个调大自己知道的几个超时时间,但是 OceanBase 里的超时时间很多,下面列出冰山一角。

obclient [test]> show global variables like '%timeout%';
+---------------------+------------------+
| Variable_name       | Value            |
+---------------------+------------------+
| connect_timeout     | 10               |
| interactive_timeout | 28800            |
| lock_wait_timeout   | 31536000         |
| net_read_timeout    | 30               |
| net_write_timeout   | 60               |
| ob_pl_block_timeout | 3216672000000000 |
| ob_query_timeout    | 10000000         |
| ob_trx_idle_timeout | 86400000000      |
| ob_trx_lock_timeout | -1               |
| ob_trx_timeout      | 86400000000      |
| wait_timeout        | 28800            |
+---------------------+------------------+
11 rows in set (0.064 sec)

obclient [test]> show parameters like '%timeout%';
+-------+----------+--------------+----------+-----------------------------------------------+-----------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+---------+---------+-------------------+---------------+-----------+
| zone  | svr_type | svr_ip       | svr_port | name                                          | data_type | value | info                                                                                                                                                                                                                                                             | section        | scope   | source  | edit_level        | default_value | isdefault |
+-------+----------+--------------+----------+-----------------------------------------------+-----------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+---------+---------+-------------------+---------------+-----------+
| zone1 | observer | 11.158.31.20 |    22602 | sys_bkgd_migration_change_member_list_timeout | NULL      | 20s   | the timeout for migration change member list retry. The default value is 20s. Range: [0s,24h]                                                                                                                                                                    | OBSERVER       | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | 20s           |         1 |
| zone1 | observer | 11.158.31.20 |    22602 | location_cache_refresh_sql_timeout            | NULL      | 1s    | The timeout used for refreshing location cache by SQL. Range: [1ms, +∞)                                                                                                                                                                                          | LOCATION_CACHE | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | 1s            |         1 |
| zone1 | observer | 11.158.31.20 |    22602 | location_cache_refresh_rpc_timeout            | NULL      | 500ms | The timeout used for refreshing location cache by RPC. Range: [1ms, +∞)                                                                                                                                                                                          | LOCATION_CACHE | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | 500ms         |         1 |
| zone1 | observer | 11.158.31.20 |    22602 | rpc_timeout                                   | NULL      | 2s    | the time during which a RPC request is permitted to execute before it is terminated                                                                                                                                                                              | RPC            | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | 2s            |         1 |
| zone1 | observer | 11.158.31.20 |    22602 | balancer_task_timeout                         | NULL      | 20m   | the time to execute the load-balancing task before it is terminated. Range: [1s, +∞)                                                                                                                                                                             | LOAD_BALANCE   | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | 20m           |         1 |
| zone1 | observer | 11.158.31.20 |    22602 | dead_socket_detection_timeout                 | NULL      | 3s    | specify a tcp_user_timeout for RFC5482. A zero value makes the option disabled, Range: [0, 2h]                                                                                                                                                                   | OBSERVER       | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | 3s            |         1 |
| zone1 | observer | 11.158.31.20 |    22602 | debug_sync_timeout                            | NULL      | 0     | Enable the debug sync facility and optionally specify a default wait timeout in micro seconds. A zero value keeps the facility disabled, Range: [0, +∞]                                                                                                          | OBSERVER       | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | 0             |         1 |
| zone1 | observer | 11.158.31.20 |    22602 | internal_sql_execute_timeout                  | NULL      | 30s   | the number of microseconds an internal DML request is permitted to execute before it is terminated. Range: [1000us, 1h]                                                                                                                                          | OBSERVER       | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | 30s           |         1 |
| zone1 | observer | 11.158.31.20 |    22602 | arbitration_timeout                           | NULL      | 5s    | The timeout before automatically degrading when arbitration member exists. Range: [3s,+∞]                                                                                                                                                                        | TRANS          | TENANT  | DEFAULT | DYNAMIC_EFFECTIVE | 5s            |         1 |
| zone1 | observer | 11.158.31.20 |    22602 | ob_query_switch_leader_retry_timeout          | NULL      | 0ms   | max time spend on retry caused by leader swith or network disconnectionRange: [0ms, +∞)                                                                                                                                                                          | OBSERVER       | TENANT  | DEFAULT | DYNAMIC_EFFECTIVE | 0ms           |         1 |
| zone1 | observer | 11.158.31.20 |    22602 | standby_db_fetch_log_rpc_timeout              | NULL      | 15s   | The threshold for detecting the RPC timeout for the standby tenant to fetch log from the log restore source tenant. When the rpc timeout, the log transport service switches to another server of the log restore source tenant to fetch logs. Range: [2s, +∞)   | LOGSERVICE     | TENANT  | DEFAULT | DYNAMIC_EFFECTIVE | 15s           |         1 |
+-------+----------+--------------+----------+-----------------------------------------------+-----------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+---------+---------+-------------------+---------------+-----------+
11 rows in set (0.104 sec)

如果遇到了 SQL 超时,想知道这条 SQL 到底受到了哪个超时时间的限制,看报错日志好像也看不出来,因为无论由于什么超时报错,错误码好像都是 4012。

希望未来 OceanBase 能够把由于不同超时时间导致的报错,匹配上不同的错误码,提升一些日志的易用性。例如 ob_query_timeout 超时报错 40120,ob_trx_timeout 超时报错 40121,_ob_ddl_timeout 超时报错 40122。这样大家看到错误码后,马上就可以知道要调整哪个超时时间了。

其他

OceanBase 4.3.0 及以上版本的 OCP 和 OBserver 支持了一个叫参数模板的功能。这个参数模板会预先将租户的参数设置好,在需要创建配置相似的一系列租户的场景下,创建各租户时可直接应用参数模板,如此可不必反复配置租户参数。在这里推荐给大家。

例如在实时分析的场景下,选择 OLAP 这个参数模板,系统就会自动调整 ob_query_timeout 这种超时时间参数,让这个租户更适合进行复杂的查询。

1720055274

除了租户级的参数模板,还有集群级的参数模板,大家感兴趣的话,自己去 OceanBase 官网搜一下 “参数模板” 关键字吧~

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

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

相关文章

2、 如何提高电脑运行速度 (改虚拟内存)?

改下电脑C磁盘的虚拟内存 方法如下: ① 按下电脑键盘上的 win E 键 , 然后鼠标移动到左边的【此电脑上】 然后,按下鼠标右键,选择【属性】 ② 然后,选择【高级系统设置】 4、选择【高级】,选择性能里面…

SPSS26统计分析笔记——5 卡法检验

1 卡方检验原理 卡方检验由卡尔皮尔逊(Karl Pearson)于1900年首次提出,是一种针对频数数据(定类数据或计数数据)的假设检验方法。它通过比较实际观测次数与理论期望次数之间的差异,构造出 χ 2 {\chi^2} χ…

seL4 Threads(四)

官网链接: Threads Threads 这篇教程主要是使用seL4中的threads。 TCB Thread Control Blocks seL4提供了线程代表执行的上下文以及管理处理器时间。seL4中的线程是通过线程控制块对象(TCB)实现的,每个内核线程都有一个线程控制块。 线程…

linux服务器安装原生的php环境

在CentOS上安装原生的PHP环境相对简单。下面是一个详细的步骤指南,适用于CentOS 7及更高版本。 ### 第一步:更新系统 首先,确保你的系统是最新的: sudo yum update -y ### 第二步:安装EPEL和Remi仓库 1. **安装EP…

Windows内核编程基础(3)

内存分配 在应用层编程时,系统提供了GlobalAlloc/HeapAlloc/LocalAlloc等函数。C/C库提供了malloc函数,以及new操作符在堆上分配内存。 在我前面一个关于Windows页交换文件的博客中,介绍了虚拟内存, 虚拟内存是计算机系统内存管…

古月居全新改版上线:AI 大模型“古月知道”引领 ROS 学习新体验

前言 古月居自成立以来,一直致力于为广大 ROS(机器人操作系统)爱好者和开发者提供优质的学习资源和社区交流平台。经过长期的用户调研和反馈,我们发现旧版古月居在使用过程中存在一些不便之处。 为了更好地服务大家,…

如何生成谷歌临时邮箱?

谷歌的Gmail作为全球最受欢迎的邮件服务之一,不仅因其稳定性和强大的功能而备受青睐,还因为它支持临时邮箱功能,这一功能能够极大地提升用户在各种场景下的使用灵活性。无论是处理一次性事务、注册新账户还是防止垃圾邮件,Gmail的…

通义模型Prompt调优的实用技巧

1. 目录 1. prompt工程简介 2. Prompt设计 2.1 Prompt主要构成要素 2.2 Prompt编写策略 策略一:对较难被准确遵循的复杂规则可拆分为多条规则,有助于提升效果 策略二:适当冗余关键信息 策略三:使用分隔符给Prompt分段 策…

类与对象—python

一、类的含义 1.1类的作用(理解) 收集学生信息时,如果让同学们自主填写,信息的顺序、格式不一,内容混乱。如果发给同学们既定的表格,同学们按照规定的顺序、格式进行填写,那信息就会一目了然&…

回归预测 | Matlab基于SO-SVR蛇群算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于SO-SVR蛇群算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SO-SVR蛇群算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于SO-SVR蛇群算法优化支持向量机的数据多…

path_provider插件的用法

文章目录 1. 概念介绍2. 实现方法3. 示例代码我们在上一章回中介绍了"如何实现本地存储"相关的内容,本章回中将介绍如何实现文件存储.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值,如果遇到…

大数据-147 Apache Kudu 常用 Java API 增删改查

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

【学习笔记】 AD24中元器件重叠系统不报错的解决方案(消除报错)

【学习笔记】 AD24中PCB设计元器件重叠后系统不报错的解决方案(如何主动屏蔽报错) 一、Component Clearance未开启使能的解决方案二、最小水平间距设置错误的解决方案三、未开启设计规则检查的解决方案四、设计规则检查中 “在线”和“批量”的含义五、为…

开源的CDN:jsDelivr+Github加速图片加载

文章目录 20240530更新 网站加载的图片耗时,将图片使用jsDelivr进行加速。 每次打开静态网站的时候,都会发现页面的内容已经加载出来了,但是图片还是一片白,就考虑如何让图片能够更快的加载出来。 后面发现可以用jsDelivr加速Gi…

自然场景文本定位系统源码分享

自然场景文本定位检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

南京市副市长吴炜一行至天洑软件参观调研

近日,南京市副市长吴炜、南京市工信局副局长代吉上、南京市科技局副局长王愿华、江宁开发区管委会副主任易骏飞一行至天洑软件参观,调研工业软件重点企业方案,天洑软件副总经理冯克列、总工程师郭阳、研发部部长谢佳雯陪同调研。 Q1&#xff…

南开大学联合同济大学发布最新SOTA Occ OPUS:使用稀疏集进行占据预测,最快实现8帧22FPS

Abstract 占据预测任务旨在预测体素化的 3D 环境中的占据状态,在自动驾驶社区中迅速获得了关注。主流的占据预测工作首先将 3D 环境离散化为体素网格,然后在这些密集网格上执行分类。然而,对样本数据的检查显示,大多数体素是未占…

Linux:编译,调试和Makefile

一丶vim编译器 ### 基本概念 模式:Vim有几种不同的模式,包括: 命令/正常/普通模式:控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode 插入模…

xpath在爬虫中的应用、xpath插件的安装及使用

安装 1、打开谷歌浏览器进入扩展程序安装页面(右上角会有"开发者模式按钮")默认是关闭的,当安装此插件时需要把开发者模式打开。 2、下载下来的xpath_helper是zip格式的,需要解压缩即可安装。 3、重启浏览器,再次点击扩展程序即…

CAN通信详解

1、CAN介绍 1.1、什么是CAN? CAN(Controller Area Network) 即控制器局域网,是ISO国际标准化的串行通信协议。 开发目的:为了满足汽车产业的“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”…