问题现象
业务使用 UTL_FILE.FOPEN_I 系统函数写入临时文件到磁盘,返回报错 invalid file operation: too many files。
ORA-29283: invalid file operation: too many files openat package body oceanbase.UTL_FILE.FOPEN_I, line: f
at package body oceanbase.UTL_FILE.FOPEN, line: 81
at package body APS.BASE_REQUEST_UTILITY_PKG.LOG, line: 4c
at package body APS.PP_MO_WRITE_BACK_TO_REQ_PKG.LOG, line: 1f
at package body APS.PP_MO_WRITE_BACK_TO_REQ_PKG.MAIN, line: 4d
at procedure , line: 1
at package body APS.CUX_SCOM_REQUEST_PUB.DO_JOB, line: 1
at anonymous block, line: 1
关键诊断信息
触发条件
PL 脚本中同时打开 f_open 的 fd 超过 50(f_close 的不算)。
关键日志信息
[2024-12-24 09:27:05.889485] WDIAG [SQL] spi_cursor_fetch (ob_spi.cpp:4392) [687][T1002_L0_G0][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=19][errcode=-4026] fail to exec do_cursor_fetch(ctx, cursor, OB_INVALID_ID != cursor->get_id() || (package_id != OB_INVALID_ID && OB_INVALID_ID == routine_id), into_exprs, into_count, column_types, type_count, exprs_not_null_flag, pl_integer_ranges, is_bulk, limit, return_types, return_type_count, is_type_record)(ret=-4026)
[2024-12-24 09:27:05.891057] WDIAG [PL] destruct_obj (ob_pl_user_type.cpp:335) [687][T1002_L0_G0][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=12][errcode=-4016] invalid arguments((__builtin_expect(!!(__null != (record)),!!1))=0)
[2024-12-24 09:27:05.891075] WDIAG [PL] final (ob_pl.cpp:2745) [687][T1002_L0_G0][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=18][errcode=0] failed to destruct pl object(i=11, tmp_ret=-4016)
[2024-12-24 09:27:05.891208] WDIAG fopen (ob_pl_utl_file.cpp:116) [687][T1002_L0_G0][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=5][errcode=-9557] ORA-29283: invalid file operation: too many files open
[2024-12-24 09:27:05.891246] WDIAG [PL] eh_adjust_call_stack (ob_pl_exception_handling.cpp:176) [687][T1002_L0_G0][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=9][errcode=0] got exception! (error_code=-9557, error_code="OB_UTL_FILE_INVALID_OPERATION", exception_msg=
[2024-12-24 09:27:05.891672] WDIAG [PL] execute (ob_pl.cpp:3845) [687][T1002_L0_G0][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=9][errcode=-9557] Unhandled exception has occurred in PL(*ctx_.status_=-9557, ret=-9557)
[2024-12-24 09:27:05.891685] WDIAG [PL] execute (ob_pl.cpp:1444) [687][T1002_L0_G0][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=9][errcode=-9557] fail to exec pl.execute()(ret=-9557)
问题原因
产品缺陷,utl file 全局限制同时打开的文件 fd 最多为50个,PL 脚本中同时 f_open的 fd 超过 50 时导致报错。
问题的风险及影响
业务调用存储过程报错。
影响租户
影响 OceanBase 数据库中的 Oracle 租户,对于 SYS 租户和 MySQL 租户无影响。
适用版本
OceanBase 数据库 V3.x、V4.x 版本。
解决方法及规避方式
修改脚本,减少同时打开 fd 数量。