행위

"ORACLE 테이블스페이스"의 두 판 사이의 차이

DB CAFE

(테이블스페이스별 사이즈)
(TEMPORARY TABLESPACE DATA FILE 삭제)
 
(사용자 2명의 중간 판 133개는 보이지 않습니다)
1번째 줄: 1번째 줄:
=테이블 스페이스=
+
== 테이블 스페이스 (TABLESPACE) ==
  
----
+
=== TABLESPACE 목록 조회 ===
== 개념 잡기 ==
+
<source lang=sql>
테이블스페이스란?
+
SELECT A.TABLESPACE_NAME
 
+
    , FILE_NAME
- 논리적인 데이터 저장구조(=DB Cache Buffer 내에서 데이터를 작업하는 공간)
+
    , BYTES / 1024 / 1024
 
+
    , MAXBYTES / 1024 / 1024
  (오라클은 데이터를 저장하고 작업할 때
+
    , AUTOEXTENSIBLE
 
+
     , B.BLOCK_SIZE
     * 메모리에 논리적으로는 Tablespace 공간을 만들어서 작업, 실제 작업이 일어나는 공간.(작업속도가 빠름)
+
     , INCREMENT_BY * B.BLOCK_SIZE / 1024 / 1024
 
+
  FROM DBA_DATA_FILES A
     * 물리적으로는 디스크에 Data File을 만들어서 저장(속도 느림)
+
    , DBA_TABLESPACES B
 
+
  WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME
+
ORDER BY B.BLOCK_SIZE, A.TABLESPACE_NAME, A.FILE_ID;
 
+
</source>
- Database Buffer Cache에 Tablespace를 생성함(=SQL을 수행하면 해당 데이터는 반드시 Tablespace에 존재해야 함)
 
 
 
- Tablespace가 사용하는 메모리 공간이 클수록 일반적으로 수행 속도가 빨라짐
 
 
 
- dba_data_files 조회
 
 
 
 
 
 
 
 
 
 
 
 
Tablespace 의 종류 및 특징
 
 
 
 
 
 
(1) SYSTEM Tablespace
 
 
 
- 데이터 딕셔너리 정보들이 저장되어 있음, 이 Tablespace 가 손상될 경우 Oracle 서버가 시작이 안됨
 
 
 
- SYS계정 소유이지만 조회만 가능!
 
 
 
   
 
 
 
- 데이터 딕셔너리 : 오라클 서버의 모든 정보를 저장하고 있는 아주 중요한 테이블이나 뷰들
 
 
 
  ┌ Base Table : 데이터베이스 생성시(dbca, create database등) 생성됨, 사람 접근 불가(DBA 조차)
 
 
 
  └ Data Dictionary View : Base Table을 조회할 수 있도록 하는 뷰
 
 
 
        ┌ Static Dictionary : 내용이 실시간으로 변경 안됨
 
 
 
        │                          (USER_XXX, ALL_XXX, DBA_XXX)  = Instance가 Open일 경우에만 조회 가능
 
 
 
        └ Dynamic Performance View : 실시간으로 변경되는 내용을 볼 수 있음
 
 
 
                                                      조회 시점에 Control File/메모리로 가서 정보를 가져옴
 
 
 
                                                      Instance가 Nomount 상태부터 조회 가능
 
 
 
 
 
 
- 데이터 딕셔너리에 들어있는 주요 정보
 
  
 +
=== TABLESPACE 종류 ===
 +
{{틀:고지상자
 +
|제목 = 테이블스페이스 사이즈 축소 작업 순서
 +
|내용 =1) SYSTEM TABLESPACE
 +
:- 데이터 딕셔너리 정보들이 저장되어 있음, 이 TABLESPACE 가 손상될 경우 Oracle 서버가 시작이 안됨
 +
:- SYS계정 소유이지만 조회만 가능
 +
:- 딕셔너리 주요 정보
 
* 데이터베이스의 논리적인 구조와 물리적인 구조 정보들
 
* 데이터베이스의 논리적인 구조와 물리적인 구조 정보들
 
 
* 객체의 정의와 공간 사용 정보들
 
* 객체의 정의와 공간 사용 정보들
 
 
* 제약조건에 관련된 정보들
 
* 제약조건에 관련된 정보들
 
 
* 사용자에 관련된 정보들
 
* 사용자에 관련된 정보들
 
 
* Role, Privilege 등에 관련된 정보들
 
* Role, Privilege 등에 관련된 정보들
 
 
* 감사 및 보안등에 관련된 정보들
 
* 감사 및 보안등에 관련된 정보들
 +
2) SYSAUX TABLESPACE
 +
: 10g ~ , Oracle 서버의 성능 튜닝을 위한 데이터 저장
 +
3) 데이터 TABLESPACE
 +
: 가장 일반적으로 많이 사용되는 TABLESPACE 로 DBA가 필요에 의해 만드는 TABLESPACE .
 +
  DBA에 의해 생성,삭제.
 +
}}
 +
----
  
 +
=== 현재 유저의 DEFAULT TABLESPACE 확인 ===
 +
<source lang="sql">
 +
SELECT * FROM USER_USERS ;-- DEFAUT TABLESPACE로 설정된 부분을 확인
 +
</source>
  
 +
==== 유저의 DEFAULT TABLESPACE 변경 ====
 +
<source lang="sql">
 +
ALTER USER [유저명] DEFAULT TABLESPACE [테이블 스페이스명]
 +
</source>
  
(2) SYSAUX Tablespace
+
=== TABLESPACE 생성 구문 ===
 +
https://docs.oracle.com/database/121/SQLRF/img/create_tablespace.gif
 +
https://docs.oracle.com/database/121/SQLRF/img/permanent_tablespace_clause.gif
  
      : 10g 버전부터 등장, Oracle 서버의 성능 튜닝을 위한 데이터들이 저장되어 있음
+
<source lang="sql">
 +
CREATE [BIGFILE/SMALLFILE] TABLESPACE TABLESPACE명
 +
DATAFILE '파일경로1' SIZE integer [M/K], '파일경로2' SIZE integer [M/K]
 +
[ MINIMUM EXTENT integer [M/K]]
 +
[ BLOCKSIZE integer [K]]
 +
[ DEFAULT STORAGE (
 +
  INITIAL integer [M/K]
 +
  NEXT integer [M/K]
 +
  MAXEXTENTS integer
 +
  MINEXTENTS integer
 +
  PCTINCREASE integer)]
 +
[ ONLINE | OFFLINE ]
 +
[ PERMANENT | TEMPORARY ]
 +
[ EXTENT MANAGEMENT [ DICTIONARY | LOCAL
 +
[ AUTOALLOCATE | UNIFORM [ SIZE integer [M/K]]]]]
 +
[ SEGMENT SPACE MANAGEMENT [ MANUAL | AUTO]]
 +
;
  
 +
-- AUTOEXTEND ON NEXT 10M ==> (옵션)데이타 파일 용량초과시 자동증가설정
 +
-- MAXSIZE 100M ==> (옵션)데이타파일 최대크기지정
 +
-- EXTENT MANAGEMENT LOCAL ==> (옵션)
 +
-- UNIFORM SIZE 1M ==> (옵션)
 +
-- DEFAULT STORAGE(
 +
:  INITIAL 80K  ==> 테이블 스페이스의 맨 첫번째 EXTENTS의 크기
 +
:  NEXT 80K  ==> 다음 EXTENTS의 크기
 +
:  MINNEXTENTS 1  ==> 생성할 EXTENTS의 최소값
 +
:  MAXNEXTENTS 121  ==> 생성할 EXTENTS의 최대값
 +
:  PCTINCREASE 80  ==> EXTENTS의 증가율,(DEFAULT값은 50%)
 +
:  )
 +
</source>
 +
==== BIGFILE 테이블스페이스 ====
 +
# 8K 블록 - bigfile 테이블 스페이스에는 최대 32TB
 +
# 32K 블록 - bigfile 파일 테이블 스페이스에는 최대 128TB
  
 +
===== BIGFILE 테이블스페이스 장점 =====
  
 +
=====  자동 수행 뷰 목록 =====
 +
{{틀:고지 상자
 +
|내용=장점
 +
# CREATE DATABASE 및 CREATE CONTROLFILE 문의 DB_FILES 초기화 매개 변수와 MAXDATAFILES 매개 변수를 조정하여 데이터 파일 정보에 필요한 SGA 공간의 양과 제어 파일의 크기를 줄일 수 있다.
 +
# Bigfile 테이블 스페이스는 데이터 파일 투명성을 제공하여 데이터베이스 관리를 단순화합니다.
 +
# ALTER TABLESPACE 문의 SQL 구문을 사용하면 기본 개별 데이터 파일이 아닌 테이블 스페이스에서 작업을 수행 할 수 있다.
 +
# 빅파일 테이블 스페이스는 자동 세그먼트 공간 관리가있는 로컬 관리 테이블 스페이스에 대해서만 가능함. (언두,템프,시스템 테이블스페이스는 지원 안함)
 +
}}
  
 +
===== BIGFILE 테이블스페이스 단점 =====
 +
{{틀:고지 상자
 +
|내용=BIGFILE 테이블스페이스 단점
 +
# 병렬 쿼리 실행 및 RMAN 백업 병렬화에 부정적인 영향을 미치므로 스트라이핑을 지원하지 않는 시스템에서 빅 파일 테이블 스페이스를 생성하지 마십시오.
 +
# 큰 파일 크기를 지원하지 않는 OS 플랫폼에서 bigfile 테이블 스페이스를 사용하는 것은 권장되지 않으며 테이블 스페이스 용량을 제한 할 수 있습니다.
 +
# Bigfile 테이블 스페이스는 ASM (Automatic Storage Management) 또는 스트라이핑 또는 RAID를 지원하는 기타 논리 볼륨 관리자 및 동적으로 확장 가능한 논리 볼륨과 함께 사용하기위한 것입니다.
 +
}}
  
(3) 일반 Tablespace
+
=== UNDO TABLESPACE 생성 ===
 +
<source lang="sql">
 +
CREATE UNDO TABLESPACE [테이블 스페이스명] ==> 이부분만 다름.
 +
              DATAFILE '\경로\TEST_UNDO.DBF'
 +
                  SIZE 10M
 +
            AUTOEXTEND ON NEXT 10M
 +
              MAXSIZE 100M
 +
-- UNDO_MANAGEMENT와 UNDO_TABLESPACE, UNDO_RETENTION PARAMETER를 제공
 +
-- 지역적으로 관리되는 익스텐트만 사용가능
 +
-- 시스템에 의해 관리되는 익스텐트 할당만 사용가능하다.
 +
--        (UNIFORMSIZE를 할당 할 수 없고 AUTOALLOCATE만 가능)
 +
</source>
  
      : 가장 일반적으로 많이 사용되는 Tablespace로 관리자가 필요에 의해 만드는 Tablespace.
+
----
  
        DBA 에 의해 얼마든지 생성하고 삭제할 수 있음
+
=== TABLESPACE 변경 ===
 +
==== TABLESPACE 읽기/쓰기 모드 변경 ====
 +
* 읽기 전용 모드
 +
<source lang="sql">
 +
alter tablespace <TABLESPACE명> read only;
 +
</source>
 +
* 읽기 쓰기 모드
 +
<source lang="sql">
 +
alter tablespace <TABLESPACE명> read ,write;
 +
</source>
  
+
==== OPEN 상태에서 DATAFILE 이동 ====
 +
<source lang="sql">
 +
alter tablespace TABLESPACE명 offline;
 +
</source>
 +
===== offline 된 T/S에 대해 복사/이동 =====
 +
<source lang=sh>
 +
cp /data1/xxx.dbf /data2/xxx.dbf
 +
or
 +
mv /data1/xxx.dbf /data2/xxx.dbf
 +
</source>
  
문제) Tablespace 용량 부족으로 에러가 발생되면?
+
===== OFFLINE 상태에서 DATAFILE 이동 =====
 +
<source lang="sql">
 +
alter tablespace TABLESPACE명 rename datafile '파일경로1/xxx.dbf' to '파일경로2/xxx.dbf';
 +
alter tablespace TABLESPACE명 online;
 +
</source>
  
해결방법 1) Data file을 크게 늘려줌(자동 증가/수동증가)
+
==== MOUNT 상태에서 DATAFILE 이동 ====
 +
<source lang="sql">
 +
startup mount;
 +
</source>
  
해결방법 2) Data file을 하나 더 추가
+
===== 해당 T/S에 대해 복사/이동 후 =====
 +
<source lang="sql">
 +
alter database rename file '파일경로' to '파일경로';
 +
alter database open;
 +
</source>
  
+
# 모든 데이타 파일은 mount상태에서 복사/이동 가능
 +
# system 파일은 mount상태에서만 복사/이동 가능
  
Tablespace Offline
+
=== 테이블의 TABLESPACE MOVE ===
 +
<source lang="sql">
 +
ALTER TABLE [테이블명]
 +
      MOVE TABLESPACE [테이블 스페이스명]
 +
</source>
 +
;-테이블스페이스 이동시 인덱스 리빌드 필요
 +
<source lang="sql">
 +
ALTER INDEX [인덱스명] REBUILD ;
 +
</source>
  
- 사용자가 더 이상 해당 Tablespace에 접근하지 못한다는 의미
+
* 인덱스 리빌드 동시 수행 시
 +
<source lang="sql">
 +
ALTER TABLE [테이블명]
 +
      MOVE TABLESPACE [테이블 스페이스명]
 +
      UPDATE INDEXES;
 +
