首页 > 其他分享 >DDL 超时,应该如何解决 | OceanBase 用户问题集萃

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

时间:2024-09-25 19:48:24浏览次数:12  
标签:name OceanBase ddl ob 集萃 timeout DDL 超时

问题背景

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 官网搜一下 “参数模板” 关键字吧~

标签:name,OceanBase,ddl,ob,集萃,timeout,DDL,超时
From: https://blog.csdn.net/OceanBaseGFBK/article/details/140214590

相关文章

  • postman关联、fiddler断点
    fiddler可以做什么?抓包、弱网、断点一、关联接口:定义:拿上一个接口的返回参数,做下一个接口入参省份接口:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportProvince城市接口:post http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/get......
  • docker部署paddleocr过程中遇到的问题
    坑1:尝试了下面csdn博客中的解决方案,但是不太行,后来发现是paddlepaddle-gpu的版本问题,版本改对后就OK了https://blog.csdn.net/weixin_43021830/article/details/128243800坑2:困扰了一周了,还是卡住了,目前尝试解决的两个思路1、将paddleocr模块添加到python解释器的搜索路径......
  • 浅析OceanBase数据库的向量化执行引擎
    本篇博客是偏数据库系统概念性的内容,不会深入到OceanBase中各个算子和表达式的在向量化中的详细设计和实现。背景为了提升OceanBase社区版用户解决问题的效率,OceanBase官方不久前推出了《OceanBase从入门到实践》系列课程。在第七期直播课程后,我们收到了不少用户的提......
  • 10月23日,2024 OceanBase 年度发布会在北京等您
    海量数据管理,源于一笔笔记录, 不止于记录, 不仅要保障每一笔记录,更要实现每一份数据的价值。OceanBase正通过一体化架构和一体化引擎,不断创新实现 一体化的TP、AP和多模融合的多工作负载, 从线下到云端,全面加速基于跨分布式数据的创新。2024年10月23日,OceanBase将在北......
  • 如何基于Flink CDC与OceanBase构建实时数仓,实现简化链路,高效排查
    本文作者:阿里云FlinkSQL负责人,伍翀,ApacheFlinkPMCMember&Committer众多数据领域的专业人士都很熟悉ApacheFlink,它作为流式计算引擎,流批一体,其核心在于其强大的分布式流数据处理能力,同时巧妙地融合了流计算与批计算的能力,因此成为了众多企业在进行流式计算业务时的首......
  • 阅信云CTO向永清:35岁不应该成为技术职业发展的瓶颈|OceanBase 《DB大咖说》
    本期嘉宾:向永清,2010年进入中国空间技术研究院总体部工作。他从DBA起步,不断成长,后来出来创业,现为阅信云CTO,负责阅信云产品研发和团队管理工作,成为公司的技术领军人物及数字化转型领域的专家。在向永清先生的职业生涯中,始终怀揣着对技术的好奇与热情,他所展现的技术情怀与使命感,为......
  • python 深度神经网络训练,pytorch ,tensorflow paddle大模型训练中损失突然增大的原因
    在机器学习和深度学习的训练过程中,损失函数的数值突然变高可能是由多种因素引起的。以下是一些可能的原因和相应的解决方案:1.**学习率设置不当**:如果学习率过高,可能会导致模型在优化过程中跳过最小值,甚至导致模型发散。相反,如果学习率过低,则可能导致模型训练速度过慢,甚至停滞......
  • 2024Mysql And Redis基础与进阶操作系列(2)作者——LJS[含MySQL登录;DDL;DML;举例说明;编码
    目录1.MySQL的登录1.1服务的启动和停止方式1:使用图形界面工具步骤1:打开windows服务 步骤2:找到MySQL80(点击鼠标右键)→启动或停止(点击)编辑补充说明2点:1.2自带客户端的登录与退出登录方式1:MySQL自带客户端注意:退出登录2MySQL数据库基本操作-DDL和DML2.1.DDL解释2.......
  • DDL语言
    创建数据库createdatabase数据库名;--这里分号为英文下的删除数据库dropdatabase数据库名;切换到指定的数据库use数据库名;关于对表的操作我们的数据实际存储的位置是对应的表中:如何创建表createtable表名(列名数据类型,--逗号为英文下列名数据类......
  • Fiddler
    一、Fiddler简介Fiddler是位于客户端和服务器端的HTTP代理目前最常用的http抓包工具之一功能非常强大,是web调试的利器监控浏览器的所有HTTP/HTTPS的流量查看、分析请求内容细节伪造客户端请求和服务器响应测试网站的性能解密HTTPS的web会话全局、局部断点功能第三方插......