9. 데이터베이스 구축

  • 흔히 데이터베이스를 구축한다고 하면 오라클, DB2, SQL 서버와 같은 DBMS를 설치하는 것인지 DBMS 위에 데이터를 저장하기 위한 공간을 구축하는 것인지 명확히 구분이 안 되는 경우가 있다.
    이 책에서 데이터베이스 구축은 데이터를 저장하기 위해서 DBMS에 데이터베이스를 생성하는 것을 의미한다.
    데이터베이스 엔진 설치가 아님을 기억하기 바란다.
  • 이 책에서는 데이터베이스 구축을 위해 오라클 DBMS를 이용하여 설명한다.
    기본적으로 DBMS 제품이 설치되어 있는 상태에서 어떻게 데이터베이스를 생성하는지에 대한 내용을 설명한다.
    OS별 DBMS 설치 메뉴는 한국 오라클의 홈페이지(http://www.oracle.com/global/kr/index.html)를 방문하여 설치 매뉴얼을 참조하면 된다.

데이터베이스를 구축하는 절차는 다음과 그림과 같이 진행된다.

1. 데이터베이스 구축을 위한 사전 준비

  • 데이터베이스를 설치하기 위해서는 분석, 설계 과정에서 다루었던 내용 중 기본적으로 데이터베이스 환경 정의서, 용량 산정서, 각종 오브젝트 설계서, 분산 환경 설계서가 필요하다.
    만약 설치하고자 하는 데이터베이스가 분산을 고려하지 않아도 된다면 분산 환경 설계서는 제외한다.
  • 여기에서는 데이터베이스 구축을 설명하기 위해 제품을 주문 거래하는 시스템을 정해 가상의 산출물을 작성하였다.
    각각의 산출물들은 설계 단계에서 작성되는 자료이며(데이터베이스 환경 설계서는 구축 시 작성되는 경우도 있음), 데이터베이스를 구축하기 위한 입력 자료가 되므로 반드시 산출물을 검토할 것을 권유한다.
    본문에서 제시된 산출물은 다음과 같다.
  • ERD
  • 테이블 정의서
  • 인덱스 정의서
  • 뷰 정의서
  • 테이블 스페이스 용량 산정서
  • 인덱스 스페이스 용량 산정서
  • 데이터파일 용량 산정서
  • 분산 설계서
  • 데이터베이스 환경 설계서
  • 시스템파일 용량 산정서
데이터베이스 구축 설명을 위한 간단한 업무 시나리오
우리 회사(㈜Pro-Medical)는 서울에 본사를 두고 전국적으로 10개의 지사를 둔 의약 제품 중간 유통 업체다. 이번 시스템은 서울 본사와 서울 지사에 대해서 우선적으로 데이터베이스를 구축하고 나머지 지사에 대해서는 추후 시스템을 확장하도록 한다.
본사에서는 의약 제품을 납품하는 업체들로부터 제품을 납품 받아서 단가 및 재고를 관리한다. 또한 전국에서 일하는 부서와 사원은 본사에서 일괄 관리하며, 모든 일의 처리는 해당 사원들이 담당한다. 지사에서는 고객으로부터 주문을 받으면 본사에서 관리하는 제품을 이용하여 주문된 제품이 있다면 고객에게 배송한다. 이때 배송을 담당하는 업체는 별도로 존재하며 우리 시스템에서는 기본 데이터만 관리한다.
사원 정보와 제품 정보는 본사에서 관리되지만 빠른 처리를 위해서 지사에도 동일한 데이터를 위치 시키도록 한다.
회계 시스템에서는 주문 관리 시스템에 있는 사원 정보를 이용한다. 그러나 급여에 관련된 정보는 보여주지 않는다.

시나리오에서 고려해야 할 사항 및 전제 사항

  • 본사 하나와 지사 하나에 대해서 고려한다.
  • 본사와 지사로 분리된 데이터베이스가 필요하다.
  • 외부 시스템과 연계할 경우에 데이터 보안이 필요하다.
  • 지사 데이터베이스에서 빠른 인터페이스를 필요로 한다.
  • 상세한 속성은 ERD에서 정의한다.
ERD
  • 속성 이름이 보이는 ERD
  • 컬럼 이름과 데이터타입이 보이는 ERD
테이블 정의서
  • ERD를 이용하여 각각의 테이블에 대한 구체적인 내용은 다음과 같이 테이블 정의서로 나타낸다.




인덱스 정의서
  • ERD에 설계된 각각의 인덱스에 대한 구체적인 내용은 다음과 같다.
    설계 단계에서 인덱스를 정의하였으므로 PK와 FK는 기본적으로 인덱스를 지정하고 조회 조건에 많이 포함되는 컬럼에 대해 인덱스를 정의하였다.
뷰 정의서
  • 설계 단계에서 크러드 메트릭스를 분석한 결과 주문과 주문목록은 항상 같이 프로세싱이 발생하여 테이블이 조인되었다(가정).
    그래서 주문과 주문목록 테이블에 대해 개발의 편의성과 단순성을 위해 뷰를 설계하였다.
    또한 ERD에는 표현되지 않았지만 외부 시스템인 회계 시스템에서 주문관리 시스템의 사원을 참조하려 하여 사원의 개인적인 정보를 제외한 일반적인 사항에 대해 보안 뷰를 설계하였다.
테이블 스페이스 용량 산정서
  • 각 테이블에 대한 트랜잭션양, 데이터 보관 주기 등을 고려하여 용량을 산정하였고 테이블 용량에 따라 테이블 스페이스 용량을 산정하였다.
인덱스 스페이스 용량 산정서
  • 각 테이블에 대한 트랜잭션양, 데이터보관 주기와 인덱스 수를 고려하여 DBMS에서 제공하는 계산방식에 따라 용량을 산정하였다.
데이터파일 용량 산정서
  • 테이블 스페이스 용량이 산정됨에 따라 각각의 테이블 스페이스에서 이용하는 데이터파일을 조사하여 다음과 같이 용량을 산정하였다.
데이터베이스 분산 환경 설계서
  • 테이블이 본사와 지사로 분산되어 생성되어야 하므로 본사와 지사의 분산 환경을 다음과 같이 설계하였다.
데이터베이스 환경 설게서
  • 오라클 데이터베이스에서 데이터베이스 생성 시 반영해야 할 각종 환경에 대한 값을 설게하였다.


데이터베이스 시스템파일 용량 산정서
  • 환경설정에 대한 값을 이용하여 데이터베이스 시스템파일들이 설치되어야 할 디렉토리를 지정하고 용량을 산정하였다.

2. 데이터베이스 생성

  • 오라클에서 데이터베이스를 생성하기 위해서는 두 가지 방법이 있다.
    데이터베이스를 생성하기 위해 환경 파일 등을 스크립트에 일일이 지정하여 수작으로 생성(Manually Creating)하는 방법이 있고,
    ODCA(The Oracle Database Configuration Assistants)라는 그래픽 툴을 사용하여 손쉽게 생성하는 방법이 있다.
    데이터베이스는 데이터를 저장하기 위한 공간도 되지만 데이터베이스 성능도 무척 중요한 사항이다.
    자동화된 툴에서는 운영체제 환경이나 디스크 수, 분산 환경 등 복잡한 시스템과 업무 환경 모두를 해당 사용 환경에 맞게 적용하여 초기에 데이터베이스를 생성하기는 불가능하다.
    하지만 초기에 데이터베이스를 구축한 이후에 오라클 파라미터값에 대한 수정이 가능하고 데이터파일을 추가하는 것이 가능하므로 ODCA를 통해서도 충분히 전문적인 데이터베이스 생성이 가능하다.

3. 테이블 스페이스 생성

  • 테이블 스페이스는 각종 오브젝트(테이블, 인덱스, 뷰 등)가 실제 데이터 파일에 저장되기 위한 공간을 정의하는 데이터베이스 오브젝트
  • 테이블 스페이스 용량 산정서, 인덱스 스페이스 용량 신청서, 데이터파일 용량 산정서를 이용하여 테이블 스페이스 생성
DDL 문장 작성
본사 DDL 문장의 작성
  • 본사의 테이블 스페이스 스토리지 옵션은 일괄적으로 INITIAL 1024K, NEXT 512K, MAXEXTENTS 128, PCTINCREASE 0으로 적용한다.
    도한 인덱스 스페이스 스토리지 옵션은 INITIAL 512K, NEXT 256K, MAXEXTENTS 128, PCTINCREASE 0 으로 적용한다.

SPOOL ts_cre_bonsa.log
-- 테이블 스페이스(TS001)
CREATE TABLESPACE TS001
	DATAFILE '/data/test/db1/DF001.DBF01' SIZE 55M
    DEFAULT STORAGE ( 
    		INITIAL 1024K
            NEXT 512K
            MAXEXTENTS 128
            PCTINCREASE 0
    );

-- 인덱스 스페이스(IS001)
CREATE TABLESPACE IS001
	DATAFILE '/data/test/db1/DF001.DBF02' SIZE 30M
    DEFAULT STORAGE (
    		INITIAL 512K
            NEXT 256K
            MAXEXTENTS 128
            PCTINCREASE 0
    );
SPOOL OFF

지사 DDL 문장의 작성
  • 지사의 테이블 스페이스 스토리지 옵션은 일괄적으로, INITIAL 1024K, NEXT 64K, MAXEXTENTS 64, PCTINCREASE 0으로 적용한다.
    또한 인덱스 스페이스 스토리지 옵션은, INITIAL 512K, NEXT 64K, MAXEXTENTS 64, PCTINCREASE 0을 적용한다.

SPOOL ts_cre_jisa.log
-- 테이블 스페이스(TS002)
CREATE TABLESPACE TS002
	DATAFILE '/data1/test/db2/DF002.DBF01' SIZE 45M
    DEFAULT STORAGE ( 
    		INITIAL 1024K
            NEXT 64K
            MAXEXTENTS 64
            PCTINCREASE 0
    );

-- 인덱스 스페이스(IS001)
CREATE TABLESPACE IS002
	DATAFILE '/data1/test/db2/DF002.DBF02' SIZE 25M
    DEFAULT STORAGE (
    		INITIAL 512K
            NEXT 64K
            MAXEXTENTS 64
            PCTINCREASE 0
    );
SPOOL OFF

DDL 문장의 실행
DDL 문장의 실행

SQL>@ts_cre_bonsa.sql

SQL>@ts_cre_jisa.sql

테이블 스페이스 생성 확인 및 실행 결과
테이블 스페이스 생성 확인

PROMPT =====================================
PROMPT     테이블 스페이스 확인 스크립트
PROMPT ====================================


COL TABLESPACE_NAME FORMAT A10
COL DATAFILE FORMAT A50
COL SZ_KB FORMAT 9,999,999

SELECT TABLESPACE_NAME,
			FILE_NAME AS DATAFILE,
			(BYTES/1024) AS SZ_KB
		FROM DBA_DATA_FILES ;

- 실행결과
TABLESPACE DATAFILE                                                SZ_KB
---------- -------------------------------------------------- ----------
TS001      /data/test/db1/DF001.DBF01                             56,320
IS001      /data/test/db1/DF001.DBF02                             30,720
TS002      /data1/test/db2/DF002.DBF01                            46,080
IS002      /data1/test/db2/DF002.DBF02                            25,600

4. 사용자 및 역할과 권한 지정

  • 데이터베이스를 사용할 수 있도록 사용자 계정을 생성하고 역할과 권한을 지정
  • 본사의 사용자 이름은 BONSA01이고, 패스워드도 BONSA01 테이블 스페이스는 USERS고, 임시 테이블 스페이스는 TEMP
  • 지사의 사용자 이름은 JISA01이고, 패스워드도 JISA01 테이블 스페이스는 USERS고, 임시 테이블 스페이스는 TEMP
본사 사용자 생성 DDL 문장 작성

SPOOL user_cre_bonsa.sql

CREATE USER BONSA01 IDENTIFIED BY BONSA01
DEFAULT TABLESPACE TS001
TEMPORARY TABLESPACE TEMP;

SPOOL OFF

지사 사용자 생성 DDL 문장 작성

SPOOL user_cre_jisa.sql

CREATE USER JISA01 IDENTIFIED BY JISA01
DEFAULT TABLESPACE TS002
TEMPORARY TABLESPACE TEMP;

SPOOL OFF

SQL>@user_cre_bonsa.sql
User created.
SQL>@user_cre_jisa.sql
User created.

# 사용자 생성 확인 및 실행 결과
PROMPT ====================================================
PROMPT     사용자 생성 확인 스크립트
PROMPT ====================================================

COL USERNAME FORMAT A15
COL DEF_TBS FORMAT A15
COL TMP_TBS FORMAT A15

- 실행 결과
USERNAME        DEF_TBS         TMP_TBS         PROFILE
--------------- --------------- --------------- ------------------------------
BONSA01         TS001           TEMP            DEFAULT
JISA01          TS002           TEMP            DEFAULT

역할 생성 DDL 문장의 작성
본사 역할 이름을 BONSA_ROLE로 생성

SPOOL role_cre_bonsa.sql

CREATE ROLE BONSA_ROLE NOT IDENTIFIED;

GRANT CREATE SESSION, CREATE TABLE,
			CREATE VIEW, 
			ALTER ROLLBACK SEGMENT
TO BONSA_ROLE;

SPOOL OFF

지사 역할 이름을 JISA_ROLE로 생성

SPOOL role_cre_jisa.log

CREATE ROLE JISA_ROLE NOT IDENTIFIED;

GRANT CREATE SESSION, CREATE TABLE, 
      CREATE VIEW, 
      ALTER ROLLBACK SEGMENT 
TO JISA_ROLE;

SPOOL OFF


SQL>@role_cre_bonsa.sql
Role created.

Grant succeeded.

SQL>@role_cre_jisa.sql
Role created.

Grant succeeded.

PROMPT ====================================================
PROMPT     역할 생성 확인 스크립트
PROMPT ====================================================

COL ROLE FORMAT A35

SELECT ROLE FROM DBA_ROLES;


SQL>COL ROLE FORMAT A35

SQL>SELECT ROLE FROM DBA_ROLES;


ROLE
-----------------------------------
......
BONSA_ROLE
JISA_ROLE

사용자에게 권한을 부여
  • 본사 데이터베이스 사용자 이름이 BONSA01이고 본사 역할 이름을 BONSA_ROLE
  • 지사 데이터베이스 사용자 이름이 JISA01이고 지사 역할 이름을 JISA_ROLE

SQL>GRANT BONSA_ROLE TO BONSA01 ;
Grant succeeded.

SQL>GRANT JISA_ROLE TO JISA01;
Grant succeeded.

PROMPT ====================================================
PROMPT     권한 부여 확인 스크립트
PROMPT ====================================================

COL GRANTEE FROMAT A10
COL GRANTED_ROLE FORMAT A30

SELECT GRANTEE, 
       GRANTED_ROLE 
	FROM DBA_ROLE_PRIVS ;

-- 실행 결과
GRANTEE                        GRANTED_ROLE
------------------------------ ------------------------------
......
BONSA01                        BONSA_ROLE
JISA01                         JISA_ROLE

5. 오브젝트 생성

  • 테이블, 인덱스, 뷰를 설계된 산출물을 참조하여 생성
테이블 생성 DDL 문장의 작성
  • 분산 환경 설계서, 테이블 설계서와 테이블 스페이스 용량 산정서를 참조하여 생성
  • 테이블 스토리지 옵션은 INITIAL 1M, NEXT 1M, PCTINCREASE 0으로 지정

SPOOL tab_cre_bonsa.sql

CREATE TABLE DEPT (
    DEPTNO    NUMBER(2) NOT NULL, 
    DEPTNM    VARCHAR2(14) NOT NULL,
    LOC          VARCHAR2(14),
    CHARGE   VARCHAR2(20)
) TABLESPACE TS001
  STORAGE ( INITIAL 1M
               NEXT 1M
               PCTINCREASE 0);
ALTER TABLE DEPT ADD CONSTRAINT DEPT_PK PRIMARY KEY(DEPTNO);

CREATE TABLE EMP (
	EMPNO	NUMBER(4) NOT NULL,
    EMPNM	VARCHAR2(14) NOT NULL,
    JOB		VARCHAR2(9) NULL,
    HIREDATE	DATE NULL,
    SAL		NUMBER(10,2) NULL,
    DEPTNO	NUMBER(2) NOT NULL
) TABLESPACE TS001
  STORAGE ( INITIAL 1M
               NEXT 1M
               PCTINCREASE 0);
ALTER TABLE EMP ADD CONSTRAINT EMP_PK PRIMARY KEY(EMPNO) ;               
      
CREATE TABLE SUPPLIER (
	SUPNO	NUMBER(4) NOT NULL,
	SUPNM	VARCHAR2(14) NOT NULL,
    SUPADDR	VARCHAR2(60) NOT NULL,
    SUPPOST	VARCHAR2(30) NULL,
    SUPTEL  VARCHAR2(20) NULL
) TABLESPACE TS001
  STORAGE ( INITIAL 1M
               NEXT 1M
               PCTINCREASE 0);
ALTER TABLE SUPPLIER ADD CONSTRAINT SUP_PK PRIMARY KEY(SUPNO) ;  

CREATE TABLE ITEM (
	ITEMCD	VARCHAR2(10) NOT NULL,
	ITEMNM	VARCHAR2(20) NOT NULL,
    ITEMQTY	NUMBER(10) NOT NULL,
    IPRICE	NUMBER(10) DEFAULT 0 NULL,
    COLOR	VARCHAR2(10) NULL,
    MADEDATE DATE NULL,
    SUPNM   NUMBER(4) NOT NULL
) TABLESPACE TS001
  STORAGE ( INITIAL 1M
               NEXT 1M
               PCTINCREASE 0);
ALTER TABLE ITEM ADD CONSTRAINT ITEM_PK PRIMARY KEY(ITEMCD) ;
         
-- FOREIGN KEY 지정
ALTER TABLE EMP ADD CONSTRAINT EMP_DEPT_FK01 
				FOREIGN KEY (DEPTNO) REFERENCES DEPT;
ALTER TABLE ITEM ADD CONSTRAINT DEPT_SUPPLIER_FK01
				FOREIGN KEY (SUPNM) REFERENCES SUPLIER;
SPOOL OFF

지사 사용자 생성 DDL 문장의 작성

SPOOL tab_cre_jisa.log

CREATE TABLE CUST (
    CUSTNO	NUMBER(4) NOT NULL,
    CUSTNM	VARCHAR2(14) NOT NULL,
    CADDR	VARCHAR2(60) NOT NULL,
    CPOST	VARCHAR2(30) NULL,
    CTEL	VARCHAR2(20) NULL,
    CEMAIL	VARCHAR2(40) NULL
) TABLESPACE TS002
  STORAGE (INITIAL 1M
               NEXT 1M
               PCTINCREASE 0);
ALTER TABLE CUST ADD CONSTRAINT CUST_PK PRIMARY KEY(CUSTNO);

CREATE TABLE ORDER01 (
    ORDERNO	NUMBER(6) NOT NULL,
    ORDERTYPE	VARCHAR2(6) NOT NULL,
    ORDERDATE	DATE NOT NULL,
    CUSTNO	NUMBER(4) NOT NULL,
    EMPNO	NUMBER(4) NOT NULL,
    DELIVNO	NUMBER(4) NOT NULL
) TABLESPACE TS002
  STORAGE (INITIAL 1M
               NEXT 1M
               PCTINCREASE 0);
ALTER TABLE ORDER01 ADD CONSTRAINT ORDER01_PK PRIMARY KEY(ORDERNO);

CREATE TABLE ORDERITEM (
    ORDERNO	NUMBER(6) NOT NULL,
    ITEMCD	VARCHAR2(10) NOT NULL,
    ORDERQTY	NUMBER(10) NOT NULL
) TABLESPACE TS002
  STORAGE (INITIAL 1M
               NEXT 1M
               PCTINCREASE 0);
ALTER TABLE ORDERITEM ADD CONSTRAINT ORDERITEM_PK PRIMARY KEY(ORDERNO, ITEMCD);

CREATE TABLE DELIVERY (
    DELIVNO	NUMBER(4) NOT NULL,
    DDATE	DATE NOT NULL,
    COMPNO	NUMBER(4) NOT NULL
) TABLESPACE TS002
  STORAGE (INITIAL 1M
               NEXT 1M
               PCTINCREASE 0);
ALTER TABLE DELIVERY ADD CONSTRAINT DELIVERY_PK PRIMARY KEY(DELIVNO);

-- FOREIGN KEY 지정
ALTER TABLE ORDER01 ADD CONSTRAINT ORDER_DELIVERY_FK01
				FOREIGN KEY (DELIVNO) REFERENCES DELIVERY;
ALTER TABLE ORDER01 ADD CONSTRAINT ORDER_CUST_FK01
				FOREIGN KEY (CUSTNO) REFERENCES CUST;
ALTER TABLE ORDER01 ADD CONSTRAINT ORDERITEM_ORDER_FK01
				FOREIGN KEY (DELIVNO) REFERENCES ORDER01 ;

SPOOL OFF

테이블 생성 DDL 문장의 실행

SQL>@tab_cre_bonsa.sql

SQL>@tab_cre_jisa.sql

테이블 생성 확인 및 실행 결과

PROMPT ================================
PROMPT          테이블 생성 확인 스크립트
PROMPT ================================

SQL>COL SEGMENT_NAME FORMAT A15
SQL>COL TABLESPACE_NAME FORMAT A10

SQL>SELECT SEGMENT_NAME, ROUND(INITIAL_EXTENT/1024,0) INI_KB,
			ROUND(NEXT_EXTENT/1024,0) NXT_KB, ROUND(BYTES/1024,0) TOT_KB,
			PCT_INCREASE PCT, EXTENTS, TABLESPACE_NAME
		FROM USER_SEGMENTS
		WHERE SEGMENT_TYPE = 'TABLE'
		AND TABLESPACE_NAME IN('TS001', 'TS002') ;


SEGMENT_NAME        INI_KB     NXT_KB     TOT_KB        PCT    EXTENTS TABLESPACE
--------------- ---------- ---------- ---------- ---------- ---------- ----------
ITEM                  1024                  1024                    16 TS001
SUPPLIER              1024                  1024                    16 TS001
EMP                   1024                  1024                    16 TS001
DEPT                  1024                  1024                    16 TS001
ORDERITEM             1024                  1024                    16 TS002
CUST                  1024                  1024                    16 TS002


PROMPT ================================
PROMPT        PRIMARY KEY 생성 확인 스크립트
PROMPT ================================

COL TABLE_NAME FORMAT A20
COL CONSTRAINT_NAME FORMAT A20

SQL>SELECT A.TABLE_NAME, B.CONSTRAINT_NAME
						FROM   USER_TABLES A, USER_CONSTRAINTS B
						WHERE A.TABLE_NAME=B.TABLE_NAME(+)
						AND B.CONSTRAINT_TYPE(+) = 'P'
						AND TABLESPACE_NAME IN('TS001', 'TS002') ;


TABLE_NAME           CONSTRAINT_NAME
-------------------- --------------------
ORDERITEM            ORDERITEM_PK
CUST                 CUST_PK
ITEM                 ITEM_PK
SUPPLIER             SUP_PK
EMP                  EMP_PK
DEPT                 DEPT_PK


PROMPT ================================
PROMPT        PRIMARY KEY 생성 확인 스크립트
PROMPT ================================

SQL>COL CONSTRAINT_NAME FORMAT A20
SQL>COL R_CONSTRAINT_NAME FORMAT A20

SQL>SELECT CONSTRAINT_NAME, R_CONSTRAINT_NAME, STATUS
	FROM USER_CONSTRAINTS
	WHERE OWNER IN('BONSA01', 'JISA01');

CONSTRAINT_NAME      R_CONSTRAINT_NAME    STATUS
-------------------- -------------------- --------
DEPT_SUPPLIER_FK01   SUP_PK               ENABLED
EMP_DEPT_FK01        DEPT_PK              ENABLED
DEPT_PK                                   ENABLED
EMP_PK                                    ENABLED
SUP_PK                                    ENABLED
ITEM_PK                                   ENABLED

인덱스 생성 DDL 문장 작성

-- 본사 인덱스 생성
SPOOL index_cre_bonsa.log
CREATE INDEX I_EMP01 ON EMP (DEPTNO ASC) TABLESPACE IS001;
SPOOL OFF

-- 지사 인덱스 생성
SPOOL index_cre_jisa.log
CREATE INDEX I_ORDER01 ON ORDER01 (DATE ASC) TABLESPACE IS002;
CREATE INDEX I_ORDER02 ON ORDER01 (CUSTNO ASC) TABLESPACE IS002;
CREATE INDEX I_ORDER03 ON ORDER01 (EMPNO ASC) TABLESPACE IS002;
CREATE INDEX I_ITEM01 ON ITEM (SUPNO ASC) TABLESPACE IS002;
CREATE INDEX I_ITEM02 ON ITEM (MADEDATE ASC) TABLESPACE IS 002;
SPOOL OFF

6. 분산 환경 생성

  • 모든 오브젝트가 생성되었으므로 분산 환경 설계서와 데이터베이스 환경 설계서를 이용하여 분산된 데이터베이스 사이의 환경을 설정하고 오브젝트를 생성한다.
  • 오라클의 데이터베이스간 통신을 위한 분산 환경에는 세 가지 사항이 적용되어 있어야 한다.
    • 연결 대상인 데이터베이스 쪽(Remote) 서버에 리스너가 기동되어야 한다.
    • 연결하고자 하는 쪽에서 Net8 클라이언트가 설치되어 있으면서 Tnsnames.ora 파일이 구성되어야 한다.
    • 로컬 데이터베이스와 원격 데이터베이스간 데이터베이스 링크를 설정하면 분산 환경 구성이 완료 된다.
  • 원격 데이터베이스 리스너 기동
    • 먼저 Net8 Configuration Assistant에서 리스너 환경을 설정한다.
      리스너의 기동은 명령으로 처리해도 되고 시작 프로그램 -> 제어판 -> 관리 도구 -> 시스템에서 오라클 리스너를 구동할 수 있다.
    • lsnrctl start
  • 로컬 서버 Tnsnames.ora 파일 구성
  • 로컬의 Net8 환경 구성 '$ORACLE_HOME/network/admin/' 에서 Tnsnames.ora 파일을 직접 수정해도 되고 Net8 Configuration Assistant 에서 지정해도 된다.

BONSA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521) ) )
    (CONNECT_DATA =
      (SERVICE_NAME = BONSA) ) )

  • 데이터베이스 링크 생성(Database Link)
    데이터베이스 링크는 참조를 하려는 쪽인 로컬에서 데이터베이스 링크 생성 권한을 가진 사용자가 생성한다.