</source>
 +
==== 파티션닝 테이블 TABLESPACE MOVE ====
 +
<source lang="sql">
 +
ALTER TABLE [테이블명]
 +
      MOVE PARTITION [파티션명] TABLESPACE [테이블 스페이스명]
 +
</source>
 +
* 파티셔닝 테이블 인덱스 REBUILD
 +
<source lang="sql">
 +
ALTER INDEX [인덱스명]
 +
      REBUILD PARTITION [파티션명]
 +
</source>
  
- 데이터파일의 위치를 이동하거나 특정 Tablespace가 장애가 나서 복구해야 할 때 사용
+
=== 운영중인 테이블 TABLESPACE ONLINE MOVE ===
 +
<source lang="sql">
 +
ALTER TABLE [테이블명]
 +
      MOVE TABLESPACE [테이블 스페이스명]
 +
    ONLINE -- online 옵션
 +
;
 +
</source>
  
 
  
- Tablespace를 Offline하는 방법 3가지
+
* 인덱스 리빌드 동시 수행 시
 +
<source lang="sql">
 +
ALTER TABLE [테이블명]
 +
      MOVE TABLESPACE [테이블 스페이스명]
 +
      UPDATE INDEXES
 +
    ONLINE -- online 옵션
 +
;
 +
</source>
 +
==== 운영중인 파티션닝 테이블 TABLESPACE ONLINE MOVE ====
 +
<source lang="sql">
 +
ALTER TABLE [테이블명]
 +
      MOVE PARTITION [파티션명] TABLESPACE [테이블 스페이스명]
 +
    ONLINE
 +
</source>
  
1) Normal Mode 
+
{{틀:알림
 +
|내용 = 온라인 Move 작업시 장단점
 +
# Move 작업 중 다른 세션의 DML 작업이 가능함
 +
# 파티션의 로컬인덱스는 USABLE 상태로 바로 사용가능함(unusable 되지 않음)
 +
# 도메인 인덱스가 포함된 테이블은 사용불가
 +
# 온라인 Move 작업시 parallel DML , Direct Path Insert 가 안됨(즉,성능은 좋지않다)
 +
}}
  
  SQL> alter tablespace haksa offline ;
+
=== TABLESPACE 사이즈 변경(RESIZE) ===
 +
<source lang="sql">
 +
ALTER TABLESPACE ts_txxxx
 +
          RESIZE 500G;
 +
</source>
 +
=== TABLESPACE 이름 변경 ===
 +
<source lang="sql">
 +
ALTER TABLESPACE [asis-TABLE] RENAME TO [tobe-TABLE]
 +
</source>
 +
----
 +
=== 인덱스의 TABLESPACE 변경 ===
 +
<source lang="sql">
 +
ALTER INDEX 인덱스명 REBUILD TABLESPACE [테이블 스페이스명]
 +
[ PARALLEL parallel_num ]
 +
[ LOGGING or NOLOGGING ]
 +
;
 +
</source>
 +
=== 인덱스의 TABLESPACE 변경 스크립트 ===
 +
<source lang="sql">
 +
SELECT 'ALTER INDEX '||index_name||' REBUILD TABLESPACE TS_OO_'||substr(a.index_name,4,2)||'_I;'
 +
  FROM  user_indexes a
 +
  WHERE a.index_name NOT IN (SELECT index_name from user_part_indexes)
 +
  AND substr(a.index_name,4,2) IN (SELECT SUBJECT_CD FROM TB_DBA_SUBJECT_CD);
 +
</source>
  
2) Temporary Mode
+
=== 인덱스/테이블 TABLESPACE 변경 스크립트 ===
 +
<source lang="sql">
 +
  SELECT DECODE (segment_type, 'TABLE', segment_name, table_name)  order_col1
 +
      , DECODE (segment_type, 'TABLE', 1, 2)   order_col2
 +
      , 'alter '
 +
        || segment_type
 +
        || ' '
 +
        || segment_name
 +
        || DECODE (segment_type, 'TABLE', ' MOVE ', ' REBUILD ')
 +
        || CHR (10)
 +
        || ' TS_오너_01 '
 +
        || CHR (10)
 +
        || ' storage ( initial '
 +
        || initial_extent
 +
        || ' next '
 +
        || next_extent
 +
        || CHR (10)
 +
        || ' minextents '
 +
        || min_extents
 +
        || ' maxextents '
 +
        || max_extents
 +
        || CHR (10)
 +
        || ' pctincrease '
 +
        || pct_increase
 +
        || ' freelists '
 +
        || freelists
 +
        || ');'
 +
    FROM user_segments, (SELECT table_name, index_name FROM user_indexes)
 +
  WHERE segment_type IN ('TABLE', 'INDEX') AND segment_name = index_name(+)
 +
ORDER BY 1, 2;
 +
</source>
  
Normal이 수행되지 못할 때(Tablespace의 Data file 이상) 사용하는 방법
 
  
3) Immediate Mode
 
  
- 반드시 Archive Log Mode일 경우에만 사용해야 한다.
+
=== TABLESPACE 자동증가/최대 사이즈 변경 ===
 +
<source lang="sql">
 +
ALTER TABLESPACE ts_txxxx
 +
      AUTOEXTEND ON
 +
            NEXT 100M 
 +
        MAXSIZE 500G;-- 최대사이즈 , UNLIMITED => 무제한 증가
 +
</source>
  
- Data file에 장애가 나서 데이터를 내려쓰지 못하는 상황에서 Tablespace를 offline해야 할 경우 사용
 
  
+
* 최대 TABLESPACE 사이즈 변경
 +
<source lang="sql">
 +
ALTER TABLESPACE [테이블 스페이스명]
 +
            ADD DATAFILE 'C:\경로\TEST2.DBF' SIZE 10M
 +
      AUTOEXTEND ON NEXT 100M
 +
        MAXSIZE 100G;
  
+
  ==> 10M씩 자동증가
 +
</source>
  
- Tablespace 이동하기
+
=== 데이터파일 사이즈 변경 ===
 +
<source lang="sql">
 +
ALTER DATABASE DATAFILE 'C:\경로\TEST1.DBF'
 +
        RESIZE 10M;
 +
</source>
  
1) Offline되는 Tablespace의 Data file 이동하기
+
=== 데이터파일 추가 ===
 +
<source lang="sql">
 +
ALTER TABLESPACE [테이블 스페이스명]
 +
            ADD DATAFILE 'C:\경로\TEST2.DBF' SIZE 10M;
 +
</source>
  
1. 해당 Tablespace Offline 하기
+
=== 데이터/템프파일 삭제 ===
 +
<source lang="sql">
 +
ALTER TABLESPACE [테이블 스페이스명]
 +
            DROP DATAFILE 'data파일';
 +
-- 템프TS    DROP TEMPFILE 'data파일';
 +
</source>
  
2. Data file을 대상 위치로 복사
+
=== 데이터 파일 삭제 후 OS 디스크 사이즈가 줄지 않을경우 ===
 +
{{틀:타이틀 투명
 +
|보더색=#696969
 +
|배경색=#483d8b
 +
|제목= 1) 테이블스페이스 사이즈를 줄인 (shrink) 후 데이터파일 삭제
 +
      2) DB 리부팅 하면 공간 확보 됨(DBWR 이 데이터파일을 사용중이기 때문에 공간이 줄지 않음)
 +
}}
  
3. Control file 내의 해당 Data file 위치 변경
+
----
  
4. 해당 Tablespace Online
+
=== TABLESPACE 삭제 ===
 +
==== TABLESPACE에 포함된 모든 세그먼트 삭제 ====
 +
<source lang="sql">
 +
DROP TABLESPACE [테이블 스페이스명]
 +
      INCLUDING CONTENTS;-- TABLESPACE의 모든 세그먼트를 삭제한다.
 +
                        -- 단, 데이타가 있는 TABLESPACE는 삭제할수 없다.
 +
</source>
 +
==== TABLESPACE에 포함된 테이블의 참조/제약 조건 삭제 ====
 +
<source lang="sql">
 +
DROP TABLESPACE [테이블 스페이스명]
 +
        CASCADE CONSTRAINTS; -- 삭제된 TABLESPACE 내의 테이블의 기본키와 유일키를 참조하는
 +
                            -- 다른 TABLESPACE의 테이블로부터 참조무결성 제약 조건을 삭제한다.       
 +
</source>
  
+
==== TABLESPACE의 데이터파일 삭제 ====
 +
<source lang="sql">
 +
DROP TABLESPACE [테이블 스페이스명]
 +
      INCLUDING CONTENTS AND DATAFILES; -- 물리적파일까지 삭제한다.
 +
</source>
  
2) Offline 안 되는 Tablespace의 Data file 이동하기
 
  
1. DB 종료
+
=== TABLESPACE 수정이나 삭제시 ONLINE/OFFLINE 설정 ===
 +
<source lang="sql">
 +
ALTER TABLESPACE [테이블 스페이스명] ONLINE
 +
ALTER TABLESPACE [테이블 스페이스명] OFFLINE
 +
</source>
  
2. Mount 상태로 시작
+
----
  
3. Data file 복사
+
=== 템프 TABLESPACE ===
  
4. Control file의 내용 변경
+
==== TEMPORARY TABLESPACE 정보 ====
 +
<source lang="sql">
 +
  SELECT d.TABLESPACE_NAME
 +
      , d.FILE_NAME
 +
      , d.BYTES / 1024 / 1024                            SIZE_MB
 +
      , d.AUTOEXTENSIBLE
 +
      , d.MAXBYTES / 1024 / 1024                          MAXSIZE_MB
 +
      , d.INCREMENT_BY * (v.BLOCK_SIZE / 1024) / 1024    INCREMENT_BY_MB
 +
    FROM dba_temp_files d, v$tempfile v
 +
  WHERE d.FILE_ID = v.FILE#
 +
ORDER BY d.TABLESPACE_NAME, d.FILE_NAME
 +
</source>
  
5. DB Open
+
===== 템프테이블 사이즈 조정 =====
 +
<source lang="sql">
 +
ALTER DATABASE TEMPFILE 'D:\APP\ORADATA\ORCL\TEMP01.DBF'
 +
RESIZE 304M;
 +
</source>
  
+
==== TEMPORARY TABLESPACE 생성 ====
  
   
+
*. '''신규생성만 가능'''.
 +
  : 사용중인 TEMP TABLESPACE 는 삭제가 안되므로 신규로 템프 TABLESPACE를 생성
 +
<source lang=sql>
 +
CREATE TEMPORARY TABLESPACE [테이블 스페이스명]
 +
        TEMPFILE '\경로\TEST_TEMP.DBF'
 +
            SIZE 10M
 +
      AUTOEXTEND ON
 +
            NEXT 100M
 +
        MAXSIZE 300G
 +
          EXTENT MANAGEMENT LOCAL
 +
        UNIFORM SIZE 512K -- LOCALY MANAGED TABLESPACE NUIFORM SIZE만 생성가능하다.
 +
                          -- (주의)AUTOALLOCATE, EXTENT MANAGEMENT DICIONARY OPTION을 사용하면 ORA-25319 ERROR 발생한다.
 +
                          --  RENAME 이 불가능하다.
 +
</source>
  
(4) Undo Tablespace
+
==== TEMPORARY TABLESPACE를 DEFAULT TABLESPACE로 변경 ====
 +
<source lang="sql">
 +
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE [테이블 스페이스명];
 +
</source>
  
    : Undo Segment를 저장하고 있는 Tablespace, 관리자가 생성/관리 가능
+
==== TEMPORARY TABLESPACE 사이즈 증가 ====
 +
<source lang="sql">
 +
ALTER TABLESPACE TEMP 
 +
      AUTOEXTEND ON
 +
            NEXT 100M 
 +
        MAXSIZE 500G;
 +
</source>
 +
----
  
  Instance당 여러 개가 동시에 존재할 수 있지만 사용은 한번에 1개만
+
==== TEMPORARY TABLESPACE 사이즈 추가 ====
 +
<source lang="sql">
 +
ALTER TABLESPACE TEMP
 +
            ADD TEMPFILE '+DATA' SIZE 10G
 +
      AUTOEXTEND ON
 +
            NEXT 100M
 +
        MAXSIZE 32767M;
 +
</source>
 +
----
  
        자동 관리 기법(AUM, Automatic Undo Management)
+
==== TEMPORARY TABLESPACE 삭제  ====
 +
<source lang="sql">
 +
DROP TABLESPACE TEMP2;
 +
</source>
  
   
+
==== TEMPORARY TABLESPACE DATA FILE 삭제 ====
 +
<source lang="sql">
 +
ALTER TABLESPACE TEMP DROP TEMPFILE '+DATA/temp.368.1013282149'; 
 +
</source>
 +
- +DATA/temp.368.1013282149 은 ASM 사용시
  
- Undo Data : 사용자가 DML을 수행할 경우 발생하는 원본데이터, Oracle Server Process가 직접 관리
+
==== TEMPORARY TABLESPACE 사용율 조회 쿼리 ====
  
                    ex) 홍길동→일지매로 업데이트 시 홍길동이 Undo Data
+
<source lang="sql">
 +
/* TEMP 사용 쿼리 확인 */
  
- Undo Segment : Undo Data만을 저장하는 Segment
+
select a.username, a.sid, a.serial#, b.blocks, a.program, a.module, a.action, a.machine, a.status, a.event, d.sql_Text ,
 +
      b.blocks*8192/1024/1024 mb
 +
