오라클 데이터베이스 관리자 기초- (7)테이블 스페이스 및 데이터 파일 관리(2)

2020. 1. 9. 09:53Security/oracle database

* 테이블 스페이스

읽기 전용 스페이스

- 체크포인트 발생

- 데이터 읽기만 가능(create, insert, update, delete 불가능)

- 테이블 스페이스에서 객체 삭제 가능(drop 가능)

 

1. 읽기 전용인 테이블스페이스의 테이블이 지워지는 이유는?

- DROP 명령어는 읽기 전용인 테이블스페이스의 데이터 파일에 접근하는 것이 아닌 딕셔너리의 정보를 통해서 테이블을 삭제하기때문에 가능하다. 즉, DROP 명령어는 읽기 전용인 부분에 접근할 필요가 없기 때문에 읽기 전용 테이블스페이스에서 실행이 가능하다.

 

2. 읽기 전용으로 테이블스페이스의 상태를 설정해도 테이블이 지워진다면 읽기 전용은 어떤 의미가 있는가? 즉, 어떤 경우에 사용하는가?

- 읽기 전용이란 더 이상의 트랜잭션이 일어날 필요가 없는 부분이므로 이 부분의 파일에 대한 동기화 정보 갱신과 같은 운영 부담을 줄이는 것이 사용 목적이다. 이러한 기능은 관리자가 읽기 전용인 테이블스페이스의 데이터 파일을 읽기 전용 매체인 CD-ROM이나 DVD-ROM에 저장해서 운영하고자 할 때 반드시 필요한 기능이다.

 

테이블 스페이스 오프라인 설정

- 오프라인 상태로 설정하면 mount 상태를 유지하는것과 같기 때문에 물리적인 작업(이동, 수정)이 가능하다. 

- 시스템 테이블 스페이스, 사용중은 undo 테이블 스페이스, 기본 temporary 테이블 스페이스는 오프라인 설정이 불가능하다. 즉, 유저용 테이블 스페이스만 오프라인 설정이 가능하다.

- 데이터 파일이 살아있는 상태에서 데이터 파일을 옮기고 싶을때 사용

 

데이터 파일 이동방식(모든 테이블 스페이스중 오프라인이 가능할때)

1. 테이블 스페이스를 오프라인으로 설정

2. os 명령어를 사용해서 파일을 이동하거나 복사

3. 위와 같이 명령어를 사용해서 오라클에게 바뀐 경로를 알려준다.

4. 테이블 스페이스를 온라인으로 설정

5. 필요한 경우 OS 명령을 사용해서 파일을 삭제

 

데이터 파일 이동방식(모든 테이블 스페이스)

1. 데이터 베이스를 마운트 단계까지 설정(컨트롤 파일에 데이터 파일이 들어있기 때문에)

2. 위와 같이 명령어를 사용해 바뀐 경로를 알려준다.

3. 다시 데이터 베이스를 오픈한다. 

 

[실습]OPEN 상태에서 tablespace 이동

ALTER TABLESPACE  RENAME DATAFILE 
<원래 data file명> TO <이동한 data file>; 
- Data file 등록 정보 수정(rename 한다.)

 

ALTER TABLESPACE  ONLINE; 
지정된 tablespace를 ONLINE한다. 
필요하다면 DATA FILE 레벨에서도 OFFLINE 가능하다.

 

ALTER DATABASE DATAFILE '' OFFLINE [DROP]; 
- DROP은 데이터 파일 손상시 사용한다.

- 하지만 지금 나의 지식 수준에서는 사용하지 않는다.

ALTER TABLESPACE users OFFLINE; 
// 사용하고자 하는 테이블 스페이스를 오프라인 설정 

SELECT tablespace_name, status, contents, 
extent_management, segment_space_management 
FROM dba_tablespaces 
ORDER BY 1; 
// 테이블의 오프라인 확인  

SELECT tablespace_name, bytes, file_name FROM dba_data_files; 
// 오프라인된  테이블 스페이스는 데이터 파일의 크기가 출력되지 않는다.

!mv /app/ora12c/oradata/DB12/users01.dbf /app/ora12c/oradata/disk3/ 

!ls /app/ora12c/oradata/disk3/ 

SELECT tablespace_name, bytes, file_name FROM dba_data_files; 
// 데이터 파일의 위치는 변경됐지만 딕셔너리 정보는 그대로기때문에 등록 정보를 수정한다 

ALTER TABLESPACE users RENAME DATAFILE  
'/app/ora12c/oradata/DB12/users01.dbf' 
TO '/app/ora12c/oradata/disk3/users01.dbf'; 
// data file의 등록 정보를 수정해주는 명령어 

SELECT tablespace_name, bytes, file_name FROM dba_data_files; 
//경로가 수정 된 것을 확인

ALTER TABLESPACE users ONLINE; 
// 이동된 테이블 스페이스 온라인으로 변경 

SELECT tablespace_name, bytes, file_name FROM dba_data_files; 
// 데이터 파일의 크기가 출력되고 정상적으로 사용 가능

 

[실습]Close 상태에서 tables space 이동

-MOUNT 상태에서 data file을 이동하는 과정 
step 1. DB SHUTDOWN 
step 2. DATA FILE 이동 
step 3. DB MOUNT 
step 4. ALTER DATABASE 명령으로 DATA FILE 등록 
step 5. DB OPEN

