tablespace 생성 및 조회
카테고리 없음
1.개요
Oracle 이라는 프로그램은 대용량의 데이터를 저장하고 관리하는데에 사용하는 하나의 프로그램.
하지만 이러한 대용량의 데이터를 어떻게 저장하고 어떻게 관리하는가에 대한 건 아주 중요한 이슈중에 하나다.

Oracle은 데이터를 저장하고 불러오거나 작업등을 할때 논리적으로 Tablespace라는 공간을 만들어서 작업하고
물리적으로는 Disk에 Data File을 만들어서 작업을 한다.

SQL(손님)에서 데이터를 호출할려고 Tablespace(매장)에 요청하면 쭈욱 찾아보다가 메모리에 데이터가 존재하지 않는다면
Sever Process가 DataFile(창고)로 옮겨가서 다시 한번 호출된 데이터를 찾아본다.
만약 데이터가 있다면, 데이터가 있는 해당 블록을 Server Process가 Tablespace로 가져온후 사용자에게 데이터를 전달한다.

2. Tablespace의 종류 및 특징들
system tablespace
system tablespace에는 데이터에 관련된 딕셔너리들이 들어있다.
따라서 위의 system tablespace가 손상이되면 Oracle 서버가 작동하지 않는다.
한마디로 운용에 관련된 tablespace고,Oracle 9i는 system tablespace에 운용딕셔너리와, 튜닝 딕셔너리가 같이 묶여있다.
10G부터는 튜닝 관련 딕셔너리가 system tablespace에서 개별적으로 나와서 sysaux tablespace라는 새로운 tablespace가 생긴다.

9i의 딕셔너리 수
SQL>select count(*) from dictionary;
-----------------
  count(*)
-----------------
   1284 //9.2.0.4버전 기준

10g의 딕셔너리 수
SQL>select count(*) from dictionary;
-----------------
  count(*)
-----------------
   1882 //10.2.0.5버전 기준

11g의 딕셔너리 수
SQL>select count(*) from dictionary;
-----------------
  count(*)
-----------------
  2600 //11.2.0.2버전 기준


3.데이터 딕셔너리의 종류와 특징
데이터 딕셔너리는 보통 크게 두가지로 나뉘는데 1.base table2.data dictionary view로 나뉜다.
1) base table : 데이터베이스를 생성할때 (dbca,create database등) 생성된다.
원본데이터가 들어있는곳이고 dba조차 이곳에 접근할 수 없다.

2)data dictionary view : 위의곳을 접근할 수 없어 추가적으로 조회는 가능하게끔 나온게 데이터 딕셔너리 뷰이다.
dbca를 사용해서 데이터베이스를 생성 할 경우엔 자동으로 생성되지만 수동으로 생성할땐 생성이 안됨
그래서 create database를 수행 한 후에 꼭 catalog.sql 스크립트를 추가로 실행해 주어야 한다.

data dictionary view를 또 두개로 나눌수 있는데 1)Static dictionary와 2)Dynamic dictionary로 나뉜다.
Static dictionary는 딕셔너리에 저장 된 정보들이 자동으로 변동되지 않는다.
이렇게 생성되는 딕셔너리엔 아래와 같은 중요정보들이 들어있다.

1.데이터베이스의 논리적인 구조와 물리적인 구조 정보들
2.객체의 정의와 공간 사용 정보들
3.제약조건에 관련된 정보들
4.사용자에 관련된 정보들
5.role,privilege 등에 관련된 정보들
6.감사 및 보안등에 관련된 정보들

4.Analyze 명령어
딕셔너리의 내용을 수동으로 업데이트 하기 위한 방법으로는 analyze명령어가 있다.
이 명령어 말고 DBMS_STATS라는 패치지도 많이 사용한다만, 주의할 점은 위 두개의 명령어는 해당 테이블들을 전체 스캔하는 명령어이므로 서버의 성능에 막대한 영향을 주는 경우가 많다.
오라클에서 사용하는 딕셔너리는 너무나도 많아서 제일 많이 사용하는 4개의 딕셔너리만 나열해보겠다.

1)USER_XXX : 해당 사용자가 생성한 내용만 볼 수 있는 딕셔너리
EX) USER_TABLES :해당 사용자가 생성한 테이블만 볼 수 있는 딕셔너리