from v$session a,
 +
      v$sort_usage b,
 +
      v$process c,
 +
      v$sqlarea d
 +
where  a.saddr = b.session_addr
 +
and a.paddr = c.addr
 +
and a.sql_hash_value= d.hash_value
 +
and b.tablespace like 'TEMP%'
 +
--and a.username ='MIG_ADM'
 +
ORDER BY A.MACHINE, SQL_TEXT
 +
</source>
  
 +
==== 템프테이블 TABLESPACE sort 사용 현황 ====
 +
<source lang="sql">
 +
SELECT
 +
  A.tablespace_name tablespace,
 +
  D.mb_total,
 +
  SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_used,
 +
  D.mb_total - SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_free
 +
FROM
 +
  v$sort_segment A,
 +
(
 +
SELECT
 +
  B.name,
 +
  C.block_size,
 +
  SUM (C.bytes) / 1024 / 1024 mb_total
 +
FROM
 +
  v$tablespace B,
 +
  v$tempfile C
 +
WHERE
 +
  B.ts#= C.ts#
 +
GROUP BY
 +
  B.name,
 +
  C.block_size
 +
) D
 +
WHERE
 +
  A.tablespace_name = D.name
 +
GROUP by
 +
  A.tablespace_name,
 +
  D.mb_total
 +
</source>
 
----
 
----
  
==현재 UNDO 상태 확인==
+
== TABLESPACE 오브젝트별 정보 ==
<source lang=sql>
+
 
SELECT A.TABLESPACE_NAME,A.STATUS, B.TOTAL_MB, A.USE_MB,
+
=== TABLESPACE/파일 확인(딕셔너리) ===
      ROUND(RATIO_TO_REPORT(A.USE_MB) OVER(PARTITION BY A.TABLESPACE_NAME) * 100)||'%' AS PCT
+
<source lang="sql">
  FROM (SELECT TABLESPACE_NAME, STATUS,
+
SELECT * FROM DBA_DATA_FILES ;
              ROUND(SUM(BYTES/1024/1024)) USE_MB
+
SELECT * FROM DBA_TABLESPACES ;
          FROM DBA_UNDO_EXTENTS
+
SELECT * FROM DBA_SEGMENTS;
        GROUP BY TABLESPACE_NAME,STATUS
+
</source>
      )A,
+
 
      (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/1024/1024) TOTAL_MB
+
=== TABLESPACE별 정보 ===
          FROM DBA_DATA_FILES
+
<source lang="sql">  
        WHERE TABLESPACE_NAME LIKE 'UNDO%'
+
SELECT A.TABLESPACE_NAME AS "TABLESPACE"
        GROUP BY TABLESPACE_NAME
+
    , A.INITIAL_EXTENT / 1024 AS "INIT(K)"
      )B
+
    , A.NEXT_EXTENT / 1024 AS "NEXT(K)"
  WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME
+
    , A.MIN_EXTENTS AS "MIN"
  ORDER BY 1,2
+
    , A.MAX_EXTENTS AS "MAX"
 +
    , A.PCT_INCREASE AS "PCT_INC(%)"
 +
    , B.FILE_NAME AS "FILE_NAME"
 +
    , B.BLOCKS * C.VALUE / 1024 / 1024 AS "SIZE(M)"
 +
    , B.STATUS AS "STATUS"
 +
  FROM DBA_TABLESPACES A
 +
    , DBA_DATA_FILES B
 +
    ,  V$PARAMETER C
 +
  WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME  
 +
  AND C.NAME = 'db_block_size'
 +
  ORDER BY 1, 2;
 +
</source>
 +
----
 +
=== TABLESPACE별 파일 목록 ===
 +
<source lang="sql">
 +
SELECT SUBSTRB(TABLESPACE_NAME, 1, 10) AS "TABLESPACE"
 +
    , SUBSTRB(FILE_NAME, 1, 50) AS "파일명"
 +
    , TO_CHAR(BLOCKS, '999,999,990') AS "블럭수"
 +
    , TO_CHAR(BYTES, '99,999,999') AS "크기"
 +
  FROM DBA_DATA_FILES ORDER BY TABLESPACE_NAME, FILE_NAME;
 
</source>  
 
</source>  
  
== 테이블스페이스별 전체 오브젝트(테이블/인덱스/LOB) 사이즈 ==
+
----
  
 +
=== TABLESPACE 사이즈 정보 ===
 +
 +
==== TABLESPACE별 전체 오브젝트(테이블/인덱스/LOB) 사이즈 ====
 
-- OBJECT별 테이블 사이즈 (UNDO,TEMP T/S 제외)  
 
-- OBJECT별 테이블 사이즈 (UNDO,TEMP T/S 제외)  
 
<source lang=sql>
 
<source lang=sql>
211번째 줄: 539번째 줄:
 
         , A.SEGMENT_TYPE
 
         , A.SEGMENT_TYPE
 
UNION ALL
 
UNION ALL
 +
 
-- INDEX SIZE
 
-- INDEX SIZE
 
 
SELECT  A.TABLESPACE_NAME
 
SELECT  A.TABLESPACE_NAME
 
       , A.SEGMENT_NAME
 
       , A.SEGMENT_NAME
246번째 줄: 574번째 줄:
 
</source>
 
</source>
 
----
 
----
== 테이블스페이스별 사이즈 ==
+
==== TABLESPACE별 사이즈 ====
 
<source lang=sql>
 
<source lang=sql>
 
SELECT  Substr(df.tablespace_name,1,20) "Tablespace Name",
 
SELECT  Substr(df.tablespace_name,1,20) "Tablespace Name",
269번째 줄: 597번째 줄:
 
</source>
 
</source>
  
== 테이블/인덱스/LOB 오브젝트별 테이블스페이스 사이즈 ==
+
==== 테이블 TABLESPACE 사이즈 ====
 
  -- 테이블 사이즈   
 
  -- 테이블 사이즈   
 
<source lang=sql>
 
<source lang=sql>
284번째 줄: 612번째 줄:
 
</source>
 
</source>
  
-- 인덱스 사이즈  
+
==== 인덱스 TABLESPACE 사이즈 ====
 
-- INDEX SIZE   
 
-- INDEX SIZE   
 
<source lang=sql>
 
<source lang=sql>
300번째 줄: 628번째 줄:
 
</source>
 
</source>
  
-- LOB 사이즈  
+
==== LOB TABLESPACE 사이즈 ====
 +
-- LOB 사이즈  
 
<source lang=sql>
 
<source lang=sql>
 
  SELECT TABLE_NAME
 
  SELECT TABLE_NAME
312번째 줄: 641번째 줄:
 
group by table_name;
 
group by table_name;
 
</source>
 
</source>
 
+
==== 데이터파일 별  테이블스페이스 사이즈 조회 ====
 
+
<source lang="sql">  
==테이블스페이스 확인==
+
SELECT    A.TABLESPACE_NAME "테이블스페이스명",
<source lang="sql">
+
          A.FILE_NAME "파일경로",
SELECT * FROM DBA_DATA_FILES ;
+
          (A.BYTES - B.FREE)    "사용공간",
SELECT * FROM DBA_TABLESPACES ;
+
            B.FREE                "여유 공간",
</source>
+
            A.BYTES                "총크기",
 
+
            TO_CHAR( (B.FREE / A.BYTES * 100) , '999.99')||'%' "여유공간"
==현재 유저의 DEFAULT TABLESPACE 확인==
+
      FROM
<source lang="sql">
+
      (
SELECT * FROM USER_USERS ;
+
        SELECT FILE_ID,
==> DEFAUT TABLESPACE로 설정된 부분을 확인
+
                TABLESPACE_NAME,
</source>
+
                FILE_NAME,
----
+
                SUBSTR(FILE_NAME,1,200) FILE_NM,
==테이블스페이스 변경==
+
                SUM(BYTES) BYTES
 
+
          FROM DBA_DATA_FILES
=== TABLESPACE 사이즈 변경 ===
+
        GROUP BY FILE_ID,TABLESPACE_NAME,FILE_NAME,SUBSTR(FILE_NAME,1,200)
<source lang="sql">
+
       ) A,
-- 최대 사용 사이즈
+
       (
ALTER TABLESPACE ts_txxxx
+
        SELECT TABLESPACE_NAME,
      AUTOEXTEND ON
+
                FILE_ID,
            NEXT 100M 
+
                SUM(NVL(BYTES,0)) FREE
        MAXSIZE 500G;
+
          FROM DBA_FREE_SPACE
 
+
        GROUP BY TABLESPACE_NAME,FILE_ID
-- 리사이즈
+
      ) B
 
+
      WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME
ALTER TABLESPACE ts_txxxx RESIZE 500G;
+
        AND A.FILE_ID = B.FILE_ID;
 
 
</source>
 
 
 
 
 
 
 
===유저의 DEFAULT TABLESPACE 변경===
 
<source lang="sql">
 
ALTER USER [유저명] DEFAULT TABLESPACE [테이블 스페이스명]
 
</source>
 
===테이블의 TABLESPACE 변경===
 
<source lang="sql">
 
ALTER TABLE [테이블명] MOVE TABLESPACE [테이블 스페이스명]
 
</source>
 
 
 
<source lang="sql">
 
SELECT 'ALTER TABLE '||a.table_name||' MOVE TABLESPACE TS_OO_'||substr(a.table_name,4,2)||'_D;'
 
  FROM  user_tables a
 
WHERE a.table_name NOT IN (SELECT table_name FROM user_part_tables)
 
   AND substr(a.table_name,4,2) IN (SELECT SUBJECT_CD FROM TB_DBA_SUBJECT_CD);
 
</source>
 
 
 
===인덱스의 TABLESPACE 변경===
 
<source lang="sql">
 
ALTER INDEX 인덱스명 REBUILD TABLESPACE [테이블 스페이스명]
 
[ PARALLEL parallel_num ]
 
[ LOGGING or NOLOGGING ]
 
;
 
</source>
 
<source lang="sql">
 
SELECT 'ALTER INDEX '||index_name||' REBUILD TABLESPACE TS_OO_'||substr(a.index_name,4,2)||'_I;'  
 
  FROM user_indexes a
 
WHERE a.index_name NOT IN (SELECT index_name from user_part_indexes)
 
  AND substr(a.index_name,4,2) IN (SELECT SUBJECT_CD FROM TB_DBA_SUBJECT_CD);
 
</source>
 
 
 
===인덱스/테이블 TABLESPACE 변경 생성 스크립트 ===
 
<source lang="sql">
 
select decode( segment_type, 'TABLE',  
 
                                                    segment_name, table_name ) order_col1,  
 
                    decode( segment_type, 'TABLE', 1, 2 ) order_col2,
 
                    'alter ' || segment_type || ' ' || segment_name ||
 
                    decode( segment_type, 'TABLE', ' move ', ' rebuild ' ) ||
 
                    chr(10) ||
 
                    ' HONEY_DATASPACE ' || chr(10) ||
 
                    ' storage ( initial ' || initial_extent || ' next ' ||
 
                    next_extent || chr(10) ||
 
                    ' minextents ' || min_extents || ' maxextents ' ||
 
                    max_extents || chr(10) ||
 
                    ' pctincrease ' || pct_increase || ' freelists ' ||
 
                    freelists || ');'
 
      from user_segments,  
 
                    (select table_name, index_name from user_indexes )  
 
       where segment_type in ( 'TABLE', 'INDEX' )
 
       and segment_name = index_name (+)
 
      order by 1, 2
 
</source>
 
 
 
=> 변경결과
 
=> 테이블
 
<source lang="sql">
 
alter TABLE TB_ASIS_TABLES move
 
HONEY_DATASPACE
 
storage ( initial 65536 next 1048576
 
minextents 1 maxextents 2147483645
 
pctincrease  freelists );
 
</source>
 
=> 인덱스
 
<source lang="sql">
 
alter INDEX PK_ASIS_TABLES rebuild
 
HONEY_DATASPACE
 
storage ( initial 65536 next 1048576
 
minextents 1 maxextents 2147483645
 
pctincrease  freelists );
 
</source>
 
 
 
===TABLESPACE 수정이나 삭제시 ONLINE/OFFLINE 설정===
 
<source lang="sql">
 
ALTER TABLESPACE [테이블 스페이스명] ONLINE
 
ALTER TABLESPACE [테이블 스페이스명] OFFLINE
 
</source>
 
 
 
===TABLESPACE의 물리적인 파일의 이름 또는 위치변경===
 
<source lang="sql">
 
ALTER TABLESPACE [asis-TABLE] RENAME TO [tobe-TABLE]
 
</source>
 
 
 
===TABLESPACE 사이즈 관리===
 
 
 
* 테이블스페이스 사이즈 변경
 
<source lang="sql">
 
ALTER TABLESPACE TS_D01 RESIZE 100M;
 
</source>
 
 
 
* 데이터파일 사이즈 변경
 
<source lang="sql">
 
ALTER DATABASE DATAFILE 'C:\경로\TEST1.DBF' RESIZE 10M;
 
</source>
 
 
 
* 데이터파일 추가
 
<source lang="sql">
 
ALTER TABLESPACE [테이블 스페이스명] ADD DATAFILE 'C:\경로\TEST2.DBF' SIZE 10M;
 
</source>
 
 
 
* 최대 테이블스페이스 사이즈 변경
 
<source lang="sql">
 
ALTER TABLESPACE [테이블 스페이스명]
 
            ADD DATAFILE 'C:\경로\TEST2.DBF' SIZE 10M
 
      AUTOEXTEND ON NEXT 100M
 
        MAXSIZE 100G;
 
 
 
  ==> 10M씩 자동증가
 
 