SQL> CREATE PUBLIC DATABASE LINK H2U1
       CONNECT TO BONSA01 IDENTIFIED BY BONSA01
       USING 'BONSA';  <-- tnsnames.ora 에서 지정한 원격 데이터 베이스명

  • 테이블 생성 DDL 문장의 작성
    • 본사 테이블 생성 DDL 문장의 작성
    • 분산 환경 설계서에서 각 테이블의 어느 위치에 생성되는지를 확인한다.
    • 테이블 설계서와 테이블 스페이스 용량 산정서를 참조하여 DDL 문장을 생성한다.(단 테이블의 스토리지 옵션은 INITIAL 1M, NEXT 1M, PCTINCREASE 0 으로 지정)
  • 스냅샷 테이블 생성
    • 분산 환경에 따른 테이블 운영 방식은 여러 가지 방법이 있을 수 있다.
      기존에는 분산된 데이터베이스에 모두 테이블을 생성하여 애플리케이션에서 제어하는 형태로 처리하였지만, 요즘에는 DBMS에서 분산 데이터베이스를 처리하기 위한 기능을 제공한다.
      스냅샷 기능은 바로 이 데이터베이스 분산 환경을 처리하기 위한 기능이다.

(1) 본사 환경 설정

  • 설계된 사원 테이블과 제품 테이블에 스냅샷 로고 테이블을 생성한다.

