문서유형ㅣ장애해결
분야ㅣ패치/업그레이드
적용제품버전ㅣ7FS02
오류코드ㅣ21009
문서번호ㅣTPATS014
현상
Tibero에서 TEMP 테이블스페이스 변경 이후, sys.log 파일에 ERROR_TX_NO_TEMPFILE(-21009) 오류가 반복적으로 기록되는 현상이 발생했습니다.
참고해당 현상은 Tibero7 FS02에서 발생했습니다.
아래는 sys.log의 일부입니다.
[2024-07-12T08:36:39.378749] [FRM-421] [I] THROW. ec=ERROR_TX_NO_TEMPFILE(-21009) [ No tempfile was found.] (csr_id:16) [tx_temp_ts.c:1220:temp_ts_alloc_ext] [2024-07-12T08:36:39.378936] [DDL-421] [I] internal dd update failed : ec=-21009 -- INSERT INTO PLAN_TABLE (STATEMENT_ID, SQL_ID, CHILD_NUMBER, TIMESTAMP, OPERATION, OBJECT_OWNER, OBJECT_NAME, OBJECT_TYPE, SEARCH_COLUMNS, ID, PARENT_ID,DEPTH, POSITION, COST, CARDINALITY, PARTITION_START, PARTITION_END, OTHERS, ACCESS_PREDICATES, FILTER_PREDICATES) SELECT :stmt_id, SQL_ID, CHILD_NUMBER, SYSTIMESTAMP, UPPER(OPERATION), OBJECT_OWNER, OBJECT_NAME, OBJECT_TYPE, SEARCH_COLUMNS, ID, PARENT_ID, DEPTH, POSITION, COST, CARDINALITY, PSTART, PEND, OTHERS, ACCESS_PREDICATES, FILTER_PREDICATES FROM VT_USER_SQL_PLAN [2024-07-12T08:36:39.381325] [FRM-421] [I] THROW. ec=ERROR_TX_NO_TEMPFILE(-21009) [ No tempfile was found.] (csr_id:26) [tx_temp_ts.c:1220:temp_ts_alloc_ext] [2024-07-12T08:36:39.381354] [DDL-421] [I] internal dd update failed : ec=-21009
TEMP 테이블스페이스는 정상적으로 사용 중이며, 관련 설정을 확인하기 위한 쿼리 조회 결과입니다.
SQL> select * from _dd_props where name=‘DFLT_TEMP_TS’ NAME VALUE COMMENT_STR ------------ ------------ ------------------------------------ DFLT_TEMP_TS TEMP3 Name of default temporary tablespace SQL> select username, DEFAULT_TEMP_TABLESPACE from dba_users; USERNAME DEFAULT_TEMP_TABLESPACE ------------ -------------------------- SYSMASTER TEMP3 SYS TEMP3 SYSCAT TEMP3 SYSGIS TEMP3 OUTLN TEMP3 TIBERO TEMP3 TIBERO1 TEMP3 YSSSODB TEMP3
TEMP 테이블스페이스는 정상적으로 사용 중이나, TEMP 영역이 과도하게 사용되는 상황에서는 아래와 같은 에러가 발생할 수 있습니다.
(ec=ERROR_TX_CANT_ALLOC_EXT는 TEMP TABLESPACE 공간이 부족할 때 발생하는 에러입니다.)
TEMP SEGMENT 사용
====================
Temp Segment Usage
====================
SID USERNAME SQL_ID SEGTYPE TEMP(MB) SQL_TEXT
---------- --------------- ------------- --------------- ---------- ----------------------------------------------------------------
1554 SYS b0kv7pqkxys8f SORT 1590.19 select * from ( select A.*,
ERROR 발생 ( sys.log 에서 확인가능)
[2024-11-28T13:58:14.258037] [TXT-1554] [W] can't extend tablespace TS #10(TEMP3)
[2024-11-28T13:58:14.258074] [FRM-1554] [I] THROW. ec=ERROR_TX_CANT_ALLOC_EXT(-21004) [ No more extent available in tablespace 'TEMP3'.] (csr_id:6) [tx_temp_ts.c:1464:temp_ts_extend]
원인
EMP TABLESPACE 변경 작업으로 기존의 TEMP TABLESPACE DROP 하였지만 정상적으로 수행되지 않아, 쿼리가 수행될 때 이전의 TEMP TABLESPACE를 바라보며 에러가 발생한 것입니다.
아래는 CALLSTACK 일부 입니다.
세그먼트 ID 1241에 대한 TEMP 세그먼트를 생성하는 과정에서, TEMP 테이블스페이스 ID 2의 공간을 사용하려는 시도가 발생하였습니다.
#4 0x0000000001f17a06 in temp_ts_alloc_ext (temp_ts_id=temp_ts_id@entry=2, unitcnt=<optimized out>, type=type@entry=TEMP_TYPE_GTEMP_TBL, my_total_alloc_for_stat=my_total_alloc_for_stat@entry=0) at /home/chef/workspace/Build_centos_7-6/tibero7/src/tbsvr/tx/tx_temp_ts.c:1220 #5 0x0000000001f0e08d in ts_alloc_ext_internal (tsid=tsid@entry=2, extsize=<optimized out>, extsize@entry=8, rec_tx=rec_tx@entry=1 '\001', j_stat=j_stat@entry=1 '\001', extend_need_=extend_need_@entry=1 '\001', deferred_undo=deferred_undo@entry=0 '\000', use_df_hint=use_df_hint@entry=0 '\000', min_extsize=min_extsize@entry=0, ret_extsize=ret_extsize@entry=0x0, schema_id=schema_id@entry=0) at /home/chef/workspace/Build_centos_7-6/tibero7/src/tbsvr/tx/tx_ts.c:1679 #6 0x0000000001ea8e5e in tx_sgmt_add_1st_ext (schema_id=0, blksize=8192, dd_extsize=1, sgmt_type=1 '\001', sgmt_id=1241, ts_id=<optimized out>) at /home/chef/workspace/Build_centos_7-6/tibero7/src/tbsvr/tx/tx_sgmt.c:1934 #7 tx_sgmt_create (ts_id=<optimized out>, sgmt_id=sgmt_id@entry=1241, sgmt_type=sgmt_type@entry=1 '\001', extsize=extsize@entry=8, blksize=8192, schema_id=schema_id@entry=0) at /home/chef/workspace/Build_centos_7-6/tibero7/src/tbsvr/tx/tx_sgmt.c:2486
아래는 TEMP TABLESPACE(TS_ID=2), DBA_TEMP_FILES 조회 결과입니다.
SQL> select TABLESPACE_NAME, TS_ID from dba_tablespaces where TS_ID=2;
TABLESPACE_NAME TS_ID
----------------- -----------------
TEMP 2
SQL> SELECT FILE_NAME, FILE_ID, TABLESPACE_NAME FROM DBA_TEMP_FILES;
FILE_NAME FILE_ID TABLESPACE_NAME
---------------- ------------ ----------------
/dev/rlv_data021 2 TEMP3
/dev/rlv_data022 3 TEMP3
SQL> SELECT SGMT_ID, TS_ID FROM SYS._DD_SGMT WHERE TS_ID = 2;
SGMT_ID TS_ID
---------- ----------
1241 2 TS_ID가 2인 테이블스페이스는 TEMP로 출력되고 있으며, TS_ID 2는 DB 초기 설치 시 생성된 TEMP 테이블스페이스의 ID입니다. TEMP 테이블스페이스를 변경하면서 기존 TEMP 테이블스페이스를 DROP하였으나, 해당 작업이 정상적으로 수행되지 않았습니다. 그 결과, 세그먼트 ID 1241이 이전 TEMP 테이블스페이스 ID(2)를 참조하면서 에러가 발생합니다.
해결
1. 테이블 재생성 또는 DD_SGMT 정보 수정
문제의 SGMT ID를 갖는 테이블 재생성
해당 SGMT ID를 참조하는 테이블은 SYS.PLAN_TABLE이었습니다. 해당 테이블을 DROP 후 재생성한 이후, 오류가 발생하지 않았습니다. 만약 사용 중인 테이블이라면, 백업 후 DROP 및 CREATE 작업이 필요합니다.
DD_SGMT 정보를 기본 TEMP 테이블스페이스로 수정
해당 세그먼트가 참조하는 TS_ID를 현재의 DEFAULT TEMP 테이블스페이스 ID로 수정하는 방법도 가능합니다.
2. DEFAULT TEMPORARY TABLESPACE 관련 패치(256390) 적용
해당 패치는 TEMP 테이블을 DEFAULT TEMP 테이블스페이스에 생성할 경우, 데이터 딕셔너리(DD)에 TS_ID 값을 NULL로 저장하여 참조 오류가 발생하지 않도록 개선한 것입니다.
주의티맥스티베로에서 제공하는 기술지원을 통해 패치를 적용합니다.