</source>
 
</source>
----
 
  
==TABLESPACE 삭제==
 
<source lang="sql">
 
DROP TABLESPACE [테이블 스페이스명] INCLUDE CONTENTS;
 
  ==> 테이블스페이스 내의 객체(테이블,인덱스등)를 다 지운다.
 
</source>
 
<source lang="sql">
 
DROP TABLESPACE [테이블 스페이스명] INCLUDING CONTENTS;
 
  ==> 테이블스페이스의 모든 세그먼트를 삭제한다.
 
  ==> 단, 데이타가 있는 테이블스페이스는 삭제할수 없다.
 
</source>
 
<source lang="sql">
 
DROP TABLESPACE [테이블 스페이스명] CASCADE CONSTRAINTS;
 
  ==> 삭제된 테이블스페이스 내의 테이블의 기본키와 유일키를 참조하는
 
        다른 테이블스페이스의 테이블로부터 참조무결성 제약 조건을 삭제한다.       
 
</source>
 
<source lang="sql">
 
DROP TABLESPACE [테이블 스페이스명] INCLUDING CONTENTS AND DATAFILES;
 
 
  ==> 물리적파일까지 삭제한다.
 
</source>
 
  
----
+
==== TABLESPACE별 사용하는 파일의 크기 ====
==TABLESPACE 생성==
 
<source lang="sql">
 
CREATE TABLESPACE [테이블 스페이스명]
 
DATAFILE 'C:\경로\TEST.DBF'SIZE 10M
 
==> 여기까지 작성하면 기본적인 사항에 대해서만 생성된다.
 
AUTOEXTEND ON NEXT 10M
 
==> (옵션)데이타 파일 용량초과시 자동증가설정
 
MAXSIZE 100M
 
==> (옵션)데이타파일 최대크기지정
 
EXTENT MANAGEMENT LOCAL
 
==> (옵션)
 
UNIFORM SIZE 1M
 
==> (옵션)
 
</source>
 
 
 
===TABLESPACE 생성2===
 
<source lang=sql>
 
CREATE TABLESPACE [테이블 스페이스명]
 
DATAFILE 'C:\경로\TEST.DBF'
 
SIZE 10M
 
DEFAULT STORAGE(
 
  INITIAL 80K  ==> 테이블 스페이스의 맨 첫번째 EXTENTS의 크기
 
  NEXT 80K  ==> 다음 EXTENTS의 크기
 
  MINNEXTENTS 1  ==> 생성할 EXTENTS의 최소값
 
  MAXNEXTENTS 121  ==> 생성할 EXTENTS의 최대값
 
  PCTINCREASE 80  ==> EXTENTS의 증가율,(DEFAULT값은 50%)
 
) ONLINE ;
 
</source>
 
 
 
 
 
==테이블스페이스 정보 확인==
 
===테이블스페이스별 파일 목록을 보기===
 
 
<source lang="sql">  
 
<source lang="sql">  
SELECT SUBSTRB(TABLESPACE_NAME, 1, 10) AS "테이블스페이스"
+
SELECT SUBSTRB(TABLESPACE_NAME, 1, 10) AS TABLESPACE
    ,  SUBSTRB(FILE_NAME, 1, 50) AS "파일명"
 
    ,  TO_CHAR(BLOCKS, '999,999,990') AS "블럭수"
 
    ,  TO_CHAR(BYTES, '99,999,999') AS "크기"
 
  FROM DBA_DATA_FILES ORDER BY TABLESPACE_NAME, FILE_NAME;
 
</source>
 
 
 
===테이블스페이스별 정보 보기===
 
<source lang="sql">
 
SELECT A.TABLESPACE_NAME AS "TABLESPACE"
 
    , A.INITIAL_EXTENT / 1024 AS "INIT(K)"
 
    , A.NEXT_EXTENT / 1024 AS "NEXT(K)"
 
    , A.MIN_EXTENTS AS "MIN"
 
    , A.MAX_EXTENTS AS "MAX"
 
    , A.PCT_INCREASE AS "PCT_INC(%)"
 
    , B.FILE_NAME AS "FILE_NAME"
 
    , B.BLOCKS * C.VALUE / 1024 / 1024 AS "SIZE(M)"
 
    , B.STATUS AS "STATUS"
 
  FROM DBA_TABLESPACES A
 
    ,  DBA_DATA_FILES B
 
    ,  V$PARAMETER C
 
WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME AND C.NAME = 'db_block_size' ORDER BY 1, 2; </source>
 
 
 
 
 
===테이블스페이스별 사용하는 파일의 크기 합 보기===
 
<source lang="sql"> SELECT SUBSTRB(TABLESPACE_NAME, 1, 10) AS TABLESPACE
 
 
     , TO_CHAR(SUM(BYTES), '9,999,999,999,990') AS BYTES
 
     , TO_CHAR(SUM(BYTES), '9,999,999,999,990') AS BYTES
 
     , TO_CHAR(SUM(BLOCKS), '9,999,999,990') AS BLOCKS
 
     , TO_CHAR(SUM(BLOCKS), '9,999,999,990') AS BLOCKS
541번째 줄: 681번째 줄:
 
   FROM DBA_DATA_FILES;  
 
   FROM DBA_DATA_FILES;  
 
</source>
 
</source>
 +
----
  
===테이블스페이스별 디스크 사용량 보기===   
+
==== TABLESPACE별 디스크 사용량 ====   
 
 
 
<source lang="sql">  
 
<source lang="sql">  
 
SELECT A.TABLESPACE_NAME AS "TABLESPACE"
 
SELECT A.TABLESPACE_NAME AS "TABLESPACE"
572번째 줄: 712번째 줄:
 
           FROM      DBA_EXTENTS
 
           FROM      DBA_EXTENTS
 
           GROUP BY  TABLESPACE_NAME) D
 
           GROUP BY  TABLESPACE_NAME) D
 
+
  WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME(+)  
  WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME(+) AND A.TABLESPACE_NAME = C.TABLESPACE_NAME(+) AND A.TABLESPACE_NAME = D.TABLESPACE_NAME(+)  
+
  AND A.TABLESPACE_NAME = C.TABLESPACE_NAME(+)  
ORDER BY A.TABLESPACE_NAME;  
+
  AND A.TABLESPACE_NAME = D.TABLESPACE_NAME(+)  
 +
ORDER BY A.TABLESPACE_NAME;  
 
</source>
 
</source>
 
+
----
===테이블스페이스의 테이블 명 보기=== 
+
====공간의 90% 이상을 사용하고 있는 TABLESPACE ====   
<source lang="sql">
 
SELECT TABLESPACE_NAME, TABLE_NAME
 
  FROM USER_TABLES
 
WHERE TABLESPACE_NAME = UPPER('&테이블스페이스명')
 
ORDER BY TABLESPACE_NAME, TABLE_NAME;
 
</source>
 
 
 
===공간의 90% 이상을 사용하고 있는 Tablespace===   
 
 
<source lang="sql"> SELECT X.TABLESPACE_NAME
 
<source lang="sql"> SELECT X.TABLESPACE_NAME
 
     , TOTAL_SIZE / 1024 / 1024 TOTAL_SIZE
 
     , TOTAL_SIZE / 1024 / 1024 TOTAL_SIZE
598번째 줄: 731번째 줄:
 
  WHERE X.TABLESPACE_NAME = Y.TABLESPACE_NAME(+) AND Y.USED_SIZE > .9 * X.TOTAL_SIZE;  
 
  WHERE X.TABLESPACE_NAME = Y.TABLESPACE_NAME(+) AND Y.USED_SIZE > .9 * X.TOTAL_SIZE;  
 
</source>
 
</source>
 +
----
  
===Object별 테이블스페이스 및 데이터파일===   
+
=== TABLESPACE에 포함된 테이블 명 보기=== 
 
+
<source lang="sql">
 +
SELECT TABLESPACE_NAME
 +
    , TABLE_NAME
 +
  FROM DBA_TABLES
 +
WHERE TABLESPACE_NAME = UPPER('&TABLESPACE명')
 +
ORDER BY TABLESPACE_NAME
 +
    , TABLE_NAME;
 +
</source>
 +
----
 +
=== 오브젝트별 TABLESPACE 및 데이터파일 ===   
 
<source lang="sql">
 
<source lang="sql">
 
  SELECT DISTINCT E.SEGMENT_NAME, E.TABLESPACE_NAME, F.FILE_NAME
 
  SELECT DISTINCT E.SEGMENT_NAME, E.TABLESPACE_NAME, F.FILE_NAME
609번째 줄: 752번째 줄:
 
   AND E.TABLESPACE_NAME NOT IN ('SYSTEM', 'TOOLS'); </source>
 
   AND E.TABLESPACE_NAME NOT IN ('SYSTEM', 'TOOLS'); </source>
  
===Tablespace별 Table, Index 개수===  
+
=== TABLESPACE별 Table, Index 개수===  
  
 
<source lang="sql">
 
<source lang="sql">
 
SELECT OWNER
 
SELECT OWNER
 
     , TABLESPACE_NAME
 
     , TABLESPACE_NAME
     , SUM(DECODE(SEGMENT_TYPE, 'TABLE', 1, 0))
+
     , SUM(DECODE(SEGMENT_TYPE, 'TABLE', 1, 0))         TAB
     , SUM(DECODE(SEGMENT_TYPE, 'INDEX', 1, 0))
+
     , SUM(DECODE(SEGMENT_TYPE, 'INDEX', 1, 0))         IDX
   FROM DBA_SEGMENTS WHERE SEGMENT_TYPE IN ('TABLE', 'INDEX') GROUP BY OWNER, TABLESPACE_NAME;  
+
    , SUM(DECODE(SEGMENT_TYPE, 'LOBINDEX', 1, 0))      LOB_IDX
 +
    , SUM(DECODE(SEGMENT_TYPE, 'LOBSEGMENT', 1, 0))    LOB_SEG
 +
   FROM DBA_SEGMENTS  
 +
WHERE SEGMENT_TYPE IN ('TABLE', 'INDEX', 'LOBINDEX','LOBSEGMENT')
 +
GROUP BY OWNER, TABLESPACE_NAME;  
 
</source>
 
</source>
  
===파일위치별 테이블스페이스 아는 방법===   
+
=== 파일위치별 TABLESPACE 아는 방법 ===   
 
<source lang="sql">
 
<source lang="sql">
  
631번째 줄: 778번째 줄:
 
         GROUP BY  FILE_ID) B
 
         GROUP BY  FILE_ID) B
 
  WHERE A.FILE_ID = B.FILE_ID  
 
  WHERE A.FILE_ID = B.FILE_ID  
   AND A.TABLESPACE_NAME = UPPER('&테이블스페이스명')  
+
   AND A.TABLESPACE_NAME = UPPER('&TABLESPACE명')  
 
  ORDER BY A.FILE_NAME; </source>
 
  ORDER BY A.FILE_NAME; </source>
  
647번째 줄: 794번째 줄:
  
 
===테이블의 익스텐트 정보 조회===
 
===테이블의 익스텐트 정보 조회===
<source lang="sql">
+
{{틀:고지상자
 
+
|제목 = 오라클에서 스토리지 구조는 아래와 같다.
/*
+
|내용 = 테이블 스페이스 -> 세그먼트 -> 익스텐트 -> 블록 -> OS 범위 -> 데이터 파일 -> 운영체제 블록     
    오라클에서 스토리지 구조는 아래와 같다.
 
    테이블 스페이스 -> 세그먼트 -> 익스텐트 -> 블록 -> OS 범위 -> 데이터 파일 -> 운영체제 블록     
 
 
     세그먼트의 이름,
 
     세그먼트의 이름,
 
     해당 세그먼트의 최대 익스텐트 개수,
 
     해당 세그먼트의 최대 익스텐트 개수,
 
     익스텐트 아이디
 
     익스텐트 아이디
 
     해당 세그먼트의 최대 익스텐트 개수 - 최대 익스텐트 아이디     
 
     해당 세그먼트의 최대 익스텐트 개수 - 최대 익스텐트 아이디     
     딕셔너리 관리 테이블스페이스로 생성한 것으로 조회를 한다.
+
     딕셔너리 관리 TABLESPACE로 생성한 것으로 조회를 한다.
*/
+
}}
 
+
<source lang="sql">
 
SELECT B.SEGMENT_NAME
 
SELECT B.SEGMENT_NAME
 
     , B.MAX_EXTENTS
 
     , B.MAX_EXTENTS
673번째 줄: 818번째 줄:
 
  ORDER BY B.MAX_EXTENTS - MAX(C.EXTENT_ID);  
 
  ORDER BY B.MAX_EXTENTS - MAX(C.EXTENT_ID);  
 
</source>
 
</source>
 +
----
 +
 +
== UNDO TABLESPACE ==
 +
* UNDO Segment를 저장하고 있는 TABLESPACE , 관리자가 생성/관리 가능
 +
* Instance당 여러 개가 동시에 존재할 수 있지만 사용은 한번에 1개만
 +
 +
{{틀:고지상자
 +
|제목 = 자동 관리 기법(AUM, Automatic Undo Management)
 +
|내용 =
 +
- Undo Data : 사용자가 DML을 수행할 경우 발생하는 원본데이터, Oracle Server Process가 직접 관리
 +
          ex) 홍길동→일지매로 업데이트 시 홍길동이 Undo Data
 +
- Undo Segment : Undo Data만을 저장하는 Segment
 +
}}
 +
