2009년 5월 28일 목요일

ORACLE의 논리적 저장구조 및 계정 생성, 할당

저장구조 : BLOCK, EXTENT, SEGMENT, TABLESPACE, DATABASE 순으로 단위가 점점 커진다.
BLOCK :  데이터의 최소 저장단위 이면서 데이터를 읽어들이는 최소단위이다. 그 SIZE 는 2KB, 4KB, 8KB, 16KB, 32KB 가 있으며 주로 8KB이다.

SELECT VALUE
FROM V$PARAMETER
WHERE NAME = 'db_block_size';


실제로 환경변수로써 BLOCK SIZE를 알아보면 위와 같다.

EXTENT : SEGMENT 의 할당단위로써 1 EXTENT는 8 BLOCK이다. 고로 1EXTENT는 64KB이다.

SEGMENT : 테이블 또는 인덱스를 저장하는 단위이다.

TABLESPACE : 테이블과 인덱스에 저장되는 DATA들의 물리적인 저장공간(경로명\파일명)에 MAPPING되는 논리적인 저장공간이다.
SYS계정에서 TABLESPACE를 만들어 보자.

CREATE TABLESPACE PROJECTTBS
DATAFILE 'D:\PROJECTDATA\PROJECTTBS01.DBF' SIZE 8M
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;

TABLESPACE의 선언과 함께 NAME을 지정하고, DATAFILE이 기록될 장소와 이름을 지정, 최초에 만들 SIZE를 설정하고 확장관리와 영역관리에 대한 정보를 기입한다

SELECT *
FROM DBA_TABLESPACES
WHERE TABLESPACE_NAME = 'PROJECTTBS';

DBA_TABLESPACES : 모든 TABLESPACE에 대한 정보를 가지고 있는 VIEW 이다.

SELECT *
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME = 'PROJECTTBS';


DBA_DATA_FILES : DATA FILE에 대한 정보를 가지고 있다.
위에서 확인하듯이 BYTE는 8388608로 되어 있음을 알 수 있다. 이는 생성시에 SIZE를 8M로 지정하였기 때문이다. 이를 확인해보자.

SELECT 8192 * 1024 FROM DUAL;


생성에 따른 정보를 알아보기 위해 테이블을 만들어 보자.

CREATE TABLE TBL_TEST1
(NAME    VARCHAR2(10)
,MPHONE VARCHAR2(20)
) TABLESPACE USERS;

CREATE TABLE TBL_TEST2
(NAME    VARCHAR2(10)
,MPHONE VARCHAR2(20)
) TABLESPACE PROJECTTBS;

SELECT *
FROM USER_TABLES
WHERE TABLE_NAME IN ('TBL_TEST1', 'TBL_TEST2');


계정 생성 및 권한 부여
ORAUSER1 이라는 계정을 생성한다. IDENTIFIED BY문에 따른 문자열은 해당 계정에 대한 PASSWORD가 된다. DAFAULT로 사용할 TABLESPACE를 지정하고, TEMPORARY로 사용하게될 TABLESPACE에 대한 정보를 기입힌다.

CREATE USER ORAUSER1 IDENTIFIED BY OCP007$
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;

서버에 접근할 수 있도록 SESSION을 생성할 권한을 부여한다.

GRANT CREATE SESSION TO ORAUSER1;

ORACLE에서의 계정의 생성은 순수한 계정의 생성만을 뜻한다. 즉, 그에 따른 권한을 관리자가 직접 적용하여야 하며, 관련 DATA가 저장될 TABLESPACE에 대한 할당 역시 관리자에 의해 지정되어야 한다. ORAUSER1 계정에게 테이블을 생성할 수 있도록 권한을 부여한다.

GRANT CREATE TABLE TO ORAUSER1;

ORAUSER1 사용자에게 부여되어진 SYSTEM PRIVILEGE 를 조회해 본다.

SELECT *
FROM DBA_SYS_PRIVS
WHERE GRANTEE = 'ORAUSER1';

DBA_SYS_PRIVS : 모든 사용자와 역할에 부여된 시스템 권한을 확인한다.


ORAUSER1 계정에 부여된 DEFAULT TABLESPACE 와 TEMPORARY TABLESPACE를 조회해본다.

SELECT DEFAULT_TABLESPACE,
            TEMPORARY_TABLESPACE
FROM DBA_USERS
WHERE USERNAME = 'ORAUSER1';


DBA_USERS : DATABASE의 모든 사용자에 대한 정보를 가지고 있다. 

생성한 ORAUSER1 사용자에게 테이블을 생성할 수 있도록 TABLESPACE 에 대한 할당량을 부여해 주어야 한다. ALTER ~ QUATA 명령어로 용량과 지정할 TABLESPACE를 지정한다.

ALTER USER ORAUSER1
QUOTA 2M ON USERS;

생성한 ORAUSER1 사용자에게 부여한 할당량의 크기를 조회해본다.

SELECT *
FROM DBA_TS_QUOTAS
WHERE USERNAME = 'ORAUSER1';


DBA_TS_QUOTAS : 모든 사용자에 대한 TABLESPACE 할당 정보를 가지고 있다.

ORAUSER1 계정에서 임의의 테이블을 만들어 보자.

CREATE TABLE TBL_ORAUSER1_MEMBER1
(ID       VARCHAR2(20)
,NAME  VARCHAR2(10)
);
SELECT *
FROM USER_USERS;