CREATE SNAPSHOT LOG ON EMP
      TABLESPACE TS001
      STORAGE(INITIAL 1M NEXT 1M PCTINCREASE 0) ;
CREATE SNAPSHOT LOG ON ITEM
      TABLESPACE TS001
      STORAGE(INITIAL 1M NEXT 1M PCTINCREASE 0) ;

(2) 지사 환경 설정

  • 지사 데이터베이스에서 스냅샷을 생성한다.

CREATE SNAPSHOT LOG ON EMP
      TABLESPACE TS002 STORAGE(INITIAL 1M NEXT 1M PCTINCREASE 0)
      USING INDEX TABLESPACE IS002 STORAGE (MINEXTENTS 1 PCTINCREASE 0)
REFRESH FAST
 START WITH SYSDATE NEXT TRUNC(SYSDATE) + 1 + (20/24) <-- REFRESH 주기
AS SELECT * FROM EMP@BONSA ;   <-- 데이터베이스 링크명

CREATE SNAPSHOT ITEM
     TABLESPACE TS002 STORAGE (MINEXTENTS 1 PCTINCREASE 0)
     USING INDEX TABLESPACE IS002 STORAGE (MINEXTENTS 1 PCTINCREASE 0)
REFRESH FAST
 START WITH SYSDATE NEXT TRUNC(SYSDATE) + 1 + (20/24)  <-- REFRESH 주기
 AS SELECT * FROM ITEM@GONSA ;  <-- 데이터베이스 링크명

  • 위는 하루 중 오후 8시(1+(20/24))에 스냅샷 문장이 기동된다.
    그러면 본사에 있는 테이블의 내용이 지사에 테이블로 전송되어 지사에서도 동일한 내용을 볼 수 있다.