----
 +
 +
=== 현재 UNDO 상태 확인 ===
 +
<source lang=sql>
 +
SELECT A.TABLESPACE_NAME,A.STATUS, B.TOTAL_MB, A.USE_MB,
 +
      ROUND(RATIO_TO_REPORT(A.USE_MB) OVER(PARTITION BY A.TABLESPACE_NAME) * 100)||'%' AS PCT
 +
  FROM (SELECT TABLESPACE_NAME, STATUS,
 +
              ROUND(SUM(BYTES/1024/1024)) USE_MB
 +
          FROM DBA_UNDO_EXTENTS
 +
        GROUP BY TABLESPACE_NAME,STATUS
 +
      )A,
 +
      (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/1024/1024) TOTAL_MB
 +
          FROM DBA_DATA_FILES
 +
        WHERE TABLESPACE_NAME LIKE 'UNDO%'
 +
        GROUP BY TABLESPACE_NAME
 +
      )B
 +
WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME
 +
ORDER BY 1,2
 +
</source>
 +
=== UNDO 테이블 스페이스 삭제 ===
 +
<source lang=sql>
 +
DROP TABLESPACE UNDO_T1 INCLUDING CONTENTS AND DATAFILES;
 +
</source> 
 +
  
===ROLLBACK SEGMENT의 사용상황 보기===  
+
----
 +
===ROLLBACK SEGMENT의 사용상황 보기===
 
<source lang="sql">
 
<source lang="sql">
 
--: EXTENTS = 현재 할당된 EXTENT의 수 --: EXTENDS = 마지막 트랜잭션에 의해 할당된 EXTENT의 수
 
--: EXTENTS = 현재 할당된 EXTENT의 수 --: EXTENDS = 마지막 트랜잭션에 의해 할당된 EXTENT의 수
690번째 줄: 873번째 줄:
 
  WHERE A.SEGMENT_ID = B.USN(+) ORDER BY 1; </source>
 
  WHERE A.SEGMENT_ID = B.USN(+) ORDER BY 1; </source>
  
=템프테이블 스페이스=
+
== TABLESPACE 장애 처리 ==
  
== TEMP TABLESPACE 확인 ==
+
=== TABLESPACE 용량 부족으로 에러 발생시 ===
 +
* 방법 1) Data file을 크게 늘려줌(자동 증가/수동증가)
 +
* 방법 2) Data file을 하나 더 추가
  
=== TEMP TABLESPACE 확인 ===
+
==== Tablespace Offline ====
<source lang="sql">
+
 
SELECT * FROM DBA_TEMP_FILES ;
+
* 사용자가 더 이상 해당 Tablespace에 접근하지 못한다는 의미
 +
* 데이터파일의 위치를 이동하거나 특정 Tablespace가 장애가 나서 복구해야 할 때 사용
 +
 +
 
 +
==== TABLESPACE 를 Offline하는 방법 3가지====
 +
1) Normal Mode 
 +
<source lang=sql>
 +
SQL> alter TABLESPACE TS_TEST offline ;
 
</source>
 
</source>
  
# 사용중인 TEMP TABLESPACE 는 삭제가 안되므로 신규로 템프 테이블스페이스를 생성
+
2) Temporary Mode
<source lang="sql">
+
 
CREATE BIGFILE TEMPORARY TABLESPACE TEMP2 TEMPFILE
+
Normal이 수행되지 못할 때(Tablespace의 Data file 이상) 사용하는 방법
  SIZE 100G AUTOEXTEND ON NEXT 100M MAXSIZE 300G
+
 
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
+
3) Immediate Mode
</source>
+
 
 +
- 반드시 Archive Log Mode일 경우에만 사용.
 +
- Data file에 장애가 나서 데이터를 내려쓰지 못하는 상황에서 TABLESPACE 를 offline해야 할 경우 사용
  
==TEMP TABLESPACE 변경==
+
==== TABLESPACE 이동하기 ====
<source lang="sql">
 
ALTER TABLESPACE TEMP 
 
      AUTOEXTEND ON
 
            NEXT 100M 
 
        MAXSIZE 500G;
 
</source>
 
----
 
== 템프 테이블스페이스 조회 ==
 
<source lang="sql">
 
SELECT *
 
  FROM  dba_temp_free_space;
 
</source>
 
  
== 템프 테이블 스페이스 정보 ==
+
1) Offline되는 Tablespace의 Data file 이동하기
<source lang="sql">
+
# 해당 Tablespace Offline 하기
  SELECT d.TABLESPACE_NAME
+
#* <SOURCE LANG=SQL>ALTER TABLESPACE TS_TEST OFFLINE;</SOURCE>
      , d.FILE_NAME
+
# Data file을 대상 위치로 복사
      , d.BYTES / 1024 / 1024                            SIZE_MB
+
# Control file 내의 해당 Data file 위치 변경
      , d.AUTOEXTENSIBLE
+
# 해당 Tablespace Online
      , d.MAXBYTES / 1024 / 1024                          MAXSIZE_MB
+
#* <SOURCE LANG=SQL>ALTER TABLESPACE TS_TEST ONLINE;</SOURCE>
      , d.INCREMENT_BY * (v.BLOCK_SIZE / 1024) / 1024    INCREMENT_BY_MB
 
    FROM dba_temp_files d, v$tempfile v
 
  WHERE d.FILE_ID = v.FILE#
 
ORDER BY d.TABLESPACE_NAME, d.FILE_NAME
 
</source>
 
  
== 템프테이블 스페이스 사이즈 추가 ==
+
2) Offline 안 되는 TABLESPACE 의 Data file 이동하기
<source lang="sql">
+
# DB 종료
ALTER TABLESPACE TEMP ADD TEMPFILE '+DATA' SIZE 10G AUTOEXTEND ON NEXT 100M MAXSIZE 32767M;
+
# Mount 상태로 시작
</source>
+
# Data file 복사
 +
# Control file의 내용 변경
 +
# DB Open
  
 
----
 
----
==TEMP TABLESPACE 생성==
 
 
*. RENAME 이 불가능하다. 신규생성만 가능함.
 
  
 +
== LOB포함된 TABLESPACE 용량 축소/REORG ==
 +
{{틀:고지상자
 +
|제목 = 테이블스페이스 사이즈 축소 작업 순서
 +
|내용 =# T/S 사용중인 테이블/인덱스/LOB 조회
 +
# 테이블 T/S 이동
 +
# 인덱스 T/S 이동(INDEX REBUILD)
 +
# LOB T/S 이동
 +
}}
 +
=== 해당 테이블스페이스를 사용중인 테이블/인덱스/LOB 조회 ===
 
<source lang=sql>
 
<source lang=sql>
CREATE TEMPORARY TABLESPACE [테이블 스페이스명]
+
SELECT *
TEMPFILE 'C:\경로\TEST_TEMP.DBF'
+
   FROM DBA_SEGMENTS
SIZE 10M
+
WHERE TABLESPACE_NAME ='TS_TEST_D01'; 
EXTENT MANAGEMENT LOCAL
 
UNIFORM SIZE 512K
 
   ==> LOCALY MANAGED TABLESPACE NUIFORM SIZE만 생성가능하다.
 
      (주의)AUTOALLOCATE, EXTENT MANAGEMENT DICIONARY OPTION을 사용하면 ORA-25319 ERROR 발생한다.
 
  ==> RENAME 이 불가능하다.
 
</source>
 
===TEMP TABLESPACE를 DEFAULT TABLESPACE로 변경===
 
<source lang="sql">
 
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE [테이블 스페이스명]
 
 
</source>
 
</source>
  
=== TEMP TABLESPACE 삭제  ===
+
=== 테이블에서 사용중인 테이블스페이스 신규테이블스페이스로 이동 ===
<source lang="sql">
+
<source lang=sql>
DROP TABLESPACE TEMP2;
+
SELECT OWNER
 +
    , TABLE_NAME
 +
    , TABLESPACE_NAME
 +
    , 'ALTER TABLE '||OWNER||'.'||TABLE_NAME||' MOVE TABLESPACE TS_TEST_D11;'                    -- 임시로 생성된 T/S로 이동
 +
    , 'ALTER TABLE '||OWNER||'.'||TABLE_NAME||' MOVE TABLESPACE '||TABLESPACE_NAME||';' MV_TS    -- 다시 원래 테이블스페이스로 이동
 +
  FROM DBA_TABLES
 +
WHERE TABLESPACE_NAME ='TS_TEST_D01';  -- TS_TEST_D01을 사용하는 테이블
 
</source>
 
</source>
  
==UNDO TABLESPACE 생성==
+
=== 인덱스 T/S 이동(INDEX REBUILD) ===
<source lang="sql">
+
<source lang=sql>
CREATE UNDO TABLESPACE [테이블 스페이스명] ==> 이부분만 다름.
+
SELECT OWNER
DATAFILE 'C:\경로\TEST_UNDO.DBF'
+
    , TABLE_NAME
SIZE 10M
+
    , INDEX_NAME   
AUTOEXTEND ON NEXT 10M
+
    , TABLESPACE_NAME
MAXSIZE 100M
+
    , 'ALTER INDEX  '||OWNER||'.'||INDEX_NAME||' REBUILD TABLESPACE TS_TEST_I11;'   RBD_TS
   ==> UNDO_MANAGEMENT와 UNDO_TABLESPACE, UNDO_RETENTION PARAMETER를 제공
+
   FROM DBA_INDEXES
   ==> 지역적으로 관리되는 익스텐트만 사용가능
+
WHERE TABLESPACE_NAME ='TS_TEST_I01'; -- TS_TEST_I01을 사용하는 인덱스
  ==> 시스템에 의해 관리되는 익스텐트 할당만 사용가능하다.
 
        (UNIFORMSIZE를 할당 할 수 없고 AUTOALLOCATE만 가능)
 
 
</source>
 
</source>
 
+
=== LOB T/S 이동 ===
== 템프테이블 사용율 조회 쿼리 ==
+
-- LOB 테이블 이동하기
 
+
<source lang=sql>  
<source lang="sql">
+
select owner,table_name
 
+
    , 'alter table '||owner||'.'||table_name||' move lob('||col||') store as (tablespace TS_TEST_D01);' mv_lob_ts
/* TEMP 사용 쿼리 확인 */
+
  from (
 
+
select a.owner,a.table_name
select a.username, a.sid, a.serial#, b.blocks, a.program, a.module, a.action, a.machine, a.status, a.event, d.sql_Text ,
+
      , listagg(a.column_name,',') within group (order by 1) col
      b.blocks*8192/1024/1024 mb
+
  from dba_lobs a where table_name in
from v$session a,
+
                                      (
      v$sort_usage b,
+
                                      SELECT DISTINCT TABLE_NAME
      v$process c,
+
                                        FROM DBA_TAB_COLUMNS
      v$sqlarea d
+
                                        WHERE OWNER = 'TEST'
where  a.saddr = b.session_addr
+
                                          AND DATA_TYPE LIKE '%LOB'
and a.paddr = c.addr
+
                                      )
and a.sql_hash_value= d.hash_value
+
group by  a.owner,a.table_name                     
and b.tablespace like 'TEMP%'
+
)
--and a.username ='MIG_ADM'
+
--order by 1,2                       
ORDER BY A.MACHINE, SQL_TEXT
+
;
 
</source>
 
</source>
  
== 템프러리 테이블스페이스 sort 사용 현황
+
=== 원래 T/S명으로 변경 ===
<source lang="sql">
+
<source lang=sql>  
SELECT
+
ALTER TABLESPACE [asis-TABLE] RENAME TO [tobe-TABLE]
  A.tablespace_name tablespace,
 
  D.mb_total,
 
  SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_used,
 
  D.mb_total - SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_free
 
FROM
 
  v$sort_segment A,
 
(
 
SELECT
 
  B.name,
 
  C.block_size,
 
  SUM (C.bytes) / 1024 / 1024 mb_total
 
FROM
 
  v$tablespace B,
 
  v$tempfile C
 
WHERE
 
  B.ts#= C.ts#
 
GROUP BY
 
  B.name,
 
  C.block_size
 
) D
 
WHERE
 
  A.tablespace_name = D.name
 
GROUP by
 
  A.tablespace_name,
 
  D.mb_total
 
 
</source>
 
</source>
 +
[[Category:oracle]]

2024년 4월 22일 (월) 23:59 기준 최신판

thumb_up 추천메뉴 바로가기


목차

1 테이블 스페이스 (TABLESPACE)[편집]

1.1 TABLESPACE 목록 조회[편집]

SELECT A.TABLESPACE_NAME
     , FILE_NAME
     , BYTES / 1024 / 1024
     , MAXBYTES / 1024 / 1024
     , AUTOEXTENSIBLE
     , B.BLOCK_SIZE
     , INCREMENT_BY * B.BLOCK_SIZE / 1024 / 1024
  FROM DBA_DATA_FILES A
     , DBA_TABLESPACES B
 WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME
ORDER BY B.BLOCK_SIZE, A.TABLESPACE_NAME, A.FILE_ID;

1.2 TABLESPACE 종류[편집]

1) SYSTEM TABLESPACE

- 데이터 딕셔너리 정보들이 저장되어 있음, 이 TABLESPACE 가 손상될 경우 Oracle 서버가 시작이 안됨
- SYS계정 소유이지만 조회만 가능
- 딕셔너리 주요 정보
  • 데이터베이스의 논리적인 구조와 물리적인 구조 정보들
  • 객체의 정의와 공간 사용 정보들
  • 제약조건에 관련된 정보들
  • 사용자에 관련된 정보들
  • Role, Privilege 등에 관련된 정보들
  • 감사 및 보안등에 관련된 정보들