// 이론적으로는 MOUNT후에 DATA파일을 이동해도 되지만 절대로 그렇게 하지 않는다.

 

- 사용 명령어 
ALTER DATABASE RENAME FILE 
<원래 data file명> TO <이동한 data file명>; 
- Data file 등록 정보 수정 
- ALTER TABLESPACE ~ RENAME DATAFILE 명령과 동일한 효과가 있다.

 

SELECT tablespace_name, bytes, file_name FROM dba_data_files;
// 데이터 파일의 정보 확인

SHUTDOWN IMMEDIATE
// DB 셧다운

!mv /app/ora12c/oradata/DB12/sysaux01.dbf /app/ora12c/oradata/disk3/
!mv /app/ora12c/oradata/DB12/system01.dbf /app/ora12c/oradata/disk3/
!mv /app/ora12c/oradata/DB12/undotbs01.dbf /app/ora12c/oradata/disk3/
!mv /app/ora12c/oradata/DB12/temp01.dbf /app/ora12c/oradata/disk3/
// 데이터 파일 이동

STARTUP MOUNT
// DB를 마운트 한다.

ALTER DATABASE RENAME file
'/app/ora12c/oradata/DB12/sysaux01.dbf'
TO '/app/ora12c/oradata/disk3/sysaux01.dbf';

ALTER DATABASE RENAME file
'/app/ora12c/oradata/DB12/system01.dbf'
TO '/app/ora12c/oradata/disk3/system01.dbf';

ALTER DATABASE RENAME file
'/app/ora12c/oradata/DB12/undotbs01.dbf'
TO '/app/ora12c/oradata/disk3/undotbs01.dbf';

ALTER DATABASE RENAME file
'/app/ora12c/oradata/DB12/temp01.dbf'
TO '/app/ora12c/oradata/disk3/temp01.dbf';
//데이터 파일의 등록 정보를 수정해주는 명령어


SELECT t.name tablespace_name, d.bytes, d.name file_name
FROM v$tablespace t, v$datafile d
WHERE t.ts#=d.ts#
ORDER BY 1;
// 데이터 파일은 이동됐지만 딕셔너리 정보가 수정 된 것을 확인

SELECT t.name tablespace_name, d.bytes,d.name file_name 
FROM v$tablespace t, v$tempfile d
WHERE t.ts#=d.ts#
ORDER BY 1;
// 템포러리 테이블 스페이스의 딕셔너리 정보 확인

SELECT name FROM v$controlfile;
// 컨트롤 파일 위치 확인
SELECT member FROM v$logfile;
// 리두로그  파일 위치 확인

!rm -rf /app/ora12c/oradata/DB12
// 불필요한 DB12 삭제

!ls /app/ora12c/oradata/
// disk1~5만 남아있다.

ALTER DATABASE OPEN;
// DB 오픈

 

임시 테이블 스페이스

- 정렬할때 사용. 정렬은 PGA안의 sort_area_size에서 시행한다. 만약 정렬해야 하는 데이터 크기에 비해 sort_area_size가 너무 작을 경우 sortset된 데이터는 temporary tablespace에 저장. 이렇게 전체 데이터가 모두 sortset 되면 다시 테이블 스페이스에서 merge 단계를 거쳐서 데이터를 출력한다.  

 

[실습]

CREATE TEMPORARY TABLESPACE <tablespace명>
TEMPFILE '' SIZE <크기>;
- Temporary TABLESPACE를 생성한다.
- Locally management가 default이다.
- Segment space management를 AUTO로 지정할 수 없다.
- 2절이 DATAFILE절이 아니라 TEMPFILE절 임에 주의한다.

ALTER DATABASE DEFAULT TEMPORARY TABLESPACE <tablespace명>;
- 지정된 tablespace를 default temporary tablespace로 정의한다.

SELECT tablespace_name, bytes, file_name FROM dba_temp_files;

// 템포러리 테이블 스페이스 조회

 

SELECT * FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME LIKE '%TEMP%';

// 디폴트 템포러리 테이블 스페이스 조회

 

DROP TABLESPACE temp;
// 현재 temp가 디폴트 템포러리 테이블 스페이스 이기때문에 삭제가 불가능하다

CREATE TEMPORARY TABLESPACE tmp
TEMPFILE '/app/ora12c/oradata/disk3/tmp01.dbf' SIZE 20M;
// 새로 템포러리 테이블스페이스로 사용할 temp 생성. CREATE절과 DATAFILE절만 써준다.

SELECT tablespace_name, bytes, file_name FROM dba_temp_files;

// 템포러리 테이블 스페이스 조회. tmp가 생긴것을 확인할 수 있다.

ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tmp;
// 디폴트 템포러리테이블 스페이스를 tmp로 변경

SELECT * FROM DATABASE_PROPERTIES 
WHERE PROPERTY_NAME LIKE '%TEMP%';

// 디폴트 템포러리 테이블 스페이스가 tmp로 변경된 것을 확인

DROP TABLESPACE temp;
// 사용자가 사용중일수도 있기때문에 삭제되지 않을 수 있다. 이 경우에 데이터 베이스를 재시작후 삭제해주면 삭제되는 것을 확인 할 수 있다.

!ls /app/ora12c/oradata/disk3/
!rm /app/ora12c/oradata/disk3/temp01.dbf
// temp01.dbf를 사용하지는 않지만 삭제 된 상태는 아니기때문에 삭제해준다.