현상
참고
해당 현상은 Tibero7 fs02에서 발생했습니다.
Tibero에서 TEMP 테이블스페이스 변경 이후, sys.log 파일에 ERROR_TX_NO_TEMPFILE(-21009) 오류가 반복적으로 기록되는 현상이 발생했습니다.
아래는 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
SQL
복사
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
SQL
복사
TEMP 테이블스페이스는 정상적으로 사용 중이나, TEMP 영역이 과도하게 사용되는 상황에서는 아래와 같은 에러가 발생할 수 있습니다.
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]
SQL
복사
ec=ERROR_TX_CANT_ALLOC_EXT는 TEMP TABLESPACE 공간이 부족할 때 발생하는 에러입니다.
원인
EMP TABLESPACE 변경 작업으로 기존의 TEMP TABLESPACE DROP 하였지만 정상적으로 수행되지 않아, 쿼리가 수행될 때 이전의 TEMP TABLESPACE를 바라보며 에러가 발생한 것입니다.
아래는 CALLSTACK 일부 입니다.
#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
SQL
복사
세그먼트 ID 1241에 대한 TEMP 세그먼트를 생성하는 과정에서, TEMP 테이블스페이스 ID 2의 공간을 사용하려는 시도가 발생하였습니다.
아래는 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
SQL
복사
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로 저장하여 참조 오류가 발생하지 않도록 개선한 것입니다.
주의
티맥스티베로에서 제공하는 기술지원을 통해 패치를 적용합니다.