2) SYSAUX TABLESPACE

: 10g ~ , Oracle 서버의 성능 튜닝을 위한 데이터 저장

3) 데이터 TABLESPACE

: 가장 일반적으로 많이 사용되는 TABLESPACE 로 DBA가 필요에 의해 만드는 TABLESPACE .
DBA에 의해 생성,삭제.



1.3 현재 유저의 DEFAULT TABLESPACE 확인[편집]

SELECT * FROM USER_USERS ;-- DEFAUT TABLESPACE로 설정된 부분을 확인

1.3.1 유저의 DEFAULT TABLESPACE 변경[편집]

ALTER USER [유저명] DEFAULT TABLESPACE [테이블 스페이스명]

1.4 TABLESPACE 생성 구문[편집]

create_tablespace.gif permanent_tablespace_clause.gif

CREATE [BIGFILE/SMALLFILE] TABLESPACE TABLESPACE명
DATAFILE '파일경로1' SIZE integer [M/K], '파일경로2' SIZE integer [M/K]
[ MINIMUM EXTENT integer [M/K]]
[ BLOCKSIZE integer [K]] 
[ DEFAULT STORAGE (
  INITIAL integer [M/K]
  NEXT integer [M/K]
  MAXEXTENTS integer
  MINEXTENTS integer
  PCTINCREASE integer)]
[ ONLINE | OFFLINE ]
[ PERMANENT | TEMPORARY ]
[ EXTENT MANAGEMENT [ DICTIONARY | LOCAL
[ AUTOALLOCATE | UNIFORM [ SIZE integer [M/K]]]]]
[ SEGMENT SPACE MANAGEMENT [ MANUAL | AUTO]]
;

-- AUTOEXTEND ON NEXT 10M ==> (옵션)데이타 파일 용량초과시 자동증가설정
-- MAXSIZE 100M ==> (옵션)데이타파일 최대크기지정
-- EXTENT MANAGEMENT LOCAL ==> (옵션)
-- UNIFORM SIZE 1M ==> (옵션)
-- DEFAULT STORAGE(
:   INITIAL 80K  ==> 테이블 스페이스의 맨 첫번째 EXTENTS의 크기
:   NEXT 80K  ==> 다음 EXTENTS의 크기
:   MINNEXTENTS 1  ==> 생성할 EXTENTS의 최소값
:   MAXNEXTENTS 121  ==> 생성할 EXTENTS의 최대값
:   PCTINCREASE 80  ==> EXTENTS의 증가율,(DEFAULT값은 50%)
:   )

1.4.1 BIGFILE 테이블스페이스[편집]

  1. 8K 블록 - bigfile 테이블 스페이스에는 최대 32TB
  2. 32K 블록 - bigfile 파일 테이블 스페이스에는 최대 128TB
1.4.1.1 BIGFILE 테이블스페이스 장점[편집]
1.4.1.2 자동 수행 뷰 목록[편집]

android 장점

  1. CREATE DATABASE 및 CREATE CONTROLFILE 문의 DB_FILES 초기화 매개 변수와 MAXDATAFILES 매개 변수를 조정하여 데이터 파일 정보에 필요한 SGA 공간의 양과 제어 파일의 크기를 줄일 수 있다.
  2. Bigfile 테이블 스페이스는 데이터 파일 투명성을 제공하여 데이터베이스 관리를 단순화합니다.
  3. ALTER TABLESPACE 문의 SQL 구문을 사용하면 기본 개별 데이터 파일이 아닌 테이블 스페이스에서 작업을 수행 할 수 있다.
  4. 빅파일 테이블 스페이스는 자동 세그먼트 공간 관리가있는 로컬 관리 테이블 스페이스에 대해서만 가능함. (언두,템프,시스템 테이블스페이스는 지원 안함)


1.4.1.3 BIGFILE 테이블스페이스 단점[편집]

android BIGFILE 테이블스페이스 단점

  1. 병렬 쿼리 실행 및 RMAN 백업 병렬화에 부정적인 영향을 미치므로 스트라이핑을 지원하지 않는 시스템에서 빅 파일 테이블 스페이스를 생성하지 마십시오.
  2. 큰 파일 크기를 지원하지 않는 OS 플랫폼에서 bigfile 테이블 스페이스를 사용하는 것은 권장되지 않으며 테이블 스페이스 용량을 제한 할 수 있습니다.
  3. Bigfile 테이블 스페이스는 ASM (Automatic Storage Management) 또는 스트라이핑 또는 RAID를 지원하는 기타 논리 볼륨 관리자 및 동적으로 확장 가능한 논리 볼륨과 함께 사용하기위한 것입니다.


1.5 UNDO TABLESPACE 생성[편집]

CREATE UNDO TABLESPACE [테이블 스페이스명] ==> 이부분만 다름.
              DATAFILE '\경로\TEST_UNDO.DBF'
                  SIZE 10M
            AUTOEXTEND ON NEXT 10M
               MAXSIZE 100M
-- UNDO_MANAGEMENT와 UNDO_TABLESPACE, UNDO_RETENTION PARAMETER를 제공
-- 지역적으로 관리되는 익스텐트만 사용가능
-- 시스템에 의해 관리되는 익스텐트 할당만 사용가능하다.
--        (UNIFORMSIZE를 할당 할 수 없고 AUTOALLOCATE만 가능)

1.6 TABLESPACE 변경[편집]

1.6.1 TABLESPACE 읽기/쓰기 모드 변경[편집]

  • 읽기 전용 모드
alter tablespace <TABLESPACE명> read only;
  • 읽기 쓰기 모드
alter tablespace <TABLESPACE명> read ,write;

1.6.2 OPEN 상태에서 DATAFILE 이동[편집]

alter tablespace TABLESPACE명 offline;
1.6.2.1 offline 된 T/S에 대해 복사/이동[편집]
cp /data1/xxx.dbf /data2/xxx.dbf
or 
mv /data1/xxx.dbf /data2/xxx.dbf
1.6.2.2 OFFLINE 상태에서 DATAFILE 이동[편집]
alter tablespace TABLESPACE명 rename datafile '파일경로1/xxx.dbf' to '파일경로2/xxx.dbf';
alter tablespace TABLESPACE명 online;

1.6.3 MOUNT 상태에서 DATAFILE 이동[편집]

startup mount;
1.6.3.1 해당 T/S에 대해 복사/이동 후[편집]
alter database rename file '파일경로' to '파일경로';
alter database open;
  1. 모든 데이타 파일은 mount상태에서 복사/이동 가능
  2. system 파일은 mount상태에서만 복사/이동 가능

1.7 테이블의 TABLESPACE MOVE[편집]

ALTER TABLE [테이블명] 
       MOVE TABLESPACE [테이블 스페이스명]
-테이블스페이스 이동시 인덱스 리빌드 필요
ALTER INDEX [인덱스명] REBUILD ;
  • 인덱스 리빌드 동시 수행 시
ALTER TABLE [테이블명] 
       MOVE TABLESPACE [테이블 스페이스명]
       UPDATE INDEXES;

1.7.1 파티션닝 테이블 TABLESPACE MOVE[편집]

ALTER TABLE [테이블명] 
       MOVE PARTITION [파티션명] TABLESPACE [테이블 스페이스명]
  • 파티셔닝 테이블 인덱스 REBUILD
ALTER INDEX [인덱스명] 
       REBUILD PARTITION [파티션명]

1.8 운영중인 테이블 TABLESPACE ONLINE MOVE[편집]

ALTER TABLE [테이블명] 
       MOVE TABLESPACE [테이블 스페이스명]
     ONLINE -- online 옵션
;


  • 인덱스 리빌드 동시 수행 시
ALTER TABLE [테이블명] 
       MOVE TABLESPACE [테이블 스페이스명]
       UPDATE INDEXES
     ONLINE -- online 옵션
;

1.8.1 운영중인 파티션닝 테이블 TABLESPACE ONLINE MOVE[편집]

ALTER TABLE [테이블명] 
       MOVE PARTITION [파티션명] TABLESPACE [테이블 스페이스명]
     ONLINE


assignment 온라인 Move 작업시 장단점
  1. Move 작업 중 다른 세션의 DML 작업이 가능함
  2. 파티션의 로컬인덱스는 USABLE 상태로 바로 사용가능함(unusable 되지 않음)
  3. 도메인 인덱스가 포함된 테이블은 사용불가
  4. 온라인 Move 작업시 parallel DML , Direct Path Insert 가 안됨(즉,성능은 좋지않다)


1.9 TABLESPACE 사이즈 변경(RESIZE)[편집]

ALTER TABLESPACE ts_txxxx 
          RESIZE 500G;

1.10 TABLESPACE 이름 변경[편집]

ALTER TABLESPACE [asis-TABLE] RENAME TO [tobe-TABLE]

1.11 인덱스의 TABLESPACE 변경[편집]

ALTER INDEX 인덱스명 REBUILD TABLESPACE [테이블 스페이스명]
[ PARALLEL parallel_num ]
[ LOGGING or NOLOGGING ]
;

1.12 인덱스의 TABLESPACE 변경 스크립트[편집]

SELECT 'ALTER INDEX '||index_name||' REBUILD TABLESPACE TS_OO_'||substr(a.index_name,4,2)||'_I;' 
  FROM  user_indexes a
 WHERE a.index_name NOT IN (SELECT index_name from user_part_indexes)
   AND substr(a.index_name,4,2) IN (SELECT SUBJECT_CD FROM TB_DBA_SUBJECT_CD);

1.13 인덱스/테이블 TABLESPACE 변경 스크립트[편집]

SELECT DECODE (segment_type, 'TABLE', segment_name, table_name)  order_col1
       , DECODE (segment_type, 'TABLE', 1, 2)   order_col2
       , 'alter '
         || segment_type
         || ' '
         || segment_name
         || DECODE (segment_type, 'TABLE', ' MOVE ', ' REBUILD ')
         || CHR (10)
         || ' TS_오너_01 '
         || CHR (10)
         || ' storage ( initial '
         || initial_extent
         || ' next '
         || next_extent
         || CHR (10)
         || ' minextents '
         || min_extents
         || ' maxextents '
         || max_extents
         || CHR (10)
         || ' pctincrease '
         || pct_increase
         || ' freelists '
         || freelists
         || ');'
    FROM user_segments, (SELECT table_name, index_name FROM user_indexes)
   WHERE segment_type IN ('TABLE', 'INDEX') AND segment_name = index_name(+)
ORDER BY 1, 2;


1.14 TABLESPACE 자동증가/최대 사이즈 변경[편집]

ALTER TABLESPACE ts_txxxx
      AUTOEXTEND ON 
            NEXT 100M  
         MAXSIZE 500G;-- 최대사이즈 , UNLIMITED => 무제한 증가


  • 최대 TABLESPACE 사이즈 변경
ALTER TABLESPACE [테이블 스페이스명] 
             ADD DATAFILE 'C:\경로\TEST2.DBF' SIZE 10M
      AUTOEXTEND ON NEXT 100M 
         MAXSIZE 100G;

  ==> 10M씩 자동증가

1.15 데이터파일 사이즈 변경[편집]

ALTER DATABASE DATAFILE 'C:\경로\TEST1.DBF' 
        RESIZE 10M;

1.16 데이터파일 추가[편집]

ALTER TABLESPACE [테이블 스페이스명] 
             ADD DATAFILE 'C:\경로\TEST2.DBF' SIZE 10M;

1.17 데이터/템프파일 삭제[편집]

ALTER TABLESPACE [테이블 스페이스명] 
             DROP DATAFILE 'data파일';
-- 템프TS    DROP TEMPFILE 'data파일';

1.18 데이터 파일 삭제 후 OS 디스크 사이즈가 줄지 않을경우[편집]

 attach_file 1) 테이블스페이스 사이즈를 줄인 (shrink) 후 데이터파일 삭제

     2) DB 리부팅 하면 공간 확보 됨(DBWR 이 데이터파일을 사용중이기 때문에 공간이 줄지 않음)


1.19 TABLESPACE 삭제[편집]

1.19.1 TABLESPACE에 포함된 모든 세그먼트 삭제[편집]

DROP TABLESPACE [테이블 스페이스명] 
      INCLUDING CONTENTS;-- TABLESPACE의 모든 세그먼트를 삭제한다.
                         -- 단, 데이타가 있는 TABLESPACE는 삭제할수 없다.

1.19.2 TABLESPACE에 포함된 테이블의 참조/제약 조건 삭제[편집]

DROP TABLESPACE [테이블 스페이스명] 
        CASCADE CONSTRAINTS; -- 삭제된 TABLESPACE 내의 테이블의 기본키와 유일키를 참조하는
                             -- 다른 TABLESPACE의 테이블로부터 참조무결성 제약 조건을 삭제한다.

1.19.3 TABLESPACE의 데이터파일 삭제[편집]

DROP TABLESPACE [테이블 스페이스명] 
      INCLUDING CONTENTS AND DATAFILES; -- 물리적파일까지 삭제한다.


1.20 TABLESPACE 수정이나 삭제시 ONLINE/OFFLINE 설정[편집]

ALTER TABLESPACE [테이블 스페이스명] ONLINE
ALTER TABLESPACE [테이블 스페이스명] OFFLINE

1.21 템프 TABLESPACE[편집]

