데이터베이스 저장 영역 구조 관리
Tablespace
- Data의 성격(세션)을 나눈다.
- SYSTEM
- TEMP
- UNDOTBS
- USERS
- Example
- HR_Data
- dba_table_spaces
- dba_datafiles(datadictionary)
Segment
- 저장공간을 차지하는 객체
- Table
- Data
- Index
- undo
- dba_rollback_segs
- temporary
- dba_segments
- segment의 할당된 첫번째 extent : segment header block
- HWM이 저장된다
- Free list 가 존재한다.
Extent
- dba_extents, user_extents
Database Block
- 테이블에 데이터가 저장되는 방식
- 행구조
- rowheader
- 1col header
- 1col value
- 2col header
- 2col value
- null
- null은 col header 정보가 0으로 저장된다.
- trailing nulls
- 행의 뒤쪽에 null로 연속된 공간
- 따로 저장을 안하고 바로 다음 헤더가 온다.
- 선택적 입력 컬름들은 테이블 설계시 뒤쪽에 배치하는 것을 고려
- pctfree
- 해당 블록에 저장된 행에 늘어나는 update를 위해서 예비한 공간의 PCT
- 10에서 30으로 늘렸을 경우
- 장점
- row migration 가능성이 줄어든다
- 단점
- 더 많은 저장공간 필요
- 성능이 저하
************row migration 발생유발 => 확인 => 해결************
- 테이블생성
- insert
- update => row migration 유발
- analyze table => 확인
- 테이블 재구성(reorganization)
SYS@orcl2> conn scott/tiger
SCOTT@orcl2> create table mig_test
( a number(10), b varchar2(1000) );
Table created.
SCOTT@orcl2> insert into mig_test
select level, 'abc' from dual connect by level < 1000;
999 rows created.
SCOTT@orcl2> select tablespace_name, segment_name from user_segments;
TABLESPACE_NAME SEGMENT_NAME
---------------------- -------------------------
USERS DEPT
USERS EMP
USERS SALGRADE
USERS MIG_TEST
USERS PK_DEPT
USERS PK_EMP
6 rows selected.
SCOTT@orcl2> select extent_id, bytes/1024 k, blocks
from user_extents
where segment_name = 'MIG_TEST';
EXTENT_ID K BLOCKS
---------- ---------- ----------
0 64 8
SCOTT@orcl2>save ext
Created file ext.sql
SCOTT@orcl2> select rowid , a from mig_test;
ROWID A
------------------ ----------
AAASNOAAEAAAAILAAA 1
AAASNOAAEAAAAILAAB 2
AAASNOAAEAAAAILAAC 3
...
AAASNOAAEAAAAIMAGt 996
AAASNOAAEAAAAIMAGu 997
AAASNOAAEAAAAIMAGv 998
AAASNOAAEAAAAIMAGw 999
SCOTT@orcl2> insert into mig_test
select * from mig_test;
999 rows created.
SCOTT@orcl2> /
1998 rows created.
SCOTT@orcl2> /
3996 rows created.
SCOTT@orcl2> commit;
Commit complete.
SCOTT@orcl2> select count(*) from mig_test;
COUNT(*)
----------
7992
SCOTT@orcl2> update mig_test
set b = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
7992 rows updated.
SCOTT@orcl2> commit;
Commit complete.
SCOTT@orcl2> select table_name, blocks, chain_cnt from user_tables
where table_name='MIG_TEST';
TABLE_NAME BLOCKS CHAIN_CNT
------------------------------ ---------- ----------
MIG_TEST 244
-- 현재 통계정보가 없다
SCOTT@orcl2> analyze table mig_test compute statistics;
Table analyzed.
-- 여러 통계정보를 만들어준다.
SCOTT@orcl2> select table_name, blocks, chain_cnt from user_tables
where table_name='MIG_TEST';
TABLE_NAME BLOCKS CHAIN_CNT
------------------------------ ---------- ----------
MIG_TEST 244 7793
SCOTT@orcl2> save tab
Created file tab.sql
SCOTT@orcl2> @ext
EXTENT_ID K BLOCKS
---------- ---------- ----------
0 64 8
1 64 8
2 64 8
3 64 8
4 64 8
5 64 8
6 64 8
7 64 8
8 64 8
9 64 8
10 64 8
11 64 8
12 64 8
13 64 8
14 64 8
15 64 8
16 1024 128
17 rows selected.
-- 17번째는 1M를 할당 받았다.(Auto extent)
SCOTT@orcl2> alter table mig_test move;
Table altered.
-- move는 지금 있는 테이블을 물리적으로 다른테이블을 만들고 이곳에 데이터를 옮기고 원래 있던 테이블을 삭제한다.(현재 약 8000번의 insert가 다시 발생한 것이다.)
SCOTT@orcl2> analyze table mig_test compute statistics;
Table analyzed.
SCOTT@orcl2> @tab
TABLE_NAME BLOCKS CHAIN_CNT
------------------------------ ---------- ----------
MIG_TEST 172 0
tablespace 생성 및 관리
CREATE TABLESPACE TBS2
DATAFILE '/u01/app/oracle/oradata/PROD/tbs2_1.dbf' SIZE 10M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K
SEGMENT SPACE MANAGEMENT AUTO;
- smallfile tablespace(default)
- 최대 1022개 까지 데이터 파일을 정의할 수 있다
- bigfile tablespace
- 10g부터 추가된 기능
- 한 테이블스페이스에 하나의 데이터파일만 정의할 수 있다.
- 40억개 block (2k ... 32k) 최대 128TB
- contents
- permanent (table, index)
- 영구히 data를 저장하는 일반적인 테이블 스페이스
- undo
- 임시로 data를 저장하는데 사용하는 임시테이블 스페이스, sort나 임시테이블을 저장
- temporary
- undo data를 저장하는 테이블 스페이스(rollback을 가능하게 해주는 undo data를 저장하는 테이블 스페이스)
- extent management 방법
- local
- extent 할당 관련 정보를 테이블스페이스의 데이터파일 헤더에 비트맵으로 기록하고 사용하겠다
- SYSTEM Tablespace의 DataDictionary에는 Free Space정보를 관리하는 정보가 있다. 이것을 읽으려면 시간이 오래걸린다.
- autoallocate(default)
- 오라클이 알아서 사이즈를 주겠다라는 뜻
- 1개의 extent에 만약 10개 블럭을 할당한다면 한번에 8개 블럭을 읽고 1번더 읽어야한다.
- 5개의 블럭이면 한번에 5개의 블럭을 읽지만 3개의 손해가 나므로 이러한 것들을 자동으로 조절해준다는 것이다.
- uniform size 1m
- 아예 사이즈를 uniform(균일)하게(1m) 자른다는 것이다
- DBA가 이 테이블스페이스에 들어가는 데이터가 작거나 큰것을 이해할때, 테이블스페이스를 설계하기 위해 사용한다.
- dictionary
- 현재 거의 쓰이지 않는 방법
- status
- online
- 사용자들이 테이블스페이스내의 세그먼트 데이터를 사용할 수 있는 상태
- read-write(select & update 가능), (default)
- read only
- offline
- normal(default)
- temporary
- checkpoint 가능한 파일만 하는 것.
- immediate
- checkpoint를 안함
- Storage Type
- Automatic Segment Space Management(ASSM)
- segment space management auto(default)
- segment space management manual
- Blocksize
- 2k, 4k, 8k, 16k, 32k
- 비표준크기 블럭을 가진 테이블스페이스를 생성하기 위해서
- db_nk_cache_size 파라미터가 먼저 정의되어야 한다.
- db_block_size = 8k
- 이놈을 늘리기위해서는 메모리부터 있어야한다.
테이블스페이스 속성
- online( read write, read only), offline
- 테스트
- 테이블스페이스의 현재 속성 확인
- read only 변경 후 테스트
- offline 변경 후 테스트
SYS@orcl2> col tablespace_name for a25
SYS@orcl2> select tablespace_name, block_size, status, extent_management, allocation_type, segment_space_management, contents
from dba_tablespaces;
TABLESPACE_NAME BLOCK_SIZE STATUS EXTENT_MAN ALLOCATIO SEGMEN CONTENTS
------------------------- ---------- --------- ---------- --------- ------ ---------
SYSTEM 8192 ONLINE LOCAL SYSTEM MANUAL PERMANENT
SYSAUX 8192 ONLINE LOCAL SYSTEM AUTO PERMANENT
UNDOTBS1 8192 ONLINE LOCAL SYSTEM MANUAL UNDO
TEMP 8192 ONLINE LOCAL UNIFORM MANUAL TEMPORARY
USERS 8192 ONLINE LOCAL SYSTEM AUTO PERMANENT
EXAMPLE 8192 ONLINE LOCAL SYSTEM AUTO PERMANENT
6 rows selected.
SYS@orcl2> select owner, segment_name
from dba_segments
where tablespace_name = 'USERS';
OWNER SEGMENT_NAME
-------------- -------------
SCOTT DEPT
SCOTT EMP
SCOTT SALGRADE
SCOTT MIG_TEST
SCOTT PK_DEPT
SCOTT PK_EMP
SYS@orcl2> select tablespace_name, status
from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------- ---------
SYSTEM ONLINE
SYSAUX ONLINE
UNDOTBS1 ONLINE
TEMP ONLINE
USERS ONLINE
EXAMPLE ONLINE
6 rows selected.
SYS@orcl2> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
...
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SYS@orcl2> update scott.emp set sal = sal*1;
14 rows updated.
SYS@orcl2> alter tablespace users read only;
Tablespace altered.
SYS@orcl2> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
...
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SYS@orcl2> update scott.emp set sal = sal*1;
update scott.emp set sal = sal*1
*
ERROR at line 1:
ORA-00372: file 4 cannot be modified at this time
ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl2/users01.dbf'
-- 다시 되돌린다.
SYS@orcl2> alter tablespace users read write;
Tablespace altered.
===================================================================================================
SYS@orcl2> alter tablespace users offline;
Tablespace altered.
SYS@orcl2> select * from scott.emp;
select * from scott.emp
*
ERROR at line 1:
ORA-00376: file 4 cannot be read at this time
ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl2/users01.dbf'
-- 파스 자체가 invalid 된다.
SYS@orcl2> alter tablespace users online;
Tablespace altered.
SYS@orcl2> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
...
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
Tablespace의 확장
- add
- resize
- autoextend on
- max size까지 늘어난다.
- max size를 제한하려면 뒤에 max size를 붙여준다.
- 테이블스페이스 공간 부족시 해결방법
SYS@orcl2> drop tablespace tbs2 including contents and datafiles;
SYS@orcl2> create tablespace tbs2 datafile '/home/oracle/tbs2_01.dbf' size 5m;
Tablespace created.
SYS@orcl2> create table scott.t1
tablespace tbs2
as select * from scott.emp;
Table created.
SYS@orcl2> select * from dba_extents
2 where segment_name = 'T1';
SYS@orcl2> insert into scott.t1
select * from scott.t1;
14 rows created.
SYS@orcl2> insert into scott.t1
select * from scott.t1;
28 rows created.
......
SYS@orcl2> insert into scott.t1
select * from scott.t1; 2
28672 rows created.
SYS@orcl2> insert into scott.t1
select * from scott.t1;
ERROR at line 1:
ORA-01653: unable to extend table SCOTT.T1 by 128 in tablespace TBS2
-- 에러 발생
SYS@orcl2> select tablespace_name, file_id, bytes/1024/1024 as MB, blocks
from dba_free_space
where tablespace_name='TBS2';
no rows selected
-- freespace공간 확인, 없는게 확인 됨.
-- 첫번째 해결방법
SYS@orcl2> alter tablespace tbs2 add datafile '/home/oracle/tbs202.dbf' size 10m;
Tablespace altered.
SYS@orcl2> select tablespace_name, file_id, bytes/1024/1024 as MB, blocks
from dba_free_space
where tablespace_name='TBS2';
TABLESPACE_NAME FILE_ID MB BLOCKS
------------------------- ---------- ---------- ----------
TBS2 8 9 1152
-- 두번째 해결방법
SYS@orcl2> alter database datafile '/home/oracle/tbs2_01.dbf' resize 20m;
Database altered.
SYS@orcl2> select tablespace_name, file_id, bytes/1024/1024 as MB, blocks
from dba_free_space
where tablespace_name='TBS2';
TABLESPACE_NAME FILE_ID MB BLOCKS
------------------------- ---------- ---------- ----------
TBS2 7 15 1920
TBS2 8 9 1152
-- 세번째 해결방법
SYS@orcl2> alter database datafile '/home/oracle/tbs2_01.dbf' autoextend
on next 10M maxsize 100m;
Database altered.
SYS@orcl2> select tablespace_name, file_id, bytes/1024/1024 as MB, blocks
from dba_free_space
where tablespace_name='TBS2';
TABLESPACE_NAME FILE_ID MB BLOCKS
------------------------- ---------- ---------- ----------
TBS2 7 15 1920
TBS2 8 9 1152
SYS@orcl2> select file_id, file_name, bytes, autoextensible from dba_data_files;
FILE_ID FILE_NAME BYTES AUT
---------- ------------------------------------------------------------ ---------- ---
4 /u01/app/oracle/oradata/orcl2/users01.dbf 10485760 YES
3 /u01/app/oracle/oradata/orcl2/undotbs01.dbf 110100480 YES
2 /u01/app/oracle/oradata/orcl2/sysaux01.dbf 555745280 YES
1 /u01/app/oracle/oradata/orcl2/system01.dbf 713031680 YES
5 /u01/app/oracle/oradata/orcl2/example01.dbf 104857600 YES
6 /home/oracle/test/ORCL2/datafile/o1_mf_tbs1_g9rx659z_.dbf 104857600 YES
7 /home/oracle/tbs2_01.dbf 20971520 YES
8 /home/oracle/tbs202.dbf 10485760 NO
8 rows selected.
FILE# NAME BYTES
---------- ------------------------------------------------------------ ----------
1 /u01/app/oracle/oradata/orcl2/system01.dbf 713031680
2 /u01/app/oracle/oradata/orcl2/sysaux01.dbf 555745280
3 /u01/app/oracle/oradata/orcl2/undotbs01.dbf 110100480
4 /u01/app/oracle/oradata/orcl2/users01.dbf 10485760
5 /u01/app/oracle/oradata/orcl2/example01.dbf 104857600
6 /home/oracle/test/ORCL2/datafile/o1_mf_tbs1_g9rx659z_.dbf 104857600
7 /home/oracle/tbs2_01.dbf 20971520
8 /home/oracle/tbs202.dbf 10485760
8 rows selected.
-- 위의 해결방법중 경로는 FILE_ID(FILE#)로 대체가 가능하다.
SYS@orcl2> insert into scott.t1
select * from scott.t1;
57344 rows created.
-- 정상적으로 삽입 된다.
SYS@orcl2> select tablespace_name, file_id, bytes/1024/1024 as MB, blocks
from dba_free_space
where tablespace_name='TBS2';
TABLESPACE_NAME FILE_ID MB BLOCKS
------------------------- ---------- ---------- ----------
TBS2 7 14 1792
TBS2 8 8 1024
-- 남은 freespace확인.
테이블 스페이스의 종류
SYS@orcl2> select tablespace_name, contents
2 from dba_tablespaces;
TABLESPACE_NAME CONTENTS
------------------------- ---------
SYSTEM PERMANENT
SYSAUX PERMANENT
UNDOTBS1 UNDO
TEMP TEMPORARY
USERS PERMANENT
EXAMPLE PERMANENT
TBS1 PERMANENT
TBS2 PERMANENT
- permanent (table, index)
- 영구히 data를 저장하는 일반적인 테이블 스페이스
- undo
- 임시로 data를 저장하는데 사용하는 임시테이블 스페이스, sort나 임시테이블을 저장
- temporary
- undo data를 저장하는 테이블 스페이스(rollback을 가능하게 해주는 undo data를 저장하는 테이블 스페이스)
- group
- group을 만드는 이유는 I/O가 분산되며 임시데이터에 의한 공간 부족 및 경합을 줄일 수 있다.
SYS@orcl2> create temporary tablespace temp1
tempfile '/home/oracle/temp1.dbf' size 10m autoextend on
tablespace group temp_grp;
Tablespace created.
SYS@orcl2> create temporary tablespace temp2
tempfile '/home/oracle/temp2.dbf' size 10m autoextend on
tablespace group temp_grp;
Tablespace created.
SYS@orcl2> select tablespace_name, status, contents, logging, segment_space_management, bigfile
from dba_tablespaces;
TABLESPACE_NAME STATUS CONTENTS LOGGING SEGMEN BIG
------------------------- --------- --------- --------- ------ ---
SYSTEM ONLINE PERMANENT LOGGING MANUAL NO
SYSAUX ONLINE PERMANENT LOGGING AUTO NO
UNDOTBS1 ONLINE UNDO LOGGING MANUAL NO
TEMP ONLINE TEMPORARY NOLOGGING MANUAL NO
USERS ONLINE PERMANENT LOGGING AUTO NO
EXAMPLE ONLINE PERMANENT NOLOGGING AUTO NO
TBS1 ONLINE PERMANENT LOGGING AUTO NO
TBS2 ONLINE PERMANENT LOGGING AUTO NO
TEMP1 ONLINE TEMPORARY NOLOGGING MANUAL NO
TEMP2 ONLINE TEMPORARY NOLOGGING MANUAL NO
10 rows selected.
SYS@orcl2> select file_id, file_name, tablespace_name, bytes/1024/1024 as mb,
blocks, autoextensible, increment_by, trunc(maxbytes/1024/1024) as max_gb
from dba_data_files;
-- TEMP파일은 DATAFILE이 아니므로 조회되지 않는다.
테이블스페이스의 삭제
SYS@orcl2> select 'drop tablespace '||tablespace_name||' including contents and datafiles;'
from dba_tablespaces
where tablespace_name not in
('SYSTEM', 'SYSAUX', 'UNDOTBS1', 'TEMP', 'USERS', 'EXAMPLE');
'DROPTABLESPACE'||TABLESPACE_NAME||'INCLUDINGCONTENTSANDDATAFILES;'
--------------------------------------------------------------------------------
drop tablespace TBS1 including contents and datafiles;
drop tablespace TBS2 including contents and datafiles;
drop tablespace TEMP1 including contents and datafiles;
drop tablespace TEMP2 including contents and datafiles;
SYS@orcl2> save drop_list
Created file drop_list.sql
SYS@orcl2>ed drop_list
spool drop.sql
set echo off
set head off
set pages 0
set feed off
select 'drop tablespace '||tablespace_name||' including contents and datafiles;'
from dba_tablespaces
where tablespace_name not in
('SYSTEM', 'SYSAUX', 'UNDOTBS1', 'TEMP', 'USERS', 'EXAMPLE')
set echo on
set feed on
set head on
set pages 100
spool off
/
~
~
SYS@orcl2> @drop_list
Tablespace dropped.
Tablespace dropped.
Tablespace dropped.
-- 이 명령어는 주의해서 사용하도록 하자. 중요한 테이블스페이스가 날라갈 수 있다,
OMF(Oracle Managed File)
- tablespace를 생성시 OMF가 활성화 되었다면 datafile을 datafile이 만들어지는 default 위치에 기본 크기로 오라클이 알아서 만드는 방식
- create tablespace tbs1;
- 파라미터 db_create_file_dest 위치에 datafile의 위치는 서버가 알아서 만들고 사
- 사이즈는 100m로 만든다. 바꾸고 싶다면 명령어에 써주면 된다.
- ASM 환경에서 유용하다.
SYS@orcl2> alter system set db_create_file_dest = '/home/oracle/test';
System altered.
만들어라 명령을 하면 이 아래에 만든다.
SYS@orcl2> create tablespace tbs1;
Tablespace created.
SYS@orcl2> select * from dba_data_files
where tablespace_name = 'TBS1';
-- 위 명령어를 실행한뒤 확인 해보자.
SYS@orcl2> create tablespace tbs2 datafile size 10m;
Tablespace created.
-- datafile_size를 수동으로 정한다.
-- 이처럼 기본값에서 수정사항이 있다면 그냥 명령어에 포함시키면 된다.
<<<<복습>>>>
1. tablespace 생성한 후 테이블스페이스에 대한 정보 확인 하세요.
tablespace 이름 : app_tbs
datafile 위치 및 이름 : /home/oracle/app_tbs01.dbf
datafile 사이즈 : 5m
extent 관리 : local uniform size 1m
segment space management: auto
SYS@orcl2> CREATE TABLESPACE app_tbs
DATAFILE '/home/oracle/app_tbs01.dbf' SIZE 5M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1024K
SEGMENT SPACE MANAGEMENT AUTO;
Tablespace created.
SYS@orcl2> select tablespace_name, block_size, status, extent_management, allocation_type, segment_space_management, contents
from dba_tablespaces
where tablespace_name = 'APP_TBS';
TABLESPACE_NAME BLOCK_SIZE STATUS EXTENT_MAN ALLOCATIO SEGMEN CONTENTS
------------------------- ---------- --------- ---------- --------- ------ ---------
APP_TBS 8192 ONLINE LOCAL UNIFORM AUTO PERMANENT
2. app_tbs 테이블스페이스에 hr.employees을 이용하여 hr.app_emp 테이블 생성하고
테이블이 어느 테이블스페이스에 있는지 조회하고 스토리지 관련 정보를 확인하시오.
HR@orcl2> create table app_emp
tablespace APP_TBS
as select * from employees;
Table created.
HR@orcl2> select * from dba_extents
where segment_name='APP_EMP';
OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID BYTES
----- ------------- --------------- ------------ ---------------- --------- --------
HR APP_EMP TABLE APP_TBS 0 1048576
-- HR 계정에서 직접 하는법
===================================================================================================
SYS@orcl2> create table hr.app_emp
tablespace APP_TBS
as select * from hr.employees;
Table created.
SYS@orcl2> select * from dba_extents
where segment_name='APP_EMP';
SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID BYTES BLOCKS
------------- --------------- ------------ ---------------- --------- -------- ------
APP_EMP TABLE APP_TBS 0 1048576 128
-- SYSDBA계정으로 하는법
3. app_tbs 테이블스페이스를 read only 로 설정하시오.
SYS@orcl2> alter tablespace app_tbs read only;
Tablespace altered.
SYS@orcl2> select file#, status, enabled from v$datafile;
FILE# STATUS ENABLED
---------- ------- ----------
1 SYSTEM READ WRITE
2 ONLINE READ WRITE
3 ONLINE READ WRITE
4 ONLINE READ WRITE
5 ONLINE READ WRITE
6 ONLINE READ WRITE
7 ONLINE READ WRITE
8 ONLINE READ ONLY
8 rows selected.
SYS@orcl2> select * from v$tablespace;
TS# NAME INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
0 SYSTEM YES NO YES
1 SYSAUX YES NO YES
2 UNDOTBS1 YES NO YES
4 USERS YES NO YES
3 TEMP NO NO YES
6 EXAMPLE YES NO YES
7 TBS1 YES NO YES
8 TBS2 YES NO YES
9 APP_TBS YES NO YES
9 rows selected.
SYS@orcl2> select t.ts#, t.name talbespace_name, file#, t.name, status, enabled
from v$datafile f, v$tablespace t
where f.ts#=t.ts#;
TS# TALBESPACE_NAME FILE# NAME STATUS ENABLED
---------- ------------------------------ ---------- -------------------- ------- ----------
0 SYSTEM 1 SYSTEM SYSTEM READ WRITE
1 SYSAUX 2 SYSAUX ONLINE READ WRITE
2 UNDOTBS1 3 UNDOTBS1 ONLINE READ WRITE
4 USERS 4 USERS ONLINE READ WRITE
6 EXAMPLE 5 EXAMPLE ONLINE READ WRITE
7 TBS1 6 TBS1 ONLINE READ WRITE
8 TBS2 7 TBS2 ONLINE READ WRITE
9 APP_TBS 8 APP_TBS ONLINE READ ONLY
8 rows selected.
4. 3번의 테이블 스페이스에 다음 작업의 결과는 어떠한지 테스트 하고 설명하시오.
1) select count(*) from hr.app_emp;
SYS@orcl2> select count(*) from hr.app_emp;
COUNT(*)
----------
107
2) delete from hr.app_emp;
SYS@orcl2> delete from hr.app_emp;
delete from hr.app_emp
*
ERROR at line 1:
ORA-00372: file 8 cannot be modified at this time
ORA-01110: data file 8: '/home/oracle/app_tbs01.dbf'
- 데이터에 대한 변경은 불가하다.
3) create table hr.app_dept
tablespace app_tbs
as select * from hr.departments;
SYS@orcl2> create table hr.app_dept
tablespace app_tbs
as select * from hr.departments; 2 3
as select * from hr.departments
*
ERROR at line 3:
ORA-01647: tablespace 'APP_TBS' is read-only, cannot allocate space in it
- 데이터에 대한 변경은 불가하다.
- 파일에 속한 데이터파일을 변경하려는 것인데 불가하다.
4) alter table hr.app_emp modify last_name varchar2(30);
SYS@orcl2> alter table hr.app_emp modify last_name varchar2(30);
Table altered.
- alter table은 DD에서 col의 데이터 타입을 바꾸거나 늘리거나 하는 일이기 때문에 app_tbs에 접근할 필요가 없으므로 가능하다.
5) truncate table hr.app_emp;
SYS@orcl2> truncate table hr.app_emp;
truncate table hr.app_emp
*
ERROR at line 1:
ORA-00372: file 8 cannot be modified at this time
ORA-01110: data file 8: '/home/oracle/app_tbs01.dbf'
- DD에서 작업하고 app_tbs에 할당된것을 해제해야 하기 때문에 불가하다.
6)drop table hr.app_emp purge;
SYS@orcl2> drop table hr.app_emp purge;
Table dropped.
- DD의 TABLE 정보와 COL의 정보를 삭제하고 스토리지에 할당된 정보가 있으면 그것도 삭제한다.
- app_tbs는 DD의 기준으로 데이터를 읽는 것이기 때문에, 테이블에 대한 정의가 없기때문에 app_tbs와의 연결이 끊어지는 것이다.
- drop column의 경우 DD에 대한 변경과 Data Block에 대한 변경이 이루어진다.(불가)
DDL
- 오라클 서버가 Data Dictionary를 변경한다
- drop column의 경우 DD에 대한 변경과 Data Block에 대한 변경이 이루어진다.
5. 테스트한 테이블스페이스를 모두 삭제하시오.
drop tablespace app_tbs including contents and datafiles cascade constraints;
-- tablespace 내의 데이터와 OS상의 datafiles를 함께 삭제하라는 뜻
-- 제약조건이 걸려있는 경우 참조하고 있는 제약조건을 삭제(cascade constraints)
'DATABASE(oracleDB 11g) > DBA' 카테고리의 다른 글
[Oracle DBA]데이터 동시성 관리 (0) | 2019.04.03 |
---|---|
[Oracle DBA]유저 보안 관리 (0) | 2019.04.01 |
[Oracle DBA]Oracle 네트워크 관리 (0) | 2019.03.27 |
[Oracle DBA]ASM Instance 관리 (0) | 2019.03.26 |
[Oracle DBA]오라클 데이터베이스 Instance 관리 (0) | 2019.03.25 |