2)ALL_XXX : 해당 사용자가 생성한 것과 그렇지 않는 것도 접근이 가능한 내용을 열람할수 있는 딕셔너리
EX)ALL_TABLES : 접근 가능한 모든 테이블 내역을 볼 수 있는 딕셔너리

3)DBA_XXX : 데이터베이스 내에 있는 모든 내용을 다 볼 수 있는 딕셔너리
EX) DBA_TABLES : 데이터베이스에 있는 모든 TABLE을 내역을 볼 수 있는 딕셔너리

위의 살펴본 딕셔너리 3개 모두 Static dictionary이다.

5.일반 Tablespace 생성 및 조회하기
SQL>create tablespace youngkyu
    datafile '/app/oracle/oradata/testdb/youngkyu01.dbf' size 1m;

Tablespace crerated.

SQL>select tablespace_name,status,contents,extent_management,
    segment_space_management
    from dba_tablespaces;

TABLESPACE_NAME                STATUS    CONTENTS  EXTENT_MAN SEGMEN
------------------------------ --------- --------- ---------- ------
SYSTEM                         ONLINE    PERMANENT LOCAL      MANUAL
SYSAUX                         ONLINE    PERMANENT LOCAL      AUTO
UNDOTBS1                       ONLINE    UNDO      LOCAL      MANUAL
TEMP                           ONLINE    TEMPORARY LOCAL      MANUAL
USERS                          ONLINE    PERMANENT LOCAL      AUTO
EXAMPLE                        ONLINE    PERMANENT LOCAL      AUTO

6 rows selected.

SQL>select tablespace_name,bytes/1024/1024 mb,file_name
  2  from dba_data_files;
TABLESPACE_NAME                        MB FILE_NAME
------------------------------ ---------- --------------------------------------------------
USERS                                  10 /app/oracle/oradata/testdb/users01.dbf
UNDOTBS1                               10 /app/oracle/oradata/testdb/undotbs01.dbf
SYSAUX                                600 /app/oracle/oradata/testdb/sysaux01.dbf
SYSTEM                                710 /app/oracle/oradata/testdb/system01.dbf
EXAMPLE                           345.625 /app/oracle/oradata/testdb/example01.dbf

6 row selected.

6.각 Datafile의 실제 사용량 확인하는 방법
SYS> set line 200 ;
SYS> col file# for 999 ;
SYS> col ts_name for a10 ;
SYS> col total_blocks for 9999999 ;
SYS> col used_blocks for 9999999
SYS> col pct_used for a10
SYS> select distinct d.file_id file#,
 2 d.tablespace_name ts_name,
 3 d.bytes /1024 / 1024 MB,
 4 d.bytes / 8192 total_blocks,
 5 sum(e.blocks) used_blocks,
 6 to_char( nvl( round( sum(e.blocks)/(d.bytes/8192), 4),0) *100,'09.99') || ' %' pct_used
 7 from dba_extents e, dba_data_files d
 8 where d.file_id = e.file_id(+)
 9 group by d.file_id , d.tablespace_name , d.bytes
 10 order by 1,2 ;

     FILE# TS_NAME                                MB TOTAL_BLOCKS USED_BLOCKS PCT_USED
---------- ------------------------------ ---------- ------------ ----------- --------
         1 SYSTEM                                710        90880       90712  99.82 %
         2 SYSAUX                                600        76800       70680  92.03 %
         3 UNDOTBS1                               10         1280        1104  86.25 %
         4 USERS                                  10         1280         768  60.00 %
         5 EXAMPLE                           345.625        44240       39560  89.42 %

7row selected.
7.datafile 크기 수동 증가시키기
SYS>alter database datafile '/app/oracle/oradata/testdb/youngkyu01.dbf' resize 20m;

Database altered.
8.datafile 크기 자동 증가시키기
SYS>alter database datafile '/app/oracle/oradata/testdb/youngkyu01.dbf' autoextend on;

Database alterd.


이렇게 자동으로 늘리게 될 경우 최대 파일 1개크기는 16gb까지 가능하며
Oracle이 64bit일 경우엔 32gb까지 가능하다.

9.각 data file들의 autoextend 유무 확인하기
SQL>  set line 200
SQL> col tablespace_name for a10
SQL> col file_name for a50
SQL> select tablespace_name,bytes/1024/1024 mb,file_name,autoextensible "AUTO", online_status
  2  from  dba_data_files;