1.21.1 TEMPORARY TABLESPACE 정보[편집]

SELECT d.TABLESPACE_NAME
       , d.FILE_NAME
       , d.BYTES / 1024 / 1024                             SIZE_MB
       , d.AUTOEXTENSIBLE
       , d.MAXBYTES / 1024 / 1024                          MAXSIZE_MB
       , d.INCREMENT_BY * (v.BLOCK_SIZE / 1024) / 1024     INCREMENT_BY_MB
    FROM dba_temp_files d, v$tempfile v
   WHERE d.FILE_ID = v.FILE#
ORDER BY d.TABLESPACE_NAME, d.FILE_NAME
1.21.1.1 템프테이블 사이즈 조정[편집]
ALTER DATABASE TEMPFILE 'D:\APP\ORADATA\ORCL\TEMP01.DBF'
RESIZE 304M;

1.21.2 TEMPORARY TABLESPACE 생성[편집]

  • . 신규생성만 가능.
: 사용중인 TEMP TABLESPACE 는 삭제가 안되므로 신규로 템프 TABLESPACE를 생성 
CREATE TEMPORARY TABLESPACE [테이블 스페이스명]
        TEMPFILE '\경로\TEST_TEMP.DBF'
            SIZE 10M
      AUTOEXTEND ON 
            NEXT 100M 
         MAXSIZE 300G
          EXTENT MANAGEMENT LOCAL
         UNIFORM SIZE 512K -- LOCALY MANAGED TABLESPACE NUIFORM SIZE만 생성가능하다.
                           -- (주의)AUTOALLOCATE, EXTENT MANAGEMENT DICIONARY OPTION을 사용하면 ORA-25319 ERROR 발생한다.
                           --  RENAME 이 불가능하다.

1.21.3 TEMPORARY TABLESPACE를 DEFAULT TABLESPACE로 변경[편집]

ALTER DATABASE DEFAULT TEMPORARY TABLESPACE [테이블 스페이스명];

1.21.4 TEMPORARY TABLESPACE 사이즈 증가[편집]

ALTER TABLESPACE TEMP  
      AUTOEXTEND ON 
            NEXT 100M  
         MAXSIZE 500G;

1.21.5 TEMPORARY TABLESPACE 사이즈 추가[편집]

ALTER TABLESPACE TEMP 
             ADD TEMPFILE '+DATA' SIZE 10G 
      AUTOEXTEND ON 
            NEXT 100M 
         MAXSIZE 32767M;

1.21.6 TEMPORARY TABLESPACE 삭제[편집]

DROP TABLESPACE TEMP2;

1.21.7 TEMPORARY TABLESPACE DATA FILE 삭제[편집]

ALTER TABLESPACE TEMP DROP TEMPFILE '+DATA/temp.368.1013282149';

- +DATA/temp.368.1013282149 은 ASM 사용시

1.21.8 TEMPORARY TABLESPACE 사용율 조회 쿼리[편집]

/* TEMP 사용 쿼리 확인 */

select a.username, a.sid, a.serial#, b.blocks, a.program, a.module, a.action, a.machine, a.status, a.event, d.sql_Text ,
      b.blocks*8192/1024/1024 mb
 from v$session a,
      v$sort_usage b,
      v$process c,
      v$sqlarea d
where  a.saddr = b.session_addr
and a.paddr = c.addr
and a.sql_hash_value= d.hash_value
and b.tablespace like 'TEMP%'
--and a.username ='MIG_ADM'
ORDER BY A.MACHINE, SQL_TEXT

1.21.9 템프테이블 TABLESPACE sort 사용 현황[편집]

SELECT 
   A.tablespace_name tablespace, 
   D.mb_total,
   SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_used,
   D.mb_total - SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_free
FROM 
   v$sort_segment A,
(
SELECT 
   B.name, 
   C.block_size, 
   SUM (C.bytes) / 1024 / 1024 mb_total
FROM 
   v$tablespace B, 
   v$tempfile C
WHERE 
   B.ts#= C.ts#
GROUP BY 
   B.name, 
   C.block_size
) D
WHERE 
   A.tablespace_name = D.name
GROUP by 
   A.tablespace_name, 
   D.mb_total

2 TABLESPACE 오브젝트별 정보[편집]

2.1 TABLESPACE/파일 확인(딕셔너리)[편집]

SELECT * FROM DBA_DATA_FILES ; 
SELECT * FROM DBA_TABLESPACES ;
SELECT * FROM DBA_SEGMENTS;

2.2 TABLESPACE별 정보[편집]

SELECT A.TABLESPACE_NAME AS "TABLESPACE"
     , A.INITIAL_EXTENT / 1024 AS "INIT(K)"
     , A.NEXT_EXTENT / 1024 AS "NEXT(K)"
     , A.MIN_EXTENTS AS "MIN"
     , A.MAX_EXTENTS AS "MAX"
     , A.PCT_INCREASE AS "PCT_INC(%)"
     , B.FILE_NAME AS "FILE_NAME"
     , B.BLOCKS * C.VALUE / 1024 / 1024 AS "SIZE(M)"
     , B.STATUS AS "STATUS"
  FROM DBA_TABLESPACES A
     ,  DBA_DATA_FILES B
     ,  V$PARAMETER C
 WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME 
   AND C.NAME = 'db_block_size' 
 ORDER BY 1, 2;

2.3 TABLESPACE별 파일 목록[편집]

SELECT SUBSTRB(TABLESPACE_NAME, 1, 10) AS "TABLESPACE"
     , SUBSTRB(FILE_NAME, 1, 50) AS "파일명"
     , TO_CHAR(BLOCKS, '999,999,990') AS "블럭수"
     , TO_CHAR(BYTES, '99,999,999') AS "크기"
  FROM DBA_DATA_FILES ORDER BY TABLESPACE_NAME, FILE_NAME;

2.4 TABLESPACE 사이즈 정보[편집]

2.4.1 TABLESPACE별 전체 오브젝트(테이블/인덱스/LOB) 사이즈[편집]

-- OBJECT별 테이블 사이즈 (UNDO,TEMP T/S 제외)

-- SELECT TABLESPACE_NAME
--      , SUM(SIZE_MB)
--   FROM (     
SELECT  A.TABLESPACE_NAME
      , A.SEGMENT_NAME
      , A.SEGMENT_TYPE      
      , ROUND(SUM(A.BYTES)/1024/1024) "SIZE_MB"      
  FROM DBA_SEGMENTS A
     , DBA_TABLES B
 WHERE A.SEGMENT_NAME = B.TABLE_NAME
   AND A.SEGMENT_TYPE IN ('TABLE','TABLE PARTITION')
--     AND A.OWNER = '유저아이디'
 GROUP BY A.TABLESPACE_NAME
        , A.SEGMENT_NAME
        , A.SEGMENT_TYPE
UNION ALL

-- INDEX SIZE
SELECT  A.TABLESPACE_NAME
      , A.SEGMENT_NAME
      , A.SEGMENT_TYPE
      , ROUND(SUM(A.BYTES)/1024/1024) "SIZE_MB"
  FROM DBA_SEGMENTS A
     , DBA_INDEXES B
 WHERE A.SEGMENT_NAME = B.INDEX_NAME   
   AND A.SEGMENT_TYPE IN ('INDEX','INDEX PARTITION')                    
--     AND A.OWNER = '유저아이디'
 GROUP BY A.TABLESPACE_NAME
        , A.SEGMENT_NAME
        , A.SEGMENT_TYPE
-- ORDER BY 2 DESC;
UNION ALL 
-- LOB  
SELECT  A.TABLESPACE_NAME
      , A.SEGMENT_NAME
      , A.SEGMENT_TYPE
      , ROUND(SUM(A.BYTES)/1024/1024) "SIZE_MB"
   FROM DBA_SEGMENTS A
      , DBA_LOBS B
  WHERE A.segment_name = B.segment_name  
    AND A.SEGMENT_TYPE LIKE 'LOB%'      
 GROUP BY A.TABLESPACE_NAME
        , A.SEGMENT_NAME
        , A.SEGMENT_TYPE        

 ORDER BY SEGMENT_TYPE,TABLESPACE_NAME DESC   
-- )
--  GROUP BY TABLESPACE_NAME 
;

2.4.2 TABLESPACE별 사이즈[편집]

SELECT  Substr(df.tablespace_name,1,20) "Tablespace Name",
        Substr(df.file_name,1,80) "File Name",
        Round(df.bytes/1024/1024,0) "Size (M)",
        decode(e.used_bytes,NULL,0,Round(e.used_bytes/1024/1024,0)) "Used (M)",
        decode(f.free_bytes,NULL,0,Round(f.free_bytes/1024/1024,0)) "Free (M)",
        decode(e.used_bytes,NULL,0,Round((e.used_bytes/df.bytes)*100,0)) "% Used"
FROM    DBA_DATA_FILES DF,
       (SELECT file_id,
               sum(bytes) used_bytes
        FROM dba_extents
        GROUP by file_id) E,
       (SELECT sum(bytes) free_bytes,
               file_id
        FROM dba_free_space
        GROUP BY file_id) f
WHERE    e.file_id (+) = df.file_id
AND      df.file_id  = f.file_id (+)
ORDER BY df.tablespace_name,
         df.file_name

2.4.3 테이블 TABLESPACE 사이즈[편집]

-- 테이블 사이즈  
SELECT A.SEGMENT_NAME
      , A.SEGMENT_TYPE      
      , ROUND(SUM(A.BYTES)/1024/1024/1024) "SIZE_GB"      
  FROM DBA_SEGMENTS A
     , DBA_TABLES B
 WHERE A.SEGMENT_NAME = B.TABLE_NAME
   AND A.SEGMENT_TYPE IN ('TABLE','TABLE PARTITION')
--     AND A.OWNER = '유저아이디'
 GROUP BY A.SEGMENT_NAME
        , A.SEGMENT_TYPE

2.4.4 인덱스 TABLESPACE 사이즈[편집]

-- INDEX SIZE

SELECT A.SEGMENT_NAME
      , A.SEGMENT_TYPE
      , ROUND(SUM(A.BYTES)/1024/1024/1024) "SIZE_GB"
  FROM DBA_SEGMENTS A
     , DBA_INDEXES B
 WHERE A.SEGMENT_NAME = B.INDEX_NAME   
   AND A.SEGMENT_TYPE IN ('INDEX','INDEX PARTITION')                    
--     AND A.OWNER = '유저아이디'
 GROUP BY A.SEGMENT_NAME
        , A.SEGMENT_TYPE
 ORDER BY 2 DESC;

2.4.5 LOB TABLESPACE 사이즈[편집]

-- LOB 사이즈

SELECT TABLE_NAME
      , sum(bytes)
   FROM (SELECT B.table_name AS table_name
              , A.bytes
           FROM DBA_SEGMENTS A
              , DBA_LOBS B
          WHERE A.segment_name = B.segment_name                          
          )
group by table_name;

2.4.6 데이터파일 별 테이블스페이스 사이즈 조회[편집]

SELECT    A.TABLESPACE_NAME "테이블스페이스명",
          A.FILE_NAME "파일경로",
           (A.BYTES - B.FREE)    "사용공간",
            B.FREE                 "여유 공간",
            A.BYTES                "총크기",
            TO_CHAR( (B.FREE / A.BYTES * 100) , '999.99')||'%' "여유공간"
      FROM
       (
         SELECT FILE_ID,
                TABLESPACE_NAME,
                FILE_NAME,
                SUBSTR(FILE_NAME,1,200) FILE_NM,
                SUM(BYTES) BYTES
           FROM DBA_DATA_FILES
         GROUP BY FILE_ID,TABLESPACE_NAME,FILE_NAME,SUBSTR(FILE_NAME,1,200)
       ) A,
       (
         SELECT TABLESPACE_NAME,
                FILE_ID,
                SUM(NVL(BYTES,0)) FREE
           FROM DBA_FREE_SPACE
        GROUP BY TABLESPACE_NAME,FILE_ID
       ) B
      WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME
         AND A.FILE_ID = B.FILE_ID;


2.4.7 TABLESPACE별 사용하는 파일의 크기 합[편집]

SELECT SUBSTRB(TABLESPACE_NAME, 1, 10) AS TABLESPACE
     , TO_CHAR(SUM(BYTES), '9,999,999,999,990') AS BYTES
     , TO_CHAR(SUM(BLOCKS), '9,999,999,990') AS BLOCKS
  FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME 
UNION ALL 
SELECT '총계', TO_CHAR(SUM(BYTES), '9,999,999,999,990') AS BYTES, TO_CHAR(SUM(BLOCKS), '9,999,999,990') AS BLOCKS 
  FROM DBA_DATA_FILES;

2.4.8 TABLESPACE별 디스크 사용량[편집]

