본문 바로가기

카테고리 없음

ORACLE TEMPORARY TABLESPACE의 특징 v1.0

출처 : ocmkorea (naver)
========================

temporary tablespace은 일반적인 테이블 스페이스와 다른 특징을 가진다

1. readonly 불가능
2. 항상 nologging 상태
3. temp file은 rename 불가능
4. read only database에서도 temp file 필요

각각을 확인하기 전에 우선 temporary tablespace를 확인해보자
이 테이블 스페이스는 dba_tablespaces, v$tablespace 에서 확인가능하다.
하지만 dba_data_files에서는 나타나지 않는다.

SQL> get tbs2
  1  select tablespace_name,status,logging
  2* from dba_tablespaces
SQL> /

TABLESPACE STATUS    LOGGING
---------- --------- ---------
SYSTEM     ONLINE    LOGGING
TEMP       ONLINE    NOLOGGING
UNDOTBS    ONLINE    LOGGING
SALES      ONLINE    LOGGING
USERS      ONLINE    LOGGING
EXAMPLES   ONLINE    LOGGING
TEST       ONLINE    LOGGING
TEST2      ONLINE    LOGGING
TEST3      ONLINE    LOGGING

9 rows selected.

temp의 존재를 확인하였다.
temporary tablespace 지정여부는 database_properties에서 property_name을
temporary tablespace 이름 조건으로 검색하면 description 컬럼에서 확인 가능하다

우선 1번 temp를 readonly로 변경 시도해보겠다.

SQL> alter tablespace temp read only;
alter tablespace temp read only

*
ERROR at line 1:
ORA-03217: invalid option for alter of TEMPORARY TABLESPACE
(alert log에도 찍힌다)
결과적으로 에러!


2번 logging으로 바꿔보는 시도를 해보겠다.

SQL> alter tablespace temp logging;
alter tablespace temp logging

*
ERROR at line 1:
ORA-03217: invalid option for alter of TEMPORARY TABLESPACE
(alert log에도 찍힌다)
결과적으로 에러!
(생성시 처음부터 nologging 상태이다. temporary tablespace의 존재 의미와 연관되어있다)


3번 rename을 시도해 보겠다.

rename은 기본적으로 tablespace를 offline으로 만들고 해야된다.

SQL> alter tablespace temp offline;
alter tablespace temp offline

*
ERROR at line 1:
ORA-03217: invalid option for alter of TEMPORARY TABLESPACE

offline 옵션은 temporary에 없다...

SQL> select file_name from dba_temp_files;

FILE_NAME
--------------------------------------------------
/opt/oracle/oradata/PROD/disk2/temp01.dbf

temporary tablespace의 file 경로와 이름을 조회하여 파일단에서 offline 시켰다.

SQL> alter database tempfile
  2  '/opt/oracle/oradata/PROD/disk2/temp01.dbf' offline;

Database altered.

위의 변경이 view에서는 변화가 나타나지 않는다
아래 표를 보면 아직도 online인걸 알 수 있다.

SQL> @tbs2

TABLESPACE STATUS    LOGGING
---------- --------- ---------
SYSTEM     ONLINE    LOGGING
TEMP       ONLINE    NOLOGGING
UNDOTBS    ONLINE    LOGGING
SALES      ONLINE    LOGGING
USERS      ONLINE    LOGGING
EXAMPLES   ONLINE    LOGGING
TEST       ONLINE    LOGGING
TEST2      ONLINE    LOGGING
TEST3      ONLINE    LOGGING

9 rows selected.

rename 하기에 앞서 변경할 이름으로 파일을 변경(혹은 복사)했다.

SQL>!mv 원래이름 변경이름
(명령어가 길어지는 관계로 생략...)

  1  alter database rename file
  2  '/opt/oracle/oradata/PROD/disk2/temp01.dbf'
  3* to '/opt/oracle/oradata/PROD/disk2/temp001.dbf'
SQL> /
alter database rename file
*
ERROR at line 1:
ORA-01511: error in renaming log/data files
ORA-01516: nonexistent log file, datafile, or tempfile
"/opt/oracle/oradata/PROD/disk2/temp01.dbf"

rename을 사용하지 못한다.

temporary tablespace를 강제적으로 os단에서 삭제했다.
temporary tablespace가 없어도 shutdown startup 정상적으로 작동한다.
10g에서는 open 단계에서 temporary tablespace 부재를 확인하고 재생성을 알아서 한다

RH3@PROD:/opt/oracle/oradata/PROD/disk2>$rm temp*


4번 read only에서도 default temporary tablespace는 필요하다

위에서 temporary tablespace를 강제적으로 삭제해 놓은 상태이다.
논리적경로(뷰) 상으론 temporary tablespace가 존재하는걸로 되어있다.
(본래 논리적(db상) 물리적(os상) 정보가 불일치 하면 db open이 안된다 : temporary 예외, system을 제외한 tablespace가 offline일때도 예외 )

SQL> startup mount;
ORACLE instance started.

Total System Global Area  219223120 bytes
Fixed Size                   451664 bytes
Variable Size             184549376 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
Database mounted.

read only로 open 한다.
SQL> alter database open read only;

Database altered.

에러를 보기 위해 row를 많이 가진 sh schema를 사용하였다.

SQL>conn sh/sh

정렬을 유발하는 쿼리를 사용하였다

SQL> select * from sales
  2  order by 1,2;
select * from sales
              *
ERROR at line 1:
ORA-01652: unable to extend temp segment by 256 in tablespace TEMP

바로 에러!
default tablespace는 메모리를 사용해 정렬하지 못할 정도의 큰 워크로드가 발생하면
디스크를 사용하여 정렬을 부분부분하여 합쳐 결과를 낸다.(os의 가상메모리와 비슷하다)
때문에 default temporary tablespace의 부재는 위와 같은 에러로 이어진다.

temporary tablespace의 재생성은

startup force 는 shutdown abort + startup  의 뜻이다.
SQL>startup force

temporary tablespace 경우는 datafile 옵션이 아니라 tempfile로 쓴다.

  1  create temporary tablespace temp2
  2* tempfile '/opt/oracle/oradata/PROD/disk2/temp02.dbf' size 100m
SQL> /

Tablespace created.

default temporary tablespace 지정구문이다.
지정 확인은 위에서 봤듯이 database_properties 조회를 통해 가능하다.

SQL> alter database default temporary tablespace temp2;

Database altered.

기존에 남아있는 논리적 정보(과거의 default temporary tablespace)를 삭제한다.
SQL> drop tablespace temp;

Tablespace dropped.

/*+ default tablespace를 사용해 정렬이 이루어지기 전에 사용하는 공간은? */