TABLESPACE         MB FILE_NAME                                          AUT ONLINE_
---------- ---------- -------------------------------------------------- --- -------
USERS             7.5 /app/oracle/oradata/testdb/users01.dbf             YES ONLINE
UNDOTBS1           95 /app/oracle/oradata/testdb/undotbs01.dbf           YES ONLINE
SYSAUX            530 /app/oracle/oradata/testdb/sysaux01.dbf            YES ONLINE
SYSTEM            700 /app/oracle/oradata/testdb/system01.dbf            YES SYSTEM
EXAMPLE       313.125 /app/oracle/oradata/testdb/example01.dbf           YES ONLINE

10.Tablespace Offline
Tablespace를 Off 한다는것은 사용자가 더 이상 해당 Tablespace에 접근하지 못한다는 의미가 된다.
사실상 Tablespace를 shutdown 시킨다는 의미고, Tablespace가 장애가 나서 복구를 해야할때 유용하게 사용된다.

Tablespace를 Off 방법은 총 3가지가 있다.
1)Tablespace Normal Mode : Tablespace가 문제 없을 시 정상적으로 수행하는 방법
SQL>alter tablespace youngkyu offline;

Database altered.
2)Tablespace Temporary Mode : offline 시키고자 하는 Tablespace의 Data file이 하나라도 이상이 생겨 offline normal mode를 수행하지 못할때
SQL>alter tablespace datafile '/app/oracle/oradata/testdb/youngkyu01.dbf' offline; //이 모드는 DB가 archive mode일때만 가능//
만약에 no archive mode라면
SQL>alter tablespace datafile '/app/oracle/oradata/testdb/youngkyu01.dbf' offline drop;
 
11. Tablespace no archive mode 후에 Online을 수행할 경우
no archive mode 기준 Offline 후에 online을 다시 수행하면 Recovery라는 메세지가 나온다.
어떤 Data filedl Offline인지 는 아래와 같이 v$datafile을 조회하면 알 수 있다.
SQL> col name for a50
SQL> select file#,name,status from v$datafile;

     FILE# NAME                                               STATUS
---------- -------------------------------------------------- -------
         1 /app/oracle/oradata/testdb/system01.dbf            SYSTEM
         2 /app/oracle/oradata/testdb/sysaux01.dbf            ONLINE
         3 /app/oracle/oradata/testdb/undotbs01.dbf           ONLINE
         4 /app/oracle/oradata/testdb/users01.dbf             ONLINE
         5 /app/oracle/oradata/testdb/example01.dbf           ONLINE
         6 /app/oracle/oradata/testdb/youngkyu01.dbf          ONLINE

6 rows selected.
위의 내용을 보면 전부 online인걸 확인 할 수 있다.
no archive mode 확인후에 offline 수행을 실행해보겠다.
SQL> archive log list;
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     6
Current log sequence           8
SQL> //현제 No Archive Mode//
위의 결과는 no archive mode로 확인되었다.
이제 오프라인을 수행하고 상태를 출력해보겠다.

SQL> alter database datafile '/app/oracle/oradata/testdb/youngkyu01.dbf' offline drop;

Database altered.

SQL> select file#,name,status from v$datafile;

     FILE# NAME                                               STATUS
---------- -------------------------------------------------- -------
         1 /app/oracle/oradata/testdb/system01.dbf            SYSTEM
         2 /app/oracle/oradata/testdb/sysaux01.dbf            ONLINE
         3 /app/oracle/oradata/testdb/undotbs01.dbf           ONLINE
         4 /app/oracle/oradata/testdb/users01.dbf             ONLINE
         5 /app/oracle/oradata/testdb/example01.dbf           ONLINE
         6 /app/oracle/oradata/testdb/youngkyu01.dbf          RECOVER

6 rows selected.
위와 같이 recovery모드로 변경이 되어있는데 Tablespace를 offline하게 되면
그 파일들에는 새로운 정보가 저장되지 않는다. 그래서 반드시 offline후에 online하게 된다면
반드시 checkpoint를 발생시켜서 data file간의 동기화를 시켜주어야 한다.
아래 내용을 참고해서 확인해보자.
SQL> select a.file#, a.ts#, b.name, a.status, a.checkpoint_change#
  2  from v$datafile a, v$tablespace b
  3  where a.ts#=b.ts#;

     FILE#        TS# NAME         STATUS  CHECKPOINT_CHANGE#