SELECT A.TABLESPACE_NAME AS "TABLESPACE"
     , A.INIT AS "INIT(K)"
     , A.NEXT AS "NEXT(K)"
     , A.MIN AS "MIN"
     , A.MAX AS "MAX"
     , A.PCT_INC AS "PCT_INC(%)"
     , TO_CHAR(B.TOTAL, '999,999,999,990') AS "총량(바이트)"
     , TO_CHAR(C.FREE, '999,999,999,990') AS "남은량(바이트)"
     , TO_CHAR(B.BLOCKS, '9,999,990') AS "총블럭"
     , TO_CHAR(D.BLOCKS, '9,999,990') AS "사용블럭"
     , TO_CHAR(100 * NVL(D.BLOCKS, 0) / B.BLOCKS, '999.99') AS "사용율%"
  FROM (SELECT TABLESPACE_NAME
                , INITIAL_EXTENT / 1024 AS INIT
                , NEXT_EXTENT / 1024 AS NEXT
                , MIN_EXTENTS AS MIN
                , MAX_EXTENTS AS MAX
                , PCT_INCREASE AS PCT_INC
           FROM      DBA_TABLESPACES) A
     , (SELECT    TABLESPACE_NAME, SUM(BYTES) AS TOTAL, SUM(BLOCKS) AS BLOCKS
           FROM      DBA_DATA_FILES
           GROUP BY  TABLESPACE_NAME) B
     , (SELECT    TABLESPACE_NAME, SUM(BYTES) AS FREE
           FROM      DBA_FREE_SPACE
           GROUP BY  TABLESPACE_NAME) C
     , (SELECT    TABLESPACE_NAME, SUM(BLOCKS) AS BLOCKS
           FROM      DBA_EXTENTS
           GROUP BY  TABLESPACE_NAME) D
 WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME(+) 
   AND A.TABLESPACE_NAME = C.TABLESPACE_NAME(+) 
   AND A.TABLESPACE_NAME = D.TABLESPACE_NAME(+) 
 ORDER BY A.TABLESPACE_NAME;

2.4.9 공간의 90% 이상을 사용하고 있는 TABLESPACE[편집]

SELECT X.TABLESPACE_NAME
     , TOTAL_SIZE / 1024 / 1024 TOTAL_SIZE
     , USED_SIZE / 1024 / 1024 USED_SIZE
     , (ROUND(USED_SIZE / TOTAL_SIZE, 2)) * 100 USED_RATIO
  FROM (SELECT TABLESPACE_NAME, SUM(BYTES) TOTAL_SIZE
           FROM      DBA_DATA_FILES
           GROUP BY  TABLESPACE_NAME) X
     , (SELECT    TABLESPACE_NAME, SUM(BYTES) USED_SIZE
           FROM      DBA_EXTENTS
           GROUP BY  TABLESPACE_NAME) Y
 WHERE X.TABLESPACE_NAME = Y.TABLESPACE_NAME(+) AND Y.USED_SIZE > .9 * X.TOTAL_SIZE;

2.5 TABLESPACE에 포함된 테이블 명 보기[편집]

SELECT TABLESPACE_NAME
     , TABLE_NAME 
  FROM DBA_TABLES 
 WHERE TABLESPACE_NAME = UPPER('&TABLESPACE명') 
 ORDER BY TABLESPACE_NAME
     , TABLE_NAME;

2.6 오브젝트별 TABLESPACE 및 데이터파일[편집]

SELECT DISTINCT E.SEGMENT_NAME, E.TABLESPACE_NAME, F.FILE_NAME
  FROM DBA_EXTENTS E
     , DBA_DATA_FILES F
 WHERE E.FILE_ID = F.FILE_ID 
   AND E.SEGMENT_TYPE = 'TABLE' 
   AND E.TABLESPACE_NAME NOT IN ('SYSTEM', 'TOOLS');

2.7 TABLESPACE별 Table, Index 개수[편집]

SELECT OWNER
     , TABLESPACE_NAME
     , SUM(DECODE(SEGMENT_TYPE, 'TABLE', 1, 0))          TAB
     , SUM(DECODE(SEGMENT_TYPE, 'INDEX', 1, 0))          IDX
     , SUM(DECODE(SEGMENT_TYPE, 'LOBINDEX', 1, 0))       LOB_IDX
     , SUM(DECODE(SEGMENT_TYPE, 'LOBSEGMENT', 1, 0))     LOB_SEG
  FROM DBA_SEGMENTS 
 WHERE SEGMENT_TYPE IN ('TABLE', 'INDEX', 'LOBINDEX','LOBSEGMENT')
 GROUP BY OWNER, TABLESPACE_NAME;

2.8 파일위치별 TABLESPACE 아는 방법[편집]

SELECT SUBSTRB(A.FILE_NAME, 1, 40) AS FILE_NAME
     , A.FILE_ID
     , B.FREE_BYTES / 1024 AS FREE_BYTES
     , B.MAX_BYTES / 1024 AS MAX_BYTES
  FROM DBA_DATA_FILES A
     , (SELECT FILE_ID, SUM(BYTES) AS FREE_BYTES, MAX(BYTES) AS MAX_BYTES
          FROM DBA_FREE_SPACE
         GROUP BY  FILE_ID) B
 WHERE A.FILE_ID = B.FILE_ID 
   AND A.TABLESPACE_NAME = UPPER('&TABLESPACE명') 
 ORDER BY A.FILE_NAME;

2.9 현재 Extension 횟수가 MaxExtents의 80% 이상인 경우[편집]

SELECT TABLESPACE_NAME
     , OWNER
     , SEGMENT_NAME
     , SEGMENT_TYPE
     , EXTENTS
     , MAX_EXTENTS
  FROM SYS.DBA_SEGMENTS S 
 WHERE EXTENTS / MAX_EXTENTS > .8 AND MAX_EXTENTS > 0 
 ORDER BY TABLESPACE_NAME, OWNER, SEGMENT_NAME;

2.10 테이블의 익스텐트 정보 조회[편집]

테이블 스페이스 -> 세그먼트 -> 익스텐트 -> 블록 -> OS 범위 -> 데이터 파일 -> 운영체제 블록

   세그먼트의 이름,
   해당 세그먼트의 최대 익스텐트 개수,
   익스텐트 아이디
   해당 세그먼트의 최대 익스텐트 개수 - 최대 익스텐트 아이디     
딕셔너리 관리 TABLESPACE로 생성한 것으로 조회를 한다.


SELECT B.SEGMENT_NAME
     , B.MAX_EXTENTS
     , MAX(C.EXTENT_ID) AS EXTENT_ID
     , B.MAX_EXTENTS - MAX(C.EXTENT_ID) AS DIFF
  FROM USER_TABLESPACES A
     , USER_SEGMENTS B
     , USER_EXTENTS C
 WHERE A.EXTENT_MANAGEMENT = 'DICTIONARY' 
   AND B.TABLESPACE_NAME = A.TABLESPACE_NAME 
   AND C.SEGMENT_NAME = B.SEGMENT_NAME 
 GROUP BY B.SEGMENT_NAME, B.MAX_EXTENTS 
HAVING B.MAX_EXTENTS - MAX(C.EXTENT_ID) <= 50 
 ORDER BY B.MAX_EXTENTS - MAX(C.EXTENT_ID);

3 UNDO TABLESPACE[편집]

  • UNDO Segment를 저장하고 있는 TABLESPACE , 관리자가 생성/관리 가능
  • Instance당 여러 개가 동시에 존재할 수 있지만 사용은 한번에 1개만


- Undo Data : 사용자가 DML을 수행할 경우 발생하는 원본데이터, Oracle Server Process가 직접 관리

         ex) 홍길동→일지매로 업데이트 시 홍길동이 Undo Data
- Undo Segment : Undo Data만을 저장하는 Segment



3.1 현재 UNDO 상태 확인[편집]

SELECT A.TABLESPACE_NAME,A.STATUS, B.TOTAL_MB, A.USE_MB,
       ROUND(RATIO_TO_REPORT(A.USE_MB) OVER(PARTITION BY A.TABLESPACE_NAME) * 100)||'%' AS PCT
  FROM (SELECT TABLESPACE_NAME, STATUS,
               ROUND(SUM(BYTES/1024/1024)) USE_MB
          FROM DBA_UNDO_EXTENTS
         GROUP BY TABLESPACE_NAME,STATUS
       )A,
       (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/1024/1024) TOTAL_MB
          FROM DBA_DATA_FILES
         WHERE TABLESPACE_NAME LIKE 'UNDO%'
         GROUP BY TABLESPACE_NAME
       )B
 WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME
 ORDER BY 1,2

3.2 UNDO 테이블 스페이스 삭제[편집]

DROP TABLESPACE UNDO_T1 INCLUDING CONTENTS AND DATAFILES;



3.3 ROLLBACK SEGMENT의 사용상황 보기[편집]

--: EXTENTS = 현재 할당된 EXTENT의 수 --: EXTENDS = 마지막 트랜잭션에 의해 할당된 EXTENT의 수

SELECT SUBSTRB(A.SEGMENT_NAME, 1, 10) AS SEGMENT_NAME
     , SUBSTRB(A.TABLESPACE_NAME, 1, 10) AS TABLESPACE_NAME
     , TO_CHAR(A.SEGMENT_ID, '99,999') AS SEG_ID
     , TO_CHAR(A.MAX_EXTENTS, '999,999') AS MAX_EXT
     , TO_CHAR(B.EXTENTS, '999,999') AS EXTENTS
     , TO_CHAR(B.EXTENDS, '999,999') AS EXTENDS
     , TO_CHAR((A.INITIAL_EXTENT + (B.EXTENTS - 1) * A.NEXT_EXTENT) / 1000000, '9,999.999') AS "ALLOC(MB)"
     , TO_CHAR(XACTS, '9,999') AS XACTS
  FROM DBA_ROLLBACK_SEGS A
     , V$ROLLSTAT B
 WHERE A.SEGMENT_ID = B.USN(+) ORDER BY 1;

4 TABLESPACE 장애 처리[편집]

4.1 TABLESPACE 용량 부족으로 에러 발생시[편집]

  • 방법 1) Data file을 크게 늘려줌(자동 증가/수동증가)
  • 방법 2) Data file을 하나 더 추가

4.1.1 Tablespace Offline[편집]

  • 사용자가 더 이상 해당 Tablespace에 접근하지 못한다는 의미
  • 데이터파일의 위치를 이동하거나 특정 Tablespace가 장애가 나서 복구해야 할 때 사용


4.1.2 TABLESPACE 를 Offline하는 방법 3가지[편집]

1) Normal Mode

SQL> alter TABLESPACE TS_TEST offline ;

2) Temporary Mode

Normal이 수행되지 못할 때(Tablespace의 Data file 이상) 사용하는 방법

3) Immediate Mode

- 반드시 Archive Log Mode일 경우에만 사용. - Data file에 장애가 나서 데이터를 내려쓰지 못하는 상황에서 TABLESPACE 를 offline해야 할 경우 사용

4.1.3 TABLESPACE 이동하기[편집]

1) Offline되는 Tablespace의 Data file 이동하기

  1. 해당 Tablespace Offline 하기
    • ALTER TABLESPACE TS_TEST OFFLINE;
  2. Data file을 대상 위치로 복사
  3. Control file 내의 해당 Data file 위치 변경
  4. 해당 Tablespace Online
    • ALTER TABLESPACE TS_TEST ONLINE;

2) Offline 안 되는 TABLESPACE 의 Data file 이동하기

  1. DB 종료
  2. Mount 상태로 시작
  3. Data file 복사
  4. Control file의 내용 변경
  5. DB Open

5 LOB포함된 TABLESPACE 용량 축소/REORG[편집]

  1. T/S 사용중인 테이블/인덱스/LOB 조회
  2. 테이블 T/S 이동
  3. 인덱스 T/S 이동(INDEX REBUILD)
  4. LOB T/S 이동


5.1 해당 테이블스페이스를 사용중인 테이블/인덱스/LOB 조회[편집]

SELECT *
  FROM DBA_SEGMENTS
 WHERE TABLESPACE_NAME ='TS_TEST_D01';

5.2 테이블에서 사용중인 테이블스페이스 신규테이블스페이스로 이동[편집]

SELECT OWNER
     , TABLE_NAME
     , TABLESPACE_NAME
     , 'ALTER TABLE '||OWNER||'.'||TABLE_NAME||' MOVE TABLESPACE TS_TEST_D11;'                    -- 임시로 생성된 T/S로 이동 
     , 'ALTER TABLE '||OWNER||'.'||TABLE_NAME||' MOVE TABLESPACE '||TABLESPACE_NAME||';' MV_TS    -- 다시 원래 테이블스페이스로 이동 
  FROM DBA_TABLES
 WHERE TABLESPACE_NAME ='TS_TEST_D01';  -- TS_TEST_D01을 사용하는 테이블

5.3 인덱스 T/S 이동(INDEX REBUILD)[편집]

SELECT OWNER
     , TABLE_NAME
     , INDEX_NAME     
     , TABLESPACE_NAME
     , 'ALTER INDEX  '||OWNER||'.'||INDEX_NAME||' REBUILD TABLESPACE TS_TEST_I11;'   RBD_TS
  FROM DBA_INDEXES
 WHERE TABLESPACE_NAME ='TS_TEST_I01'; -- TS_TEST_I01을 사용하는 인덱스

5.4 LOB T/S 이동[편집]

-- LOB 테이블 이동하기

select owner,table_name 
     , 'alter table '||owner||'.'||table_name||' move lob('||col||') store as (tablespace TS_TEST_D01);' mv_lob_ts
  from (
 select a.owner,a.table_name
      , listagg(a.column_name,',') within group (order by 1) col 
   from dba_lobs a where table_name in
                                      (
                                       SELECT DISTINCT TABLE_NAME
                                         FROM DBA_TAB_COLUMNS
                                        WHERE OWNER = 'TEST'
                                          AND DATA_TYPE LIKE '%LOB'
                                      )
group by  a.owner,a.table_name                       
)
--order by 1,2                        
;

5.5 원래 T/S명으로 변경[편집]

ALTER TABLESPACE [asis-TABLE] RENAME TO [tobe-TABLE]