问题描述
在 OceanBase 数据库中,出现磁盘水位较高的情况,SQL 执行结束后,节点中存在大量临时文件,需要等待一个固定时间才会释放。
适用版本
适用于 OceanBase 数据库 V2.x 和 V3.x 版本。
问题原因
造成该问题的原因是在 OceanBase 数据库中,在一些异常场景中,SQL 执行结束后不会立即清理中间结果,需要等到超时时间(ob_query_timeout)才会清理。
本文的示例中,由于租户 ob_query_timeout 设置为 6 小时,即使 SQL 执行结束,临时文件仍然需要等待 6 小时后才会清理。
说明
- SQL 执行过程中会写中间结果,结果集较大时会发生落盘,写入临时文件中。
- 正常情况下,SQL 执行结束时会清理中间结果,对应的临时文件会被立即回收,但是空间释放需要等一轮宏块 mark sweep,OceanBase 数据库 V3.2.x 版本中是 5min, 在 OceanBase 数据库 V4.x 版本中是 30s。
解决方法
在 OceanBase 数据库 V3.2.4 BP7 (oceanbase-3.2.4.7-107000012023113010) 及以上版本中,无论是否发生异常,SQL 执行结束后都会立即清理临时文件。您可以升级到这些版本来规避本文中介绍的问题。
在业务租户下,调小
ob_query_timeout(默认值 10000000 微妙)的值,通过 OBClient 客户端执行 SQL 语句修改ob_query_timeout的值。例如通过以下命令将ob_query_timeout的值调小为 20000000 微妙。在 MySQL 模式下:
obclient> SET GLOBAL ob_query_timeout = 20000000;在 Oracle 模式下:
obclient> ALTER SESSION SET ob_query_timeout = 20000000;或者
obclient> ALTER SYSTEM SET ob_query_timeout = 20000000;
有关 ob_query_timeout 的详细信息,参见 ob_query_timeout。