---------- ---------- ------------ ------- ------------------
         1          0 SYSTEM       SYSTEM              926358
         2          1 SYSAUX       ONLINE              926358
         3          2 UNDOTBS1     ONLINE              926358
         4          4 USERS        ONLINE              926358
         5          6 EXAMPLE      OFFLINE             941046
         6          7 YOUNGKYU     RECOVER             940157

6 rows selected.
위 내용을 보면 example tablespace가 offline 상태여서 checkpoint_change(checkpoint scn)이 다른 파일들과
다름을 알 수 있다. 이 상태에서 online을 수행해도 결과는 같다.
SQL> alter tablespace example online;

Tablespace altered.

SQL> select a.file#, a.ts#, b.name, a.status, a.checkpoint_change#
  2  from v$datafile a, v$tablespace b
  3  where a.ts#=b.ts#;

     FILE#        TS# NAME         STATUS  CHECKPOINT_CHANGE#
---------- ---------- ------------ ------- ------------------
         1          0 SYSTEM       SYSTEM              926358
         2          1 SYSAUX       ONLINE              926358
         3          2 UNDOTBS1     ONLINE              926358
         4          4 USERS        ONLINE              926358
         5          6 EXAMPLE      ONLINE              941102
         6          7 YOUNGKYU     RECOVER             940157

6 rows selected.
scn이 다른 이런상태에서 datafile backup을 받는다면 당장 문제가 없더라도 후에 복구나 여러 기타 장애가 일어날 수 있다.
위에서 설명했듯이 checkpoint를 강제로 일으켜 scn을 맞춰주고, 맞춘후엔 반드시 backup을 받아놓으면 된다.
SQL> alter system checkpoint; //checkpoint 발생

System altered.

SQL> alter tablespace youngkyu offline; //youngkyu tablespace offline시켜보지만 이미 2개중 1개가 offline이라 normal mode안됨
alter tablespace youngkyu offline
*
ERROR at line 1:
ORA-01191: file 6 is already offline - cannot do a normal offline
ORA-01110: data file 6: '/app/oracle/oradata/testdb/youngkyu01.dbf'

SQL> alter tablespace youngkyu offline temporary;

Tablespace altered.

SQL> recover tablespace youngkyu;
Media recovery complete.
SQL>
SQL> alter tablespace youngkyu online;

Tablespace altered.

SQL> select a.file#, a.ts#, b.name, a.status, a.checkpoint_change#
  2  from v$datafile a, v$tablespace b
  3  where a.ts#=b.ts#;

     FILE#        TS# NAME         STATUS  CHECKPOINT_CHANGE#
---------- ---------- ------------ ------- ------------------
         1          0 SYSTEM       SYSTEM              941286
         2          1 SYSAUX       ONLINE              941286
         3          2 UNDOTBS1     ONLINE              941286
         4          4 USERS        ONLINE              941286
         5          6 EXAMPLE      ONLINE              941286
         6          7 YOUNGKYU     ONLINE              941507 //복구가 완료 되었지만 scn번호가 다르다

6 rows selected.

SQL> alter system checkpoint; //다시 한번 checkpoint를 수행해준다.

System altered.

SQL> select a.file#, a.ts#, b.name, a.status, a.checkpoint_change#
  2  from v$datafile a, v$tablespace b
  3  where a.ts#=b.ts#;

     FILE#        TS# NAME         STATUS  CHECKPOINT_CHANGE#
---------- ---------- ------------ ------- ------------------
         1          0 SYSTEM       SYSTEM              941635
         2          1 SYSAUX       ONLINE              941635
         3          2 UNDOTBS1     ONLINE              941635
         4          4 USERS        ONLINE              941635
         5          6 EXAMPLE      ONLINE              941635
         6          7 YOUNGKYU     ONLINE              941635 //모든 Datafile들의 번호가 같아졌다.

6 rows selected.
Tablespace를 offline후 online을 하게 되면 반드시 수동으로 checkpoint를 수행해서
SCN번호를 동기화 시켜야 된다는점 잊지 말길 바란다