SELECT DEFAULT_TABLESPACE
FROM USER_USERS;

USER_USERS : 현재 사용자에 대한 정보를 가지고 있다.

SELECT *
FROM USER_TS_QUOTAS;


USER_TS_QUOTAS : 사용자의 TABLESPACE에 대한 할당 정보를 가지고 있다.

SELECT USERNAME,PRIVILEGE,ADMIN_OPTION
FROM USER_SYS_PRIVS;.


USER_SYS_PRIVS : 현재 사용자에 대한 시스템 권한에 대한 정보를 가지고 있다.

ORAUSER1에서 새로 만든 OJECTTBS TABLESPACE에 저장하도록 테이블을 만들어 보자.

CREATE TABLE TBL_ORAUSER1_MEMBER2
(ID       VARCHAR2(20)
,NAME  VARCHAR2(10)
) TABLESPACE PROJECTTBS;


위에서 설명 했듯이 TABLESPACE에 대한 할당을 관리자가 직접 할당하여야 하므로, 지정되지 않은 TABLESPACE인 PROJECTTBS에 대한 할당량이 없으므로 해당 TABLESPACE에 TABLE을 만들 수 없다.

SELECT TABLE_NAME, TABLESPACE_NAME
FROM USER_TABLES
WHERE TABLE_NAME IN ('TBL_ORAUSER1_MEMBER1',
                                     'TBL_ORAUSER1_MEMBER2');


USER_TABLES : 사용자가 소유한 관계 테이블에 대한설명을 가지고 있다.

SYS계정에서 ORAUSER2와 ORAUSER3을 만들어 보자.

CREATE USER ORAUSER2 IDENTIFIED BY OCP007$
DEFAULT TABLESPACE PROJECTTBS
TEMPORARY TABLESPACE TEMP
QUOTA 4M ON PROJECTTBS;

CREATE USER ORAUSER3 IDENTIFIED BY OCP007$
DEFAULT TABLESPACE PROJECTTBS
TEMPORARY TABLESPACE TEMP
QUOTA UNLIMITED ON PROJECTTBS;

GRANT CREATE SESSION, CREATE TABLE
TO ORAUSER2, ORAUSER3;

위의 쿼리문은 계정 생성 시에 TABLESPACE에 대한 영역 할당을 포함하여 한번에 생성하는 것이다. 다만 PRIVILEGE에 대한 권한은 생성시에 할당 할 수 없기 때문에 GRANT 명령어를 이용, 관리자 권한으로 별도 할당하여야 한다.

ORAUSER2와 ORAUSER3에서 테이블을 만들어 보자.

CREATE TABLE TBL_ORAUSER2_MEMBER1
(ID       VARCHAR2(20)
,NAME  VARCHAR2(10));

CREATE TABLE TBL_ORAUSER3_MEMBER1
(ID       VARCHAR2(20)
,NAME  VARCHAR2(10));

이에 대한 정보를 SYS 계정에서 확인해 보자.

SELECT OWNER, TABLE_NAME, TABLESPACE_NAME
FROM DBA_TABLES
WHERE TABLE_NAME
IN ('TBL_ORAUSER1_MEMBER1',
     'TBL_ORAUSER2_MEMBER1',  'TBL_ORAUSER3_MEMBER1');


DBA_TABLES : DATABASE에 존재하는 모든 관계 테이블에 대한 설명을 가지고 있다.

SELECT *
FROM DBA_TS_QUOTAS
WHERE USERNAME IN('ORAUSER1', 'ORAUSER2', 'ORAUSER3');

ORAUSER1에게 TABLESPACE를 사용 할 수 있도록 할당한다.

ALTER USER ORAUSER1
QUOTA 1M ON PROJECTTBS;

ORAUSER1에서 두번째 테이블을 만들어 보자.

CREATE TABLE TBL_ORAUSER1_MEMBER2
(ID       VARCHAR2(20)
,NAME  VARCHAR2(10)
) TABLESPACE PROJECTTBS;

그에 대한 정보를 확인해 보자.

SELECT TABLE_NAME, TABLESPACE_NAME
FROM USER_TABLES
WHERE TABLE_NAME IN ('TBL_ORAUSER1_MEMBER1', 'TBL_ORAUSER1_MEMBER2');

SYS에서 전체 TABLESPACE에 대한 할당 정보를 확인해보자.

SELECT *
FROM DBA_TS_QUOTAS
WHERE USERNAME IN('ORAUSER1', 'ORAUSER2', 'ORAUSER3');


TEMPORARY TABLESPACE의 용도 : PGA(PROGRAM GLOBAL AREA) 공간을 보충하기 위해 TEMPORARY TABLESPACE를 사용하며, SYSTEM MEMORY의 한정된 공간을 충당하는데에 사용된다. 특히, 검출할 데이터가 많을 경우 TEMPORARY TABLESPACE에서 메모리를 충당한다. 
TEMPORARY에 대한 정보를 찾아서 확인해 보자.

SELECT *
FROM DBA_TABLESPACES
WHERE CONTENTS = 'TEMPORARY';

실제 데이타가 저장되어 지는 위치를 확인해 보자

 SELECT *
 FROM DBA_DATA_FILES; 

TEMP 파일에 대한 정보를 확인해 보자.

 SELECT *
 FROM DBA_TEMP_FILES;

DBA_TEMP_FILES : DATABASE의 임시 파일에 대한 정보를 가지고 있다.

댓글 없음:

댓글 쓰기