Tibero 관리자안내서 Tibero 5 Copyright 2013 TIBERO Co., Ltd. All Rights Reserved.
Copyright Notice Copyright 2013 TIBERO Co., Ltd. All Rights Reserved. 대한민국경기도성남시분당구서현동 272-6 우 ) 463-824 Restricted Rights Legend All TIBERO Software (Tibero ) and documents are protected by copyright laws and the Protection Act of Computer Programs, and international convention. TIBERO software and documents are made available under the terms of the TIBERO License Agreement and may only be used or copied in accordance with the terms of this agreement. No part of this document may be transmitted, copied, deployed, or reproduced in any form or by any means, electronic, mechanical, or optical, without the prior written consent of TIBERO Co., Ltd. 이소프트웨어 (Tibero ) 사용설명서의내용과프로그램은저작권법, 컴퓨터프로그램보호법및국제조약에의해서보호받고있습니다. 사용설명서의내용과여기에설명된프로그램은 TIBERO Co., Ltd. 와의사용권계약하에서만사용이가능하며, 사용권계약을준수하는경우에만사용또는복제할수있습니다. 이사용설명서의전부또는일부분을 TIBERO의사전서면동의없이전자, 기계, 녹음등의수단을사용하여전송, 복제, 배포, 2차적저작물작성등의행위를하여서는안됩니다. Trademarks Tibero is a registered trademark of TIBERO Co., Ltd. Other products, titles or services may be registered trademarks of their respective companies. Tibero 는 TIBERO Co., Ltd. 의등록상표입니다. 기타모든제품들과회사이름은각각해당소유주의상표로서참조용으로만사용됩니다. Open Source Software Notice This product includes open source software developed and/or licensed by "OpenSSL," "RSA Data Security, Inc.," "Apache Foundation," "Jean-loup Gailly and Mark Adler," and "Paul Hsieh's hash". Information about the afore mentioned and the related open source software can be found in the "${INSTALL_PATH}/license/oss_licenses" directory. 본제품은 OpenSSL, RSA Data Security, Inc., Apache Foundation 및 Jean-loup Gailly와 Mark Adler 및 Paul Hsieh's hash 에의해개발또는라이선스된오픈소스소프트웨어를포함합니다. 관련상세정보는제품의디렉터리 ${INSTALL_PATH}/license/oss_licenses 에기재된사항을참고해주십시오. 안내서정보안내서제목 : Tibero 관리자안내서발행일 : 2013-02-25 소프트웨어버전 : Tibero 5 안내서버전 : 2.1.4
내용목차 안내서에대하여... xv 제1장 Tibero 소개... 1 1.1. 주요기능... 1 1.2. 데이터베이스로서의기본기능... 3 1.3. Row level locking... 4 1.4. 프로세스구조... 4 1.4.1. 리스너... 5 1.4.2. 워킹프로세스... 5 1.4.3. 배경프로세스... 7 제2장 관리의기본... 13 2.1. 사용자의정의... 13 2.1.1. DBA... 13 2.1.2. SYS... 14 2.1.3. 시스템관리자... 15 2.1.4. 애플리케이션프로그램개발자... 15 2.1.5. 데이터베이스사용자... 15 2.2. 설치환경... 16 2.3. tbsql 유틸리티의사용... 17 2.4. 사용자및테이블의생성... 23 2.5. 기동과종료... 28 2.5.1. tbboot... 28 2.5.2. tbdown... 31 제3장 파일과데이터의관리... 37 3.1. 데이터의저장구조... 37 3.2. 테이블스페이스... 37 3.2.1. 테이블스페이스의구성... 37 3.2.2. 테이블스페이스의생성, 제거... 39 3.2.3. 테이블스페이스의변경... 41 3.2.4. 테이블스페이스의정보조회... 43 3.3. 로그파일... 44 3.3.1. 로그파일의구성... 45 3.3.2. 로그파일의생성, 제거... 47 3.3.3. 로그파일의정보조회... 48 3.4. 컨트롤파일... 49 3.4.1. 컨트롤파일의변경... 50 3.4.2. 컨트롤파일의정보조회... 51 제4장 스키마객체의관리... 53 4.1. 테이블... 53 4.1.1. 테이블의생성, 변경, 제거... 54 Tibero iii
4.1.2. 테이블의효율적인관리... 59 4.1.3. 테이블의정보조회... 59 4.1.4. 테이블압축... 60 4.1.5. INDEX ORGANIZED TABLE... 62 4.2. 제약조건... 64 4.2.1. 제약조건의선언, 변경, 제거... 64 4.2.2. 제약조건의상태... 68 4.2.3. 제약조건의정보조회... 70 4.3. 디스크블록... 70 4.3.1. PCTFREE 파라미터... 70 4.3.2. INITRANS 파라미터... 71 4.3.3. 파라미터의설정... 71 4.4. 인덱스... 72 4.4.1. 인덱스의생성, 제거... 73 4.4.2. 인덱스의효율적인관리... 74 4.4.3. 인덱스의정보조회... 76 4.5. 뷰... 76 4.5.1. 뷰의생성, 변경, 제거... 76 4.5.2. 뷰의갱신가능성... 78 4.5.3. 뷰의정보조회... 80 4.6. 시퀀스... 80 4.6.1. 시퀀스의생성, 변경, 제거... 80 4.6.2. 시퀀스의정보조회... 83 4.7. 동의어... 84 4.7.1. 동의어의생성, 제거... 84 4.7.2. 공용동의어의생성, 제거... 85 4.7.3. 동의어의정보조회... 86 4.8. 트리거... 86 4.8.1. 트리거의생성, 제거... 87 4.9. 파티션... 88 4.9.1. 파티션의생성... 88 4.9.2. 복합파티션의생성... 90 4.9.3. 인덱스파티션의생성... 91 4.9.4. 파티션의정보조회... 92 제5장 사용자관리와데이터베이스보안... 93 5.1. 사용자관리... 93 5.1.1. 사용자의생성, 변경, 제거... 94 5.1.2. 사용자의정보조회... 97 5.1.3. 사용자계정잠금및해제... 97 5.2. 특권... 98 5.2.1. 스키마객체특권... 99 5.2.2. 시스템특권... 100 iv Tibero 관리자안내서
5.2.3. 특권의정보조회... 103 5.3. 프로파일... 104 5.3.1. 프로파일생성, 변경, 제거... 104 5.3.2. 프로파일지정... 106 5.3.3. 프로파일정보조회... 107 5.4. 역할... 107 5.4.1. 역할의생성, 부여, 회수... 108 5.4.2. 미리정의된역할... 110 5.4.3. 기본역할... 110 5.4.4. 역할의정보조회... 111 5.5. 네트워크접속제어... 111 5.5.1. 전체네트워크접속제어... 111 5.5.2. IP 주소기반네트워크접속제어... 112 5.6. 감사... 114 5.6.1. 감사설정과해제... 114 5.6.2. 감사기록... 115 5.6.3. SYS 사용자에대한감사... 117 제6장 백업과복구... 119 6.1. Tibero의구성파일... 119 6.2. 백업... 120 6.3. 백업의종류... 121 6.4. 백업의실행... 122 6.4.1. 컨트롤파일의백업... 122 6.4.2. Consistent 백업... 124 6.4.3. Inconsistent 백업... 125 6.5. 복구... 126 6.5.1. 부트모드별복구... 127 6.5.2. 파손복구... 127 6.5.3. 미디어복구... 128 6.5.4. 온라인미디어복구... 129 6.6. 백업및복구사례... 129 6.6.1. NOARCHIVELOG 모드... 129 6.6.2. ARCHIVELOG 모드... 130 6.7. 복구관리자... 142 제7장 분산트랜잭션... 151 7.1. XA... 151 7.2. Two-phase commit mechanism... 152 7.3. XA의 In-doubt 트랜잭션처리... 153 7.3.1. DBA_2PC_PENDING... 153 7.4. 데이터베이스링크... 155 7.4.1. 데이터베이스링크의생성, 제거... 155 7.4.2. 원격데이터베이스의연결... 156 Tibero v
7.4.3. 게이트웨이... 156 7.4.4. 데이터베이스링크의사용... 164 7.4.5. Global Consistency... 165 7.4.6. 데이터베이스링크의 In-doubt 트랜잭션처리... 165 7.4.7. 데이터베이스링크의정보조회... 166 제8장 Tibero Standby Cluster... 169 8.1. 개요... 169 8.2. 프로세스... 170 8.3. 로그전송방식... 170 8.4. Primary의동작모드... 170 8.5. Primary의설정및운용... 171 8.6. Standby의설정및운용... 173 8.6.1. Standby의 read only 모드... 174 8.7. 데이터베이스의역할전환... 175 8.7.1. Switchover... 175 8.7.2. Failover... 176 8.8. 클라이언트의설정... 176 8.9. 제약사항... 177 8.10. Tibero Standby Cluster의정보조회... 177 제9장 Tibero Cluster Manager... 179 9.1. 개요... 179 9.2. TBCM의동작모드... 179 9.3. TBCM의멤버십관리... 180 9.4. TBCM의환경설정... 180 9.4.1. 환경변수설정... 180 9.4.2. 환경설정파일의설정... 181 9.4.3. 환경설정파일의초기화파라미터... 182 9.5. VIP... 188 9.5.1. VIP 설정... 188 9.5.2. VIP failover... 188 9.6. TBCM의실행... 188 제10장 Tibero Active Cluster... 191 10.1. 개요... 191 10.2. 구성요소... 191 10.3. 프로세스... 193 10.4. TAC 환경설정... 195 10.5. TAC 를위한데이터베이스생성... 196 10.6. TAC 실행... 200 10.6.1. 실행전준비사항... 200 10.6.2. 데이터베이스생성... 200 10.6.3. TAC 기동... 201 10.6.4. TAC 모니터링... 202 vi Tibero 관리자안내서
10.7. 로드밸런싱... 202 제11장 데이터암호화... 205 11.1. 개요... 205 11.2. 환경설정... 205 11.3. 컬럼암호화... 207 11.3.1. 암호화컬럼을갖는테이블생성... 207 11.3.2. 테이블에암호화컬럼추가... 208 11.3.3. 일반컬럼을암호화컬럼으로변경... 208 11.3.4. 암호화컬럼을일반컬럼으로변경... 209 11.3.5. 모든암호화컬럼의알고리즘변경... 209 11.4. 테이블스페이스암호화... 209 11.4.1. 암호화된테이블스페이스의생성... 209 11.4.2. 암호화된테이블스페이스의변경... 210 11.4.3. 암호화된테이블스페이스의사용... 211 11.4.4. 암호화된테이블스페이스의정보조회... 212 제12장 통신암호화... 213 12.1. 개요... 213 12.2. 환경설정... 213 12.2.1. 개인키및인증서생성... 213 12.2.2. 개인키및인증서위치설정... 214 12.2.3. 클라이언트설정... 215 제13장 Parallel Execution... 217 13.1. 개요... 217 13.2. Degree of Parallelism... 218 13.2.1. DOP 결정... 218 13.2.2. DOP에따른워킹스레드할당... 219 13.3. 동작원리... 219 13.3.1. 2-set 구조... 220 13.3.2. TPS의분배... 221 13.4. Parallelism 유형... 222 13.4.1. Parallel Query... 223 13.4.2. Parallel DDL... 227 13.4.3. Parallel DML... 227 제14장 Automatic Performance Monitoring... 229 14.1. 개요... 229 14.2. APM 사용법... 229 14.2.1. tip 설정... 229 14.2.2. 관련테이블과뷰... 230 14.2.3. 수동스냅샷생성기능... 231 14.2.4. 리포트작성기능... 232 Appendix A. tbdsn.tbr... 235 Tibero vii
A.1. tbdsn.tbr의구조... 235 A.2. 이중화서버의설정... 236 A.3. 로드밸런싱의설정... 237 A.4. Failover의설정... 237 Appendix B. V$SYSSTAT... 239 Appendix C. 문제해결... 245 C.1. 데이터베이스접속... 245 Appendix D. 클라이언트환경변수... 249 색인... 251 viii Tibero 관리자안내서
그림목차 [ 그림 1.1] Tibero의프로세스구조... 4 [ 그림 3.1] 테이블스페이스의논리적구성... 38 [ 그림 3.2] 테이블스페이스의물리적구성... 39 [ 그림 3.3] Redo 로그의구조... 44 [ 그림 3.4] 로그멤버의다중화... 46 [ 그림 3.5] 로그그룹의다중화... 46 [ 그림 3.6] 컨트롤파일의다중화... 50 [ 그림 7.1] XA의동작 (AP, TM, DB의상호작용 )... 151 [ 그림 8.1] Tibero Standby Cluster의동작구조... 169 [ 그림 10.1] TAC 의구조... 191 [ 그림 13.1] Parallel Execution... 220 [ 그림 13.2] Parallel Operations... 222 Tibero ix
예목차 [ 예 2.1] tbsql 유틸리티의실행... 17 [ 예 2.2] tbsql 유틸리티를이용한데이터베이스접속... 18 [ 예 2.3] LS 명령어의실행... 20 [ 예 2.4] LS 명령어의실행 - 사용자조회... 21 [ 예 2.5] LS 명령어의실행 - 테이블스페이스조회... 21 [ 예 2.6] SQL 문장의실행 (1)... 21 [ 예 2.7] SQL 문장의실행 (2)... 22 [ 예 2.8] 사용자의생성... 23 [ 예 2.9] CREATE TABLE 문을이용한테이블의생성... 24 [ 예 4.1] 테이블의생성... 55 [ 예 4.2] 테이블의변경 - 컬럼속성... 57 [ 예 4.3] 테이블의변경 - 컬럼이름... 57 [ 예 4.4] 테이블의변경 - 디스크블록의파라미터... 57 [ 예 4.5] 테이블의제거... 58 [ 예 4.6] 압축이지정된테이블생성... 60 [ 예 4.7] Partition별압축을지정하는테이블생성... 61 [ 예 4.8] 테이블의압축상태학인... 61 [ 예 4.9] 기존테이블혹은파티션을압축하거나압축해제하는예... 62 [ 예 4.10] 테이블의추가적인 DML에대한압축여부를변경하는예... 62 [ 예 4.11] INDEX ORGANIZED TABLE의생성... 63 [ 예 4.12] INDEX ORGANIZED TABLE의삭제... 64 [ 예 4.13] 제약조건의이름설정... 65 [ 예 4.14] 제약조건의선언 - 컬럼단위... 66 [ 예 4.15] 제약조건의선언 - 테이블단위... 66 [ 예 4.16] 제약조건의변경 - 제약조건의이름... 67 [ 예 4.17] 제약조건의변경 - 제약조건의추가... 67 [ 예 4.18] 제약조건의제거... 68 [ 예 4.19] 제약조건의상태변경 - ENABLE... 69 [ 예 4.20] 제약조건의상태변경 - DISABLE... 69 [ 예 4.21] 제약조건의상태변경 - VALIDATE... 69 [ 예 4.22] 인덱스의생성... 74 [ 예 4.23] 인덱스의제거... 74 [ 예 4.24] 복합키검색... 75 [ 예 4.25] 뷰의생성... 77 [ 예 4.26] 뷰의변경... 77 [ 예 4.27] 뷰의제거... 78 [ 예 4.28] 시퀀스의생성... 81 [ 예 4.29] 시퀀스의변경... 82 [ 예 4.30] 시퀀스의제거... 83 [ 예 4.31] 동의어의생성... 84 Tibero xi
[ 예 4.32] 동의어의제거... 85 [ 예 4.33] 공용동의어의생성... 85 [ 예 4.34] 공용동의어의제거... 86 [ 예 4.35] 트리거의생성... 87 [ 예 4.36] 트리거의제거... 87 [ 예 4.37] 파티션의생성... 88 [ 예 4.38] 로컬파티션인덱스의생성... 91 [ 예 4.39] 글로벌파티션인덱스의생성... 92 [ 예 6.1] 컨트롤파일의백업... 122 [ 예 6.2] 백업된컨트롤파일의생성문... 122 [ 예 6.3] 컨트롤파일의경로설정... 123 [ 예 6.4] 컨트롤파일의조회... 123 [ 예 6.5] 데이터파일의조회... 124 [ 예 6.6] 온라인로그파일의조회... 124 [ 예 6.7] Inconsistent 백업 - 테이블스페이스의선정... 125 [ 예 6.8] Inconsistent 백업 - begin backup, end backup 명령어의사용... 126 [ 예 6.9] RESETLOGS를이용한데이터베이스의기동... 128 [ 예 6.10] 데이터파일의위치수정... 130 [ 예 6.11] 시스템테이블스페이스의데이터파일복구... 131 [ 예 6.12] 장애가발생한데이터파일이속한테이블스페이스의제거... 133 [ 예 6.13] 데이터파일의생성을통한복구... 134 [ 예 6.14] 미러링을사용한컨트롤파일의복구... 136 [ 예 6.15] 컨트롤파일의생성을통한복구... 137 [ 예 6.16] 불완전복구를통한테이블의데이터복원... 139 [ 예 6.17] 온라인미디어복구를통한데이터파일복구... 141 [ 예 6.18] Online Full Backup 시나리오... 144 [ 예 6.19] Incremental Full Backup 시나리오... 145 [ 예 6.20] Recovery with Online Full Backup 시나리오... 147 [ 예 6.21] Recovery with Incremental Full Backup 시나리오... 148 [ 예 7.1] DBA_2PC_PENDING 뷰의조회... 153 [ 예 8.1] Standby의 $TB_SID.tip 파일의경로변환... 173 [ 예 8.2] 수정된 Standby의경로적용... 173 [ 예 8.3] Standby의기동... 174 [ 예 8.4] Standby의 read only... 174 [ 예 8.5] RECOVERY 모드의전환... 174 [ 예 8.6] Standby의 read only continue recovery... 175 [ 예 8.7] Switchover 명령어의실행... 175 [ 예 8.8] ALTER DATABASE open 문장의실행... 175 [ 예 10.1] 글로벌뷰의조회 - GV$SESSION... 202 [ 예 10.2] 서버쪽로드밸런싱설정... 203 [ 예 11.1] 보안지갑의생성... 206 [ 예 11.2] 보안지갑의위치설정... 206 [ 예 11.3] 보안지갑열기... 206 xii Tibero 관리자안내서
[ 예 11.4] 보안지갑닫기... 206 [ 예 11.5] 암호화컬럼을갖는테이블생성 - 디폴트암호화옵션 (AES192 알고리즘, SALT)... 207 [ 예 11.6] 암호화컬럼을갖는테이블생성 - AES256 알고리즘, NO SALT 옵션설정... 208 [ 예 11.7] 암호화컬럼추가... 208 [ 예 11.8] 일반컬럼을암호화컬럼으로변경... 209 [ 예 11.9] 암호화컬럼을일반컬럼으로변경... 209 [ 예 11.10] 모든암호화컬럼의암호화알고리즘변경... 209 [ 예 11.11] 암호화된테이블스페이스생성 - 3DES168 알고리즘지정... 210 [ 예 11.12] 암호화된테이블스페이스 - 생성실패... 210 [ 예 11.13] 암호화된테이블스페이스 - 데이터파일추가... 211 [ 예 11.14] 암호화된테이블스페이스 - 테이블생성... 211 [ 예 12.1] 개인키및인증서의생성... 213 [ 예 12.2] 개인키및인증서의위치설정... 214 [ 예 12.3] 클라이언트설정... 215 Tibero xiii
안내서에대하여 안내서의대상 본안내서는 Tibero ( 이하 Tibero) 를사용하여데이터베이스를생성하고원활한 Tibero 의동작을보장하 려는데이터베이스관리자 (Database Administrator, 이하 DBA) 를대상으로기술한다. 안내서의전제조건 본안내서는 Tibero 를관리하는방법을설명한안내서이다. 따라서본안내서를원활히이해하기위해서는다음과같은사항을미리알고있어야한다. 데이터베이스의이해 RDBMS 의이해 운영체제및시스템환경의이해 UNIX 계열 (LINUX 포함 ) 의기본지식 안내서의제한조건 본안내서는 Tibero 를실무에적용하거나운용하는데필요한모든사항을포함하고있지않다. 따라서 설치, 환경설정등운용및관리에대해서는각제품안내서를참고하기바란다. 참고 Tibero 의설치및환경설정에관한내용은 " Tibero 설치안내서 " 를참고한다. 안내서에대하여 xv
안내서구성 Tibero 관리자안내서는총 12개의장과 Appendix로구성되어있다. 각장의주요내용은다음과같다. 제1장 : Tibero소개 DBA 측면에서 Tibero의기본개념과이를구성하는프로세스와디렉터리구조를기술한다. 제 2 장 : 관리의기본 Tibero 를관리하기위한기본적인사항을기술한다. 제 3 장 : 파일과데이터의관리 Tibero 의파일과데이터를관리하는방법을기술한다. 제 4 장 : 스키마객체의관리 Tibero 의데이터베이스를구성하는데필요한스키마객체를관리하는방법을기술한다. 제 5 장 : 사용자관리와데이터베이스보안 데이터베이스보안을위한사용자, 특권, 역할을생성하고이를관리하는방법을기술한다. 제 6 장 : 백업과복구 시스템의예상치못한오류로부터대비하기위해다양한백업및복구과정을기술한다. 제 7 장 : 분산트랜잭션 분산트랜잭션을지원하기위해 Tibero 가제공하는기능을기술한다. 제 8 장 : Tibero Standby Cluster 고가용성, 자료보호, 재난복구를위한 Tibero Standby Cluster 를기술한다. 제 9 장 : Tibero Cluster Manager 클러스터관리를편리하게하고, 가용성을높이기위해제공하는 Tibero 의부가기능인 TiberoCluster Manage 를기술한다. 제 10 장 : Tibero Active Cluster 확장성, 고가용성을목적으로하는 Tibero Active Cluster 를기술한다. xvi Tibero 관리자안내서
제 11 장 : 데이터암호화 데이터암호화기능을사용하고이를관리하는방법을기술한다. 제 12 장 : 통신암호화 Tibero 에서통신암호화기능을사용하고관리하기위한방법을설명한다. 제 13 장 : Parallel Execution Parallel Execution 의기본개념과동작원리를소개하고, 이를유형별로실행하는방법을기술한다. 제 14 장 : Automatic Performance Monitoring Tibero 의성능진단을위해서제공되는 APM(Automatic Performance Monitoring) 에대해서설명한다. Appendix A: tbdsn.tbr 클라이언트가 Tibero 에접속하기위해필요한 tbdsn.tbr 환경설정파일을기술한다. Appendix B: V$SYSSTAT 동적뷰 V$SYSSTAT 에포함된시스템의각종통계정보를기술한다. Appendix C: 문제해결 Tibero 를사용할때발생할수있는문제를해결하는방법을기술한다. Appendix D: 클라이언트환경변수 클라이언트에서설정할수있는환경변수에대해서설명한다. 안내서에대하여 xvii
안내서규약 표기 <AaBbCc123> <Ctrl>+C [Button] 진하게 " "( 따옴표 ) ' 입력항목 ' 하이퍼링크 > +---- ---- 참고 의미프로그램소스코드의파일명, 디렉터리 Ctrl과 C를동시에누름 GUI의버튼또는메뉴이름강조다른관련안내서또는안내서내의다른장및절언급화면 UI에서입력항목에대한설명메일계정, 웹사이트메뉴의진행순서하위디렉터리또는파일있음하위디렉터리또는파일없음참고또는주의사항 [ 그림 1.1] [ 표 1.1] AaBbCc123 그림이름 표이름 명령어, 명령어수행후화면에출력된결과물, 예제코드 { } [ ] 필수인수값 옵션인수값 선택인수값 xviii Tibero 관리자안내서
시스템사용환경 요구사항 Platform HP-UX 11i (PA-RISC, ia64) Solaris (SPARC 9/Solaris 9) AIX (PPC 5L/AIX 5.3) GNU (X86, 64, IA64) Linux kernel 2.6 이상 Windows(x86) 32bit/64bit Hardware 최소 1.5GB 하드디스크공간 512MB 이상메모리공간 Compiler PSM (C99 지원필요 ) tbesql/c (C99 지원필요 ) 안내서에대하여 xix
관련안내서 안내서 Tibero 설치안내서 Tibero tbcli 안내서 Tibero 애플리케이션개발자안내서 Tibero External Procedure 안내서 Tibero JDBC 개발자안내서 Tibero tbesql/c 안내서 Tibero tbesql/cobol 안내서 Tibero tbpsm 안내서 Tibero tbpsm 참조안내서 Tibero tbadmin 안내서 Tibero 유틸리티안내서 Tibero 설명설치시필요한시스템요구사항과설치및제거방법을기술한안내서이다. Call Level Interface인 tbcli의개념과구성요소, 프로그램구조를소개하고 tbcli 프로그램을작성하는데필요한데이터타입, 함수, 에러메시지를기술한안내서이다. 각종애플리케이션라이브러리를이용하여애플리케이션프로그램을개발하는방법을기술한안내서이다. External Procedure를소개하고이를생성하고사용하는방법을기술한안내서이다. Tibero에서제공하는 JDBC 기능을이용하여애플리케이션프로그램을개발하는방법을기술한안내서이다. C 프로그래밍언어를사용해데이터베이스작업을수행하는각종애플리케이션프로그램을작성하는방법을기술한안내서이다. COBOL 프로그래밍언어를사용해데이터베이스작업을수행하는각종애플리케이션프로그램을작성하는방법을기술한안내서이다. 저장프로시저모듈인 tbpsm의개념과문법, 구성요소를소개하고, tbpsm 프로그램을작성하는데필요한제어구조, 복합타입, 서브프로그램, 패키지와 SQL 문장을실행하고에러를처리하는방법을기술한안내서이다. 저장프로시저모듈인 tbpsm의패키지를소개하고, 이러한패키지에포함된각프로시저와함수의프로토타입, 파라미터, 예제등을기술한참조안내서이다. SQL/PSM 처리와 DBA를위한시스템관리기능을제공하는 GUI 기반의툴인 tbadmin을소개하고, 설치및사용방법을기술한안내서이다. 데이터베이스와관련된작업을수행하기위해필요한유틸리티의설치및환경설정, 사용방법을기술한안내서이다. Tibero를사용하는도중에발생할수있는각종에러의원인과해결방법을기술한안내서이다. xx Tibero 관리자안내서
안내서 설명 에러참조안내서 Tibero 참조안내서 Tibero SQL 참조안내서 Tibero의동작과사용에필요한초기화파라미터와데이터사전, 정적뷰, 동적뷰를기술한참조안내서이다. 데이터베이스작업을수행하거나애플리케이션프로그램을작성할때필요한 SQL 문장을기술한참조안내서이다. 참고문헌 제품 Tibero MMDB 안내서 관리자안내서 안내서에대하여 xxi
연락처 Korea TIBERO Co., Ltd. 272-6, Seohyeon-dong, Bundang-gu, Seongnam-si, Gyeonggi-do, 463-824 South Korea Tel: +82-31-779-7113 Fax: +82-31-779-7119 Email: info@tmax.co.kr Web (Korean): http://www.tibero.com 기술지원 : http://technet.tmax.co.kr USA TmaxSoft, Inc. 560 Sylvan Avenue Englewood Cliffs, NJ 07632 U.S.A Tel: +1-201-567-8266 Fax: +1-201-567-7339 Email: info@tmaxsoft.com Web (English): http://www.tmaxsoft.com Japan TmaxSoft Japan Co., Ltd. 5F Sanko Bldg, 3-12-16 Mita, Minato-Ku, Tokyo, 108-0073 Japan Tel: +81-3-5765-2550 Fax: +81-3-5765-2567 Email: info@tmaxsoft.co.jp Web (Japanese): http://www.tmaxsoft.co.jp xxii Tibero 관리자안내서
China TmaxSoft China Co., Ltd. Beijing Silver Tower, RM 1508, 2# North Rd Dong San Huan, Chaoyang District, Beijing, China, 100027 China Tel: +86-10-6410-6145~8 Fax: +86-10-6410-6144 Email: info.cn@tmaxsoft.com Web (Chinese): http://www.tmaxsoft.com.cn 안내서에대하여 xxiii
제 1 장 Tibero 소개 현재기업의비즈니스는폭발적인데이터의증가와다양한환경및플랫폼의등장으로빠르게확장되고있다. 새로운비즈니스환경이도래함에따라보다더효율적이고유연한데이터서비스와정보의처리, 데이터관리기능이필요하게되었다. Tibero는이러한변화에맞춰기업비즈니스구현의기반이되는데이터베이스인프라구성을지원하며고성능, 고가용성및확장성의문제를해결하는엔터프라이즈데이터베이스관리시스템이다. 기존 DB의단점을보완하기위해 Tibero는독자적인 Tibero Thread Architecture를채택하고구현하였다. 한정된서버프로세스의 CPU 및메모리등의시스템리소스를효율적으로사용하면서뛰어난성능과안정성및확장성을보장하고편리한개발환경과관리기능을제공한다. Tibero는초기설계부터대규모사용자, 대용량데이터, 강화된안정성, 향상된호환성측면등에서타 DBMS와차별화를고려하여개발되었다. Tibero는이처럼기업이원하는최적의데이터베이스환경을제공하는대표적인 DB이다. 본장에서는 Tibero 의주요기능과프로세스구조, 디렉터리구조를간단히소개한다. 1.1. 주요기능 대용량의데이터를관리하고안정적인비즈니스의연속성을보장하는데이터관리솔루션인 Tibero는 DB 환경에서요구되는주요기능을다음과같이갖추고있다. 분산데이터베이스링크 (Distributed Database Link) 데이터베이스인스턴스별로각각서로다른데이터를저장하는기능이다. 이기능을통해원격데이터베이스에저장된데이터를네트워크를통해읽기및쓰기를수행할수있다. 또한, 이기능은다양한벤더의 DB 제품을연결하여읽기및쓰기를수행할수있다. 데이터이중화 (Data Replication) 현재운영중인데이터베이스에서변경된모든내용을 Standby DB 로복제하는기능이다. 즉, 네트워크 를통해서변경로그 (Change log) 만전송하면 Standby DB 에서데이터에적용하는방식이다. 데이터베이스클러스터 (Database Cluster) 기업용 DB 의최대이슈인고가용성과고성능을모두해결하는기능이다. Tibero DB 는고가용성과고성 능을보장하기위해 Tibero Active Cluster 기술을보유하고있다. 제 1 장 Tibero 소개 1
이기술로인해여러개의데이터베이스인스턴스가공유디스크를이용하여동일한데이터베이스를공유할수있다. 이때각데이터베이스인스턴스는내부의데이터베이스캐시 (Database cache) 사이의일관성을유지하는기술이매우중요하다. 따라서이러한기술도 Tibero Active Cluster에포함하여제공하고있다. 보다자세한내용은 제10장 Tibero Active Cluster 를참고한다. 병렬쿼리처리 (Parallel Query Processing) 기업의데이터크기는계속적으로증가하고있다. 대용량데이터를처리하기위해서버의리소스를최대한활용할수있는병렬처리기술이필수적으로요구되고있다. Tibero는이러한요구사항에맞추어온라인트랜잭션처리 (OLTP, on-line transaction processing) 환경에최적화된기능을제공할뿐만아니라 OLAP(Online Analytical Processing) 환경에최적화된 SQL 병렬처리기능을제공하고있다. 이로인해쿼리는빠른응답속도로수행되며, 기업의빠른의사결정을돕는다. 쿼리최적화기 (Optimizer) 쿼리최적화기는스키마객체의통계정도를바탕으로다양한데이터처리경로들을고려하여어떤실행계획이가장효율적인지를결정한다. 쿼리최적화기는논리적으로다음과같은단계를통해수행된다. 1. 주어진 SQL 문을처리하는다양한실행계획들을만들어낸다. 2. 데이터의분산도에대한통계정보와테이블, 인덱스, 파티션등의특징을고려하여각각의실행계 획의비용을계산한다. 여기서비용이란특정실행계획을수행하는데필요한상대시간을나타내고, 최적화기는 I/O, CPU, 메모리등의컴퓨터자원을고려하여그비용을계산해낸다. 3. 실행계획들의비용을비교하여가장비용이작은계획을선택한다. 쿼리최적화기의주요기능은다음과같다. 최적화목표사용자는최적화기의최종목표를바꿀수도있는데, 예를들어다음의두가지목표를선택할수있다. 구분 전체처리시간 최초반응시간 설명 ALL_ROWS 힌트를사용하면최적화기는마지막 row까지얻어내는시간을최대한단축하도록최적화한다. FIRST_ROWS 힌트를사용하면최적화기는첫번째 row를얻어내는시간을최대한단축하도록최적화한다. 질의변형 2 Tibero 관리자안내서
질의의형태를바꿔서더좋은실행계획을만들수있도록한다. 질의변형의예에는뷰병합, 부질의 언네스트, 실체화뷰의사용등이있다. 데이터접근경로결정데이터를데이터베이스로부터꺼내오는작업은전체테이블스캔, 인덱스스캔, rowid 스캔등의다양한방법을통해서수행될수있다. 각방법마다필요한데이터의양이나필터링의형태등에따라장단점이있어서질의에따라최적의접근방식이다르다. 조인처리방식결정여러테이블에서데이터를꺼내오게되는조인의경우, 최적화기는조인의순서와방법을결정해야한다. 여러테이블간의조인일때어떤테이블을먼저조인할지에대한순서와, 각각의조인에있어서중첩루프조인, 합병조인, 해시조인등의다양한방법중어떤것을사용할지가실행속도에큰영향을미치게된다. 비용추정각각의실행계획에대해비용을추정한다. 비용추정을위해서필요한 predicate의선택도나각실행단계에서데이터의 row 수등을통계정보를사용해서추정하고, 이를바탕으로각단계에서의비용을추정한다. 1.2. 데이터베이스로서의기본기능 Tibero 는데이터베이스의영속성과일관성을유지하기위하여 SQL문장의묶음인트랜잭션을다음의 4 가지성질을통해보장한다. Atomicity All-or-nothing 즉 transaction이행한모든일이적용되던가, 아니면모두적용되지않아야함을의미한다. Tibero 에서는이를위하여 undo data를사용한다. Consistency 트랜잭션이데이터베이스의 consistency를깨뜨리는일은여러방면에서생겨날수있다. 간단한예는 table과 index 간에서로다른내용을담고있어서 consistency가깨지는것이다. 이를막기위해 Tibero 에서는트랜잭션이적용한일들중일부만자신이나남에게적용되는것을막고있다. 즉, table만수정했고아직 index를수정하지않은상태라고해도다른트랜잭션에서는이를예전모습으로돌려보아서 table과 index가항상 consistency가맞는형태로보이게된다. Isolation 트랜잭션은혼자만돌고있는것처럼보이게된다. 물론다른트랜잭션이수정한데이터에접근할때에는이를기다릴수는있지만다른트랜잭션이수정중이므로접근할수없다고에러가나지는않는다. 이를위해 Tibero 에서는 Multi version concurrency control 기법과 row-level locking 기법을사용한다. 제 1 장 Tibero 소개 3
데이터를참조시에는 MVCC 기법을이용하여다른트랜잭션과무관하게참조가능하며, 데이터를수정 할때도 row level 의 fine-grained lock control 을통하여최소한의충돌만을일으키고설사같은데이터 에접근한다고해도단지기다림으로써이를해결한다. Durability Tibero 에서는이를위하여 REDO log와 write-ahead logging 기법을사용한다. 트랜잭션이커밋할때에해당 REDO log가디스크에기록되어트랜잭션의영속성을보장해준다. 또한블럭이디스크에내려가기전에항상 REDO log가먼저내려가서데이터베이스전체가일관성을지니게한다. 1.3. Row level locking Tibero는 fine-grained lock control을보장해주기위하여 row level locking을사용한다. 즉, 데이터최소단위인 Row 단위의 locking을통하여최대한의 concurrency를보장해준다. 많은 Row들을수정한다고해도 table에 lock이걸려서 concurrent한 DML이수행되지못하는상황은발생하지않는다. 이러한기법을통해 OLTP환경에서더욱강력한성능을발휘하고있다. 1.4. 프로세스구조 Tibero는대규모사용자접속을수용하는다중프로세스및다중스레드기반의아키텍처를갖추고있다. 다음은 Tibero의프로세스구조를나타내는그림이다. [ 그림 1.1] Tibero의프로세스구조 4 Tibero 관리자안내서
Tibero 의프로세스는크게 3 가지로구성된다. 리스너 (Listener) 워킹프로세스 (Working Process 또는 Foreground Process) 배경프로세스 (Background Process) 1.4.1. 리스너 리스너는클라이언트의새로운접속요청을받아이를유휴한워킹프로세스에할당한다. 즉, 클라이언트와워킹프로세스간의중계역할을담당하며, 이는별도의실행파일인 tblistener를사용하여작업을수행한다. 다음은 [ 그림 1.1] 를기준으로클라이언트의새로운접속요청이이루어지는순서이다. 1. 현재유휴한워킹스레드가있는워킹프로세스를찾아서클라이언트의접속요청 (1) 을한다. 2. 이때 File descriptor 와함께할당되므로, 클라이언트는서버의내부동작과상관없이마치처음부터워 킹스레드에접속한것처럼동작하게된다. 3. 리스너의요청을받은컨트롤스레드 (CTHR: control thread) 는자기자신에속한워킹스레드의상태 를검사 (2) 하여현재유휴한워킹스레드에클라이언트의접속을할당 (3) 한다. 4. 할당된워킹스레드는클라이언트와인증절차를거친후세션을시작 (4) 한다. 1.4.2. 워킹프로세스 워킹프로세스는클라이언트와실제로통신을하며사용자의요구사항을처리하는프로세스이다. 이프로세스의개수는 WTHR_PROC_CNT 초기화파라미터로조절할수있으며, 일단 Tibero가기동된뒤에는변경할수없다. 따라서시스템환경을고려하여적절한값을설정해야한다. 참고 초기화파라미터에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. Tibero는효율적인리소스의활용을위해스레드 (Thread) 기반으로작업을수행한다. Tibero를설치하면기본적으로하나의워킹프로세스안에는 1개의컨트롤스레드와 10개의워킹스레드가존재한다. 프로세스당워킹스레드개수는 _WTHR_PER_PROC 초기화파리미터로조절할수있으며, WTHR_PROC_CNT처럼일단 Tibero가기동된뒤에는변경할수없다. 따라서시스템환경을고려하여적절한값을설정해야한다. 제 1 장 Tibero 소개 5
주의 WTHR_PROC_CNT 와 _WTHR_PER_PROC 초기화파라미터값을직접바꾸는것보다는 MAX_SESSION_ COUNT 초기화파라미터를통해서버에서제공하는최대세션개수를지정할것을권장한다. MAX_ SESSION_COUNT 값에따라 WTHR_PROC_CNT 와 _WTHR_PER_PROC 값이자동으로설정된다. 만약 WTHR_PROC_CNT 와 _WTHR_PER_PROC 를직접설정할경우, WTHR_PROC_CNTWTHR_PROC_ CNT * _WTHR_PER_PROC 값이 MAX_SESSION_COUNT 값과같게두값을설정해야한다. 워킹프로세스는컨트롤스레드와워킹스레드를통해다음과같은작업을수행한다. 컨트롤스레드 워킹프로세스마다하나씩존재하며다음과같은역할을담당한다. Tibero 가기동될때초기화파라미터에설정된수만큼워킹스레드를생성한다. 클라이언트의새로운접속요청이오면현재유휴한워킹스레드에클라이언트의접속을할당한다. 시그널처리를담당한다. 워킹스레드 워킹스레드는클라이언트와 1:1로통신하며, 클라이언트가보내는메시지를받아처리하고그결과를돌려준다. 주로 SQL 파싱, 최적화수행등 DBMS가하는작업대부분이워킹프로세스에서일어난다. 그리고워킹스레드는하나의클라이언트와접속하므로 Tibero에동시접속이가능한클라이언트수는 WTHR_ PROC_CNT * _WTHR_PER_PROC이다. Tibero는세션멀티플렉싱 (Session multiplexing) 을지원하지않으므로하나의클라이언트접속은곧하나의세션과같다. 그러므로최대세션이생성될수있는개수는 WTHR_PROC_CNT * _WTHR_PER_PROC를연산한값과같다. 워킹스레드는클라이언트와접속이끊긴다고해도없어지지않으며, Tibero가기동될때생성된이후부터종료할때까지계속존재하게된다. 이러한구조에서는클라이언트와접속을빈번하게발생시키더라도매번스레드를생성하거나제거하지않으므로시스템의성능을높일수있다. 반면실제클라이언트의수가적더라도초기화파라미터에설정된개수만큼스레드를생성해야하므로운영체제의리소스를계속소모하는단점은있으나, 운영체제대부분이유휴한스레드하나를유지하는데드는리소스는매우적으므로시스템을운영하는데는별무리가없다. 주의많은수의워킹스레드가동시에작업을수행하려고할때심한경우운영체제에과도한부하를일으켜시스템성능이크게저하될수있다. 그러므로대규모시스템을구축할경우에는 Tibero와클라이언트의애플리케이션프로그램사이에미들웨어를설치하여 3-Tier 구조로시스템을구축할것을권장한다. 6 Tibero 관리자안내서
1.4.3. 배경프로세스 배경프로세스는클라이언트의접속요청을직접받지않고, 워킹스레드나다른배경프로세스가요청할때혹은정해진주기에따라동작하는주로시간이오래걸리는디스크작업을담당하는독립된프로세스이다. 배경프로세스에속해있는프로세스는다음과같다. 감시프로세스 (MTHR: monitor thread) 감시프로세스의영문약자를보면프로세스가아닌스레드로나타나있지만, 실제로는하나의독립된프로세스이다. 리스너를제외하고 Tibero가기동할때최초로생성되며, Tibero가종료하면맨마지막에프로세스를끝마친다. Tibero가기동할때다른프로세스를생성하거나주기적으로각프로세스의상태를점검하는역할을담당한다. 또한, 교착상태 (deadlock) 도검사한다. 시퀀스프로세스 (AGENT 또는 SEQW: sequence writer) 시스템유지를위해주기적으로처리해야하는 Tibero 내부의작업을담당한다. 4SP1 까지는시퀀스캐시 (sequence cache) 의값을디스크에저장하는작업도담당했으나 5.0 이후로각워킹스레드가담당하는것으로변경되었다. 사용자의혼란을피하기위해 SEQW라는명칭은유지된다. 시퀀스를사용하는방법에대한내용은 4.6.1. 시퀀스의생성, 변경, 제거 를참고한다. 데이터블록쓰기프로세스 (DBWR: data block writer 또는 BLKW) 사용자가수정한데이터블록을주기적으로디스크에기록한다. 기록된데이터블록은주로워킹스레 드가직접읽어온다. 체크포인트프로세스 (CKPT: checkpoint process) 체크포인트는주기적으로혹은클라이언트의요청에따라메모리에있는변경된모든데이터블록을디스크에기록하는작업이다. Tibero에장애가발생하면이를복구하기위해걸리는시간이한계수치를넘지않도록예방하는효과가있다. 이러한체크포인트를관리하는프로세스가체크포인트프로세스이다. 클라이언트가직접체크포인트를요청하는방법은 "Tibero SQL 참조안내서 " 의 ALTER SYSTEM CHECKPOINT 문을참고한다. 로그쓰기프로세스 (LGWR: log writer 또는 LOGW) Redo 로그파일을디스크에기록하는프로세스이다. 로그파일에는데이터베이스의데이터에대한모든변경사항을저장하고있으며빠른트랜잭션처리와복구를위해사용된다. 로그파일에대한자세한내용은 3.3. 로그파일 을참고한다. 제 1 장 Tibero 소개 7
1.4.3.1. 디렉터리구조 Tibero 가설치되면다음과같은디렉터리가생성된다. $TB_HOME +- bin +- client +- bin +- config +- include +- lib +- ssl +- man +- man1 +- man3 +- man5 +- man7 +- misc +- tbepa +- java +- config +- lib +- win32 +- win64 +- config +- database +- $TB_SID +- psm +- instance +- $TB_SID +- audit +- log +- dbmslog +- lsnr +- tracelog +- path 8 Tibero 관리자안내서
+- lib +- license +- oss_licenses +- scripts +- pkg 위의디렉터리구조에서 $TB_SID라고보이는부분은각각의시스템환경에맞는서버의 SID로바꿔서읽어야한다. Tibero에서사용하는고유의디렉터리는다음과같다. bin Tibero의실행파일과서버관리를위한유틸리티가위치한디렉터리이다. 이디렉터리에속한파일중에서 tbsvr과 tblistener는 Tibero를구성하는실행파일이며, tbboot와 tbdown은각각 Tibero를기동하고종료하는역할을담당한다. tbsvr과 tblistener 실행파일은반드시 tbboot 명령어를이용하여실행되어야하며, 절대로직접실행해서는안된다. client/bin Tibero의클라이언트실행파일이있는디렉터리이다. 이디렉터리에는다음과같은유틸리티가있다. 유틸리티 tbsql tbmigrator tbexport tbimport tbloader tbpc 설명기본적인클라이언트프로그램으로사용자가직접 SQL 질의를하고그결과를확인할수있는유틸리티이다. 다른데이터베이스의내용을 Tibero의데이터베이스로옮기는것을지원하는유틸리티이다. 논리적백업이나데이터베이스간에데이터이동을위해데이터베이스의내용을외부파일로저장하는유틸리티이다. 외부파일에저장된내용을데이터베이스로가져오는유틸리티이다. 대량의데이터를데이터베이스로한꺼번에읽어들이는유틸리티이다. C 언어로작성된프로그램안에서내장 SQL(Embedded SQL) 을사용하는프로그램을개발할때이를 C 프로그램으로변환하는유틸리티이다. 이렇게변환된프로그램을 C 컴파일러를통해컴파일할수있도록도와주는역할도담당한다. 유틸리티에대한내용은 "Tibero 유틸리티안내서 " 를참고한다. 단, tbpc 유틸리티는 "TiberotbESQL/C 안내서 " 를참고한다. 제 1 장 Tibero 소개 9
client/config Tibero의클라이언트프로그램을실행하기위한설정파일이위치하는디렉터리이다. client/include Tibero의클라이언트프로그램을작성할때필요한헤더파일이위치하는디렉터리이다. client/lib Tibero의클라이언트프로그램을작성할때필요한라이브러리파일이위치하는디렉터리이다. 이에대한자세한내용은 "Tibero 애플리케이션개발자안내서 " 와 "TiberotbESQL/C 안내서 " 를참고한다. client/ssl 서버보안을위한인증서와개인키를저장하는디렉터리이다. client/tbepa External Procedure와관련된설정파일과로그파일이있는디렉터리이다. 이에대한자세한내용은 "Tibero External Procedure 안내서 " 를참고한다. client/win32 32Bit Windows 용 ODBC/OLE DB 드라이버가위치하는디렉터리이다. client/win64 64Bit Windows 용 ODBC/OLE DB 드라이버가위치하는디렉터리이다. config Tibero의환경설정파일이위치하는디렉터리이다. 이위치에존재하는 $TB_SID.tip 파일이 Tibero의환경설정을결정한다. database/$tb_sid Tibero의데이터베이스정보를별도로설정하지않는한, 모든데이터베이스정보가이디렉터리와그하위디렉터리에저장된다. 이디렉터리에는데이터자체에대한메타데이터 (metadata) 뿐만아니라다음과같은종류의파일이있다. 파일컨트롤파일데이터파일로그파일 설명다른모든파일의위치를담고있는파일이다. 실제데이터를저장하고있는파일이다. 데이터복구를위해데이터에대한모든변경사항을저장하는파일이다. 10 Tibero 관리자안내서
database/$tb_sid/psm tbpsm 프로그램을컴파일드모드 (Compiled mode) 로컴파일하는경우, 컴파일된파일이저장되는디렉터리이다. 하지만, 현재 Tibero에서는인터프리터모드만을지원하고있다. 이에대한자세한내용은 "TiberotbPSM 안내서 " 를참고한다. instance/$tb_sid/audit 데이터베이스사용자가시스템특권또는스키마객체특권을사용하는것을감시 (AUDIT) 한내용을기록한파일이저장되는디렉터리이다. instance/$tb_sid/log Tibero의트레이스 (trace) 로그파일과 DBMS 로그파일이저장되는디렉터리이다. 파일 트레이스로그파일 DBMS 로그파일 설명디버깅을위한파일이다. 서버가하는모든일이자세하게기록되는파일이며, 서버성능이저하되는원인을찾거나 Tibero 자체의버그를해결하는데사용될수있다. 트레이스로그파일에기록되는정보보다좀더중요한정보가기록되는파일이며, 서버기동및종류, DDL 문장의수행등이기록되는파일이다. 트레이스로그파일과 DBMS 로그파일은데이터베이스를사용할수록계속누적되어저장된다. 또한, 전체디렉터리의최대크기를지정할수있으며, Tibero 는그지정된크기를넘어가지않도록오래된 파일을삭제한다. DBMS 로그파일을설정하는초기화파라미터는다음과같다. 초기화파라미터 DBMS_LOG_FILE_SIZE DBMS_LOG_TOTAL_SIZE_LIMIT TRACE_LOG_FILE_SIZE TRACE_LOG_TOTAL_SIZE_LIMIT 설명 DBMS 로그파일하나의최대크기를설정한다. DBMS 로그파일이저장된디렉터리의최대크기를설정한다. 트레이스로그파일하나의최대크기를설정한다. 트레이스로그파일이저장된디렉터리의최대크기를설정한다. instance/$tb_sid/path Tibero의프로세스간에통신을위한소켓파일이있는디렉터리이다. Tibero가운영중일때이위치에존재하는파일을읽거나수정해서는안된다. lib Tibero 서버에서 Spatial과관련된함수를사용하기위한라이브러리파일이있는디렉터리이다. license Tibero의라이선스파일 (license.xml) 이있는디렉터리이다. XML 형식이므로일반텍스트편집기로도라이선스의내용을확인할수있다. 제 1 장 Tibero 소개 11
license/oss_licenses 반드시준수해야하는오픈소스라이선스의대한정보를확인할수있는디렉터리이다. scripts Tibero의데이터베이스를생성할때사용하는각종 SQL 문장이있는디렉터리이다. 또한, Tibero의현재상태를보여주는각종뷰의정의도이디렉터리에있다. scripts/pkg Tibero에서사용하는패키지의생성문이저장되는디렉터리이다. 12 Tibero 관리자안내서
제 2 장관리의기본 본장에서는 DBA 가 Tibero 를관리하기에앞서기본적으로알아야할사항을설명한다. 2.1. 사용자의정의 Tibero 를크게사용하는목적과역할에따라사용자의유형을다음과같이정의한다. DBA SYS 시스템관리자 (sysadmin) 애플리케이션프로그램개발자 (Application Developers) 데이터베이스사용자 (Database Users) 2.1.1. DBA DBMS는적어도 1명의 DBA가필요하다. 데이터베이스를사용하는사용자가많으면많을수록이를관리하는개인이나그룹이필요하다. DBA는데이터베이스환경을유지하는데필요한제반활동을감독하거나직접수행하는개인또는그룹이다. 데이터베이스내용의정확성이나통합성을결정하고데이터베이스의내부저장구조와접근관리대책을결정하며, 데이터의보안정책을수립하고점검하는등데이터베이스의성능을감시하여변화하는요구에대응하는책임을진다. 또한, 다양한데이터베이스제품에관한깊은경험이요구된다. 다음은 DBA 가관리해야할항목을간략히소개한표이다. 항목 DBMS 설명 현재사용하고있는 DBMS 의특성을파악한다. - 디스크용량이충분한가? - 물리적으로독립된디스크인경우시스템부하가제대로분산이되고있는가? - 데이터배치는잘되었는가? - CPU와메모리사용량, 클라이언트의응답시간은어떠한가? 제 2 장관리의기본 13
항목 설명 문제가발생하면, H/W 를확장하거나데이터베이스를튜닝한다. 데이터베이스 - 자주사용되는스키마객체는무엇인가? - 자주사용되는 SQL 문장은무엇인가? - 자주사용되는 SQL 문장이효율적으로실행되고있는가? 유지보수 - Tibero 의설치및패치를수행한다. - 데이터베이스의설계및분석, 구현을한다. - 데이터베이스의생성및권한을설정한다. - 사용자의권한을설정한다. 정책및절차확립 보안 백업및복구 데이터베이스의관리, 보안, 유지보수등에속하는정책및절차를확립한다. 데이터누출이나유실을막기위해보안정책을수립한다. 주기적으로데이터를백업하며, 문제발생시복구한다. Tibero 는 DBA 가위와같은항목을효율적이고유연하게관리할수있도록유틸리티를제공하고있다. 참고 자세한내용은 "Tibero 유틸리티안내서 " 를참고한다. 2.1.2. SYS Tibero를설치하고나면, 데이터베이스자체의메타데이터를관리하는 SYS라는사용자가생성된다. SYS 사용자에 DBA 역할이부여되며, 이는 UNIX 계열 (LINUX 포함 ) 의루트사용자와비슷한역할을담당한다. Tibero의데이터사전, 기반테이블, 뷰등은모두 SYS 사용자의스키마에저장된다. 특히기반테이블, 뷰는 Tibero가동작하는데매우중요한역할을한다. 따라서 SYS 사용자외다른사용자가이를수정하거나조작해서는안된다. SYS 사용자의접속계정은다음과같다. 항목 ID 설명 ID 는 'SYS' 이다. SYS 사용자는하나의스키마를가진다. 스키마의이름은사용자이름인 SYS 와 동일하다. 14 Tibero 관리자안내서
항목 패스워드 설명 패스워드는 Tibero 를설치할때사용자가입력한값이다. 패스워드는설치후에 변경할수있다. 2.1.3. 시스템관리자 일부사이트는 1명이상의시스템관리자가있다. 시스템관리자 ( 또는 sysadmin, 네트워크관리자포함 ) 는컴퓨터시스템이나네트워크를운영하고유지보수하는개인이나그룹이다. 서버나다른컴퓨터에운영체제를설치하고, 유지보수하며서비스정지등의문제에대해관리책임이있다. 또한, 약간의프로그래밍실력그리고시스템과관련된프로젝트에대한관리, 감시, 운영기술등을가지고있어야하며컴퓨터문제에대해기술적지원을하는역할도수행해야한다. 2.1.4. 애플리케이션프로그램개발자 애플리케이션프로그램개발자는보통넓은영역의컴퓨터프로그래밍이나전문적인프로젝트관리분야에서소프트웨어개발작업을하는개인이다. 애플리케이션프로그램개발자는일반적으로개별프로그램작업보다는애플리케이션프로그램의수준에서전반적인프로젝트에기여한다. 애플리케이션프로그램개발자는데이터베이스사용측면에서데이터베이스애플리케이션프로그램을설계하고구현하는역할을수행한다. 역할은다음과같다. 데이터베이스애플리케이션프로그램의설계와개발 애플리케이션프로그램을위한데이터베이스구조설계및명세 애플리케이션프로그램을위한저장공간요청 DBA 와데이터베이스정보를공유 개발중에애플리케이션프로그램튜닝 개발중에애플리케이션프로그램의보안정책수립 2.1.5. 데이터베이스사용자 데이터베이스사용자는 Tibero 를사용하는 DBA, 업무분석가, 애플리케이션프로그램개발자, 사용자모 두를뜻한다. 제 2 장관리의기본 15
2.2. 설치환경 Tibero 를정상적으로설치했다면, 시스템에다음과같은환경변수가설정된다. 환경변수 $TB_HOME $TB_SID $PATH 설명 Tibero가설치된홈디렉터리로 Tibero 서버, 클라이언트라이브러리, 다양한부가기능을수행하는파일이설치된다. 한머신에서 Tibero의인스턴스를여러개로운영할때필요한서비스 ID이다. 파일시스템을통해특정파일에접근하기위한디렉터리경로를설정하는환경변수이다. 환경변수를제대로설정하지않으면 Tibero 를사용할수없다. 따라서환경변수를확인하는절차가필요 하다. 참고본안내서에서는 UNIX 셸명령어를실행할때 GNU Bash(http://www.gnu.org/software/bash/) 문법을따른다. 사용하는셸의종류에따라문법이다를수있으며, 자세한내용은현재사용중인운영체제의안내서를참고한다. UNIX 셸프롬프트에서환경변수를확인하는방법은다음과같다. $TB_HOME $ echo $TB_HOME /home/tibero/tibero5 이디렉터리안에는 Tibero 서버, 클라이언트라이브러리, 부가기능을지원하는파일이있다. $TB_SID $ echo $TB_SID Tb5 서비스 ID 는데이터베이스의이름과동일하게설정할것을권장한다. $PATH $ echo $PATH...:/home/tibero/tibero4/bin:/home/tibero/tibero4/client/bin:... $PATH 는다음의디렉터리를포함하고있어야한다. 16 Tibero 관리자안내서
디렉터리 $TB_HOME/bin $TB_HOME/client/bin 설명 Tibero 의실행파일과서버관리를위한유틸리티가위치한디렉터리이다. Tibero 의클라이언트실행파일이있는디렉터리이다. 2.3. tbsql 유틸리티의사용 tbsql은 Tibero에서제공하는대화형 SQL 명령어처리유틸리티이다. SQL 질의, 데이터정의어, 트랜잭션과관련된 SQL 문장등을실행할수있다. 본절에서는 tbsql 유틸리티를이용하여데이터베이스에접속하는방법과그이후에간단한 SQL 문장을실행하는방법을설명한다. tbsql 유틸리티 tbsql 유틸리티를실행하는방법은다음과같다. [ 예 2.1] tbsql 유틸리티의실행 $ tbsql tbsql 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. SQL> tbsql 유틸리티가정상적으로실행되면이처럼 SQL 프롬프트가나타난다. 이프롬프트에서데이터베이 스사용자는 SQL 문장을실행할수있다. 참고 SQL 프롬프트가나타나지않고데이터베이스접속에실패한경우 Appendix C. 문제해결 을참고 하여해결한다. 데이터베이스접속 tbsql 유틸리티를실행한후 SQL 프롬프트가나타나면데이터베이스에접속할수있는상태가된다. 데이터베이스에접속하는방법은다음과같다. 제 2 장관리의기본 17
[ 예 2.2] tbsql 유틸리티를이용한데이터베이스접속 $ tbsql SYS/tibero tbsql 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Connected to Tibero. SQL> 본예제에서는 UNIX 셸프롬프트에서 tbsql 유틸리티의실행과함께사용자명과패스워드를입력한다. 사용자명과패스워드를입력할때에는다음과같은규칙이있다. 항목 사용자명 패스워드 설명스키마객체의이름과마찬가지로대소문자를구분하지않는다. 단, 큰따옴표 ( ) 에사용자명을입력하는경우는예외다. 패스워드는대소문자를구분하므로입력할때주의해야한다. tbsql 유틸리티의명령어 tbsql 유틸리티에서사용할수있는명령어는대소문자를구분하지않고사용할수있으며, SQL 문장을 실행하거나데이터베이스관리에필요한명령어가포함되어있다. tbsql 유틸리티에서사용할수있는명령어는총 35 개로다음과같다. 명령어! 설명 운영체제의명령어를실행하는명령어이다. HOST 명령어와동일하다. @ 스크립트를실행하는명령어이다. START 명령어와동일하다. / 현재 SQL 버퍼내의 SQL 문장또는 tbpsm 프로그램을실행하는명령어이다. RUN 명령어와동일하다. ACC[EPT] C[HANGE] CL[EAR] 사용자의입력을받아바인드변수의속성을설정하는명령어이다. SQL 버퍼의현재라인에서패턴문자를찾아주어진문자로변환하는명령어이다. 설정된옵션을초기화하거나지우는명령어이다. 18 Tibero 관리자안내서
명령어 COL[UMN] CONN[ECT] COUNT DEFINE DEL DESC[RIBE] DISC[ONNECT] ED[IT] EXEC[UTE] EXIT 설명컬럼의출력속성을설정하는명령어이다. 특정사용자 ID로데이터베이스에접속하는명령어이다. 지정된테이블의컬럼개수를세는명령어이다. 바인드변수를정의하거나출력하는명령어이다. SQL 버퍼에저장된라인을지우는명령어이다. 지정된객체의컬럼정보를출력하는명령어이다. 현재데이터베이스로부터접속을해제하는명령어이다. 특정파일또는 SQL 버퍼의내용을외부편집기를이용하여편집하는명령어이다. 단일 tbpsm 문장을수행하는명령어이다. tbsql 유틸리티를종료하는명령어이다. QUIT 명령어와동일하다. H[ELP] HIS[TORY] HO[ST] 도움말을출력하는명령어이다. 실행한명령어의히스토리를출력하는명령어이다. 운영체제명령어를실행하는명령어이다.! 명령어와동일하다. I[NPUT] L[IST] LOAD[FILE] LS PAU[SE] PRI[NT] PRO[MPT] Q[UIT] SQL 버퍼의현재라인뒤에새로운라인을추가하는명령어이다. SQL 버퍼내의특정내용을출력하는명령어이다. Tibero의테이블을 Oracle의 SQL*Loader 툴이인식할수있는형식으로저장하는명령어이다. 현재사용자가생성한데이터베이스객체를출력하는명령어이다. 사용자가 <Enter> 키를누를때까지실행을멈추는명령어이다. 사용자가정의한바인드변수의값을출력하는명령어이다. 사용자가정의한 SQL 문장이나빈라인을그대로화면에출력하는명령어이다. tbsql 유틸리티를종료하는명령어이다. EXIT 명령어와동일하다. R[UN] 현재 SQL 버퍼내의 SQL 문장이나 tbpsm 프로그램을실행하는명령어이다. / 명령어와동일하다. SET SHO[W] SPO[OL] tbsql 유틸리티의시스템변수를설정하는명령어이다. tbsql 유틸리티의시스템변수를출력하는명령어이다. 화면에출력되는내용을모두외부파일에저장하는과정을시작하거나종료하는명령어이다. 제 2 장관리의기본 19
명령어 STA[RT] 설명 스크립트파일을실행하는명령어이다. @ 명령어와동일하다. [TB]DOWN UNDEF[INE] VAR[IABLE] Tibero 를종료하는명령어이다. 하나이상의바인드변수를삭제하는명령어이다. 사용자가정의한바인드변수를선언하는명령어이다. 위표에서대괄호 ([ ]) 에포함된내용은입력하지않아도명령어를실행할수있다. 참고 tbsql 유틸리티에대한자세한내용은 "Tibero 유틸리티안내서 " 를참고한다. 기본적으로자신의스키마에어떤객체들이있는지알아보기위해서는 LS 명령어를사용해야한다. 다음은 SYS 사용자로데이터베이스에접속하여 LS 명령어를실행하는예이다. [ 예 2.3] LS 명령어의실행 SQL> LS NAME OBJECT_TYPE ------------------------------ -------------------- SYS_CON100 INDEX SYS_CON400 INDEX SYS_CON700 INDEX _DD_CCOL_IDX1 INDEX... 중간생략... UTL_RAW PACKAGE DBMS_STATS PACKGE BODY TB_HIDDEN2 PACKGE BODY SQL> LS 명령어는 tbsql 유틸리티를사용할때사용자의편의를위해제공되는명령어이며, SQL 문장을실행할때지원하는명령어는아니다. 오직 tbsql 유틸리티에서만사용할수있다. 즉, tbsql 유틸리티가아닌 JDBC, CLI 등을이용하여접속한경우, 이명령어를사용할수없다. [ 예 2.3] 에서는 SYS 사용자의스키마에존재하는모든객체가출력된다. SYS 스키마에는 Tibero가스스로를관리하기위해내부적으로사용되는객체가많다. 따라서객체가많이출력된다. 20 Tibero 관리자안내서
다음은 LS 명령어를실행하여현재시스템에접속하고있는사용자를조회하는예이다. [ 예 2.4] LS 명령어의실행 - 사용자조회 SQL> LS USER USERNAME ------------------------------ SYS 다음은 LS 명령어를실행하여현재데이터베이스에존재하는테이블스페이스를조회하는예이다. [ 예 2.5] LS 명령어의실행 - 테이블스페이스조회 SQL> LS TABLESPACE TABLESPACE_NAME ------------------------------ SYSTEM UNDO TEMP USER SQL 문장의실행 다음은 V$SESSION이라는뷰를이용하여 TYPE 컬럼이 'WTHR' 인데이터를조회하는 SQL 문장을실행하는예이다. [ 예 2.6] SQL 문장의실행 (1) SQL> SELECT SID, STATUS, TYPE, WTHR_ID FROM V$SESSION WHERE TYPE = 'WTHR'; SID STATUS TYPE WTHR_ID ---------- -------------------------------- -------- ---------- 10 ACTIVE WTHR 1 13 RUNNING WTHR 1 2 rows selected. V$SESSION 은각각의세션 ID 를나열하는뷰이다. 다음은 SQL 표준에대한간략한설명이다. 일반적으로 SQL 문장을실행할때지켜야할규칙이있다. 이규칙은 ANSI(American National Standard Institute) 와 ISO/IEC(International Standard Organization/International Electrotechnical Commission) 에서 제 2 장관리의기본 21
공동으로제정한관계형 (relational) 또는객체관계형 (object-relational) 데이터베이스언어즉 SQL 표준을따른다. SQL 표준은 1992년과 1999년에각각버전 2와버전 3가제정되었다. 1992년에발표된 SQL 표준은 SQL2 또는 SQL-92라고불리며, 관계형데이터베이스를위한언어로정의되었다. 1999년에제정된 SQL 표준은 SQL3 또는 SQL-99라고불리며, SQL2에객체지향개념을추가하여확장한객체관계형데이터베이스언어이다. SQL 표준에서정의하고있는 SQL 문장은크게다음과같이나뉜다. 데이터조작어 (Data Manipulation Language, 이하 DML) 데이터정의어 (Data Definition Language, 이하 DDL) 데이터제어어 (Data Control Language, 이하 DCL) 참고 본안내서에서는 DCL 에포함되는 COMMIT, ROLLBACK 등의 SQL 명령어일부를트랜잭션및세션 언어로재구성하였다. 따라서전체 DCL 에대한내용은관련문서를참고하기바란다. DML 에포함되는 SELECT 문을다음과같이실행한다. [ 예 2.7] SQL 문장의실행 (2) SQL> select SID, STATUS, TYPE, WTHR_ID from v$session where type = 'WTHR';...[ 예 2.6] 의실행결과와동일... SQL> select SID, STATUS, TYPE, WTHR_ID from V$SESSION where type = 'WTHR';...[ 예 2.6] 의실행결과와동일... SQL> select SID, STATUS, TYPE, WTHR_ID From v$session Where type = 'WTHR';...[ 예 2.6] 의실행결과와동일... SQL 표준은대소문자를구분하지않으므로큰따옴표 ( ) 또는작은따옴표 ( ) 로묶은부분을제외하고는대소문자를혼용하여사용할수있다. 위예제는모두 [ 예 2.6] 를실행한결과와동일한결과가나타나며, 그의미또한같다. 그러나, 다음과같은 SQL 문장을실행하면그결과와의미는달라진다. SQL> SELECT SID, STATUS, TYPE, WTHR_ID FROM V$SESSION WHERE TYPE = 'wthr'; 0 row selected. 22 Tibero 관리자안내서
2.4. 사용자및테이블의생성 본절에서는데이터베이스를사용하기위해사용자와테이블을생성하는방법을설명한다. 사용자의생성 사용자를생성하려면 CREATE USER 문을사용해야한다. 다음은 ADMIN이라는사용자를생성하고세션 (CREATE SESSION) 과테이블을생성 (CREATE TABLE) 할수있는특권을부여하는예이다. [ 예 2.8] 사용자의생성 SQL> CREATE USER ADMIN IDENTIFIED BY 'password123';..."admin" 이라는이름의사용자를생성하고패스워드는 'password123' 으로한다. User 'ADMIN' created. SQL> GRANT CREATE SESSION TO ADMIN; Granted....ADMIN 사용자에게세션을시작할수있는특권을부여한다. SQL> GRANT CREATE TABLE TO ADMIN; Granted....ADMIN 사용자에게테이블을생성할수있는특권을부여한다. SQL> CONN ADMIN/PASSWORD123... 방금만든 ADMIN 사용자로데이터베이스에접속한다. TBR-17001: Login failed: invalid user name or password. No longer connected to server.... 패스워드는대소문자를구분하므로데이터베이스접속에실패한다. SQL> CONN ADMIN/password123 Connected.... 패스워드를올바르게입력한후, 데이터베이스에다시접속한다. SQL> LS... 방금생성된사용자이므로스키마객체가없다. NAME OBJECT_TYPE ------------------------------ -------------------- SQL> [ 예 2.8] 의과정을모두완료하면, Tibero 에 ADMIN 이라는새로운사용자가추가된다. 제 2 장관리의기본 23
테이블의생성 테이블을생성하려면 CREATE TABLE 문을사용해야한다. 다음은 PRODUCT라는테이블을생성하고 4개의로우데이터를삽입 (INSERT) 하는예이다. [ 예 2.9] CREATE TABLE 문을이용한테이블의생성 SQL> CREATE TABLE "PRODUCT" ( PROD_ID NUMBER(3) NOT NULL CONSTRAINT PROD_ID_PK PRIMARY KEY, PROD_NAME VARCHAR(50) NULL, PROD_COST NUMBER(10) NULL, PROD_PID NUMBER(3) NULL, PROD_DATE DATE NULL ); Table 'PRODUCT' created. SQL> SELECT TABLE_NAME FROM USER_TABLES;...USER_TABLES 은현재데이터베이스에접속한사용자의모든테이블을나열하는정적뷰이다. TABLE_NAME ------------------------ PRODUCT 1 row selected. SQL> DESC "PRODUCT"...DESC 는 PRODUCT 테이블에어떤컬럼이있는지출력하는 tbsql 유틸리티의명령어이다. COLUMN_NAME TYPE CONSTRAINT ------------------------ ---------------- -------------------------- PROD_ID NUMBER(3) PRIMARY KEY NOT NULL PROD_NAME VARCHAR(50) PROD_COST NUMBER(10) PROD_PID NUMBER(3) PROD_DATE DATE INDEX_NAME TYPE COLUMN_NAME ------------------------ ------- ------------------------------ PROD_ID_PK NORMAL PROD_ID SQL> INSERT INTO "PRODUCT" VALUES(601,'TIBERO',7000,'', to_date('2004-12-31 09:00:00', 'yyyy-mm-dd hh24:mi:ss'));...sql 표준에따라큰따옴표 ("") 로 PRODUCT 에설정하면스키마객체나사용자명을 24 Tibero 관리자안내서
영문대문자가아닌임의의글자로사용할수있다....SQL 표준에따라작은따옴표 ('') 는데이터베이스에직접삽입되는문자열데이터에 사용한다. 1 row inserted. SQL> INSERT INTO "PRODUCT" VALUES(602,'TIBERO2',8000,'601', to_date('2005-06-21 09:00:00', 'yyyy-mm-dd hh24:mi:ss')); 1 row inserted. SQL> INSERT INTO "PRODUCT" VALUES(603,'TIBERO3',9000,'601', to_date('2007-01-01 09:00:00', 'yyyy-mm-dd hh24:mi:ss')); 1 row inserted. SQL> INSERT INTO "PRODUCT" VALUES(604,'TIBERO4',10000,'601', to_date('2009-04-30 09:00:00', 'yyyy-mm-dd hh24:mi:ss')); 1 row inserted. SQL> SELECT * FROM "PRODUCT";...PRODUCT 테이블의모든데이터를출력하는 SQL 문장이다. PROD_ID PROD_NAME PROD_COST PROD_PID PROD_DATE ---------- ------------------- ---------- ---------- ---------- 601 TIBERO 7000 2004/12/31 602 TIBERO2 8000 601 2005/06/21 603 TIBERO3 9000 601 2007/01/01 604 TIBERO4 10000 601 2009/04/30 4 rows selected. Tibero 는 USER_TABLES 를비롯한여러정적뷰를제공한다. 이뷰를통해현재데이터베이스에접속한 사용자가접근할수있는스키마객체의다양한정보를볼수있다. 참고 정적뷰에대한내용은 "Tibero 참조안내서 " 를참고한다. 테이블생성과데이터삽입을완료하였으면, 이콘솔창을그대로놔두고또다른콘솔창을실행한다. 본예제에서는 tbsql 유틸리티를이용하여 [ 예 2.8] 에서생성한 ADMIN 으로 Tibero 에다음과같이접속한 다. $ tbsql ADMIN/password123 tbsql 5 제 2 장관리의기본 25
Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Connected to Tibero. SQL> SELECT * FROM "PRODUCT"; 0 row selected. 위예를보면, [ 예 2.9] 에서처럼 4개의로우데이터가출력되지않음을알수있다. 그이유는 Tibero는트랜잭션을지원하기때문에한세션에서입력한데이터라도커밋을하기전까지는다른세션에서보이지않는현상이다. 따라서 4개의로우데이터를확인하려면이전콘솔창 ([ 예 2.9] 화면 ) 으로이동하여트랜잭션의 commit 명령을실행해야한다. commit 명령을실행하는방법은다음과같다. SQL> COMMIT; Commit succeeded. 커밋이완료되면두번째콘솔창에서 SELECT 문을실행하여 4 개의로우데이터가출력되는지확인한다. 사용예제 다음은가상의시나리오를설정하여 SQL 문장을실행하는예이다. 시나리오는다음과같다. 8,500원미만의모든제품의가격 (PROD_COST 컬럼 ) 을 10% 인상했는데, 다시이전상태로복구해야한다. TIBERO2 제품은더이상판매하지않는다. 시나리오를기준으로 SQL 문장을실행하는과정은다음과같다. SQL> UPDATE "PRODUCT" SET PROD_COST = PROD_COST * 1.1 WHERE PROD_COST < 8500; 2 rows updated. SQL> SELECT PROD_NAME, PROD_COST FROM "PRODUCT"; PROD_NAME PROD_COST -------------------------------------------------- ---------- TIBERO 7700 TIBERO2 8800 TIBERO3 9000 TIBERO4 10000 4 rows selected. 26 Tibero 관리자안내서
...8,500 원미만의모든제품의가격 (PROD_COST 컬럼 ) 을 10% 인상한 SQL 문장이다. SQL> ROLLBACK;... 다시이전상태로복구한다. Rollback succeeded. SQL> DELETE FROM "PRODUCT" WHERE PROD_NAME = 'TIBERO2';...TIBERO2 제품은더는판매하지않는다. 따라서 PRODUCT 테이블에서이제품을삭제한다. 1 row deleted. SQL> SELECT PROD_NAME, PROD_COST FROM "PRODUCT";...PRODUCT 테이블을조회한다. TIBERO2 제품은삭제되었고, 10% 인상됐던 TIBERO 제품 (8,500 원미만 ) 은이전상태의가격으로롤백되었다. PROD_NAME PROD_COST -------------------------------------------------- ---------- TIBERO 7000 TIBERO3 9000 TIBERO4 10000 3 rows selected. SQL> quit...quit 명령어는현재진행중인트랜잭션을먼저커밋하고데이터베이스접속을종료한다. 따라서 TIBERO2 제품은 PRODUCT 테이블에서완전히제거되었다. Disconnected. $ SQL 문장을실행하는데있어사용자에게부여된특권은매우중요하다. DBA 역할을부여받은사용자라면, 데이터베이스를관리할때편리하게 SQL 문장을실행할수있다. 부여되지않은특권때문에매번 SYS 사용자나 DBA 역할을가진다른사용자로접속하여특권을부여해줘야하기때문이다. 이를해결하기위해여러특권을모아하나의역할로생성하는방법을사용할수있다. 참고 특권과역할에대한자세한내용은 5.2. 특권 과 5.4. 역할 을참고한다. 제 2 장관리의기본 27
다음은 SYS 사용자로데이터베이스에접속한후, [ 예 2.8] 에서생성한 ADMIN 사용자에게 DBA 역할을부 여하는예이다. $ tbsql SYS/tibero tbsql 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Connected to Tibero. SQL> GRANT DBA TO ADMIN; Granted. ADMIN 사용자를더이상사용하지않을경우에는다음과같은 SQL 명령을실행한다. SQL> DROP USER ADMIN; TBR-7139: cascade is required to remove this user from the system SQL> DROP USER ADMIN CASCADE; User 'ADMIN' dropped. 위예제에서보듯이, ADMIN 사용자의스키마에생성된모든객체를완전히삭제하려면 CASCADE 옵션을반드시사용해야한다. 그렇지않으면 TBR-7139 에러가발생한다. ADMIN 사용자는더이상데이터베이스에접속할수없게된다. 2.5. 기동과종료 본절에서는 Tibero 를기동하고종료할때사용하는명령어와이를사용하는방법을설명한다. 2.5.1. tbboot tbboot는 Tibero가설치된머신에서실행해야한다. 또한, 2.2. 설치환경 에서설명했듯이 tbboot를실행하기전에반드시환경변수가제대로설정되어있어야한다. 이명령어와관련된환경변수는 $TB_HOME 과 $TB_SID이다. 또한, tbboot는실행파일을실행할수있는권한이있는사용자라면어느누구든 Tibero를기동할수있다. 따라서이는보안문제가발생할수있어, 정책상 Tibero를설치한사용자만 Tibero의실행파일에접근할수있도록권한을설정할것을권장한다. 파일의권한 (permission) 을설정하는방법은다음과같다. $ cd $TB_HOME/bin $ chmod 700 tbsvrtblistenertbboottbdowntbctl $ ls -alf 28 Tibero 관리자안내서
total 56 drwxr-xr-x 4 tiberotibero 4096 Dec 28 18:12./ drwxr-xr-x 13 tiberotibero 4096 Dec 20 11:59../... 중간생략... -rwx------ -rwx------ -rwx------ lrwxrwxrwx lrwxrwxrwx 1... tbboot* 1... tbctl* 1... tbdown* 1... tblistener ->.build/dflt/tblistener* 1... tbsvr ->.build/dflt/tbsvr* $ ls -alf.build/dflt... 디렉터리이름은시스템환경에따라다를수있다.... total 98332 drwxr-xr-x 2 tiberotibero 4096 Dec 28 18:12./ drwxr-xr-x 3 tiberotibero 4096 Oct 30 13:52../ -rwx------ 1 tiberotibero 712592 Dec 28 18:12 tblistener* -rwx------ 1 tiberotibero 30613251 Dec 28 18:12 tbsvr* tbboot 의사용법은다음과같다. tbboot tbboot -v tbboot -h tbboot [-t] [ normal mount nomount resetlogs NORMAL MOUNT NOMOUNT RESETLOGS ] 옵션 설명 옵션이없는경우 Tibero 를부트모드중 NORMAL 로기동하는옵션이다. -h -v -t tbboot 를사용하기위한간단한도움말을보여주는옵션이다. Tibero 의버전정보를보여주는옵션이다. Tibero 서버를기동할수있는옵션이다. 이옵션은생략이가능하다. NORMAL Tibero에서는 tbboot에부트모드 (bootmode) 를제공한다. 다음은각부트모드에대한설명과사용예이다. 정상적으로데이터베이스의모든기능을사용할수있는모드이다. 사용예는다음과같다. $ tbboot NORMAL listener port = 8629 제 2 장관리의기본 29
Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started suspended at NORMAL mode. 참고 데이터베이스를비정상적으로종료한경우 Tibero 가기동할때자동으로파손복구 (crash recovery) 를실행한다. 자세한내용은 6.5.2. 파손복구 를참고한다. NOMOUNT Tibero의프로세스만기동시키는모드이다. 일반적으로는이모드를사용하는경우는거의없고 Tibero가기동한다음에 CREATE DATABASE 문을이용하여데이터베이스를생성하는것밖에없다. 사용예는다음과같다. $ tbboot NOMOUNT listener port = 8629 Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started suspended at NOMOUNT mode. MOUNT 미디어복구를위해사용하는모드이다. 사용예는다음과같다. $ tbboot MOUNT listener port = 8629 Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started suspended at MOUNT mode. 30 Tibero 관리자안내서
RESETLOGS Tibero 서버를기동하는과정에서로그파일을초기화하며, 미디어복구이후에사용하는모드이다. 사용예는다음과같다. $ tbboot RESETLOGS listener port = 8629 Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started suspended at NORMAL mode. 참고 RESETLOGS 부트모드는직전에데이터베이스가비정상적으로종료되었을경우에는사용할수없으며, 일단 Tibero가기동되면 NORMAL 모드와동일하게동작한다. 자세한내용은 6.5.3. 미디어복구 를참고한다. 2.5.2. tbdown tbdown 은현재동작중인 Tibero 를종료하는역할을수행한다. tbdown 의사용법은다음과같다. tbdown tbdown -h tbdown [-t] [ normal post_tx immediate abort switchover abnormal NORMAL POST_TX IMMEDIATE ABORT SWITCHOVER ABNORMAL ] tbdown clean 옵션 설명 옵션이없는경우 Tibero 를정상모드로종료하는옵션이다. -h -t clean tbdown을사용하기위한간단한도움말을보여주는옵션이다. Tibero 서버를종료할수있는옵션이다. 이옵션은생략이가능하다. Tibero 서버가비정상종료된상태에서운영중에사용하였던공유메모리나세마포어자원들을해제하는옵션이다. Tibero 서버가운영중일때는사용할수없는옵션이다. 제 2 장관리의기본 31
참고만약 Tibero 서버가 kill과같은시스템내부명령어에의해서비정상적으로종료된경우, 운영중에사용하였던공유메모리나세마포어자원들이해제가안될수있다. 이런경우에재부팅을시도하는경우실패를하게되고, 관리자는에러메시지를통해서서버가비정상종료되었다는것을인지하게된다. 이와같은서버의비정상종료후, 재부팅을하기위해서는먼저반드시 tbdown clean으로기존자원을해제시켜야한다. 비정상적으로종료되더라도초기화파라미터 BOOT_WITH_AUTO_DOWN_CLEAN를 Y로설정하면자동으로이전운영중에사용하였던자원을해제시켜부팅을시킬수는있다. 하지만관리자가서버의비정상종료상황을제대로인지하지못하고서버운영을할수있으며, 기존자원이나프로세스가제대로정리가안되는예외적이상황이발생하여충돌이날수있으므로 BOOT_WITH_AU TO_DOWN_CLEAN 옵션을켜는것을권장하지않는다. Tibero 에서는 tbdown 에다운모드 (downmode) 를제공한다. 다운모드 NORMAL POST_TX IMMEDIATE ABORT SWITCHOVER ABNORMAL 설명일반적인종료모드이다. 모든트랜잭션이끝날때까지기다리고나서 Tibero를종료하는모드이다. 현재수행중인모든작업을강제로중단시키며, 진행중인모든트랜잭션을롤백하고 Tibero를종료하는모드이다. Tibero의프로세스를강제로종료하는모드이다. Standby DB와 Primary DB를동기화시킨후, Primary DB를 NORMAL 모드처럼종료하는모드이다. Tibero 서버에접속하지않고서버프로세스를무조건강제로종료시키는모드이다. 참고 1. 만약현재 Tibero 서버에접속하고있는세션이존재하는경우에다운모드옵션이없는 tbdown 명령을하면, NORMAL 모드로세션이끝날때까지기다렸다가종료할건지, IMMEDIATE 모드로바로종료할건지, 아니면서버종료를취소할건지를선택해야한다. 2. 이장에서설명하는 tbdown 명령과다운모드는 SYS 사용자로접속한 tbsql의 SQL 프폼프트에서도가능하다. 이를통하여 Tibero 서버가설치되지않은원격에서 tbsql를이용하여서버를종료시킬수있다. 단, ABNORMAL 모드의 tbdown 명령은 tbsql에서사용할수없다. 3. Window에서서비스관리자를통해서 Tibero 서비스를중지시킬경우, 기본적으로 immediate 모드로 Tibero 서버가종료된다. 하지만사용자가원한다면초기화파라미터 SERVICE_CON TROL_STOP_DOWN를이용하여종료모드를설정할수있다. 32 Tibero 관리자안내서
NORMAL 다음은각모드에대한설명과예제이다. 일반적인종료모드이다. Tibero에 SYS 사용자로접속한다음다른모든세션의접속이끊어질때까지기다린후, 그다음서버를종료시킨다. 일단 tbdown을실행하고나면어떤사용자도더이상데이터베이스에접속할수없게된다. 하지만, tbdown이실행되기전에이미데이터베이스에접속한사용자는스스로접속을끊을때까지제한없이데이터베이스를계속사용할수있다. 사용예는다음과같다. $ tbdown Tibero instance terminated (NORMAL mode). POST_TX 모든트랜잭션이끝날때까지기다리고나서 Tibero를종료하는모드이다. POST_TX는 Tibero에 SYS 사용자로접속한다음모든트랜잭션이끝날때까지기다린다. 그다음 Tibero 를종료시킨다. tbdown 실행이시작되면더는데이터베이스에접속할수없고, 이미열려있던세션에서도새로운트랜잭션을시작할수없게된다. 다만, 현재수행중인트랜잭션은커밋혹은롤백할때까지제한없이수행할수있으며, 커밋이나롤백을하는순간자동으로데이터베이스접속을종료하게된다. 또한, tbdown 실행이시작되면데이터베이스에접속한클라이언트에게서버종료를알리는메시지를보내지않는다. tbsql 유틸리티등에서는클라이언트가서버종료를즉시알지못하고그다음명령을실행할때비로소 Tibero가종료되었음을알게된다. 예를들면다음과같다. $ tbsql admin/password123 tbsql 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Connected to Tibero. SQL> CREATE TABLE T1 (COL1 NUMBER); Table 'T1' created. SQL> INSERT INTO T1 VALUES(10); 1 row inserted. SQL> SELECT * FROM T1; 제 2 장관리의기본 33
COL1 ---------- 10 1 row selected.... 이시점에서 tbdown POST_TX 명령을실행한다....tbdown 명령은트랜잭션이끝나기를기다린다. SQL> COMMIT; Commit succeeded.... 이시점에서실제로서버가종료되고 tbdown 실행이끝난다. SQL> SELECT * FROM T1; TBR-2069: I/O read error... 서버가종료되었으므로 tbsql 유틸리티의프롬프트에서는 TBR-2069 에러가발생된다. IMMEDIATE 현재수행중인모든작업을강제로중단시키며, 진행중인모든트랜잭션을롤백하고 Tibero를종료하는모드이다. IMMEDIATE는 Tibero에 SYS 사용자로접속한다음현재수행중인모든작업을강제로종료하고진행중이던모든트랜잭션을롤백한후, Tibero를종료시킨다. 클라이언트에서 Tibero 종료를알지못하는것은 POST_TX 모드와같다. 트랜잭션이오래걸리는작업중에있었다면, 이를모두롤백하기위해서다소시간이걸릴수있다. 사용예는다음과같다. $ tbdown immediate Tibero instance terminated (IMMEDIATE mode). ABORT Tibero의프로세스를강제로종료하는모드이다. ABORT는 Tibero에 SYS 사용자로접속한다음 Tibero의 MTHR 프로세스가모든프로세스를 OS의강제종료시그널을전달하여강제로종료시키는모드이다. 따라서이모드는비상시에사용하며. 다음번에 Tibero를기동할때파손복구과정이필요하다. 사용예는다음과같다. 34 Tibero 관리자안내서
$ tbdown abort Tibero instance terminated (ABORT mode). ABORT는 Tibero가강제로종료시키므로사용하던시스템리소스를해제할기회가없다. 따라서서버가종료된다음에도공유메모리 (Shared Memory), 세마포어 (Semaphore) 등의시스템리소스가남아있을수있으며, 로그파일이나데이터파일도마찬가지이다. 또한, 다음번에 Tibero를기동할때파손복구에많은시간이걸릴수도있다. ABORT 는다음과같은경우에만제한적으로사용할것을권장한다. Tibero 의내부에러로인한정상적인종료가불가능한경우 H/W 에문제가발생하여 Tibero 를즉시종료해야하는경우 해킹등의비상상태가발생하여 Tibero 를즉시종료해야하는경우 SWITCHOVER SWITCHOVER는 Standby DB와 Primary DB를동기화시킨후, Primary DB를 NORMAL 모드처럼종료하는모드이다. 이와관련된자세한내용은 제8장 Tibero Standby Cluster 의 8.7.1. Switchover 를참고한다. ABNORMAL Tibero 서버에접속하지않고서버프로세스를무조건강제로종료시키는모드이다. ABNORMAL은 Tibero 서버에접속하지않은채현재 Tibero 서버상태와상관없이 OS의강제종료시그널을사용하여무조건서버프로세스를강제로종료시키는모드이다. 따라서이모드는비상시에사용하며, 다음번에 Tibero를기동할때파손복구과정이필요하다. 사용예는다음과같다. $ tbdown abnormal Tibero instance terminated (ABNORMAL mode). ABNORMAL는 Tibero가강제로종료시키므로사용하던시스템리소스를해제할못할수있다. 따라서서버가종료된다음에도공유메모리 (Shared Memory), 세마포어 (Semaphore) 등의시스템리소스가남아있을수있으며, 로그파일이나데이터파일도마찬가지이다. 또한, 다음번에 Tibero를기동할때파손복구에많은시간이걸릴수도있다. ABNORMAL은다음과같은경우에만제한적으로사용할것을권장한다. 제 2 장관리의기본 35
Tibero 의내부에러로인한정상적인종료가불가능한경우 ABNORMAL 외다른종료모드로종료명령을내린후종료가지연되고있을때, 강제로즉시종료해야 하는경우 H/W 나 OS 등의외부적인요인으로인하여문제가발생하여 ABNORMAL 외다른종료모드의실행이 실패한경우 H/W 에문제가발생하여 Tibero 를즉시종료해야하는경우 해킹등의비상상태가발생하여 Tibero 를즉시종료해야하는경우 36 Tibero 관리자안내서
제 3 장파일과데이터의관리 본장에서는 Tibero 의파일과데이터를관리하는방법을설명한다. 3.1. 데이터의저장구조 Tibero의데이터를저장하는구조는다음과같이두가지영역으로나뉜다. 논리적저장영역데이터베이스의스키마객체를저장하는영역이다. 논리적저장영역은다음과같은포함관계가있다. 데이터베이스 > 테이블스페이스 > 세그먼트 > 익스텐트 물리적저장영역 운영체제와관련된파일을저장하는영역이다. 물리적저장영역은다음과같은포함관계가있다. 데이터파일 > 운영체제의데이터블록 3.2. 테이블스페이스 테이블스페이스는논리적저장영역과물리적저장영역에공통적으로포함된다. 논리적저장영역에는 Tibero의모든데이터가저장되며, 물리적저장영역에는데이터파일이하나이상저장된다. 테이블스페이스는논리적저장영역과물리적저장영역을연관시키기위한단위이다. 3.2.1. 테이블스페이스의구성 테이블스페이스는크게두가지구성으로 Tibero 의데이터를저장한다. 제 3 장파일과데이터의관리 37
테이블스페이스의논리적구성 다음은테이블스페이스의논리적구성을나타내는그림이다. [ 그림 3.1] 테이블스페이스의논리적구성 테이블스페이스는 [ 그림 3.1] 과같이세그먼트 (Segment), 익스텐트 (Extent), 데이터블록 (Block) 으로구성 된다. 구성요소 세그먼트 설명 익스텐트의집합이다. 하나의테이블, 인덱스등에대응되는것으로, CREATE TABLE 등의문장을실행하 면생성된다. 익스텐트 연속된데이터블록의집합이다. 세그먼트를처음만들거나, 세그먼트의저장공간이더필요한경우, Tibero 는테이블 스페이스에서연속된블록의주소를갖는데이터블록을할당받아세그먼트에추가 한다. 데이터블록 데이터베이스에서사용하는데이터의최소단위이다. Tibero 는데이터를블록 (Block) 단위로저장하고관리한다. 참고 논리적저장영역을관리하는방법에대한자세한내용은 제 4 장스키마객체의관리 를참고한다. 38 Tibero 관리자안내서
테이블스페이스의물리적구성 다음은테이블스페이스의물리적구성을나타내는그림이다. [ 그림 3.2] 테이블스페이스의물리적구성 테이블스페이스는 [ 그림 3.2] 와같이물리적으로여러개의데이터파일로구성된다. Tibero는데이터파일외에도컨트롤파일과로그파일을이용하여데이터를저장할수있다. 빈번하게사용되는두테이블스페이스 ( 예 : 테이블과인덱스 ) 는물리적으로서로다른디스크에저장하는것이좋다. 왜냐하면한테이블스페이스를액세스하는동안에디스크의헤드가그테이블스페이스에고정되어있기때문에, 다른테이블스페이스를액세스할수없다. 따라서, 서로다른디스크에각각의테이블스페이스를저장하여동시에액세스하는것이데이터베이스성능을향상시키는데도움이된다. 참고 테이블스페이스안에서특정한데이터파일을사용할수있도록임의로지정할수없다. 또한, 테이 블스페이스내의모든데이터블록은구분되지않고저장공간에할당된다. 3.2.2. 테이블스페이스의생성, 제거 테이블스페이스는생성되는유형에따라시스템테이블스페이스 (System Tablespace) 와비시스템테이블스페이스 (Non System Tablespace) 로구분된다. 시스템테이블스페이스는데이터베이스가생성될때자동으로생성되는테이블스페이스고, 비시스템테이블스페이스는일반사용자가생성한테이블스페이스이다. 본절에서는비시스템테이블스페이스를생성하고제거하는방법을설명한다. 제 3 장파일과데이터의관리 39
테이블스페이스의생성 테이블스페이스를생성하기위해서는 CREATE TABLESPACE 문을사용해야한다. 테이블스페이스의이름, 테이블스페이스에포함되는데이터파일과데이터파일의크기, 익스텐트의크기등을설정할수있다. 다음은하나의데이터파일 my_file.dtf로구성되는테이블스페이스 my_space를생성하는예이다. CREATE TABLESPACE my_space DATAFILE '/usr/tibero/dtf/my_file.dtf' SIZE 50M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256K; 데이터파일 my_file.dtf는 SQL 문장을실행함과동시에생성된다. 만약동일한이름의파일이이미사용중이라면에러를반환하게된다. 데이터파일 my_file.dtf의크기는 50MB이며, 테이블스페이스의크기도 50MB가된다. 참고 Tibero에서는데이터파일마다데이터블록을 2^22개까지관리한다. 따라서데이터파일의최대크기는데이터블록의크기 * 2^22 이다. 예를들어, 데이터블록의크기가 8KB라고한다면데이터파일의최대크기는 32GB이다. Tibero에서는하나의테이블스페이스내의모든익스텐트의크기를항상일정하게관리한다. 예를들어, 하나의익스텐트의크기가 256KB이고, 데이터블록의크기가 4KB라고한다면하나의익스텐트에는총 64개의데이터블록이포함된다. 또한, 하나의테이블스페이스를두개이상의데이터파일로구성할수도있다. 예를들면다음과같다. CREATE TABLESPACE my_space2 DATAFILE '/usr/tibero/dtf/my_file21.dtf' SIZE 20M,... 1... '/usr/tibero/dtf/my_file22.dtf' SIZE 30M... 2... EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K;... 3... 1 20MB 크기의데이터파일 my_file21.dtf를정의한다. 2 30MB 크기의데이터파일 my_file22.dtf를정의한다. 테이블스페이스 my_space2의전체크기는총 50MB가된다. 3 테이블스페이스 my_space2는하나의익스텐트의크기가 64KB로설정한다. 하나의테이블스페이스에포함되는데이터파일의개수는데이터베이스와시스템환경에따라달라진다. 하나의테이블스페이스에많은데이터가저장되면여러개의데이터파일로테이블스페이스를생성해야한다. 단, 운영체제에따라동시에처리할수있는데이터파일의최대개수가달라질수있으므로, 범위내에서데이터파일의개수를조정해야한다. 40 Tibero 관리자안내서
데이터파일의크기는데이터베이스의크기를추정하여설정해야한다. 테이블스페이스를생성할때설정된크기보다더많은공간이필요할것에대비하여데이터파일의크기가자동으로확장되도록설정할수도있다. 다음은 CREATE TABLESPACE 문의 DATAFILE 절에 AUTOEXTEND 절을추가하여저장공간이더필요할것에대비하여 1MB씩확장하도록설정하는예이다. CREATE TABLESPACE my_space DATAFILE '/usr/tibero/dtf/my_file.dtf' SIZE 50M AUTOEXTEND ON NEXT 1M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256K; Tibero에서는데이터블록을할당한정보를테이블스페이스에비트맵형태로저장한다. 따라서, 테이블스페이스내의익스텐트의최대개수는 ( 테이블스페이스의크기 / 익스텐트의크기 ) 보다작은값이된다. 테이블스페이스의제거 테이블스페이스를제거하기위해서는 DROP TABLESPACE 문을사용해야한다. 단, 테이블스페이스를제거하면그안에포함되어있는모든스키마객체가제거되므로, 주의해야한다. 다음은테이블스페이스를제거하는예이다. DROP TABLESPACE my_space; 이 SQL 문장을실행하면데이터베이스에서테이블스페이스는제거되지만, 테이블스페이스를구성하는데이터파일은삭제되지않는다. 데이터파일까지제거하려면다음과같이 INCLUDING 절을삽입하여 DROP TABLESPACE 문을실행해야한다. DROP TABLESPACE my_space INCLUDING CONTENTS AND DATAFILES; 참고테이블스페이스를생성하거나제거하면그러한내용이컨트롤파일에동시에반영된다. CREATE TABLESPACE, DROP TABLESPACE 문에대한자세한내용은 "Tibero SQL 참조안내서 " 를참고한다. 3.2.3. 테이블스페이스의변경 테이블스페이스의저장공간이더필요한경우데이터파일이자동으로확장하도록설정하는방법도있지만, ALTER TABLESPACE 문에서 ADD DATAFILE 절을삽입하여새로운데이터파일을테이블스페이스에추가하는방법도있다. 다음은테이블스페이스 my_space에새로운데이터파일 my_file02.dtf를추가하는예이다. 제 3 장파일과데이터의관리 41
ALTER TABLESPACE my_space ADD DATAFILE 'my_file02.dtf' SIZE 20M; 데이터파일을추가할때위의예처럼절대경로를명시하지않으면, 디폴트로설정된디렉터리에데이터파일이생성된다. 이때생성되는데이터파일의개수는하나이상이될수있으며, 각데이터파일에대한크기를자동으로확장하도록설정할수있다. 참고데이터파일의절대경로를명시하지않았을때, 디폴트로생성되는위치는초기화파라미터파일 ($TB_HOME/config/$TB_SID.tip) 에설정된 DB_CREATE_FILE_DEST이다. 단, 해당파라미터가정의되지않았으면디폴트위치는 $TB_HOME/database/$TB_SID이다. 또한, 데이터파일은 ALTER DATABASE 문을통해크기를변경할수도있다. ALTER DATABASE 문을사용하면데이터파일의크기를늘리거나줄이는것이모두가능하다. 단, 데이터파일의크기를줄이는경우, 데이터파일안에저장되어있는스키마객체의전체크기보다작을경우에는에러가발생된다. 다음은데이터파일 my_file01.dtf의크기를변경하는예이다. ALTER DATABASE DATAFILE 'my_file01.dtf' RESIZE 100M; 특정테이블스페이스에읽고쓰는모든접근을허용하지않으려면 ALTER TABLESPACE 문에서 OFFLINE 절을이용하여테이블스페이스를오프라인상태로변경하면된다. 테이블스페이스오프라인은 NORMAL 과 IMMEDIDATE 두가지모드를지원한다. 모드 NORMAL IMMEDIATE 설명체크포인트를수행한후테이블스페이스오프라인을수행한다. 향후테이블스페이스온라인을수행할때미디어복구가필요없다. 체크포인트를수행하지않고테이블스페이스오프라인을수행한다. 향후테이블스페이스온라인을수행할때미디어복구가필요하다. 따라서 ARCHIVELOG 모드에서만가능하다. 다음은테이블스페이스 my_space 를 NORMAL 모드로오프라인상태로만든후다시온라인상태로만드 는예이다. ALTER TABLESPACE my_space OFFLINE [NORMAL]; ALTER TABLESPACE my_space ONLINE; 참고 SYSTEM, UNDO, TEMP 테이블스페이스는오프라인상태로변경할수없다. 42 Tibero 관리자안내서
다음은테이블스페이스 my_space 를 IMMEDIATE 모드로오프라인상태로만든후미디어복구를수행한 뒤다시온라인상태로만드는예이다. ALTER TABLESPACE my_space OFFLINE IMMEDIATE; ALTER DATABASE RECOVER AUTOMATIC TABLESPACE my_space; ALTER TABLESPACE my_space ONLINE; 참고 미디어복구에대한자세한내용은 6.5.3. 미디어복구 을참고한다. 3.2.4. 테이블스페이스의정보조회 Tibero에서는테이블스페이스를효율적으로관리하기위해다음표에나열된뷰 ( 정적뷰, 동적뷰포함 ) 를통해테이블스페이스의정보를제공하고있다. 테이블스페이스내의익스텐트의크기및개수, 할당된서버, 포함된데이터파일의이름및크기, 세그먼트의이름및종류, 크기등의정보를제공한다. 뷰 DBA_TABLESPACES USER_TABLESPACES V$TABLESPACE 설명 Tibero 내의모든테이블스페이스의정보를조회하는뷰이다. 현재사용자에속한테이블스페이스의정보를조회하는뷰이다. Tibero내의모든테이블스페이스에대한간략한정보를조회하는뷰이다. 참고 정적뷰와동적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 제 3 장파일과데이터의관리 43
3.3. 로그파일 로그파일은 Redo 로그를저장하는파일이다. Redo 로그는데이터베이스에서발생하는모든변경내용을포함하며, 데이터베이스에치명적인에러가발생한경우, 커밋된트랜잭션의갱신된내용을복구하는핵심적인데이터구조이다. 다음은 Redo 로그의구조를나타내는그림이다. [ 그림 3.3] Redo 로그의구조 Redo 로그 [ 그림 3.3] 에서보듯이, Redo 로그는두개이상의로그그룹 (Log Group) 으로구성된다. Tibero에서는이러한로그그룹을순환적 (Circular) 으로사용한다. 예를들어, 세개의로그그룹으로 Redo 로그를구성하는경우, 먼저로그그룹 1에로그를저장한다. 로그그룹 1에로그가가득차면, 그다음로그그룹 2, 3에로그를저장한다. 로그그룹 3까지로그가가득차면로그그룹 1부터다시저장한다. 이처럼하나의로그그룹을모두사용하고그다음로그그룹을사용하는것을로그전환 (log switch) 이라고한다. Redo 로그에는하나이상의로그레코드 (log record) 가저장된다. 로그레코드에는데이터베이스에서발생하는모든변경내용이포함되어있으며, 이전에변경된값과새로운변경값이함께저장된다. Tibero는동시에하나의로그그룹만을사용하는데, 현재사용중인로그그룹을활성화 (active) 된로그그룹이라고한다. 하나의로그그룹은하나이상의로그멤버로구성할수있다. 이러한구성을다중화 (multiplexing) 라고한다. 단, 다중화를하려면동일한그룹에속해있는모든로그멤버의크기는일정해야하며, 동일한데이터를저장하고동시에갱신되어야한다. 반면에서로다른영역에있는로그그룹은각각다른개수의로그멤버를포함할수있으며, 로그멤버의크기가같지않아도된다. 44 Tibero 관리자안내서
하나의로그그룹을여러로그멤버로구성하는이유는일부로그멤버가손상되더라도다른로그멤버를 사용하기위함이다. 디스크가대단히신뢰성이높거나데이터가손실되어도큰문제가없다면다중화를 하지않아도된다. ARCHIVELOG 모드의설정 Redo 로그에저장된내용을제3의저장장치에반영구적으로저장할수있다. 이러한과정을아카이브 (Archive) 라고하며, 디스크상에로그파일이손상될경우를대비하는작업이다. 아카이브에사용되는저장장치로는대용량하드디스크또는테이프등이있다. Tibero에서는 Redo 로그를사용하지않을때나, 데이터베이스와함께사용중인경우에도동시에아카이브를수행할수있다. Redo 로그를사용하는중에아카이브를하려면로그아카이브모드를 ARCHIVELOG 로설정해야한다. ARCHIVELOG 모드는마운트 (MOUNT) 상태에서다음의 SQL 문장을실행하여설정할수있다. SQL> ALTER DATABASE ARCHIVELOG; ARCHIVELOG 모드에서는아카이브가되지않은로그그룹은재사용되지않는다. 예를들어, 로그그룹 1를전부사용하고나서로그그룹 2를사용하려고할때, 로그그룹 2 이전에저장된로그가아카이브가되지않은경우에는로그그룹 2가아카이브가될때까지대기해야한다. 이때읽기전용이아닌모든트랜잭션은실행이잠시중지된다. 로그그룹 2가아카이브가되면바로활성화되어로그를저장한다. 또한, 잠시중지되었던트랜잭션도모두다시실행된다. DBA는이러한일이발생하지않도록로그그룹의개수를충분히설정해야한다. NOARCHIVELOG 모드의설정 Redo 로그를사용하는중에아카이브를수행하지않으려면로그아카이브모드를 NOARCHIVELOG로설정해야한다. NOARCHIVELOG 모드에서는아카이브가수행되지않으며, 로그그룹을순환적으로활성화하기전에아카이브되기를기다리는경우가발생하지않으므로데이터베이스의성능이향상된다. 하지만, 데이터베이스와 Redo 로그자체에문제가발생하여동시에복구할수없는경우라면, 이전에커밋된트랜잭션에의해갱신된데이터를모두잃어버리게된다. 따라서, NOARCHIVELOG 모드에서는복구가제한적으로이루어지므로항상데이터베이스전체를백업할것을권장한다. 3.3.1. 로그파일의구성 로그멤버는기본적으로하나의로그파일이다. Redo 로그를구성할때, 각로그그룹과로그멤버에서로다른로그파일을할당해야한다. 로그파일은데이터파일과서로다른디스크에저장할것을권장한다. 로그파일과데이터파일을같은디스크에저장하는경우, 디스크에장애가발생한다면데이터베이스를다시복구할수없게된다. 각로그그룹이여러개의로그멤버로구성된다면, 최소한로그멤버하나는데이터파일과다른디스크에저장되어야한다. 제 3 장파일과데이터의관리 45
로그멤버의다중화 로그그룹하나에포함된로그멤버는시스템의성능을위해서로다른디스크에저장하는것이좋다. 같은로그그룹내의모든멤버는같은로그레코드를저장해야한다. 모든로그멤버가서로다른디스크에존재하게된다면, 로그레코드를저장하는과정을동시에수행할수있다. 다음은같은로그그룹의모든로그멤버를서로다른디스크에배치한그림이다. [ 그림 3.4] 로그멤버의다중화 [ 그림 3.4] 에서 Log Member 1-1은로그그룹 1의첫번째로그멤버라는의미이다. 하나의디스크에같은그룹의로그멤버가존재한다면동시에같은로그레코드를저장할수없다. 이때문에데이터베이스시스템의성능이저하되는원인이되기도한다. 로그아카이브모드를 ARCHIVELOG로설정했을때, Redo 로그안에활성화된로그그룹의로그가저장됨과동시에비활성화된로그그룹중하나에대해서아카이브가수행된다. 활성화된로그그룹과아카이브중인로그그룹이한디스크에존재하게된다면이또한데이터베이스시스템의성능이저하되는원인이된다. 따라서, 서로다른로그그룹의로그파일은각각다른디스크에저장하는것이시스템성능을높이는데도움이된다. 로그그룹의다중화 다음은두개의로그멤버로구성된두개의로그그룹을서로다른디스크에분리하여배치한그림이다. [ 그림 3.5] 로그그룹의다중화 46 Tibero 관리자안내서
[ 그림 3.5] 에서 Log Member 1-1은로그그룹 1의첫번째로그멤버라는의미이다. 로그그룹의크기와개수를정할때는아카이브작업을충분히고려해야한다. 로그그룹의크기는제3의저장장치에빠르게전달하고저장공간을효율적으로사용할수있도록설정해야한다. 또한, 로그그룹의개수는아카이브중인로그그룹을대기하는경우가발생하지않도록해야한다. 로그그룹의크기와개수는데이터베이스를실제로운영하면서변경해야한다. 즉, 데이터베이스에최적화된파라미터를설정한후로그그룹의크기와개수를증가시켜가면서, 데이터베이스처리성능에무리가가지않는범위에서변경해야한다. 3.3.2. 로그파일의생성, 제거 새로운로그그룹또는로그그룹에포함되어있는로그멤버를생성하거나제거하려면 ALTER DATABASE 문을사용해야한다. 단, ALTER DATABASE 문을사용하기위해서는시스템특권이필요하다. 로그파일의생성 새로운로그그룹을생성하려면 ALTER DATABASE 문에 ADD LOGFILE 절을삽입해야한다. 이절은로그파일을추가할때사용한다. 단, 로그파일을추가할때에는로그그룹단위로만해야한다. 다음은두개의로그멤버로구성된로그그룹을추가하는예이다. 본예제에서는두로그멤버의크기를 512KB로설정한다. 이때두로그멤버의크기는항상같아야한다. ALTER DATABASE ADD LOGFILE ( '/usr/tibero/log/my_log21.log', '/usr/tibero/log/my_log22.log') SIZE 512K 또한, ADD LOGFILE 절에로그그룹의번호를지정할수있는 GROUP 옵션을추가할수있다. 로그그룹의번호를설정하면, 이후에특정한로그그룹을지칭하여로그멤버를추가하는등의작업을수행할수있다. 다음은로그그룹에번호를설정하는예이다. ALTER DATABASE ADD LOGFILE GROUP 5 ( '/usr/tibero/log/my_log21.log', '/usr/tibero/log/my_log22.log') SIZE 512K 기존의로그그룹에새로운로그멤버를추가하려면 ADD LOGFILE MEMBER 절을삽입해야한다. 이때 로그파일에할당된서버프로세스를반드시명시해야한다. 다음의 SQL 문장은로그그룹 5 에새로운로그멤버를추가하는예이다. ALTER DATABASE ADD LOGFILE MEMBER '/usr/tibero/log/my_log25.log' TO GROUP 5 제 3 장파일과데이터의관리 47
새로운로그멤버를추가할때에는로그파일의크기를지정하면안된다. 로그파일의크기는같은로그 그룹내의로그멤버의크기와동일하게설정한다. 로그파일의제거 로그그룹을제거하려면 DROP LOGFILE 절을삽입해야한다. 다음의 SQL 문장은로그그룹 5 를제거하는예이다. ALTER DATABASE DROP LOGFILE GROUP 5; 다음은로그그룹을제거하기전에고려해야할사항이다. 로그그룹이둘이상인가? Tibero 는로그그룹을최소한두개이상가져야한다. 로그그룹을제거한후남은로그그룹의개수가하나인가? 남은로그그룹의개수가하나이면에러를반환한다. 현재활성화되어사용중인로그그룹인가? 로그그룹은제거되지않는다. ARCHIVELOG 모드에서아카이브되지않은로그그룹인가? 로그그룹은제거되지않는다. 로그그룹내의하나의로그멤버를제거하기위해서는 DROP LOGFILE MEMBER 절을삽입해야한다. 로그그룹이할당된서버를명시해야하며, 로그그룹은명시하지않아도된다. 다음의 SQL 문장은로그멤버하나를제거하는예이다. ALTER DATABASE DROP LOGFILE MEMBER '/usr/tibero/log/my_log25.log' 로그멤버도로그그룹을제거할때처럼로그그룹내에남겨진로그멤버가하나도없는경우, 에러를반환하게된다. 뿐만아니라현재활성화되어사용중이거나 ARCHIVELOG 모드에서아카이브되지않은로그그룹내의로그멤버도제거되지않는다. 3.3.3. 로그파일의정보조회 Tibero에서는 Redo 로그관리에도움을주기위해다음표에나열된동적뷰를제공하고있다. Redo 로그의그룹별로그파일, 다중화정보, 갱신날짜등의정보를제공하며, DBA나일반사용자모두가이뷰를사용할수있다. 48 Tibero 관리자안내서
동적뷰 V$LOG V$LOGFILE 설명 로그그룹의정보를조회하는뷰이다. 로그파일의정보를조회하는뷰이다. 참고 동적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 3.4. 컨트롤파일 컨트롤파일은데이터베이스자체의메타데이터를보관하고있는바이너리파일이다. 최초의컨트롤파일은 Tibero를설치할때함께생성된다. 최초로설정된컨트롤파일에대한정보는 $TB_SID.tip 파일에저장된다. 컨트롤파일은 Tibero에의해서만생성과갱신을할수있다. 단, DBA가컨트롤파일의내용을조회하거나갱신할수는없다. 컨트롤파일에는다음과같은정보가포함되어있다. 정보데이터베이스테이블스페이스데이터파일 Redo 로그체크포인트 설명데이터베이스이름, $TB_SID.tip 파일의이름또는생성되었거나변경된타임스탬프등이있다. 테이블스페이스를구성하는데이터파일또는생성되었거나변경된타임스탬프등이있다. 데이터파일의이름과위치또는생성되었거나변경된타임스탬프등이있다. 로그그룹의개수및이를구성하는로그멤버 ( 로그파일 ) 의이름과위치또는생성되었거나변경된타임스탬프등이있다. 최근체크포인트를수행한타임스탬프등이있다. Tibero 에서는데이터베이스를다시기동할때마다먼저컨트롤파일을참조한다. 참조하는절차는다음과같다. 1. 테이블스페이스와데이터파일의정보를얻는다. 2. 데이터베이스에실제저장된데이터사전과스키마객체의정보를얻는다. 3. 필요한데이터를읽는다. Tibero 에서컨트롤파일은같은크기, 같은내용의파일을두개이상유지하기를권장한다. 이는 Redo 로 그멤버를다중화하는방법과유사하다. 제 3 장파일과데이터의관리 49
같은로그그룹내의로그멤버를서로다른디스크에설치하는것처럼, 컨트롤파일의복사본을서로다른디스크에저장하는것이좋다. 이는데이터베이스의시스템성능과안정성을유지하는데매우필요하다. 예를들어, 한디스크에컨트롤파일의복사본이존재하는경우문제가발생할수있다. 만약이디스크를영구적으로사용할수없게된다면, 컨트롤파일은복구할수없는상태가된다. 따라서컨트롤파일은 Redo 로그와연관하여배치하는것이좋다. 주의 컨트롤파일은데이터베이스를운영할때매우중요한파일이므로컨트롤파일이손상되지않도록 주의해야한다. 다음은컨트롤파일을다중화한그림이다. [ 그림 3.6] 컨트롤파일의다중화 위그림에서보듯이, 디스크마다하나의로그그룹에여러로그멤버를배치한것처럼컨트롤파일의복사본을같은위치에배치한다. Tibero에서는컨트롤파일로부터정보를확인할때여러복사본중에서하나만읽는다. 그리고테이블스페이스의변경등의이유로컨트롤파일을갱신해야하는경우에는모든복사본을동시에갱신한다. 컨트롤파일의갱신을유발하는 SQL 문장은모두 DDL 문장이다. DDL 문장의특징은하나의문장이하나의트랜잭션이된다는것이다. 따라서, DDL 문장을실행하면바로커밋되며, 갱신된내용은바로디스크에반영된다. 3.4.1. 컨트롤파일의변경 DBA는컨트롤파일의복사본을추가하거나제거할수있다. 컨트롤파일은 DBMS에대한메타데이터이므로, 데이터베이스를운영중일때에는컨트롤파일의변경이불가능하다. 따라서, 컨트롤파일의복사본을추가또는제거하기위한 SQL 문장은존재하지않는다. 반드시데이터베이스를종료한후, 컨트롤파일을변경해야한다. 이처럼컨트롤파일을추가또는제거하기위한 SQL 문장이존재하지않기때문에일반적인운영체제명령어를사용하여변경작업을수행해야한다. 그다음변경된내용을 $TB_SID.tip 파일에반영한다. 50 Tibero 관리자안내서
다음은 UNIX Command 에서컨트롤파일을복사하는예이다. $ cp /usr1/tibero/control01.ctl /usr3/tibero/control03.ctl 위의예에서 usr1 과 usr3 은서로다른디스크에존재하는디렉터리이다. Tibero는데이터베이스를다시기동하면서 $TB_SID.tip 파일을읽고, 변경된내용에따라컨트롤파일의갱신을수행한다. 이때유의할점은 $TB_SID.tip 파일내에설정된컨트롤파일의이름은절대경로를포함한이름이어야한다. 디스크에러등의원인으로컨트롤파일의복사본중하나라도문제가발생한다면, Tibero는즉시데이터베이스운영을중지한다. 컨트롤파일에문제가있는상태에서 Tibero를다시기동할수없으므로, DBA는문제가있는컨트롤파일의복사본을제거하거나문제가없는컨트롤파일의복사본을다시복사해야한다. 이때컨트롤파일의변경내용은반드시 $TB_SID.tip 파일에반영시켜야한다. 컨트롤파일의백업은논리적백업만을지원한다. 따라서컨트롤파일을생성하는 SQL 문장을백업해야한다. 특히테이블스페이스, 데이터파일, Redo 로그를새로생성하거나변경또는제거를수행한경우에는바로컨트롤파일을백업하는것이관리측면에서안전하다. 물론데이터베이스전체를백업할때에도컨트롤파일자체를백업해야한다. 참고 자세한내용은 6.4. 백업의실행 을참고한다. 다음의 SQL 문장은컨트롤파일을백업하는예이다. SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/tibero5/backup/ctrlfile1.sql' REUSE NORESETLOGS; 위예에서보듯이, 백업할컨트롤파일의복사본 (ctrlfile1.sql) 은기존의복사본과다른디스크에저장해야하므로, 반드시절대경로를포함한이름을명시해야한다. 3.4.2. 컨트롤파일의정보조회 Tibero에서는컨트롤파일을관리하는데도움을주기위해다음표에동적뷰를제공하고있다. 데이터베이스생성시간, 체크포인트정보등의정보를제공하며, DBA나일반사용자모두가이뷰를사용할수있다. 동적뷰 V$DATABASE V$CONTROLFILE 설명 ARCHIVELOG 모드여부와체크포인트등의정보를조회하는뷰이다. 컨트롤파일의이름과상태등의정보를조회하는뷰이다. 제 3 장파일과데이터의관리 51
참고 동적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 52 Tibero 관리자안내서
제 4 장스키마객체의관리 본장에서는 Tibero에서실제로데이터베이스를구성하는데필요한논리적저장영역즉스키마객체를관리하는방법과이를구성하는최소단위인디스크블록을설명한다. 다음은데이터베이스의대표적인스키마객체이다. 테이블 (Table) 인덱스 (Index) 뷰 (View) 시퀀스 (Sequence) 동의어 (Synonym) 스키마객체는한스키마에의해생성되며또한, 그스키마에속하게된다. 여기서테이블, 인덱스와같이실제물리적공간을가지는객체를세그먼트라고한다. 4.1. 테이블 테이블은관계형데이터베이스에서가장기본적인스키마객체이다. 다른스키마객체의형태로표현하더라도대부분의데이터베이스처리는테이블에서이루어진다. 따라서, 관계형데이터베이스의설계는테이블의설계가가장중심이되며, 테이블을효율적으로관리하는것이데이터베이스성능에큰영향을미친다. 테이블은다음과같이두가지구성요소로이루어진다. 구성요소 컬럼 (column) 로우 (row) 설명 테이블에저장될데이터의특성을설정한다. 하나의테이블을구성하며다른유형의데이터가저장된다. 데이터베이스를효율적으로운영하기위해서는테이블설계를정확하게해야하며, 테이블의배치와저장환경설정등을고려해야한다. Tibero는테이블을생성하고나서설계를변경하는것을어느정도허용하고있다. 그러나, 테이블의설계를변경하려면처리비용이많이들기때문에될수있으면잦은변경은하지말아야한다. 제 4 장스키마객체의관리 53
테이블을정확하게설계하기위해서는정규화 (normalization) 과정과각테이블에적절한무결성제약조 건 (integrity constraints) 을설정해야한다. 예를들어, 조인연산을피하기위해테이블간의중복된데이터 를허용하는경우데이터의일관성유지를위해어떻게테이블을설계할것인지를고려해야한다. 4.1.1. 테이블의생성, 변경, 제거 본절에서는테이블을생성, 변경, 제거하는방법을설명한다. 테이블의생성 테이블은다음같은경우에따라생성요건이다르다. 현재사용자가자신의스키마에테이블을생성하는경우 CREATE TABLE 문을사용할수있는시스템특권이있어야한다. 다른사용자의스키마에테이블을생성하는경우 CREATE ANY TABLE 문을사용할수있는시스템 특권이있어야한다. 테이블을생성하기위해서는 CREATE TABLE 문을사용해야한다. 다음은테이블을생성할때포함되는구성요소이다. 구성요소 테이블의이름 설명 - 테이블의이름을설정한다. 이구성요소는테이블을생성할때반드시포함 되어야한다. - 테이블의이름은최대 128자로설정할수있다. - 한사용자의스키마내에서유일해야하며, 모든스키마객체의이름과달라야한다. - 서로다른사용자는같은이름의테이블을소유할수있다. - 인덱스, 트리거, 대용량객체형과도같은이름을사용할수있다. - 공용동의어 (public synonym) 와같은이름도테이블의이름으로사용할수있다. 공용동의어의이름을 SQL 문장에서사용하면공용동의어라는의미대신현재사용자가소유한테이블이된다. 테이블의컬럼구조 - 테이블에저장될데이터의특성 ( 컬럼이름, 데이터타입, 디폴트값등 ) 을설 정한다. 이구성요소는테이블을생성할때반드시포함되어야한다. - 테이블은하나이상의컬럼으로구성되며, 각컬럼은반드시데이터타입을 선언해야한다. - 한테이블은최대 1,000 개의컬럼으로구성할수있다. 54 Tibero 관리자안내서
구성요소 설명 - 컬럼의이름은최대 128 자로설정할수있다. - 컬럼의디폴트값과제약조건은선택적으로선언할수있다. 무결성제약조건 - 테이블의컬럼에사용자가원하지않는데이터가입력, 변경, 제거되는것 을방지하기위해설정한다. 이구성요소는테이블을생성할때선택적으로 사용할수있다. 자세한내용은 4.2. 제약조건 을참고한다. - 기본키 (PRIMARY KEY), 유일키 (UNIQUE KEY), 참조무결성 (referential integrity), NOT NULL, CHECK 등의제약조건이있다. - 제약조건의이름은테이블내에서유일해야한다. - 제약조건은컬럼또는테이블단위에서설정할수있다. - 두개이상의복합컬럼을사용하는경우제약조건을따로설정해야한다. - ALTER TABLE 문을사용하여제약조건을추가또는상태를변경하거나제거할수있다. 테이블스페이스 - 테이블이저장될테이블스페이스를설정한다. 이구성요소는테이블을생 성할때선택적으로사용할수있다. - 테이블스페이스를명시하지않으면사용자의디폴트테이블스페이스로설정된다. - 테이블의적절한배치가데이터베이스성능에큰영향을미치므로, 테이블의소유자는테이블이저장될테이블스페이스를별도로명시하는것이좋다. 디스크블록파라미터 디스크블록마다테이블의갱신에대비하여어느정도여유공간을남겨둘 것인가를설정한다. 자세한내용은 4.3. 디스크블록 을참고한다. - PCTFREE - INITRANS 파티션 - 파티션을정의한다. 다음은테이블을생성하는예이다. [ 예 4.1] 테이블의생성 CREATE TABLE DEPT ( DEPTNO NUMBER PRIMARY KEY, DEPTNAME VARCHAR(20), PDEPTNO NUMBER ) TABLESPACE my_space 제 4 장스키마객체의관리 55
PCTFREE 5 INITRANS 3; CREATE TABLE EMP ( EMPNO NUMBER PRIMARY KEY, ENAME VARCHAR(16) NOT NULL, ADDR VARCHAR(24), SALARY NUMBER, DEPTNO NUMBER, CHECK (SALARY >= 10000), FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO) ) TABLESPACE my_space PCTFREE 5 INITRANS 3; 위의예에서보듯이, 테이블 EMP 는다섯개의컬럼 (EMPNO, ENAME, ADDR, SALARY, DEPNO) 으로구 성되어있으며, 네개의제약조건으로선언되어있다. 또한, 테이블스페이스 my_space 에저장되며, 디스 크블록파라미터의세부항목 (PCTFREE, INITRANS) 을모두설정하였다. 테이블의변경 테이블은다음같은경우에따라변경요건이다르다. 현재사용자가자신의스키마에속한테이블을변경하는경우 ALTER TABLE 문을사용할수있는시스템특권이있어야한다. 다른사용자의스키마에있는테이블을변경하는경우 ALTER ANY TABLE 문을사용할수있는시스 템특권이있어야한다. 테이블을변경하기위해서는 ALTER TABLE 문을사용해야한다. 다음은테이블을변경할때포함되는구성요소이다. 구성요소 테이블의이름 설명 - 테이블의이름을변경한다. - 테이블의이름은최대 128 자로변경할수있다. 컬럼의정의변경 - 컬럼에정의된속성 ( 디폴트값, 제약조건등 ) 을변경한다. - 컬럼의디폴트값과제약조건은 MODIFY 절을이용하여변경한다. [ 예 4.2] 를참고한다. 컬럼의이름 - 컬럼의이름과정의된컬럼의속성을변경한다. 56 Tibero 관리자안내서
구성요소 설명 - 컬럼이름은최대 30 자로변경할수있으며, RENAME COLUMN 절을사용 하여변경한다. [ 예 4.3] 을참고한다. 디스크블록의파라미터 제약조건 - 파라미터의이름과값을지정한다. [ 예 4.4] 를참고한다. - 제약조건의이름을변경한다. - 제약조건을추가하거나제거한다. - 제약조건의상태를변경한다. 테이블스페이스 파티션 - 테이블에할당된테이블스페이스는변경할수없다. - 파티션을추가하거나제거한다. 다음은 [ 예 4.1] 에서생성한 EMP 테이블의속성을변경하는예이다. 정의된컬럼의속성을변경하는경우 [ 예 4.2] 테이블의변경 - 컬럼속성 ALTER TABLE EMP MODIFY (SALARY DEFAULT 5000 NOT NULL); SALARY 컬럼은 MODIFY 절을사용하여디폴트값과 NOT NULL 제약조건으로재정의한다. 본예제에서는컬럼 SALARY의디폴트값을 5000으로하고, 동시에 SALARY 값이 NULL이되지못하도록컬럼의속성을변경한다. 동시에여러컬럼의속성을변경할수도있다. 이때각컬럼의내용은콤마 (,) 로분리하여다시정의한다. 컬럼의이름을변경하는경우 [ 예 4.3] 테이블의변경 - 컬럼이름 ALTER TABLE EMP RENAME COLUMN ADDR TO ADDRESS; ADDR 컬럼은 RENAME COLUMN 절을사용하여컬럼의이름을 ADDRESS로변경한다. 컬럼의이름을변경하면이전에컬럼이름을사용하던제약조건등은 Tibero 시스템에의해자동으로변경된다. 예를들어. 위 SQL 문장이실행되면 ADDR 컬럼에설정된제약조건이 ADDRESS 컬럼에자동으로적용된다. 단, CHECK 제약조건의경우제대로동작하지않을수있으며, 사용자가 ALTER TABLE 문을이용하여제약조건을다시정의해야한다. 디스크블록의파라미터의값을변경하는경우 [ 예 4.4] 테이블의변경 - 디스크블록의파라미터 ALTER TABLE EMP PCTFREE 10; 제 4 장스키마객체의관리 57
디스크블록의파라미터의값을변경하려면파라미터의이름과값을지정하면된다. 본예제에서는테 이블 EMP 의 PCTFREE 파라미터의값을 5 에서 10 으로변경한다. 제약조건을변경하는경우 테이블에설정된제약조건과상태를변경하는내용은 4.2. 제약조건 에서자세히설명한다. 또한, 테이 블을생성하거나변경을위한자세한문법은 "Tibero SQL 참조안내서 " 를참고한다. 테이블의제거 테이블은다음같은경우에따라제거요건이다르다. 현재사용자가자신의스키마에속한테이블을제거하는경우 DROP TABLE 문을사용할수있는시스템특권이있어야한다. 다른사용자의스키마에있는테이블을제거하는경우 DROP ANY TABLE 문을사용할수있는시스템 특권이있어야한다. 테이블을제거하기위해서는 DROP TABLE 문을사용해야한다. 다음은테이블을제거하는예이다. [ 예 4.5] 테이블의제거 DROP TABLE EMP; 다른사용자가소유한테이블을제거하려면, 반드시다른사용자의이름을명시한후 DROP TABLE 문을 실행해야한다. 예를들면다음과같다. DROP TABLE John.EMP; 제거하려는테이블의기본키가다른테이블의참조무결성제약조건으로정의된경우, 참조된테이블은바로제거할수없다. 이러한경우에는참조하는테이블을먼저제거하거나, 참조하는테이블에정의된참조무결성제약조건을제거해야한다. 참조하는테이블에정의된참조무결성제약조건을제거하기위해서는 DROP TABLE 문에 CASCADE CONSTRAINTS 절을삽입해야한다. 예를들면다음과같다. DROP TABLE EMP CASCADE CONSTRAINTS; 58 Tibero 관리자안내서
4.1.2. 테이블의효율적인관리 테이블을효율적으로관리하기위해서는각각의경우에맞는적절한조치방법을수행해야한다. 예를들면다음과같은경우이다. 동시에액세스될가능성이높은테이블인경우병렬쿼리처리가수행될가능성을높이기위해서로다른디스크에데이터를저장한다. 예를들어, 조인이이루어지는 SELECT 문에서액세스할두개의테이블의 SELECT 연산을먼저수행한후, 조인연산을수행하는경우라면, 이두테이블을서로다른디스크에저장하여 SELECT 연산이병렬적으로수행되도록한다. 테이블이저장될디스크의용량을결정하는경우테이블의최대크기를추정한다. 테이블에 UPDATE 연산이자주발생하는경우라면, 디스크블록에갱신을위한디스크공간을충분히 할당해야한다. 디스크공간을할당하는방법은 PCTFREE 파라미터를삽입하여설정하면된다. 테이블에동시에액세스할트랜잭션의수를결정하는경우동시에액세스할트랜잭션의수를추정한다. 테이블을구성하는디스크블록안에트랜잭션의정보를저장해야하며, 얼마만큼의디스크공간을할당할것인지를정해야한다. 이러한공간을할당하는방법은 INITRANS 파라미터를삽입하여설정한다. 갱신에대비하거나테이블을액세스할트랜잭션의정보를저장할디스크공간이필요한경우, 같은크기의테이블이라도좀더많은디스크공간을필요로한다. PCTFREE와 INITRANS 파라미터에대한자세한내용은 4.3. 디스크블록 을참고한다. 테이블에 INSERT 연산이발생하는경우로그를저장하는디스크공간을할당한다. 테이블에 INSERT 연산이자주발생하는경우라면, Redo 로그를구성하는로그그룹의크기와개수를증가시켜야하므로, 그만큼디스크의공간도커져야한다. 단, Redo 로그를저장하는디스크는데이터를저장하는디스크와는다른것을사용해야한다. 4.1.3. 테이블의정보조회 Tibero 에서는테이블의정보를제공하기위해다음표에나열된정적뷰를제공하고있다. DBA 나일반사 용자모두사용할수있다. 정적뷰 DBA_TABLES USER_TABLES ALL_TABLES DBA_TBL_COLUMNS 설명 Tibero 내의모든테이블의정보를조회하는뷰이다. 현재사용자에속한테이블의정보를조회하는뷰이다. 현재사용자가접근가능한테이블의정보를조회하는뷰이다. Tibero 내의모든테이블과뷰에속한컬럼의정보를조회하는뷰이다. 제 4 장스키마객체의관리 59
정적뷰 USER_TBL_COLUMNS ALL_TBL_COLUMNS 설명현재사용자에속한테이블및뷰에속한컬럼의정보를조회하는뷰이다. 현재사용자가접근가능한테이블및뷰에속한컬럼의정보를조회하는뷰이다. 참고 정적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 4.1.4. 테이블압축 Tibero는테이블에대해중복된컬럼값을압축하여저장공간을절약하는압축기능을제공한다. 값블럭에존재하는중복된컬럼값을한번만저장함으로써압축을수행하게된다. 이런중복컬럼값들이저장되는공간을심볼테이블이라고한다. 심볼테이블은해당블럭안에저장되기때문에압축된컬럼의원래값을참조하기위해서는해당블럭만을참조하면된다. 압축된테이블에대한 DML 지원은일반테이블과동일하다. 즉 insert, update, delete 등의 DML을지원한다. bulk가아닌일반적인 insert문으로추가된로우는압축이되지않으므로, 비압축 table에대한 insert 와동일한성능을가진다. delete또한비압축 table에대한 delete와동일한성능을가진다. 하지만 update 는압축을해제해야하는경우가있으므로, 비압축 table에대한 update 보다성능이좋지않을수있다. 압축을수행하면디스크공간을절약할수있지만, 압축을위해 CPU를더많이소모한다. 테이블에 DML 이많은경우, 점점더압축효율이낮아지게된다. 따라서 OLTP환경보다는 OLAP 환경에서더유리하다. 테이블압축대상 압축은테이블과파티션, 서브파티션에대해가능하다. 파티션과서브파티션각각에대해압축유무를지정할수있다. 즉한파티션은압축하고, 한파티션은압축하지않은상태로테이블을생성할수있다. [ 예 4.6] 압축이지정된테이블생성 CREATE TABLE EMP ( EMPNO DECIMAL(4), ENAME VARCHAR(10), JOB VARCHAR(9), MGR DECIMAL(4), HIREDATE VARCHAR(14), SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2)) COMPRESS; 60 Tibero 관리자안내서
[ 예 4.7] Partition별압축을지정하는테이블생성 CREATE TABLE EMP ( EMPNO DECIMAL(4), ENAME VARCHAR(10), JOB VARCHAR(9), MGR DECIMAL(4), HIREDATE VARCHAR(14), SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2)) COMPRESS PARTITION BY RANGE(EMPNO) ( PARTITION EMP_PART1 VALUES LESS THAN(500), PARTITION EMP_PART2 VALUES LESS THAN(1000) NOCOMPRESS, PARTITION EMP_PART3 VALUES LESS THAN(1500), PARTITION EMP_PART4 VALUES LESS THAN(2000) NOCOMPRESS, PARTITION EMP_PART5 VALUES LESS THAN(MAXVALUE)); 테이블의압축상태확인 *_TABLES, * TBL_PARTITIONS 정적뷰를쿼리해보면테이블의압축상태를알수있다. compression 컬럼의값이 'YES' 인경우추가적인 DML에대해압축을수행하게된다.. [ 예 4.8] 테이블의압축상태학인 select table_name, compression from user_tables; TABLE_NAME COMPRESSION --------------- ------- EMP YES 테이블압축방법 다음의경우테이블에데이타가압축된다. Direct Path Loader Direct Path Insert(Parallel INSERT 혹은 append hint 로수행되는 bulk INSERT) CREATE TABLE AS SELECT 문 위경우처럼대량 insert 시에는테이블에 EXCLUSIVE LOCK 을잡기때문에다른 DML 을수행할수없다. 압축이된후위경우이외수행되는일반적인 insert, update 문의로우값은압축되지않는다. 제 4 장스키마객체의관리 61
기존테이블의압축및압축해제 ALTER TABLE MOVE문을이용하면기존테이블에대한압축상태변경을할수있다. 즉압축된테이블을압축해제하거나, 압축해제된테이블을압축할수있다. 단 ALTER TABLE MOVE문이수행되는동안에는테이블에 EXCLUSIVE LOCK을잡게되므로, 다른 DML을수행할수없다. 파티션을가진테이블의경우테이블자체가아닌파티션단위로 MOVE를수행해야한다. 만약, DML을수행하는도중에압축상태를바꾸고싶은경우, Exchange DDL 기능을이용하면 online중에테이블을압축또는압축해제할수있다. [ 예 4.9] 기존테이블혹은파티션을압축하거나압축해제하는예 ALTER TABLE TBL_COMP MOVE COMPRESS; ALTER TABLE EMP MOVE PARTITION EMP_PART1 NOCOMPRESS; ALTER TABLE문을이용하면추가적인 DML에대해압축을수행할지여부를설정할수있다. 압축이지정된테이블에 ALTER TABLE문으로압축을하지않기로지정하게되면이후수행되는 Direct Path Loader, Parallel Insert등에대해압축을수행하지않게된다. 하지만기존의데이타의상태는바뀌지않는다. [ 예 4.10] 테이블의추가적인 DML에대한압축여부를변경하는예 ALTER TABLE EMP COMPRESS; 테이블압축시제약사항 테이블의스키마에 Long 이나 Lob 을포함한테이블은압축할수없다. 한번이라도압축이지정된테이블에는컬럼추가 (ADD COLUMN), 컬럼삭제 (DROP COLUMN) DDL 을 수행할수없다. 4.1.5. INDEX ORGANIZED TABLE 은인덱스의 B-TREE구조를이용해데이터를저장하는형태의테이블을말한다. 일반적인테이블에서는데이터가로우단위로무작위로블럭에저장되지만, INDEX ORGANIZED TABLE은인덱스와유사한형태로기본키를기준으로로우가정렬되어인덱스리프블럭에저장된다. 로우가너무크거나, 지역효율성을위해, 특정컬럼부터는데이터영역에저장할수도있다. 이를오버플로우데이터영역이라고부른다. INDEX ORGANIZED TABLE은다음과같은장점을가진다. 기본키를랜덤억세스할때, 기본키를기준으로정렬되어있으므로, 일반테이블보다더욱빠르다. 62 Tibero 관리자안내서
일반테이블에서인덱스가있는경우라도, 기본키를인덱스에서찾고로우 ID 로다시해당로우를찾아 야한다. 하지만 INDEX ORGANIZED TABLE 에서는인덱스영역에서해당로우를바로찾을수있기 때문에추가적인디스크검색이불필요하기때문이다. 또한인덱스와데이터영역에기본키가중복저장되지않으므로, 스토리지사용량이줄어든다. 단, 잦은수정이발생할경우인덱스를재구조화하는부담이생기므로, DML이자주발생하는환경에서는적합하지않을수있다. INDEX ORGANIZED TABLE은기본키로전체로우가정렬되어저장되므로, 다른키로인덱스를만들고자하는경우, SECONDARY INDEX를만들수있다. INDEX ORGANIZED TABLE 의생성 INDEX ORGANIZED TABLE은 CREATE TABLE 문뒤에 ORGANIZATION INDEX 구문을덧붙여생성할수있다. 이때반드시기본키 (primary key) 선언을해주어야한다. 추가로줄수있는파라미터는다음과같다. 파라미터 OVERFLOW INCLUDING PCTTHRESHOLD 설명 INDEX ORGANIZED TABLE 로우의크기제한을넘어서거나, INCLUDING 이후의컬럼들은 OVERFLOW 데이터영역에저장된다. 이때사용자가원하는테이블스페이스를줄수있다. INCLUDING으로선언된컬럼이후부터는무조건오버플로우데이터영역에저장된다. INCLUDING은기본키의마지막컬럼이나, 기본키가아닌임의의컬럼을지정할수있다. 블럭크기를기준으로 INDEX ORGANIZED TABLE의인덱스영역에들어갈수있는로우의한최대크기의비율을말한다. INCLUDING을지정하지않은경우, PCTTHRESHOLD 범위를넘는컬럼부터 OVERFLOW 데이터영역에저장된다. INCLUDING을지정한경우라도, INCLUDING이지정된이전의컬럼까지의크기합이 PCTTHRESHOLD 범위를넘어서게되면 OVERFLOW 데이터영역에저장된다. [ 예 4.11] INDEX ORGANIZED TABLE의생성 CREATE TABLE TBL_IOT ( COL1 NUMBER, COL2 VARCHAR2(20), COL3 VARCHAR2(10), COL4 VARCHAR2(10), 제 4 장스키마객체의관리 63
PRIMARY KEY (COL1, COL2) ) ORGANIZATION INDEX PCTTHRESHOLD 40 OVERFLOW; INDEX ORGANIZED TABLE 의삭제 DROP TABLE 구문으로삭제할수있다. [ 예 4.12] INDEX ORGANIZED TABLE의삭제 DROP TABLE TBL_IOT; INDEX ORGANIZED TABLE 생성제약조건 INDEX ORGANIZED TABLE 을생성할때다음의제약조건을유의해야한다. LOB 이나 LONG 은포함할수없다. 컬럼의최대개수는 1000 개이다. 인덱스영역에는최대 255 개의컬럼만저장할수있다. 컬럼개수가그이상인경우, OVERFLOW 를지 정해야한다. PCTTHRESHOLD 의값은 1-50 이다. 하지만실제인덱스영역에저장할수있는로우의최대크기는구 조적인문제로블럭의 50% 보다더작다. 모든컬럼은 PCTTHRESHOLD 보다작아야한다. 4.2. 제약조건 제약조건 (Constraints) 은사용자가원하지않는데이터가테이블의컬럼에삽입, 변경, 제거되는것을방 지하는방법이다. 4.2.1. 제약조건의선언, 변경, 제거 본절에서는제약조건을선언하고변경, 제거하는방법을설명한다. 64 Tibero 관리자안내서
테이블을생성할때제약조건을선언하는방법은다음과같다. 제약조건 기본키 설명 무결성제약조건과고유키무결성제약조건을결합한방법이다. 기본키로설정된컬럼은 NULL 값을가질수없다. 유일키 참조무결성 NOT NULL 테이블의컬럼은동일한값을가질수없다. 대신, NULL 값은여러컬럼에입력할수있다. 다른테이블이나현재사용자가소유한테이블의기본키나유일키를참조할때사용하는방법이다. 테이블의컬럼은 NULL 값을가질수없다. 테이블레벨의제약조건은설정할수없다. CHECK 삽입또는변경할값이만족해야할제약조건을설정한다. 한컬럼에여러개의제약조건을설정할수있다. 제약조건의선언 제약조건은삭제가능성, 제약조건에포함되는컬럼의개수등에따라선택적으로선언할수있다. 제약조건을어떻게선언하든테이블내에서미치는영향은동일하다. 제약조건을선언한후, 정의또는상태를변경하기위해서는제약조건을선언할때제약조건의이름을설정해야한다. 제약조건의이름을찾아변경한다. 제약조건에이름을설정하기위해서는제약조건을선언할때예약어 CONSTRAINT와제약조건의이름을추가로정의해야한다. 다음은 [ 예 4.1] 에서선언한제약조건에이름을설정하는예이다. [ 예 4.13] 제약조건의이름설정 CREATE TABLE DEPT ( DEPTNO NUMBER PRIMARY KEY, DEPTNAME VARCHAR(20), PDEPTNO NUMBER ) TABLESPACE my_space PCTFREE 5 INITRANS 3; CREATE TABLE EMP ( EMPNO NUMBER PRIMARY KEY, ENAME VARCHAR(16) NOT NULL, 제 4 장스키마객체의관리 65
ADDR VARCHAR(24), SALARY NUMBER, DEPTNO NUMBER, CONSTRAINT SALARY_MIN CHECK (SALARY >= 10000), CONSTRAINT DEPTNO_REF FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO) ) TABLESPACE my_space PCTFREE 5 INITRANS 3; 제약조건은다음과같은경우에따라사용하는문법이다르다. 컬럼단위로제약조건을선언하는경우 컬럼의정의와함께제약조건을선언한다. 제약조건 CHECK NOT NULL 설명 문법이동일하다. 처음선언할때는반드시컬럼의정의와함께선언되어야한다. 선언된이후에변경할경우 ALTER TABLE MODIFY 문을사용한다. 다음은컬럼단위로제약조건을선언하는예이다. [ 예 4.14] 제약조건의선언 - 컬럼단위 CREATE TABLE TEMP_PROD ( PROD_ID NUMBER(6) CONSTRAINT PROD_ID_PK PRIMARY KEY, PROD_NAME VARCHAR2(50) CONSTRAINT PROD_NAME_NN NOT NULL, PROD_COST VARCHAR2(30) CONSTRAINT PROD_COST_NN NOT NULL, PROD_PID NUMBER(6), PROD_DATE DATE CONSTRAINT PROD_DATE_NN NOT NULL ); 본예제에서는컬럼 PROD_ID, PROD_NAME, PROD_COST, PROD_DATE 각각에기본키, NOT NULL 제약조건을선언한다. 테이블단위로선언하는경우모든컬럼을정의한후제약조건을선언한다. 다음은테이블단위로제약조건을선언하는예이다. [ 예 4.15] 제약조건의선언 - 테이블단위 CREATE TABLE TEMP_PROD ( 66 Tibero 관리자안내서
); PROD_ID NUMBER(6), PROD_NAME VARCHAR2(50) CONSTRAINT PROD_NAME_NN NOT NULL, PROD_COST VARCHAR2(30) CONSTRAINT PROD_COST_NN NOT NULL, PROD_PID NUMBER(6), PROD_DATE DATE CONSTRAINT PROD_DATE_NN NOT NULL, CONSTRAINT PROD_ID_PK PRIMARY KEY(PROD_ID, PROD_NAME) 두개이상의컬럼에제약조건을선언하고자한다면반드시모든컬럼을정의한후선언해야한다. 본 예제에서는컬럼 PROD_ID 와 PROD_NAME 를통합하여기본키제약조건을선언한다. 제약조건의변경 Tibero에서는이미선언된제약조건을변경할수있다. 제약조건은 ALTER TABLE 문에서변경할수있다. 단, 변경할수있는테이블에한해서만제약조건을변경할수있다. 다음은제약조건을변경하는예이다. 제약조건의이름을변경하는경우 ALTER TABLE 문의 RENAME CONSTRAINT 절을삽입한다. 제약조건의이름을변경할때에는테이블내에서유일해야한다. 다음은제약조건의이름을변경하는예이다. [ 예 4.16] 제약조건의변경 - 제약조건의이름 ALTER TABLE EMP RENAME CONSTRAINT EMP_PRI_KEY TO EMP_KEY; 제약조건을새로추가하는경우제약조건을새로추가하려면 ALTER TABLE 문의 ADD 절을삽입해야한다. 사용하는방법은 CREATE TABLE 문에서컬럼을정의한후, 제약조건을선언하는문법과동일하게 ADD 절다음에제약조건을선언한다. 단, NOT NULL 제약조건의경우에는 ADD 절이아닌 MODIFY 절로추가해야한다. 다음은각각새로운 CHECK 제약조건과 UNIQUE 제약조건을추가하는예이다. [ 예 4.17] 제약조건의변경 - 제약조건의추가 ALTER TABLE EMP ADD CONSTRAINT SALARY_MAX CHECK (SALARY >= 50000); ALTER TABLE EMP ADD UNIQUE (ENAME, DEPTNO); 제약조건을추가할때제약조건의이름은 CHECK 제약조건의예에서처럼이름을설정할수도있지만, 선택적으로설정하지않을수있다. 제 4 장스키마객체의관리 67
컬럼의이름을변경하면기존에컬럼의이름을사용하던제약조건은 Tibero 시스템에의해자동으로변경된다. 예를들어 [ 예 4.3] 처럼 SQL 문장을실행하면 ADDR 컬럼에설정된제약조건을 ADDRESS 컬럼에자동으로적용한다. 단, CHECK 제약조건의경우제대로동작하지않을수있으며, 사용자가 ALTER TABLE 문으로제약조건을다시정의해야한다. 제약조건의제거 제약조건을제거하기위해서는 ALTER TABLE 문에 DROP 절을삽입해야한다. 기본키, 유일키제약조건을제외하고는반드시제약조건의이름이있어야한다. 제약조건을선언할때제약조건의이름을명시하지않으면 Tibero가임의의이름을자동으로생성해준다. 제약조건의이름을설정하지않은경우 USER_CONSTRAINTS 뷰에서해당제약조건의이름을확인하여이를변경또는제거할수있다. 다음은제약조건을제거하는예이다. [ 예 4.18] 제약조건의제거 ALTER TABLE EMP DROP PRIMARY KEY;... 기본키가설정된제약조건을제거한다.... ALTER TABLE EMP DROP CONSTRAINT SALARY_MAX;... 제약조건의이름이 SALARY_MAX 인제약조건을제거한다.... 4.2.2. 제약조건의상태 제약조건의상태는다음과같이두가지로나뉜다. ENABLE 테이블에삽입또는갱신되는모두로우에적용된다. ENABLE은아래와같이두가지옵션을추가적으로사용할수있다. 옵션 VALIDATE 설명 제약조건이설정되지않은상태에서많은수의로우가새로삽입되거나갱신될 때로우가제약조건을만족하는지를확인하는옵션이다. 가능하면모든로우를한꺼번에확인하는것이데이터베이스성능향상에도움 이된다. 68 Tibero 관리자안내서
옵션 NOVALIDATE 설명 기존에저장된테이블의로우가제약조건에만족하지않아도되거나또는모든 로우가제약조건에만족하는경우에만사용하는옵션이다. 테이블에저장된로우가제약조건에만족하는지확인하지않아도되므로데이터베이스성능향상에도움이된다. 단, 기본키또는유일키제약조건은내부적으로사용하는인덱스의특성상 NOVALIDATE 옵션을사용한다고해도무조건 VALIDATE로동작한다. DISABLE ENABLE과는반대의경우로선언된제약조건을적용하지않는다. 한꺼번에많은수의로우를테이블에삽입하거나갱신하는경우, 제약조건을 DISABLE 상태로하여작업을마친후제약조건을다시 EN ABLE 상태로다시설정하는것이데이터베이스성능향상에도움이된다. tbloader 또는 tbimport 유틸리티나배치프로그램을통해많은수의로우를삽입하거나갱신할수있다. 테이블에저장된로우가제약조건에만족하는지를확인하지않아도되므로데이터베이스성능향상에도움이된다. 제약조건의상태변경 제약조건의상태를변경하기위해서는 ALTER TABLE 문을사용해야한다. 다음은제약조건의상태를변경하는예이다. ENABLE 상태로변경하는경우 [ 예 4.19] 제약조건의상태변경 - ENABLE ALTER TABLE EMP MODIFY CONSTRAINT EMP_UNIQUE ENABLE; DISABLE 상태로변경하는경우 [ 예 4.20] 제약조건의상태변경 - DISABLE ALTER TABLE EMP MODIFY PRIMARY KEY DISABLE; NOVALIDATE 로추가한제약조건을다시 VALIDATE 로변경하는경우 [ 예 4.21] 제약조건의상태변경 - VALIDATE ALTER TABLE EMP MODIFY CONSTRAINT SALARY_MIN ENABLE NOVALIDATE; 제 4 장스키마객체의관리 69
4.2.3. 제약조건의정보조회 Tibero 에서는제약조건의정보를제공하기위해다음표에나열된정적뷰를제공하고있다. DBA 나일반 사용자모두사용할수있다. 정적뷰 DBA_CONSTRAINTS USER_CONSTRAINTS ALL_CONSTRAINTS DBA_CONS_COLUMNS USER_CONS_COLUMNS ALL_CONS_COLUMNS 설명 Tibero 내의모든제약조건의정보를조회하는뷰이다. 현재사용자에속한제약조건의정보를조회하는뷰이다. 사용자가접근가능한제약조건의정보를조회하는뷰이다. Tibero 내의모든제약조건에적용된컬럼정보를조회하는뷰이다. 현재사용자에속한제약조건에적용된컬럼정보를조회하는뷰이다. 사용자가접근가능한제약조건에적용된컬럼정보를조회하는뷰이다. 참고 정적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 4.3. 디스크블록 디스크블록은데이터를저장하는물리적인최소단위이며, 크기가일정하다. Tibero에서는디스크블록을효율적으로사용할수있도록스키마객체별로파라미터를제공한다. 스키마객체의특성에따라파라미터를설정하면, 데이터베이스성능의향상과저장공간의활용도를높일수있다. 4.3.1. PCTFREE 파라미터 PCTFREE는디스크블록에저장된스키마객체의갱신에대비하여얼마만큼의여유공간을남길것인가를설정하는파라미터이다. 퍼센트값으로표현하며, 1에서 99 사이의임의의정수로설정할수있다. 디스크블록의여유공간이 PCTFREE 파라미터에설정한값이하로떨어질때까지계속새로운로우를삽입한다. PCTFREE 파라미터에설정한값이하인경우에는더이상새로운로우를삽입하지않으며, 남은공간은기존로우의갱신에대비하게된다. 디스크블록내의빈공간이 PCTFREE 파라미터의값보다작아지면, 디스크블록내의객체를삭제한다. 빈공간이 PCTFREE 파라미터의값보다커지더라도바로새로운객체를삽입하지는않는다. 이후에충분한공간이생겼을때디스크블록에삽입된다. 현재디스크블록에저장된객체가갱신되어크기가증가할가능성이있는경우, PCTFREE 파라미터의값을크게설정해야한다. 이때, PCTFREE 값이작은경우와비교하여하나의디스크블록에저장되는객체의수가상대적으로적어지므로, 같은수의객체를저장하는데에더많은디스크블록을필요로하게된다. 이러한점은데이터베이스성능저하의원인이될수있다. 70 Tibero 관리자안내서
반면에, 하나의객체를여러디스크블록에저장해야하는가능성이적어지므로성능향상에도움이될수도있다. 따라서, PCTFREE 파라미터의값은데이터베이스를운용하며적절하게설정해야하며, 객체의갱신이많이발생하는경우에는 PCTFREE 파라미터의값을크게잡는것이좋다. 디폴트로설정될 PCT FREE 파라미터의값은 10% 이다. 디스크블록을액세스하는트랜잭션내의갱신연산이객체의크기를증가시키지않거나트랜잭션이읽기연산만으로이루어져있다면, PCTFREE 파라미터의값을매우작게설정할수있다. 예를들어, PCT FREE 값을 5로설정할수있다. 4.3.2. INITRANS 파라미터 하나의디스크블록은동시에여러트랜잭션에접근할수있으며, 디스크블록에포함되어있는각로우는자신을마지막으로생성, 갱신, 삭제한트랜잭션의정보를가지고있다. 이러한트랜잭션의데이터를디스크블록내의한곳에모아두는것을트랜잭션엔트리리스트 (transaction entry list) 라한다. 트랜잭션엔트리리스트는디스크블록의헤더에포함되며, 디스크블록이생성될때최초크기는 INITRANS 파라미터에설정된값이된다. 리스트내의트랜잭션엔트리는트랜잭션이커밋되면다른트랜잭션에의해다시사용할수있다. 예를들어, 더많은트랜잭션엔트리가필요한경우에는전체리스트의크기 ( 트랜잭션엔트리의개수 ) 를하나씩증가시킨다. 이때디스크블록의크기에따라트랜잭션엔트리의최대개수가정해진다. 즉디스크블록의크기가커질수록트랜잭션엔트리의개수가증가하게된다. 단, 최대 255개를초과하지않아야한다. 트랜잭션엔트리개수가최대개수에도달하면더이상리스트의크기를증가시키지않으며, 트랜잭션의실행을중지하고대기한다. 트랜잭션은다른트랜잭션이끝나고, 기존의트랜잭션엔트리를다시사용할수있게되면실행을계속한다. 트랜잭션엔트리리스트를증가시키는작업은처리비용이필요하므로, 자주하지않는것이좋다. 따라서, 하나의디스크블록을여러트랜잭션에서액세스할가능성이높은경우에는 INITRANS 파라미터의값을처음부터높게설정해주는것이중요하다. INITRANS 파라미터를설정하지않으면기본값은 2이다. 4.3.3. 파라미터의설정 PCTFREE와 INITRANS 파라미터는스키마객체단위로설정할수있다. 스키마객체는항상같은파라미터의값을갖는다. 파라미터는스키마객체를생성하거나변경할때설정할수있다. 다음은테이블 EMP를생성할때파라미터를설정하는예이다. CREATE TABLE EMP ( ENAME ADDR SALARY VARCHAR(16) NOT NULL, VARCHAR(24), INT, 제 4 장스키마객체의관리 71
DEPTNO INT ) PCTFREE 5 INITRANS 5; 파라미터는 ALTER TABLE 문을이용하여변경할수있다. 예를들면다음과같다. ALTER TABLE EMP PCTFREE 10; 인덱스를생성할때에는 INITRANS 파라미터의값만설정할수있다. 다음의 SQL 문장은테이블 EMP 의인덱스를생성할때파라미터를설정하는예이다. CREATE INDEX EMP_DEPTNO_IDX ON EMP (DEPTNO) INITRANS 5; 디스크블록의파라미터의값을변경하더라도디스크블록에는바로반영되지는않는다. 파라미터별로 디스크블록에반영되는경우는다음과같다. 파라미터 PCTFREE INITRANS 설명 새로객체를삽입하고삭제하는경우기존의디스크블록에반영된다. 기존의디스크블록에는반영되지않으며, 새로할당된디스크블록에만반영된다. 4.4. 인덱스 인덱스는테이블에서원하는데이터를효율적으로검색하기위해사용하는데이터구조이다. 인덱스는테이블과는다른스키마객체이므로독립적으로생성, 변경, 제거, 저장할수있다. 다음은인덱스의종류이다. 단일컬럼인덱스 (Single Index) 하나의컬럼으로구성된인덱스이다. 복합컬럼인덱스 (Concatenated Index) 하나이상의컬럼으로구성된인덱스이다. 유일인덱스 (Unique Index) 테이블에서유일한값을가진컬럼으로구성된인덱스이다. 비유일인덱스 (Non-Unique Index) 중복되는값을인정하는컬럼으로구성된인덱스이다. 72 Tibero 관리자안내서
4.4.1. 인덱스의생성, 제거 Tibero는기본키, 유일키그리고외래키에제약조건이설정된컬럼을제외하고는임의의컬럼에인덱스를생성하거나제거할수있다. 인덱스의이름은사용자가별도로지정하지않으면디폴트로지정된제약조건의이름과동일하게생성된다. 인덱스의생성 인덱스는다음같은경우에따라생성, 제거요건이다르다. 현재사용자가자신의스키마에속한테이블에인덱스를생성하고제거하는경우 CREATE INDEX 문을사용할수있는시스템특권이있어야한다. 다른사용자의스키마에속한테이블에인덱스를생성하고제거하는경우 CREATE ANY INDEX 문을 사용할수있는시스템특권이있어야한다. 인덱스를생성하기위해서는 CREATE INDEX 문을사용해야한다. 다음은인덱스를생성할때포함되는구성요소이다. 구성요소 인덱스의이름 설명 생성할인덱스의이름을설정한다. 이구성요소는테이블을생성할때반드시포함되어야한다. 테이블의이름 해당컬럼이속한테이블의이름을설정한다. 이구성요소는테이블을생성할때반드시포함되어야한다. Unique Unique 인덱스여부를설정한다. 이구성요소는인덱스를생성할때선택적으로사용할수있다. 컬럼정의, 정렬방향 해당컬럼을정의하고정렬방향을설정한다. 이구성요소는인덱스를생성할때선택적으로사용할수있다. 테이블스페이스 인덱스가저장될테이블스페이스를설정한다. 이구성요소는인덱스를생성할때선택적으로사용할수있다. 디스크블록의파라미터 INITRANS 파라미터를설정할수있다. 이구성요소는인덱스를생성할때선택적으로사용할수있다. 파티션인덱스 파티션인덱스를설정할수있다. 이구성요소는인덱스를생성할때선택적으로사용할수있다. 제 4 장스키마객체의관리 73
다음은테이블 EMP의컬럼 DEPTNO에인덱스를생성하는예이다. 인덱스의이름은 EMP_FK로설정한다. [ 예 4.22] 인덱스의생성 CREATE INDEX EMP_FK ON EMP (DEPTNO); 인덱스의제거 인덱스를제거하기위해서는 DROP INDEX 문을사용해야한다. 인덱스는테이블처럼독립적인스키마객체이므로, 인덱스를제거하더라도테이블의데이터에는영향을미치지않는다. 단, 인덱스를제거하게되면해당컬럼의데이터를조회할때이전과다르게조회속도가느려질수도있다. 인덱스가더이상필요하지않는경우에는제거하는것이데이터베이스성능향상에도움이된다. 다음은 [ 예 4.22] 에서생성한인덱스 EMP_FK를제거하는예이다. [ 예 4.23] 인덱스의제거 DROP INDEX EMP_FK; 4.4.2. 인덱스의효율적인관리 Tibero 에서는인덱스의기본구조로 B- 트리를제공한다. 이를이용하여단일키검색 (single key search), 범위검색 (range search), 복합키검색 (composite key search) 을수행할수있다. 인덱스의검색유형 인덱스를이용하여테이블의로우를검색하는방법은다음과같다. 단일키검색하나의키를갖는로우를검색하는방법이다. 인덱스가유일인덱스인경우에는하나의키를갖는한개의로우만검색되며, 비유일인덱스의경우에는여러개의로우가검색된다. 범위검색 검색범위에포함되는키를갖는로우를모두검색하는방법이다. 복합키검색 서로다른두개이상의컬럼을하나의키로조합하여검색하는방법이다. 74 Tibero 관리자안내서
다음은복합키를이용하여검색하는예이다. [ 예 4.24] 복합키검색 SELECT * FROM EMP WHERE DEPTNO = 5 AND ADDR = 'Seoul'; 위의예제에서컬럼 DEPTNO와컬럼 ADDR가별도의인덱스로생성되어있다면, 원하는로우를검색하기위해먼저 DEPTNO = 5인조건을만족하는로우와 ADDR = ' 서울 ' 인조건을만족하는로우를각각검색하게된다. 그다음두조건에서공통으로포함하는모든로우를출력하게된다. 컬럼 DEPTNO와컬럼 ADDR를복합키인덱스로생성하는방법은 DEPTNO+ADDR 또는 ADDR+DEPT NO 형태로조합하면된다. 복합키인덱스를생성하면, 한꺼번에원하는로우를검색할수있어효율적이다. 인덱스의효율적인관리지침 인덱스를효율적으로관리하기위한지침은다음과같다. 인덱스가필요한테이블과컬럼에만생성한다. 인덱스는데이터의저장공간과데이터베이스성능에영향을미친다. 인덱스를생성하면데이터를저장하기위한별도의공간이필요하며, 테이블에로우가삽입, 변경, 제거될때마다인덱스도함께갱신된다. 기본키가적용된컬럼과함께조인연산의대상이되는컬럼의경우인덱스를생성한다는것은컬럼에정렬을수행한결과를저장한다는의미이다. Tibero에서는정렬된컬럼간의조인연산을더욱효율적으로수행한다. 이러한결과는조인의대상이되는테이블이컸을때효과적이다. WHERE 절의검색조건에포함되는빈도가높으며, 검색결과가전체테이블의 10% 이하인컬럼의경 우단일키검색의경우인덱스가없으면전체테이블을액세스한다. 반면에인덱스가있으면하나의로우만액세스하므로검색성능을향상시킬수있다. 복합키인덱스를생성할때컬럼값의순서에유의한다. 검색조건에포함되는빈도가높은컬럼부터정렬한다. 예를들어, 컬럼 C1과컬럼 C2에복합키인덱스를생성할때, 인덱스키를만드는방법은 (C1, C2) 와 (C2, C1) 의두가지가있다. 컬럼 C1에대한검색이컬럼 C2에대한검색보다더빈번하게일어난다면 (C1, C2) 값을이용하여복합키인덱스를생성하는것이유리하다. 그이유는인덱스내에서같은 C1 값을갖는키들이모여있기때문에검색을위해액세스해야할디스크블록의개수가적기때문이다. (C1, C2) 값으로인덱스를생성했다면컬럼 C2에대한검색은거의사용할수없다. 사용빈도가낮거나필요없는인덱스는제거한다. 제 4 장스키마객체의관리 75
하나의테이블에많은수의인덱스는생성하지않는다. 시스템의성능향상을위해인덱스와테이블은서로다른디스크에저장한다. 4.4.3. 인덱스의정보조회 Tibero 에서는인덱스의정보를제공하기위해다음표에나열된정적뷰를제공하고있다. DBA 나일반사 용자모두사용할수있다. 정적뷰 DBA_INDEXES USER_INDEXES ALL_INDEXES DBA_IDX_COLUMNS USER_IDX_COLUMNS ALL_IDX_COLUMNS 설명 Tibero 내의모든인덱스의정보를조회하는뷰이다. 현재사용자에속한인덱스의정보를조회하는뷰이다. 사용자가접근가능한인덱스의정보를조회하는뷰이다. Tibero 내의모든인덱스에적용된컬럼의정보를조회하는뷰이다. 현재사용자에속한인덱스에적용된컬럼의정보를조회하는뷰이다. 사용자가접근가능한인덱스에적용된컬럼의정보를조회하는뷰이다. 참고 정적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 4.5. 뷰 뷰는 SELECT 문으로표현되는질의에이름을부여한가상테이블이다. SQL 문장내에서테이블과동일 하게사용된다. 단, 실제데이터를포함하는스키마객체는아니며, 다른스키마객체를통해정의된다. 4.5.1. 뷰의생성, 변경, 제거 본절에서는뷰를생성, 변경, 제거하는방법을설명한다. 뷰의생성 뷰는다음같은경우에따라생성요건이다르다. 현재사용자가자신의스키마에속한뷰를생성하는경우 CREATE VIEW 문을사용할수있는시스템특권이있어야한다. 다른사용자의스키마에있는뷰를생성하는경우 CREATE ANY VIEW 문을사용할수있는시스템특 권이있어야한다. 76 Tibero 관리자안내서
뷰를생성하기위해서는 CREATE VIEW 문을사용해야한다. 모든기반객체 (base objects) 의액세스권한을갖고있어야하며, 기반테이블의수에상관없이액세스권한이있어야한다. 예를들면다음과같다. [ 예 4.25] 뷰의생성 CREATE VIEW MANAGER AS SELECT * FROM EMP WHERE DEPTNO = 1; CREATE VIEW EMP_DEPT AS SELECT E.EMPNO, E.ENAME, E.SALARY, D.DEPTNO, D.LOC FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO; 뷰를이용하여수행할수있는연산은기반테이블에대한뷰정의자가수행할수있는연산의교집합이다. 예를들어, 뷰 EMP_DEPT를정의한사용자가테이블 EMP에대하여삽입, 제거연산이가능하고테이블 DEPT에대하여삽입, 갱신연산이가능하다면, 뷰 EMP_DEPT에대해서는삽입연산만할수있다. 뷰는테이블과같이액세스권한을다른사용자에게부여할수있다. 단, 뷰를정의한기반객체에대한 GRANT OPTION 또는 ADMIN OPTION과함께액세스권한을부여받아야한다. 뷰에대한액세스권한을부여받은사용자는그뷰를정의한기반객체에직접액세스할수있는권한이없어도그뷰를통하여액세스할수있다. 단, 수행할연산에대한권한은뷰의정의자가가지고있어야한다. 다음은뷰를생성하는예이다. CREATE VIEW V_PROD AS SELECT PROD_ID, PROD_NAME,PROD_COST FROM PRODUCT WHERE PROD_ID= 100001; 뷰의변경 뷰또는기반객체의변경으로인해사용할수없게된뷰를다시사용하기위해서는 CREATE OR REPLACE VIEW 문을사용해야한다. 단, 뷰를생성하고제거할수있는권한이있어야한다. 다음은뷰를변경하는예이다. [ 예 4.26] 뷰의변경 CREATE OR REPLACE VIEW MANAGER AS SELECT * FROM EMP WHERE DEPTNO = 2; 제 4 장스키마객체의관리 77
위와같은 SQL 문장을실행하면다른사용자에게부여한뷰 MANAGER 의권한이그대로남아있게된다. 반면에 DROP VIEW 와 CREATE VIEW 문을연속으로사용하면뷰 MANAGER 의권한은없어진다. 뷰의제거 뷰는다음같은경우에따라제거요건이다르다. 현재사용자가자신의스키마에속한뷰를제거하는경우 DROP VIEW 문을사용할수있는시스템특권이있어야한다. 다른사용자의스키마에속한뷰를제거하는경우 DROP ANY VIEW 문을사용할수있는시스템특권 이있어야한다. 뷰를제거하기위해서는 DROP VIEW 문을사용해야한다. 다음은뷰를제거하는예이다. [ 예 4.27] 뷰의제거 DROP VIEW EMP_DEPT; 4.5.2. 뷰의갱신가능성 모든뷰는 SQL 질의가가능하나삽입, 갱신, 제거가불가능한뷰가존재한다. 또한, 대상컬럼에따라삽입, 갱신이가능하거나불가능한뷰도존재한다. 삽입, 갱신, 제거를수행할수있는뷰를갱신가능한뷰 (updatable view) 라고한다. 다음의뷰는갱신가능한뷰가아니다. 두개이상의테이블에대한집합연산을수행하여생성한뷰 그룹화 (grouping) 와집단함수 (aggregate function) 를이용하여생성한뷰 다 : 다 (many-to-many) 관계를갖는컬럼간에조인을수행하여생성한뷰 WITH READ ONLY 절을사용하여생성한뷰 조인뷰 두개이상의테이블을조인하여생성한뷰를조인뷰라고한다. 조인뷰를갱신하는경우, INSERT, UPDATE, DELETE 연산은뷰를구성하는기반테이블중키보존테이블 (key-preserved table) 의특성을만족하는테이블에한해서만수행한다. 78 Tibero 관리자안내서
키보존테이블이란기본키를가지고있는테이블이다. 하나의뷰에서키보존테이블이여러개가존재하는경우, 하나의 DML 문장은이중하나의테이블에대해서만연산을수행한다. 다시말해, 삽입, 갱신, 제거가일어나는컬럼이이키보존테이블의컬럼이어야한다는뜻이다. DELETE 연산을하는경우, 컬럼을명시적으로지정하지않으므로키보존테이블이여러개가존재하는경우에제거연산이일어나는테이블은 (FROM 절에서명시된순서 ) 맨처음이키보존테이블이된다. [ 예 4.25] 에서생성한뷰 EMP_DEPT는테이블 EMP의외래키컬럼 DEPTNO와테이블 DEPT의기본키컬럼 DEPTNO를조인하여얻어진뷰이다. 테이블 EMP 내에같은 DEPTNO 값을갖는로우가여러개일수있으므로, 뷰 EMP_DEPT의질의결과의로우중에는같은 DEPTNO 값이여러로우에걸쳐나타날수있다. 하지만, 컬럼 EMPNO는테이블 EMP의기본키컬럼이므로, 뷰 EMP_DEPT의질의결과의로우중하나의 EMPNO 값이여러로우에중복되어나타날수없다. 따라서, 뷰 EMP_DEPT의키컬럼은 EMPNO이며같은컬럼을키컬럼으로갖는테이블 EMP가키보존테이블이다. 일반적으로, 기본키와외래키의컬럼처럼일 : 다 (one-to-many) 관계를갖는조인컬럼에의해생성된조인뷰에서다 (many) 측의테이블, 외래키조인컬럼을갖는테이블이키보존테이블이된다. 셋이상의기반테이블을정의한뷰에서도마찬가지이다. 다음은뷰 EMP_DEPT에 INSERT, UPDATE, DELETE 연산을수행하는예이다. 세문장모두테이블 EMP 의컬럼에삽입, 갱신, 제거연산을수행한다. INSERT INTO EMP_DEPT (EMPNO, ENAME, SALARY) VALUES (1562, 'Brown', 35000); UPDATE EMP_DEPT SET SALARY = SALARY * 1.1 WHERE DEPTNO = 5; DELETE FROM EMP_DEPT WHERE ENAME = 'Scott'; INSERT 문에서값이지정되지않은컬럼은 NULL 값이삽입되거나기본키의값으로채워진다. 단, NOT NULL 제약조건이설정된경우에러를반환한다. 뷰를생성할때 WITH CHECK OPTION 제약을사용할수도있는데, 이때갱신, 삽입, 제거가가능한조건이약간변경된다. WITH CHECK OPTION 제약이명시된뷰를갱신할때는, 갱신되는로우가갱신후에도뷰에의해 SELECT 되는경우에만그로우의갱신이허용된다. 조인뷰의경우는조인된컬럼또는반복되는컬럼은무조건갱신이불가능하다는제약조건이추가된다. 삽입의경우도갱신과마찬가지로삽입하는로우가뷰에의해 SELECT 되어야한다. 단, 기반테이블이하나일경우에만가능하며조인뷰의경우에는삽입할수없다. 제거의경우는제거의대상이되는키보존테이블이반복되지않으면가능하다. 제 4 장스키마객체의관리 79
4.5.3. 뷰의정보조회 Tibero 에서는뷰의정보를제공하기위해다음표에나열된정적뷰를제공하고있다. DBA 나일반사용자 모두사용할수있다. 정적뷰 DBA_VIEWS USER_VIEWS ALL_VIEWS DBA_UPDATABLE_COLUMNS USER_UPDATABLE_COLUMNS ALL_UPDATABLE_COLUMNS 설명 Tibero 내의모든뷰의정보를조회하는뷰이다. 현재사용자에속한뷰의정보를조회하는뷰이다. 사용자가접근가능한뷰의정보를조회하는뷰이다. Tibero 내의모든뷰에속한컬럼의갱신가능성정보를조회하는뷰이다. 현재사용자에속한뷰에속한컬럼의정보를조회하는뷰이다. 사용자가접근가능한뷰에속한컬럼의갱신가능성정보를조회하는뷰이다. 참고 정적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 4.6. 시퀀스 시퀀스는순차적으로부여하는고유번호이다. 주로새로운데이터에유일한고유번호를자동으로부여할 때사용한다. 4.6.1. 시퀀스의생성, 변경, 제거 본절에서는시퀀스를생성, 변경, 제거하는방법을설명한다. 시퀀스는여러개의트랜잭션이서로겹치지않는고유번호를만들어낼때사용된다. 시퀀스를사용하지않으면, 고유번호를만들어내기위해서마지막으로사용된번호를기억하는테이블을만들고, 각트랜잭션이해당값을읽어서하나씩증가시켜야한다. 이러한방법을사용하면고유번호를생성하는모든트랜잭션사이에잠금 (Lock) 으로인한데이터충돌이발생하게된다. 이로인해데이터베이스성능이저하되는원인이될수있다. 시퀀스의생성 시퀀스는다음같은경우에따라생성요건이다르다. 현재사용자가자신의스키마에시퀀스를생성하는경우 CREATE SEQUENCE 문을사용할수있는시스템특권이있어야한다. 80 Tibero 관리자안내서
다른사용자의스키마에시퀀스를생성하는경우 CREATE ANY SEQUENCE 문을사용할수있는시 스템특권이있어야한다. 시퀀스를생성하기위해서는 CREATE SEQUENCE 문을사용해야한다. 다음은시퀀스를생성할때포함되는구성요소이다. 구성요소 시퀀스의이름 설명 시퀀스의이름을설정한다. 이구성요소는시퀀스를생성할때반드시포함되어야한다. MINVALUE MAXVALUE INCREMENT BY CACHE START WITH 시퀀스가생성할수있는최솟값이다. 시퀀스가생성할수있는최댓값이다. 시퀀스의값을사용할때마다얼마씩증가또는감소할지를설정한다. 데이터베이스성능향상을위해내부적으로메모리에값을캐시한다. 시퀀스를가장처음사용할때생성되는값을설정한다. 이값을설정하지않으면최솟값 ( 감소할경우에는최댓값 ) 으로정의된다. NOCYCLE 시퀀스는기본적으로 NOCYCLE 로정의되어있다. 최댓값 ( 값이감소할경우에는최솟값 ) 에도달하면 ALTER SEQUENCE 문을사 용하지않는한새로운값을생성할수없다. CYCLE 최댓값 ( 최솟값 ) 에도달하면자동으로다음값은최솟값 ( 최댓값 ) 으로순환한다. 시퀀스는데이터베이스성능향상을위해내부적으로메모리에값을캐시한다. MAX_SEQ_BUFFER 파라미터에캐시의크기를지정하며, 기본값은 20이다. 시스템이정상적으로종료될경우캐시에존재하지만아직실제로쓰이지않은값은디스크에저장되어다음번 Tibero가기동할때사용할수있다. 하지만시스템이비정상적으로종료될경우캐시에존재하던값은모두사용된것으로간주되며, 캐시의최대크기만큼시퀀스의값을건너뛸수있다. 이러한경우가발생하지않으려면시퀀스를 NOCACHE로선언해야한다. 하지만, 시퀀스를사용할때마다디스크액세스가일어나므로데이터베이스성능이저하된다. 특수한상황이아니면 NOCACHE를사용하지않기를권장한다. 다음은시퀀스를생성하는예이다. [ 예 4.28] 시퀀스의생성 CREATE SEQUENCE NEW_ID MINVALUE 1000 MAXVALUE 9999 INCREMENT BY 10 제 4 장스키마객체의관리 81
CACHE 100 NOCYCLE; 다음은시퀀스의값을사용하는예이다. CREATE TABLE EMP_ID (ID NUMBER, NAME VARCHAR(30)); INSERT INTO EMP_ID VALUES(NEW_ID.NEXTVAL, 'Peter'); 시퀀스에일단사용된값은해당트랜잭션이롤백되거나시스템이비정상적으로종료되어도재사용되지 않는다. 시퀀스의변경 시퀀스는다음같은경우에따라변경요건이다르다. 현재사용자가자신의스키마에속한시퀀스를변경하는경우 ALTER SEQUENCE 문을사용할수있는시스템특권이있어야한다. 다른사용자의스키마에속한시퀀스를변경하는경우 ALTER ANY SEQUENCE 문을사용할수있는 시스템특권이있어야한다. 시퀀스를변경하기위해서는 ALTER SEQUENCE 문을사용해야한다. 다음은시퀀스를변경하는예이다. [ 예 4.29] 시퀀스의변경 ALTER SEQUENCE NEW_ID MAXVALUE 99999 INCREMENT BY 1 CACHE 200; Tibero는시퀀스를사용할때, 사용자가마지막으로 NEXTVAL로적용한값이아니라다음사용자가 NEXTVAL을부를때가져갈값을저장한다. 따라서 ALTER SEQUENCE 문을실행했을때의결과가타 DBMS와다를수있다. 다음은내부적으로다음번에받아갈값 = 10을기억하고있으며, 마지막결과가 10이되는시퀀스의예이다. SQL> CREATE SEQUENCE S1 START WITH 10 INCREMENT BY 1; created SQL> ALTER SEQUENCE S1 INCREMENT BY 5; altered 82 Tibero 관리자안내서
SQL> SELECT S1.NEXTVAL FROM DUAL; NEXTVAL ---------- 10 1 selected 시퀀스의제거 시퀀스는다음같은경우에따라제거요건이다르다. 현재사용자가자신의스키마에속한시퀀스를제거하는경우 DROP SEQUENCE 문을사용할수있는시스템특권이있어야한다. 다른사용자의스키마에속한시퀀스를제거하는경우 DROP ANY SEQUENCE 문을사용할수있는 시스템특권이있어야한다. 시퀀스를제거하기위해서는 DROP SEQUENCE 문을사용해야한다. 다음은시퀀스를제거하는예이다. [ 예 4.30] 시퀀스의제거 DROP SEQUENCE NEW_ID; 4.6.2. 시퀀스의정보조회 Tibero 에서는시퀀스의정보를제공하기위해다음표에나열된정적뷰를제공하고있다. DBA 나일반사 용자모두사용할수있다. 정적뷰 DBA_SEQUENCES USER_SEQUENCES ALL_SEQUENCES 설명 Tibero 내의모든시퀀스의정보를조회하는뷰이다. 현재사용자에속한시퀀스의정보를조회하는뷰이다. 사용자가접근가능한시퀀스의정보를조회하는뷰이다. 참고 뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 제 4 장스키마객체의관리 83
4.7. 동의어 동의어는스키마객체의별칭 (Alias) 이다. 단, 실제데이터를포함하는스키마객체는아니며, 다른스키마 객체를통해정의된다. 4.7.1. 동의어의생성, 제거 본절에서는동의어를생성, 제거하는방법을설명한다. 동의어의생성 동의어는다음같은경우에따라생성요건이다르다. 현재사용자가자신의스키마에동의어를생성하는경우 CREATE SYNONYM 문을사용할수있는시스템특권이있어야한다. 다른사용자의스키마에동의어를생성하는경우 CREATE ANY SYNONYM 문을사용할수있는시스 템특권이있어야한다. 동의어를생성하기위해서는 CREATE SYNONYM 문을사용해야한다. 다음은동의어를생성할때포함되는구성요소이다. 구성요소 동의어의이름 설명 동의어의이름을설정한다. 이구성요소는동의어를생성할때반드시포함되어야한다. 테이블의이름 동의어를적용할테이블의이름을설정한다. 이구성요소는동의어를생성할때반드시포함되어야한다. 다음은동의어를생성하는예이다. [ 예 4.31] 동의어의생성 CREATE SYNONYM T1 FOR U1.EMP; 동의어의제거 정의된동의어를변경하기위해서는먼저동의어를제거하고다시생성해야한다. 동의어는다음같은경우에따라제거요건이다르다. 84 Tibero 관리자안내서
현재사용자가자신의스키마에속한동의어를제거하는경우 DROP SYNONYM 문을사용할수있는 시스템특권이있어야한다. 다른사용자의스키마에속한동의어를제거하는경우 DROP ANY SYNONYM 문을사용할수있는시 스템특권이있어야한다. 동의를제거하기위해서는 DROP SYNONYM 문을사용해야한다. 다음은동의어를제거하는예이다. [ 예 4.32] 동의어의제거 DROP SYNONYM T1; 4.7.2. 공용동의어의생성, 제거 본절에서는공용동의어를생성, 제거하는방법을설명한다. 공용동의어의생성 동의어를모든사용자가액세스할수있도록생성할수있다. 이를공용동의어 (PUBLIC SYNONYM) 라고 한다. 공용동의어는 Tibero 에서정의하고있는 PUBLIC 이라는특수한사용자가소유하는동의어이다. 공용동의어를생성하기위해서는 CREATE PUBLIC SYNONYM 문을사용해야한다. 다음은공용동의어를생성할때포함되는구성요소이다. 각구성요소는공용동의어를생성할때반드시 포함되어야한다. 구성요소 공용동의어의이름 테이블의이름 설명 공용동의어의이름을설정한다. 공용동의어를적용할테이블의이름을설정한다. 다음은공용동의어를생성하는예이다. [ 예 4.33] 공용동의어의생성 CREATE PUBLIC SYNONYM PUB_T1 FOR U1.EMP; 동의어는객체참조방법의편의성과투명성 (transparency) 을제공한다. 예를들어, 현재사용자가아닌다른사용자가 U1이소유한테이블 EMP를접근하려고하면매번 U1.EMP라고입력해야한다. 하지만, 공용동의어를정의하면 PUB_T1만입력하면된다. 예를들어, 다음의두 SQL 문장은같은결과를반환한다. 제 4 장스키마객체의관리 85
SELECT EMPNO, ENAME, ADDR FROM T1; SELECT EMPNO, ENAME, ADDR FROM U1.EMP; 하나의테이블을액세스하는애플리케이션프로그램에서다른테이블을액세스하는동의어를사용하는 경우, 프로그램내에서액세스하는테이블의이름을모두변경하는대신정의된동의어를변경하는것으 로도충분하다. 공용동의어의제거 공용동의어를제거하려면 DROP PUBLIC SYNONYM 문을사용해야한다. 단, DROP PUBLIC SYNONYM 시스템특권이있어야한다. 다음은공용동의어를제거하는예이다. [ 예 4.34] 공용동의어의제거 DROP PUBLIC SYNONYM PUB_T1; 4.7.3. 동의어의정보조회 Tibero 에서는동의어의정보를제공하기위해다음표에나열된정적뷰를제공하고있다. DBA 나일반사 용자모두사용할수있다. 정적뷰 DBA_SYNONYMS USER_SYNONYMS ALL_SYNONYMS PUBLICSYN 설명 Tibero 내의모든동의어의정보를조회하는뷰이다. 현재사용자에속한동의어의정보를조회하는뷰이다. 사용자가접근가능한동의어의정보를조회하는뷰이다. 모든공용동의어의정보를조회하는뷰이다. 참고 정적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 4.8. 트리거 트리거는테이블의로우를삽입, 변경, 삭제할때자동으로수행되도록미리지정해놓은 PSM(Persistent Store Module) 프로시저이다. 제약조건으로표현하기어려운데이터베이스의논리적조건을표현할때사용한다. 예를들어, 사용자계정별로테이블에삽입할수있는값의범위를다르게제한하고싶을때트리거를사용할수있다. 86 Tibero 관리자안내서
4.8.1. 트리거의생성, 제거 본절에서는트리거의생성, 제거하는방법을설명한다. 트리거의생성 트리거는다음같은경우에따라생성요건이다르다. 현재사용자가자신의스키마에속한트리거를생성하는경우 CREATE TRIGGER 문을사용할수있는시스템특권이있어야한다. 다른사용자의스키마에속한트리거를생성하는경우 CREATE ANY TRIGGER 문을사용할수있는 시스템특권이있어야한다. 트리거를생성하기위해서는 CREATE TRIGGER 문을사용해야한다. 트리거는삽입, 변경, 삭제연산을수행하기직전이나직후에수행할수있다. 다음은 EMP 테이블에새로운로우를삽입한직후에트리거를수행하는예이다. [ 예 4.35] 트리거의생성 CREATE TRIGGER TRG1 AFTER INSERT ON EMP FOR EACH ROW WHEN (TRUE) BEGIN --- PSM BLOCK --- END; 생성된트리거는트리거를생성한사용자의권한을가지고동작한다. 참고 트리거에대한자세한내용은 "Tibero SQL 참조안내서 " 를참고한다. 트리거의제거 트리거를제거하기위해서는 DROP TRIGGER 문을사용해야한다. 다음은트리거를제거하는예이다. [ 예 4.36] 트리거의제거 DROP TRIGGER TRG1; 제 4 장스키마객체의관리 87
4.9. 파티션 테이블의크기가점점커지고많은트랜잭션이동시에액세스하는경우, 운영체제는빈번한입출력과잠금 (Lock) 현상이발생하게된다. 이러한현상은데이터베이스성능이저하되는원인이된다. 이를해결하기위해하나의논리적테이블을여러개의물리적인공간으로나누는파티션을설정할수있다. 파티션은대용량서비스를하는데이터베이스에서효율적으로관리하고동작하기위해지원하는옵션이다. 파티션은서로다른테이블스페이스에생성할수있으며, 입출력과같은물리적인제약을감소시킬수있다. 하나의테이블로만모든데이터가유지된다면, 모든트랜잭션이한곳에집중하게된다. 이로인해각트랜잭션이다른트랜잭션을대기하는일이많아져서데이터베이스성능이저하된다. 하지만파티션으로나눈경우에는각트랜잭션은자신이접근해야할파티션에만접근하면되므로대기확률이줄어든다. 일부 DML 문장의경우특정파티션에있는데이터만접근하면되므로, 전체테이블을모두읽는것보다 1/N( 파티션개수 ) 의정보만을검색할수있다. 파티션은다음과같이세가지종류가있다. 파티션 RANGE HASH LIST 설명각파티션에포함될 RANGE를지정하여파티션을정의한다. HASH 함수를이용하여파티션을정의한다. 각파티션에포함될값을직접지정하여파티션을정의한다. 4.9.1. 파티션의생성 파티션을생성하기위해서는 CREATE TABLE 문을사용할때파티션의정보를정의함으로써파티션된테이블을만들수있다. 테이블을만들수있는권한만있다면특별한권한은필요하지않다. 다음은파티션으로구성한테이블을생성하는예이다. [ 예 4.37] 파티션의생성 CREATE TABLE PARTITIONED_TABLE1 (C1 NUMBER, C2 CLOB, C3 NUMBER) PARTITION BY RANGE (C1, C3) ( PARTITION PART1 VALUES LESS THAN (30, 40), PARTITION PART2 VALUES LESS THAN (50, 60), PARTITION PART3 VALUES LESS THAN (60, 70) ); 테이블을파티션으로나누는방법은범위를통해가능하다. 위의예에서는각파티션에범위를지정하여 해당파티션에데이터를삽입한다. 이를통해데이터가어느파티션에속해있는지를알수있다. 파티션 은최대 10,000 개까지생성할수있다. 88 Tibero 관리자안내서
파티션의또다른장점은관리의편의성이다. 각연도별로파티션을나눈테이블이있다고했을때필요치않은 10년전의정보를저장하고있는해당파티션을제거함으로써쉽게삭제 (DROP) 할수있다. 또한다음해에해당하는파티션이필요하다면새로운파티션을추가 (ADD) 할수있다. 파티션의제거와추가는 ALTER TABLE 문에서파티션과관련된옵션을사용함으로써가능하다. ALTER TABLE PARTITIONED_TABLE1 ADD PARTITION PART3 VALUES LESS THAN (70, 80); ALTER TABLE PARTITIONED_TABLE1 DROP PARTITION PART1; 파티션을정의할때다음과같은주의사항이있다. 각파티션을정의한순서에따라범위가정렬되어야한다. 예를들면, 다음의문장은에러가발생한다. CREATE TABLE PARTITIONED_TABLE2 (C1 NUMBER, C2 CLOB, C3 NUMBER) PARTITION BY RANGE (C1, C3) ( PARTITION PART1 VALUES LESS THAN (50, 20), PARTITION PART2 VALUES LESS THAN (30, 10), PARTITION DEF_PART VALUES LESS THAN (MAXVALUE, MAXVALUE) ); PART1이 PART2보다먼저선언되었지만범위가오히려 PART1이 PART2를포함하는것을볼수있다. 범위를정의할때 VALUES LESS THAN 절은 ' 이전 PARTITION에들어가지않고 ~ 보다작은값을갖는데이터를포함하는파티션 ' 이라는의미를가진다. 그러므로항상파티션의범위는정렬되어야한다. ALTER TABLE 문에의해새로만들어진파티션은기존의마지막파티션의범위보다높은범위를가져야한다. 범위간의비교는선행하는파티션의키가더큰쪽이큰범위이다. 선행하는파티션의키가 MAXVALUE 로지정되어새로운파티션의키로더큰값을지정할수없는경우에는파티션을추가하거나생성할수없으므로주의해야한다. 다음은이와같은에러를발생시키는예이다. CREATE TABLE PARTITIONED_TABLE3 (C1 NUMBER, C2 CLOB, C3 NUMBER) PARTITION BY RANGE (C1, C3) ( PARTITION PART1 VALUES LESS THAN (50, 20), PARTITION PART2 VALUES LESS THAN (60, 70) ); ALTER TABLE PARTITIONED_TABLE3 ADD PARTITION PART3 VALUES LESS THAN (80, 40); 제 4 장스키마객체의관리 89
ALTER TABLE PARTITIONED_TABLE3 ADD PARTITION PART3 VALUES LESS THAN (70, 100); 4.9.2. 복합파티션의생성 복합파티션은한개의키로우선파티션을한뒤각파티션을같은키혹은다른키로다시파티션을하는테이블파티션의한방식이다. 아래예는 solid_date 컬럼을이용해월별로 RANGE 파티셔닝을우선한뒤각파티션들을다시 product_id로 HASH 파티셔닝한예이다. CREATE TABLE years_sales ( product_id NUMBER, product_name VARCHAR(20), price NUMBER, sold_date DATE ) PARTITION BY RANGE (sold_date) SUBPARTITION BY HASH (product_id) ( PARTITION jan_sales VALUES LESS THAN (TO_DATE('31-01-2006', 'DD-MM-YYYY')), PARTITION feb_sales VALUES LESS THAN (TO_DATE('28-02-2006', 'DD-MM-YYYY')), PARTITION mar_sales VALUES LESS THAN (TO_DATE('31-03-2006', 'DD-MM-YYYY')), PARTITION apr_sales VALUES LESS THAN (TO_DATE('30-04-2006', 'DD-MM-YYYY')), PARTITION may_sales VALUES LESS THAN (TO_DATE('31-05-2006', 'DD-MM-YYYY')), PARTITION jun_sales VALUES LESS THAN (TO_DATE('30-06-2006', 'DD-MM-YYYY')), PARTITION jul_sales VALUES LESS THAN (TO_DATE('31-07-2006', 'DD-MM-YYYY')), PARTITION aug_sales VALUES LESS THAN (TO_DATE('31-08-2006', 'DD-MM-YYYY')), PARTITION sep_sales VALUES LESS THAN (TO_DATE('30-09-2006', 'DD-MM-YYYY')), PARTITION oct_sales VALUES LESS THAN (TO_DATE('31-10-2006', 'DD-MM-YYYY')) SUBPARTITIONS 2, PARTITION nov_sales VALUES LESS THAN (TO_DATE('30-11-2006', 'DD-MM-YYYY')) SUBPARTITIONS 4, PARTITION dec_sales VALUES LESS THAN 90 Tibero 관리자안내서
(TO_DATE('31-12-2006', 'DD-MM-YYYY')) (SUBPARTITION dec_1, SUBPARTITION dec_2, SUBPARTITION dec_3, SUBPARTITION dec_4) ); 두개의컬럼 ( 위예의경우 solid_date와 product_id) 에대한조건으로빈번하게조회가일어나는대용량테이블에대해이런식으로복합파티셔닝을하면검색할데이터의양이크게줄기때문에성능상의큰이득을볼수있다. 참고 각복합파티션에대한문법은 "Tibero SQL 참조안내서 " 를참고한다. 4.9.3. 인덱스파티션의생성 테이블뿐만아니라인덱스도파티션을지정할수있다. 인덱스또한파티션을통해데이터베이스성능을 향상시킬수있다. 인덱스는다음과같이두가지방법으로파티션을나눌수있다. 로컬파티션 테이블이파티션되었을때테이블파티션에들어가는키로파티션을나누는방법이다. 각파티션에아무런정보를입력하지않고단지 LOCAL이라고선언하면된다. 이름은자동으로생성되며, 그외정보는기본값으로설정된다. 로컬파티션으로설정된인덱스는테이블의한파티션과 1:1로대응된다. 로컬파티션으로설정된인덱스의한파티션은테이블의한파티션에있는로우만을가리킨다. 다음은로컬파티션으로인덱스를생성하는예이다. [ 예 4.38] 로컬파티션인덱스의생성 CREATE TABLE PARTITIONED_TABLE1 (C1 NUMBER, C2 CLOB, C3 NUMBER) PARTITION BY RANGE (C1, C3) ( PARTITION PART1 VALUES LESS THAN (30, 40), PARTITION PART2 VALUES LESS THAN (50, 60), PARTITION DEF_PART VALUES LESS THAN (MAXVALUE, MAXVALUE) ); CREATE INDEX PARTITIONED_INDEX1 ON PARTITIONED_TABLE1 (C1) LOCAL ( PARTITION IPART1 INITRANS 3, PARTITION IPART2 PCTFREE 10, PARTITION IPART3 ); 제 4 장스키마객체의관리 91
글로벌파티션 테이블과는무관하게인덱스에따로파티션을설정하는방법이다. 테이블이파티션으로나뉘어져있든아니든글로벌파티션인덱스를만들수있다. 글로벌파티션인덱스의한파티션은테이블의어느파티션에있는로우라도가리킬수있다. 다음은글로벌파티션으로인덱스를생성하는예이다. [ 예 4.39] 글로벌파티션인덱스의생성 CREATE TABLE PARTITIONED_TABLE1 (C1 NUMBER, C2 CLOB, C3 NUMBER) PARTITION BY RANGE (C1, C3) ( PARTITION PART1 VALUES LESS THAN (30, 40), PARTITION PART2 VALUES LESS THAN (50, 60), PARTITION DEF_PART VALUES LESS THAN (MAXVALUE, MAXVALUE) ); CREATE INDEX PARTITIONED_INDEX1 ON PARTITIONED_TABLE1 (C1) GLOBAL PARTITION BY RANGE (C1, C3) ( PARTITION IPART1 VALUES LESS THAN (10, 20) INITRANS 3 PARTITION IPART2 VALUES LESS THAN (30, 40) PCTFREE 10 ); 4.9.4. 파티션의정보조회 Tibero 에서는파티션된스키마의정보를제공하기위해다음표에나열된정적뷰를제공하고있다. DBA 나일반사용자모두사용할수있다. 정적뷰 DBA_PART_TABLES USER_PART_TABLES ALL_PART_TABLES DBA_PART_INDEXES USER_PART_INDEXES ALL_PART_INDEXES 설명 Tibero 내의파티션된모든테이블의정보를조회하는뷰이다. 현재사용자에속한파티션된테이블의정보를조회하는뷰이다. 사용자가접근가능한파티션된테이블의정보를조회하는뷰이다. Tibero 내의파티션된모든인덱스의정보를조회하는뷰이다. 현재사용자에속한파티션된인덱스의정보를조회하는뷰이다. 사용자가접근가능한파티션된인덱스의정보를조회하는뷰이다. 참고 정적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 92 Tibero 관리자안내서
제 5 장사용자관리와데이터베이스보안 데이터베이스보안 (Security) 은사용자가고의나실수로데이터베이스에저장된데이터를조작해일관성을손상시키거나전체데이터베이스를파손시키는일을방지하려는데목적이있다. 본장에서는 Tibero의데이터베이스보안을위한사용자계정과사용자의특권 (Privilege) 및역할 (Role) 등을효율적으로관리하고데이터베이스사용을감시 (Audit) 하기위한방법을설명한다. 5.1. 사용자관리 Tibero 내부의데이터에접근하기위해서는사용자계정 (Account) 이필요하다. 각계정은패스워드 (Pass word) 를통해보안이유지된다. 패스워드는사용자계정을생성할때설정하며, 생성된이후에변경할수있다. Tibero는패스워드를데이터사전 (Data Dictionary) 에암호화된형태로저장한다. Tibero에서하나의사용자계정은하나의스키마를가지며, 스키마의이름은사용자의이름과같다. 참고 스키마 (Schema) 는테이블, 뷰, 인덱스등의스키마객체 (Schema object) 의묶음이다. 특정스키마에속한스키마객체를나타내려면다음과같이입력해야한다. 사용자계정. 스키마객체 다음은 tibero 라는사용자계정으로접속하여 SYS 사용자의 SYSTEM_PRIVILEGES 에접근하는예이다. $ tbsqltibero/tmax tbsql 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Connected to Tibero. SQL> SELECT * FROM SYS.SYSTEM_PRIVILEGES;... 다음은스키마객체앞에특정한사용자계정을명시하지않았을경우의예이다. SELECT * FROM V$DATABASE; 제 5 장사용자관리와데이터베이스보안 93
사용자계정이생략되면, 스키마객체에접근할때다음과같은과정을거친다. 1. 사용자자신이소유한스키마객체중에 V$DATABASE 가있는지검색한다. tibero 라는사용자계정으로접속했다고가정하면, tibero.v$database 를검색한다. 2. 사용자가소유한스키마객체중 V$DATABASE 가존재하지않으면, PUBLIC 사용자가소유한동의어를검색한다. 즉, PUBLIC.V$DATABASE를검색한다. PUBLIC 사용자는오직동의어만을소유할수있다. PUBLIC 사용자가소유한동의어를검색할때, 스키마객체앞에 PUBLIC 사용자계정을명시할수없다. PUBLIC 사용자가소유한동의어 V$DATABASE를찾는다고가정하면, PUBLIC.V$DATABASE라고입력할수없고, V$DATABASE만입력해야한다. 3. PUBLIC.V$DATABASE 라는이름의스키마객체가없거나있어도사용자가 PUBLIC.V$DATABASE 객체에대한특권이없다면에러를반환한다. 5.1.1. 사용자의생성, 변경, 제거 사용자를새로생성하거나변경, 제거하기위해서는 DBA 특권을가진사용자로 Tibero에접속해야한다. Tibero에서는기본적으로 SYS라는사용자를제공한다. SYS 사용자는 Tibero를설치하는과정에서생기는계정으로, DBA 역할이부여된다. SYS 사용자로 Tibero 에접속하는방법은다음과같다. $ tbsql SYS/tibero tbsql 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Connected to Tibero. SQL> SYS 사용자는 DBA 의역할이부여된만큼될수있으면다른사용자계정을사용할것을권장한다. 사용자의생성 사용자를생성할때에는데이터베이스보안정책에따라적당한특권을가진사용자계정을생성한다. 사용자를생성하는방법은다음과같다. 94 Tibero 관리자안내서
SQL> CREATE USER Steve... 1... IDENTIFIED BY dsjeoj134... 2... DEFAULT TABLESPACE USR;... 3... 1 CREATE USER 문을사용하여 Steve라는사용자를생성한다. 2 사용자 Steve의패스워드를 dsjeoj134로설정한다. CREATE USER 문을사용할때에는반드시패스워드를설정해야한다. 3 디폴트테이블스페이스를 USR로설정한다. 다음은위와동일한방법으로여러사용자를생성하는예이다. SQL> CREATE USER Peter User 'PETER' created. IDENTIFIED BY abcd; SQL> CREATE USER John User 'JOHN' created. IDENTIFIED BY asdf; SQL> CREATE USER Smith User 'SMITH' created. IDENTIFIED BY aaaa; SQL> CREATE USER Susan IDENTIFIED BY bbbb; User 'SUSAN' created. 위와같이테이블스페이스를지정하지않으면, 자동으로시스템테이블스페이스를사용하게된다. 새로생성된사용자는아무런특권을가지지않으며, 데이터베이스에접속할수없다. 데이터베이스에접속하기위해서는 CREATE SESSION 시스템특권이나, 이를포함하는역할을부여받아야한다. 다음은생성된사용자에게특권을할당하는예이다. SQL> GRANT CONNECT TO Peter; Granted. SQL> GRANT RESOURCE TO John; Granted. SQL> GRANT CONNECT TO Smith; Granted. SQL> GRANT DBA TO Susan; Granted. 제 5 장사용자관리와데이터베이스보안 95
참고 자세한내용은 5.2. 특권 을참고한다. 사용자의변경 사용자에게설정된패스워드, 테이블스페이스등을변경하는방법은다음과같다. ALTER USER Peter... 1... IDENTIFIED BY abcdef... 2... DEFAULT TABLESPACE SYSTEM;... 3... 1 ALTER USER 문을사용하여 Peter라는사용자의정보를변경한다. 2 사용자 Peter의패스워드를 abcdef로변경한다. 3 테이블스페이스를 SYSTEM 테이블스페이스로변경한다. 사용자의제거 사용자를제거하는방법은다음과같다. DROP USER user_name CASCADE; 항목 DROP USER user_name CASCADE 설명 DROP USER 문을통해 user_name에설정된사용자를제거한다. DROP USER 문의옵션중하나인 CASCADE는사용자를제거하기전에그사용자의모든스키마객체를제거한다. CASCADE 옵션을사용하지않으면, 해당사용자가아무런스키마객체를가지고있지않을경우에만사용자를제거할수있다. 제거된사용자의스키마객체를참조하는뷰나동의어, 프로시저, 함수는모두 INVALID 상태가된다. 나중에동일한이름의다른사용자가만들어지면, 새로운사용자는그이름을가졌던이전사용자로부터아무것도상속받지못한다. 다음은 John 이라는사용자를제거하는예이다. DROP USER John CASCADE; 96 Tibero 관리자안내서
5.1.2. 사용자의정보조회 Tibero 에서는사용자의정보를제공하기위해다음표에나열된정적뷰를제공하고있다. DBA 나일반사 용자모두사용할수있다. 정적뷰 ALL_USERS DBA_USERS USER_USERS 설명데이터베이스의모든사용자의기본적인정보를조회하는뷰이다. 데이터베이스의모든사용자의자세한정보를조회하는뷰이다. 현재사용자의정보를조회하는뷰이다. 참고 정적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 5.1.3. 사용자계정잠금및해제 데이터베이스사용자가계정에접속할수없도록계정을잠금상태로설정하거나잠금상태를해제할수 있다. SQL> ALTER USER Peter ACCOUNT LOCK; User 'PETER' altered. 계정잠금상태에서해당계정에접속을시도하면다음과같은오류코드와함께접속이중단된다. SQL> conn peter/abcd; TBR-17006: Account is locked. No longer connected to server. 계정잠금을해제하려면다음의 SQL 을수행한다. SQL> ALTER USER Peter ACCOUNT UNLOCK; User 'PETER' altered. 프로파일설정에따라패스워드사용기한이만료되거나패스워드오류횟수초과등으로계정잠금상태 가된경우에도동일한방법으로잠금해제할수있다. 제 5 장사용자관리와데이터베이스보안 97
5.2. 특권 사용자가데이터베이스의특정스키마객체에접근하려면특권을부여받아야한다. 특권을부여받으면허용된스키마객체에 SQL 문장등을실행할수있다. 다음은사용자에게특권을부여하는예이다. SQL> conn Peter/abcdef... 1... Connected. SQL> CREATE TABLE EMPLOYEE Created. (ID NUMBER, EMPLOYEE_NAME VARCHAR(20), ADDRESS VARCHAR(50));... 2... SQL> GRANT SELECT ON EMPLOYEE TO Smith;... 3... Granted. 1 Peter 라는사용자계정으로데이터베이스에접속한다. 2 CREATE TABLE 문을사용하여 EMPLOYEE 테이블을생성한다. 총 3개의컬럼 (ID, EMPLOYEE_NAME, ADDRESS) 을생성한다. 3 Smith 라는사용자가 Peter 사용자가생성한 EMPLOYEE 테이블에 GRANT 명령을실행하여 SELECT 특권을부여한다. 이제사용자 Smith는 Peter의 EMPLOYEE 테이블을조회할수있다. PUBLIC 사용자에게특권을부여할수있는데, 존재하는모든사용자에게특권을부여한것과동일한효과를갖는다. 특권을효율적으로관리하기위해, 특권의집합인역할을생성할수있다. 동일한특권을부여해야할사용자가많은경우, 역할을이용함으로써 GRANT 명령의사용횟수를줄일수있다. 특권과마찬가지로역할도 PUBLIC 사용자에게부여하면모든사용자에게역할을부여한것과동일한효과를갖는다. Tibero에서제공하는특권은크게두가지로나뉜다. 스키마객체특권 (Schema Object Privilege) 특정객체에대한질의및갱신특권이다. 시스템특권 (System Privilege) 데이터베이스에서특정작업을수행할수있는특권이다. 98 Tibero 관리자안내서
5.2.1. 스키마객체특권 스키마객체특권은스키마객체인테이블, 뷰, 시퀀스, 동의어등에접근하는것을제어하는권한이다. 스키마객체특권은 GRANT 명령을사용해다른사용자에게부여할수있으며, 그내용은데이터사전에기록된다. 스키마객체특권은다음과같다. 스키마객체특권 SELECT INSERT UPDATE DELETE ALTER INDEX REFERENCES 설명테이블을조회하는권한이다. 테이블에로우를삽입하는권한이다. 테이블에로우를갱신하는권한이다. 테이블에로우를삭제하는권한이다. 스키마객체의특성을변경하는권한이다. 테이블에인덱스를생성하는권한이다. 테이블을참조하는제약조건을생성하는권한이다. 스키마객체특권의부여 다음은 WITH GRANT OPTION 을이용하여스키마객체특권을부여하는예이다. SQL> GRANT SELECT, UPDATE (EMPLOYEE_NAME, ADDRESS) ON EMPLOYEE TO Smith WITH GRANT OPTION; WITH GRANT OPTION을이용하여특권을부여받았을경우, 특권을부여받은사용자가부여받은특권을다른사용자에게부여할수있다. 사용자 Peter가위의 GRANT 명령을실행하기위해서는특권을갖고있어야한다. 그특권은스키마객체 EMPLOYEE에대한 SELECT, UPDATE 특권과 WITH GRANT OPTION을함께사용할수있는특권이다. 위의명령이실행되면사용자 Smith는 EMPLOYEE에대한 SELECT 및 UPDATE 특권을갖게된다. 이때, EMPLOYEE에대한 UPDATE 특권은컬럼 EMPLOYEE_NAME과 ADDRESS에한한다. 사용자 Smith는또한 EMPLOYEE에대한 SELECT, UPDATE, WITH GRANT OPTION 특권을다른사용자에게부여할수있는특권도갖게된다. 마찬가지로사용자 Susan과 John에게도다음과같은특권을할당한다. SQL> GRANT ALL ON EMPLOYEE TO Susan WITH GRANT OPTION; Granted. SQL> GRANT SELECT, DELETE ON EMPLOYEE TO John WITH GRANT OPTION; Granted. 제 5 장사용자관리와데이터베이스보안 99
스키마객체특권의회수 다른사용자로부터스키마객체특권을회수하기위해서는 REVOKE 명령을사용해야한다. 이명령은사용자의스키마객체특권의일부또는전체를회수할수있다. DBA는자신이직접부여하지않는특권에대해서도다른사용자로부터회수할수있다. 다음은각각 Peter로부터테이블 EMPLOYEE에대한 DELETE 특권을회수하고 John으로부터모든특권을회수하는예이다. REVOKE DELETE ON EMPLOYEE FROM Peter; REVOKE ALL ON EMPLOYEE FROM John; WITH GRANT OPTION 과함께부여된특권을회수할때에는연속적으로특권이회수된다. 다음은 Peter 로부터부여받은 Peter.EMPLOYEE 에대한특권을사용자 Smith 가 Susan 에게부여하는예 이다. SQL> conn Smith/abcd Connected. SQL> GRANT ALL ON Peter.EMPLOYEE TO Susan; Granted. 사용자 Peter 가다음과같이 Smith 에게부여한테이블 EMPLOYEE 의특권을회수하면, 사용자 Smith 가 Susan 에게부여한같은특권도동시에회수된다. SQL> conn Peter/abcdef Connected SQL> REVOKE ALL ON EMPLOYEE FROM Smith; 5.2.2. 시스템특권 데이터베이스를관리하는데필요한시스템명령어를사용하기위해서는시스템특권을부여받아야한다. 시스템특권은기본적으로 SYS 사용자가소유하고있으며, 다른사용자에게부여할수있다. 시스템특권은다음과같다. 시스템특권 ALTER SYSTEM CREATE SESSION CREATE USER 설명 ALTER SYSTEM 문을실행할수있는권한이다. 데이터베이스에세션을생성할수있는권한이다. 즉로그인이가능하다는것을의미한다. 사용자를생성하는권한이다. 100 Tibero 관리자안내서
시스템특권 ALTER USER DROP USER CREATE TABLESPACE ALTER TABLESPACE DROP TABLESPACE CREATE TABLE CREATE ANY TABLE ALTER ANY TABLE DROP ANY TABLE COMMENT ANY TABLE SELECT ANY TABLE INSERT ANY TABLE UPDATE ANY TABLE DELETE ANY TABLE CREATE ANY INDEX ALTER ANY INDEX DROP ANY INDEX CREATE SYNONYM CREATE ANY SYNONYM DROP ANY SYNONYM SYSDBA CREATE PUBLIC SYNONYM DROP PUBLIC SYNONYM CREATE VIEW CREATE ANY VIEW DROP ANY VIEW CREATE SEQUENCE CREATE ANY SEQUENCE ALTER ANY SEQUENCE DROP ANY SEQUENCE SELECT ANY SEQUENCE CREATE ROLE 설명사용자의정보를변경하는권한이다. 사용자를제거하는권한이다. 테이블스페이스를생성하는권한이다. 테이블스페이스를변경하는권한이다. 테이블스페이스를제거하는권한이다. 자신의스키마에테이블을생성하는권한이다. 임의의스키마에테이블을생성하는권한이다. 임의의스키마에속한테이블을변경하는권한이다. 임의의스키마에속한테이블을제거하는권한이다. 임의의스키마에속한테이블에주석을추가하는권한이다. 임의의스키마에속한테이블을조회하는권한이다. 임의의스키마에속한테이블에로우를삽입하는권한이다. 임의의스키마에속한테이블에로우를갱신하는권한이다. 임의의스키마에속한테이블에로우를제거하는권한이다. 임의의스키마에속한테이블에인덱스를생성하는권한이다. 임의의스키마에속한테이블에인덱스를수정하는권한이다. 임의의스키마에속한테이블에인덱스를제거하는권한이다. 자신의스키마에동의어를생성하는권한이다. 임의의스키마에동의어를생성하는권한이다. 임의의스키마에속한동의어를제거하는권한이다. SHUTDOWN, ALTER DATABASE, CREATE DATABASE, ARCHIVELOG, RECOVERY 문을실행할수있는권한이다. PUBLIC 스키마에동의어를생성하는권한이다. PUBLIC 스키마에속한동의어를제거하는권한이다. 자신의스키마에뷰를생성하는권한이다. 임의의스키마에뷰를생성하는권한이다. 임의의스키마에속한뷰를제거하는권한이다. 자신의스키마에시퀀스를생성하는권한이다. 임의의스키마에시퀀스를생성하는권한이다. 임의의스키마에속한시퀀스를변경하는권한이다. 임의의스키마에속한시퀀스를제거하는권한이다. 임의의스키마에속한시퀀스를조회하는권한이다. 역할을생성하는권한이다. 제 5 장사용자관리와데이터베이스보안 101
시스템특권 DROP ANY ROLE GRANT ANY ROLE ALTER ANY ROLE ALTER DATABASE CREATE PROCEDURE CREATE ANY PROCEDURE ALTER ANY PROCEDURE DROP ANY PROCEDURE EXECUTE ANY PROCEDURE CREATE TRIGGER CREATE ANY TRIGGER ALTER ANY TRIGGER DROP ANY TRIGGER GRANT ANY OBJECT PRIVILEGE GRANT ANY PRIVILEGE 설명역할을제거하는권한이다. 임의의역할에부여하는권한이다. 역할을수정하는권한이다. 데이터베이스를변경하는권한이다. 자신의스키마에프로시저를생성하는권한이다. 임의의스키마에프로시저를생성하는권한이다. 임의의스키마에속한프로시저를변경하는권한이다. 임의의스키마에속한프로시저를제거하는권한이다. 임의의스키마에속한프로시저를실행하는권한이다. 자신의스키마에속한트리거를생성하는권한이다. 임의의스키마에속한트리거를생성하는권한이다. 임의의스키마에속한트리거를변경하는권한이다. 임의의스키마에속한트리거를제거하는권한이다. 모든스키마객체에대한특권을가지는권한이다. 모든특권을전부부여할수있는권한이다. 시스템특권의부여 시스템특권도 WITH ADMIN OPTION을이용하여다른사용자에게특권을부여할수있다. 단, 특권을부여할때에는해당특권을소유하고있어야한다. 다음은시스템특권을가지고있는사용자 SYS가 Susan에게 WITH ADMIN OPTION과함께 GRANT SELECT ANY TABLE 특권을부여하는예이다. SQL> conn SYS/tibero Connected to Tibero. SQL> GRANT SELECT ANY TABLE TO Susan WITH ADMIN OPTION; Granted. 사용자 Susan은 SYS 사용자에게부여받은시스템특권을다른사용자에게부여할수있는권한이생성된다. 즉, 다른사용자에게데이터베이스내의모든테이블을조회할수있는특권을부여할수있다는의미이다. 시스템특권의회수 WITH ADMIN OPTION 과함께부여된특권은 WITH GRANT OPTION 과는달리연속적으로회수되지않 는다. 102 Tibero 관리자안내서
다음은사용자 Susan 이사용자 SYS 로부터부여받은특권을 Peter 에게부여하는예이다. SQL> conn Susan/abcd Connected to Tibero. SQL> GRANT SELECT ANY TABLE TO Peter; Granted. 다음과같이 Susan 에게부여한시스템특권을회수하더라도, 사용자 Susan 이 Peter 에게부여한시스템 특권은그대로유지된다. SQL> conn SYS/tibero Connected to Tibero. SQL> REVOKE SELECT ANY TABLE FROM Susan; 5.2.3. 특권의정보조회 Tibero 에서는특권의정보를제공하기위해다음표에나열된정적뷰를제공하고있다. DBA 나일반사용 자모두사용할수있다. 정적뷰 DBA_SYS_PRIVS USER_SYS_PRIVS DBA_TBL_PRIVS USER_TBL_PRIVS ALL_TBL_PRIVS DBA_COL_PRIVS USER_COL_PRIVS ALL_COL_PRIVS USER_COL_PRIVS_MADE ALL_COL_PRIVS_MADE 설명사용자에게부여된모든특권의정보를조회하는뷰이다. 현재사용자에게부여된특권의정보를조회하는뷰이다. 데이터베이스내의모든스키마객체특권의정보를조회하는뷰이다. 현재사용자가소유한모든스키마객체특권의정보를조회하는뷰이다. 현재사용자가소유한모든스키마객체특권과모든사용자가사용할수있도록공개한모든스키마객체특권의정보를조회하는뷰이다. 데이터베이스내의모든스키마객체특권중스키마객체의특정컬럼에부여된특권의정보를조회하는뷰이다. 현재사용자가소유한스키마객체특권중스키마객체의특정컬럼에부여된특권의정보를조회하는뷰이다. 현재사용자가소유한스키마객체특권혹은모든사용자가사용할수있도록공개한모든스키마객체특권중스키마객체의특정컬럼에부여된특권의정보를조회하는뷰이다. 현재사용자소유한객체중특정컬럼에부여된특권의정보를조회하는뷰이다. 현재사용자가만든특권중스키마객체의특정컬럼에부여된특권의정보를조회하는뷰이다. 제 5 장사용자관리와데이터베이스보안 103
정적뷰 USER_COL_PRIVS_RECD ALL_COL_PRIVS_RECD 설명현재사용자에게부여된모든스키마객체특권중스키마객체의특정컬럼에부여된특권의정보를조회하는뷰이다. 현재사용자또는 PUBLIC 사용자에게부여된모든스키마객체특권중스키마객체의특정컬럼에부여된특권의정보를조회하는뷰이다. 참고 정적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 5.3. 프로파일 데이터베이스사용자의패스워드관리정책을지정할수있다. 예를들어, 사용자 1, 2, 3은 90일후패스워드사용기간이만료되도록설정하고사용자 4, 5는패스워드사용기간이 30일후만료되며한번사용한패스워드는재사용못하도록패스워드사용정책을각각다르게설정할필요가있다고가정하자. 이경우 90일후패스워드사용기간이만료되도록설정한프로파일과 30일후패스워드사용기간이만료되며한번사용한패스워드는재사용못하도록설정한프로파일을각각생성하고, 사용자 1, 2, 3은첫번째프로파일을사용하도록지정하고사용자 4, 5는두번째프로파일을사용하도록지정하면된다. 이처럼, 프로파일은사용자패스워드관리정책을다양하게생성하고각각의사용자에게특정정책을사용하도록지정함으로써사용자별로그룹화된패스워드정책을관리할수있는기능을제공한다. 5.3.1. 프로파일생성, 변경, 제거 다음은프로파일을생성하는예이다. SQL> CREATE PROFILE prof LIMIT failed_login_attempts 3 password_lock_time 1/1440 password_life_time 90 password_reuse_time unlimited password_reuse_max 10 password_grace_time 10 password_verify_function verify_function; Profile 'PROF' created. 104 Tibero 관리자안내서
프로파일파라미터의종류 위예제에서보았듯이프로파일을생성, 변경할때는세부적인파라미터를지정할수있다. 아래표는각파라미터에대한상세설명이다. 참고로각파라미터의기본값은데이터베이스를생성할때함께생성된 'DEFAULT' 프로파일에의해결정되며이기본값들은 DBA_PROFILES 뷰를통해확인할수있다. 구성요소 FAILED_LOGIN_ATTEMPTS LOGIN_PERIOD PASSWORD_LIFE_TIME 설명잘못된패스워드로로그인시도할경우사용자계정를잠글때까지로그인시도허용횟수를지정한다. 이값이지정되어있을경우마지막로그인후지정된시간이지나면계정인잠긴다. 패스워드만료기간을설정한다. 숫자와수식두가지형태로지정할수있다. 숫자로지정할경우단위는일 (day) 이다. 예를들어 30으로지정하면패스워드만료일자가 30일후가된다. 해당값을 1 일미만으로지정하는등특별한용도로사용하기위해수 식을사용할수있다. 예를들어 1/1440 으로지정하면패스워드만료일 자가 1 분후가된다. PASSWORD_REUSE_TIME 패스워드재사용금지기간을설정한다. 숫자와수식두가지형태로지 정할수있다. 예를들어해당값을 30 으로설정하면 30 일동안동일한패스워드로다 시변경할수없다. PASSWORD_REUSE_MAX 설정된갯수만큼최근변경한패스워드는재사용할수없다. 예를들어해당값을 10 으로지정하면현재패스워드를재사용하기위 해서는 10 회이상다른값으로먼저패스워드를변경해야한다. PASSWORD_LOCK_TIME 패스워드오류횟수초과로계정이잠금상태가되었을때자동으로잠 금상태를해제하는기간을설정한다. 숫자와수식두가지형태로지정 할수있다. 예를들어 1/1440 으로지정하면 1 분후자동으로잠금상태가해제된다. PASSWORD_GRACE_TIME 패스워드사용기간 (PASSWORD_LIFE_TIME) 만료후패스워드만료 경고를보내는기간을설정한다. 숫자와수식두가지형태로지정할수 있다. 경고를보내는기간은패스워드사용기간만료후첫접속한시점부터계산한다. 예를들어 PASSWORD_LIFE_TIME을 30, PASS WORD_GRACE_TIME을 3으로설정하면 30일이지난후첫접속부터 3일간패스워드만료경고가나타나고다시 3일이지나면계정이잠금상태가된다. 제 5 장사용자관리와데이터베이스보안 105
구성요소 설명 패스워드만료경고는 tbsql 에서만동작하며다른방식으로접속하는경 우 (OCI, JDBC 등 ) 패스워드만료에러를반환한다. PASSWORD_VERIFY_FUNC TION 패스워드를변경할때패스워드문자열을검사하여유효성을확인하는 PSM 함수를지정한다. PSM 함수는기본으로들어있는함수를지정하 거나다른함수를정의해서지정할수있다. 아무것도지정하지않으면데이터베이스를생성할때미리만들어진 NULL_VERIFY_FUNCTION 이라는함수를기본으로사용한다. 다음은프로파일을변경하는예이다. SQL> ALTER PROFILE prof LIMIT password_lock_time 1 password_reuse_time 30; Profile 'PROF' altered. 위의 SQL 문장이실행되면 PROF1이라는 profile의패스워드오류횟수초과시계정잠금상태가 1일간지속되며한번사용한패스워드는 30개의다른패스워드를사용한이후에다시사용할수있다. 다음은프로파일을삭제하는예이다. SQL> DROP PROFILE prof CASCADE; Profile 'PROF' dropped. 삭제하려는프로파일을이미사용자가지정한경우반드시 cascade 옵션을붙여야한다. casade 옵션을사용하면해당프로파일을지정한모든사용자의프로파일지정정보를일괄삭제한다. 단, 사용자정보는삭제하지않는다. 5.3.2. 프로파일지정 다음은사용자계정을생성할때프로파일을지정하는예이다. SQL> CREATE USER Peter IDENTIFIED BY abcd PROFILE prof; User 'PETER' created. 다음은 prof1 프로파일에서 default 프로파일로변경하는예이다. Default 프로파일은데이터베이스를생 성할때기본으로함께생성되는프로파일이다. SQL> ALTER USER Peter PROFILE default; User 'PETER' altered. 106 Tibero 관리자안내서
5.3.3. 프로파일정보조회 프로파일관련정보는다음과같이확인할수있다. SQL> select * from dba_profiles; PROFILE RESOURCE_NAME RESOURCE_TYPE LIMIT --------- ------------------------- ------------- --------------- DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD UNLIMITED DEFAULT PASSWORD_LIFE_TIME PASSWORD UNLIMITED DEFAULT PASSWORD_REUSE_TIME PASSWORD UNLIMITED DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD NULL_VERIFY_FUNCTION DEFAULT PASSWORD_LOCK_TIME PASSWORD 1 DEFAULT PASSWORD_GRACE_TIME PASSWORD UNLIMITED DEFAULT LOGIN_PERIOD PASSWORD UNLIMITED 16 rows selected. 다음은사용자별로적용된프로파일정보를조회하는예이다. TIBERO 라는사용자에 T_PROF 라는프로 파일이할당된상황을확인할수있다. SQL> select username, profile from dba_users; USERNAME PROFILE ---------- ---------- TIBERO1 TIBERO T_PROF OUTLN SYSGIS SYSCAT SYS 6 rows selected. 5.4. 역할 사용자는데이터베이스와관련된애플리케이션프로그램을실행하려면해당스키마객체에대한적절한특권을부여받아야한다. 예를들어, 20개의테이블에 30명의사용자가접근하는경우라면 DBA는 20개테이블 * 30명의사용자로계산된총 600번의특권을부여하는작업을수행해야한다. 특권은시간을필요로하는작업이다. 따라서특권의효율적인관리를위해 DBA가부여할특권을모아놓은역할을미리정의한다면 600번의특권부여작업을실행할필요가없고특권의관리가훨씬더간편해진다. 제 5 장사용자관리와데이터베이스보안 107
역할 (Role) 은여러특권을모아놓은것이며, 하나의단위로서사용자에게부여할수있다. 역할을생성하 거나변경, 부여하기위해서는이에맞는특권이필요하다. 5.4.1. 역할의생성, 부여, 회수 다음은역할을생성하거나변경, 특권을부여하는예이다. SQL> conn SYS/tibero Connected to Tibero. SQL> GRANT CREATE ROLE, ALTER ANY ROLE, GRANT ANY ROLE TO Peter; Granted. 위의예에서는사용자 SYS로접속하여, 사용자 Peter에게 CREATE ROLE, ALTER ANY ROLE, GRANT ANY ROLE 특권을부여하고있다. 역할의생성 다음은역할을생성하는예이다. SQL> CREATE ROLE APP_USER; Role 'APP_USER' created. SQL> GRANT CREATE SESSION TO APP_USER; Granted. SQL> CREATE ROLE CLERK; Role 'CLERK' created. SQL> GRANT SELECT, INSERT ON Peter.EMPLOYEE TO CLERK; Granted. SQL> GRANT SELECT, INSERT ON Peter.TIME_CARDS TO CLERK; Granted. SQL> GRANT SELECT, INSERT ON Peter.DEPARTMENT TO CLERK; Granted. 다음은본예제를기준으로생성된역할을설명한다. 역할 APP_USER 설명 CREATE ROLE 문을사용하여역할 APP_USER 를생성한다. 시스템특권인 CREATE SESSION 문이역할 APP_USER 에부여된다. APP_USER 역할을부여받은사용자는데이터베이스에접속할수있다. 108 Tibero 관리자안내서
역할 CLERK 설명 CREATE ROLE 문을사용하여 CLERK 역할을생성한다. 여러개의테이블에스키마객체특권이부여된다. - Peter 스키마에속한 EMPLOYEE 테이블에 SELECT, INSERT를할수있다. - Peter 스키마에속한 TIME_CARDS 테이블에 SELECT, INSERT를할수있다. - Peter 스키마에속한 DEPARTMENT 테이블에 SELECT, INSERT를할수있다. 역할의부여 역할을다른역할에게부여할수있다. 예를들면, 다음과같이역할 APP_USER 를역할 CLERK 에부여할수있다. SQL> GRANT APP_USER TO CLERK; Granted. 위의 SQL 문장이실행되면역할 CLERK을부여받은사용자에게동시에역할 APP_USER가부여되고, 역할 CLERK과 APP_USER에양쪽에포함된모든특권을사용할수있게된다. 역할을부여받은사용자는그역할을다른사용자에게다시부여할수있다. 단, 역할을부여하는사용자 가그역할을다음과같이 WITH ADMIN OPTION 과함께부여받아야한다. SQL> GRANT CLERK TO Susan WITH ADMIN OPTION; Granted. SQL> GRANT CLERK TO Peter; Granted. 위의 GRANT 명령이실행되면, 사용자 Susan은부여된역할을다시다른사용자에게부여할수있으며, 그사용자로부터역할을회수할수도있다. 하지만사용자 Peter는 CLERK 역할을사용만할뿐, 그역할을다시다른사용자에게부여하거나회수하지는못한다. 역할의회수 다른사용자로부터역할을회수시키기위해서는 REVOKE 명령을사용해야한다. DBA는자신이직접부여하지않은역할에대해서도다른사용자로부터회수할수있다. 다음은사용자 Peter와역할 CLERK으로부터역할 APP_USER를회수하는예이다. REVOKE APP_USER FROM Peter; REVOKE APP_USER FROM CLERK; 위의예에서는회수대상이사용자든역할이든문법은동일하다. 제 5 장사용자관리와데이터베이스보안 109
5.4.2. 미리정의된역할 Tibero 에서는빈번하게사용되는시스템특권을모아다음과같은역할로미리정의하고있다. 역할 CONNECT 포함된특권 CREATE SESSION 설명 단순히데이터베이스에접속만할수있는특권이다. 이특 권은모든사용자에게필요한특권이다. RESOURCE CREATE PROCEDURE CREATE SEQUENCE CREATE TABLE CREATE TRIGGER 자신의스키마에기본적인스키마객체를생성하는특권이 다. 이특권은애플리케이션프로그램개발자에게필요한 기본적인특권이다. DBA - DBA에게필요한시스템특권을포함하고있는특권이다. 이역할을부여받은 DBA는시스템특권을임의로다른사용자에게부여할수있다. 모든시스템특권이 WITH ADMIN OPTION으로부여된다. 5.4.3. 기본역할 사용자에게부여한역할은한세션내에서 SET ROLE 명령을사용함으로써동적으로활성화하거나비활성화할수있다. 예를들어사용자가 CLERK, RESOURCE, APP_USER 역할을가지고있다면다음과같은명령을사용하여이중필요한역할만을활성화할수있다. SET ROLE CLERK, RESOURCE; /* CLERK, RESOURCE 역할을활성화한다. */ SET ROLE ALL EXCEPT CLERK; /* CLERK를제외한모든역할을활성화한다. */ SET ROLE ALL; /* 모든역할을활성화한다. */ SET ROLE NONE; /* 모든역할을비활성화한다. */ 역할의활성화와비활성화는사용자의특권을효율적으로제어하는데에매우유용하다. 사용자에게애플리케이션프로그램을실행할때에만특정한특권을부여하길원한다면, SET ROLE 명령을사용하여프로그램의시작과동시에그특권이포함된역할을사용할수있도록활성화하고, 프로그램종료직전에그역할의사용을중지시키기위해비활성화를하면된다. 사용자가처음으로세션에접속할때에활성화되는역할을그사용자의기본역할이라고한다. 새로생성한사용자는처음에기본역할이 ALL로설정된다. 즉, 사용자에게부여하는모든역할이기본적으로활성화된다. 사용자의기본역할은 ALTER USER 문을이용하여바꿀수있으며, 그형식은 SET ROLE 명령과비슷하다. 110 Tibero 관리자안내서
예를들면다음과같다. ALTER USER Park DEFAULT ROLE CLERK, RESOURCE; ALTER USER Park DEFAULT ROLE ALL EXCEPT CLERK; ALTER USER Park DEFAULT ROLE ALL; ALTER USER Park DEFAULT ROLE NONE; 5.4.4. 역할의정보조회 Tibero 에서는역할의정보를제공하기위해다음표에나열된정적뷰를제공하고있다. DBA 나일반사용 자모두사용할수있다. 정적뷰 DBA_ROLES DBA_ROLE_PRIVS USER_ROLE_PRIVS 설명 Tibero 내의모든역할의정보를조회하는뷰이다. 사용자나다른역할에부여된모든역할의정보를조회하는뷰이다. 현재사용자나 PUBLIC 사용자에부여된역할의정보를조회하는뷰이다. 참고 정적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 5.5. 네트워크접속제어 네트워크접속제어 (NAC: Network Access Control) 는허가되지않은사용자나보안문제를가진사용자의네트워크접속을차단하고제어하는네트워크보안기술이다. Tibero는이러한기술을채택함으로써기업내 IT 자산을보다효과적으로보호할수있다. Tibero에서제공하는네트워크접속제어는네트워크보안의범위에따라크게두가지로나뉜다. 전체네트워크접속제어클라이언트전체의네트워크접속을차단하거나허용한다. IP 주소기반네트워크접속제어클라이언트의 IP 주소에따라네트워크접속을차단하거나허용한다. 5.5.1. 전체네트워크접속제어 전체네트워크접속제어는클라이언트전체를더는 TCP/IP 네트워크로접속하지못하게하거나혹은접 속할수있도록하는방법이다. 제 5 장사용자관리와데이터베이스보안 111
다음은클라이언트전체의네트워크접속을허용하는방법으로 Tibero 서버를처음기동시킬때와같은 상태이다. ALTER SYSTEM LISTENER REMOTE ON; 다음은클라이언트전체의네트워크접속을차단하는방법이다. ALTER SYSTEM LISTENER REMOTE OFF; 위명령을실행하면외부클라이언트의네트워크접속은차단되지만, 로컬호스트에서접속하는클라이언트의네트워크접속은여전히허용된다. 단, 로컬호스트의 tbdsn.tbr 파일에서 IP가 'localhost' 라고설정된경우에만해당된다. 그리고이미접속된클라이언트는계속유지된다. 5.5.2. IP 주소기반네트워크접속제어 IP 주소기반네트워크접속제어는초기화파라미터에설정된 IP 주소에따라클라이언트의네트워크접속을허용하거나차단하는방법이다. LSNR_INVITED_IP 이방법은특정한 IP 주소를갖는클라이언트의네트워크접속은허용되지만, 그밖의접속은차단하는경우에사용한다. 하나의 IP 주소는 'IP 주소 / 서브넷마스크의 bit 수 ' 와같은형식으로표현된다. 여러개의 IP 주소를설정하는경우에는각 IP 주소를세미콜론 (;) 으로구분하여표기한다. 서브넷마스크의 bit 수가 32 인경우에는표기를생략할수있다. 위의예제에서 192.168.1.1 은 192.168.1.1/32 와같은의미이다. 예 : 192.168.2.0/24 192.168.2.0/24는서브텟마스크의 bit 수가 24bit이므로, 255.255.255.0과같은서브넷마스크를의미한다. 따라서 192.168.2.xxx의 IP 주소를갖는모든클라이언트의네트워크접속을허용한다는의미이다. 다음은 LSNR_INVITED_IP 초기화파라미터를이용하여클라이언트의네트워크접속을허용하는 방법이다. <$TB_SID.tip> LSNR_INVITED_IP=192.168.1.1;192.168.2.0/24;192.1.0.0/16 LSNR_DENIED_IP 112 Tibero 관리자안내서
이방법은특정한 IP 주소를갖는클라이언트의네트워크접속은차단되지만, 그밖의접속은허용하는 경우에사용한다. LSNR_INVITED_IP 초기화파라미터의설정방법과동일하다. 다음은 LSNR_DENIED_IP 초기화파라미터를이용하여클라이언트의네트워크접속을차단하는방 법이다. <$TB_SID.tip> LSNR_DENIED_IP=192.168.1.1;192.168.2.0/24;192.1.0.0/16 이두파라미터는다음과같은특징이있다. $TB_SID.tip 파일에 LSNR_INVITED_IP와 LSNR_DENIED_IP가모두설정되어있는경우 LSNR_ DENITED_IP의설정은무시되며, LSNR_INVITED_IP만적용된다. 즉 LSNR_INVITED_IP에설정된 IP 주소의클라이언트를제외하고는모든접속이차단된다. $TB_SID.tip 파일에 LSNR_INVITED_IP 와 LSNR_DENIED_IP 가모두설정되지않은경우모든클라 이언트의네트워크접속이허용된다. 루프백주소 (loopback address, 127.0.0.1) 에서접속하는경우 LSNR_INVITED_IP 또는 LSNR_DENIED_ IP 의설정과는무관하게항상허용된다. Tibero 서버를운영하는중에서버를다시기동하지않고 LSNR_INVITED_IP 또는 LSNR_DENIED_IP 의설정을변경하려는경우 1. 우선 $TB_SID.tip 파일에 LSNR_INVITED_IP 또는 LSNR_DENIED_IP의설정을변경한후, $TB_SID.tip 파일을저장한다. 2. 다음의명령을실행한다. alter system listener parameter reload; 위의명령을실행하면 $TB_SID.tip 파일에서 LSNR_INVITED_IP 또는 LSNR_DENIED_IP 의내용을 다시읽어변경된내용을실시간으로적용한다. 참고 해당초기화파라미터가제대로적용되었는지를확인하기위해서는반드시리스너의트레이스로그 파일의내용을확인해볼것을권장한다. 제 5 장사용자관리와데이터베이스보안 113
5.6. 감사 감사 (Auditing) 는데이터베이스내에서지정된사용자의동작을기록하는보안기술이다. 관리자는감사기능을통해특정동작또는특정사용자에대해별도의로그를남김으로써데이터베이스를보다효과적으로보호할수있다. 감사기능은감사의대상에따라두종류로구분된다. 스키마객체에대한감사지정된스키마객체에수행되는모든동작을기록할수있다. 시스템특권에대한감사 지정된시스템특권을사용하는모든동작을기록할수있다. 감사기록 (Audit Trail) 을남기고싶은사용자또는역할을지정할수있으며, 성공한동작또는실패한동 작에대해서만감사기록을남기도록지정할수있다. 또한세션별로한번만감사기록을남기거나동작 이수행될때마다감사기록을남기도록지정할수있다. 5.6.1. 감사설정과해제 감사를설정하거나해제하려면 AUDIT 또는 NOAUDIT 명령을사용한다. 스키마객체에대한감사 다른사용자가소유한스키마의객체또는디렉터리객체를감사하기위해서는 AUDIT ANY 시스템특권을부여받아야한다. 다음은스키마객체에대한감사를설정하는예이다. 뷰 SQL> AUDIT delete ON t BY SESSION WHENEVER SUCCESSFUL; Audited. 위의 SQL 문장이성공하면테이블에수행되는모든 delete 문에대해성공하는경우에만감사기록을남 긴다. 참고 1. Directory 객체에대한감사는지원하지않는다. 2. 객체에걸리는 Lock 에대한감사는지원하지않는다. 114 Tibero 관리자안내서
시스템특권에대한감사 시스템특권을감사하기위해서는 AUDIT SYSTEM 시스템특권을부여받아야한다. 다음은시스템특권에대한감사를설정하는예이다. SQL> AUDIT create table BY tibero; Audited. 위의 SQL 문장이성공하면 tibero 라는사용자가테이블을생성하려고할때그것이성공하든실패하든 관계없이감사기록을남긴다. 참고 시스템특권에관한자세한내용은 5.2. 특권 을참고한다. 감사해제 시스템특권의감사를해제하기위해서는 AUDIT SYSTEM 시스템특권을부여받아야한다. 다른사용자가소유한스키마의객체또는디렉터리객체의감사를해제하기위해서는 AUDIT ANY 시스템특권을부여받아야한다. 다음은이미설정된감사를해제하는예이다. SQL> NOAUDIT create table BY tibero; Noaudited. 위의 SQL 문장이성공하면 tibero 라는사용자가테이블을생성할때더이상감사기록을남기지않는다. 참고 SYS 사용자를감사의대상으로지정할수없다. SYS 사용자에대한감사는 5.6.3. SYS 사용자에 대한감사 을참고한다. 5.6.2. 감사기록 감사기록 (Audit Trail) 은명령을수행한사용자, 명령이수행된스키마객체, 수행시각, 세션 ID 등의기본 정보와실행된 SQL 문장으로이루어진다. 제 5 장사용자관리와데이터베이스보안 115
감사기록저장 감사기록은 $TB_SID.tip 파일에설정된 AUDIT_TRAIL 파라미터에따라데이터베이스내부또는 OS 파일에저장할수있다. OS 파일에감사기록을저장하는경우파일의위치와최대크기를각각 $TB_SID.tip 파일의 AUDIT_FILE_DEST 파라미터와 AUDIT_FILE_SIZE 파라미터로설정할수있다. 다음은감사기록의저장위치를지정하는예이다. <$TB_SID.tip> AUDIT_TRAIL=DB_EXTENDED 위와같이설정하면감사기록에포함되는기본정보뿐만아니라사용자가실행한 SQL문장까지데이터베이스에저장된다. <$TB_SID.tip> AUDIT_TRAIL=OS AUDIT_FILE_DEST=/home/tibero/audit/audit_trail.log AUDIT_FILE_SIZE=10M 위와같이설정하면 "/home/tibero/audit/audit_trail.log" 에최대 10MB 의크기로감사기록 이저장된다. 참고 1. $TB_SID.tip 파일설정에관한자세한내용은 "Tibero 참조안내서 " 를참고한다. 2. SYS 사용자에대한감사기록은데이터베이스에저장되지않는다. SYS 사용자에대한감사는 5.6.3. SYS 사용자에대한감사 을참고한다. 감사기록조회 감사기록은 OS 파일또는데이터베이스에저장된다. OS 파일에저장하도록설정한경우일반텍스트파일의형태로저장되므로쉽게내용을열람할수있다. 데이터베이스에저장하도록설정한경우에는다음의정적뷰를통해감사기록을조회할수있다. 슈정적뷰 DBA_AUDIT_TRAIL USER_AUDIT_TRAIL 설명 데이터베이스에저장된모든감사기록을조회하는뷰이다. 데이터베이스에저장된현재사용자의감사기록을조회하는뷰이다. 참고 1. 정적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 2. 정적뷰에서제공하는정보는제한적으로지원한다. 116 Tibero 관리자안내서
5.6.3. SYS 사용자에대한감사 SYS 사용자의명령은보안상의이유로다른사용자의명령과는다른방식으로감사된다. SYS 사용자는기본적으로감사의대상에서제외되기때문에 AUDIT 또는 NOAUDIT 명령을사용해감사를설정또는해제할수없다. SYS 사용자의명령을감사하기위해서는 $TB_SID.tip 파일의 AUDIT_SYS_OPERATIONS 파라미터를 Y로설정해야한다. SYS 사용자의명령을감사하도록설정하면, 수행한모든동작이 OS 파일에기록되며보안상의이유로데이터베이스에는기록되지않는다. 다음은 SYS 사용자의동작을감사하도록설정한예이다. <$TB_SID.tip> AUDIT_SYS_OPERATIONS=Y AUDIT_FILE_DEST=/home/tibero/audit/audit_trail.log AUDIT_FILE_SIZE=10M 위와같이설정하면 SYS 사용자가수행한모든동작이 "/home/tibero/audit/audit_trail.log" 에최대 10MB의크기로저장된다. 제 5 장사용자관리와데이터베이스보안 117
제 6 장백업과복구 Tibero 는시스템의예상치못한오류등으로인해데이터베이스가비정상적으로종료하거나시스템에물 리적인손상을입은상황을대처하려고다양한백업과복구방법을제공한다. 본장에서는이러한백업과복구방법을설명한다. 6.1. Tibero 의구성파일 Tibero의파일은컨트롤파일 (Control file), 데이터파일 (Data file), 임시파일 (Temp file), 로그파일 (Log file) 로구성된다. 각파일의특징과역할을다음과같다. 컨트롤파일컨트롤파일은 Tibero를구성하는모든파일의위치와데이터베이스의이름등데이터베이스의구조를저장하는파일이다. 특히, Tibero가사용하는데이터파일, 로그파일등의상태정보가기록된다. 컨트롤파일은 Tibero를기동할때복구가필요한지를판단하는데사용된다. 컨트롤파일은데이터베이스의복구에매우중요한파일이므로다른물리적파티션에여러개지정하기를권장한다. 여러개를유지하면, 한파티션에장애가발생하여컨트롤파일을사용하지못하더라도다른컨트롤파일을이용하여복구할수있다. 컨트롤파일은현재의데이터베이스를구성하는파일에관한정보를담고있으므로반드시최신것으로유지해야한다. 컨트롤파일의백업은현재의컨트롤파일자체를백업하는방식으로이루어지지않고, 컨트롤파일을생성하는 CREATE CONTROLFILE 문을백업해두었다가, 복구가필요한경우백업해놓은컨트롤파일생성문을사용하여컨트롤파일을다시생성하는방식으로이루어진다. 최신의컨트롤파일을유지하기위해서는데이터베이스에파일을추가하거나변경하는등구조상변화가있을때마다컨트롤파일의생성문을백업해야한다. 컨트롤파일자체를백업해두었다가사용하는것은 NOARCHIVELOG 모드에서처럼데이터베이스전체를백업하는경우에만사용할수있다. 데이터파일데이터파일은사용자의데이터를저장하는파일로써로그파일과함께데이터베이스를구성하는가장중요한파일이다. Permanent 테이블스페이스와 Undo 테이블스페이스에서정의한파일로테이블, 인덱스등의데이터베이스객체를저장한다. 테이블스페이스는한개이상의데이터파일로이루어지며, 한데이터파일은하나의테이블스페이스에속한다. 데이터파일은사용자의데이터가물리적으로저장되는공간이므로반드시백업해야한다. 제 6 장백업과복구 119
임시파일임시파일은데이터베이스가메모리에서처리할수없는방대한양의데이터를다루는경우임시로사용하기위한공간이다. Tibero는사용자의질의를처리하기위해정렬등의연산을수행할때와임시테이블 (Temporary Table) 의데이터를저장할때데이터파일을사용한다. 데이터파일은임시테이블스페이스 (Temporary Ta blespace) 에서만정의할수있고, 임시테이블스페이스는하나이상의데이터파일을가질수있다. 임시파일은데이터베이스를구성하는데이터가물리적으로저장되지는않고운영중에임시로사용되는영역이므로백업할필요가없다. 로그파일로그파일은로그를저장하는파일이다. 데이터파일에기록되는내용을시간순으로기록하는파일로써데이터베이스를복구할때사용한다. 로그파일은운영중에순환적으로재사용되는온라인로그파일과재사용된온라인로그파일을보관하는아카이브로그파일로나뉜다. ARCHIVELOG 모드로운영중일때만아카이브로그파일이만들어진다. NOARCHIVELOG 모드에서는온라인로그파일만사용한다. NOARCHIVELOG 모드에서는재사용되어없어진로그파일이있을수있으므로복구할때많은제약이따른다. 로그파일은데이터베이스복구할때복원된데이터파일을최신상태로복구하기위해, 데이터베이스가어떻게변경되어왔는지에대한모든정보를기록한다. 따라서, 데이터파일과함께반드시백업을해야한다. 6.2. 백업 백업은여러가지유형의장애로부터데이터베이스를보호하는것을뜻한다. 즉시스템장애가발생했을때복구를하거나시스템작동을유지하기위한절차또는기법이다. Tibero는데이터베이스를백업하는방법을크게두가지로나누어수행할수있다. 논리적백업논리적백업이란테이블, 인덱스, 시퀀스와같은데이터베이스의논리적단위를백업하는것을뜻한다. Tibero에서는이를위해 tbexport와 tbimport 유틸리티를제공하고있다. 참고 tbexport 와 tbimport 에대한자세한내용은 "Tibero 유틸리티안내서 " 를참고한다. 물리적백업 120 Tibero 관리자안내서
물리적백업이란데이터베이스를구성하는물리적인파일을백업하는것이며, 운영체제에서파일복사명령 (COPY) 으로백업하는것을뜻한다. 물리적백업이필요한파일에는데이터파일과아카이브로그파일이있다. 온라인로그파일은 NOARCHIVELOG 모드에서데이터베이스전체를백업하여복구할경우에만의미가있다. 주의 데이터베이스가운영중일때운영체제의파일복사명령을사용하는것은안전하지않으므로주의 해야한다. 6.3. 백업의종류 본절에서는백업의종류를설명한다. 다음은 Tibero가제공하는백업의종류이다. 모드별백업데이터베이스를 ARCHIVELOG 모드로운영할때와그렇지않았을때사용할수있는백업방법이다르다. 모드 ARCHIVELOG 모드 설명 온라인백업 (Online Backup) 또는 Hot Backup 이라한다. 데이터베이스가운영중일때백업할수있다. 백업이가능한파일은컨트롤파일의생성문과데이터파일, 아카이브로그파일등이있다. 복구는백업된아카이브로그파일의시점에따라데이터파일의백업시점전으로복구할수있다. NOARCHIVELOG 모드오프라인백업 (Offline Backup) 또는 Cold Backup이라한다. 기본적으로데이터베이스는 NOARCHIVELOG 모드이다. 데이터베이스를구성하는전체파일은반드시 Tibero가정상적으로종료된상태에서백업한다. 백업때문에서비스가중지되면안된다. 복구는데이터베이스를백업받은시점으로부터복구할수있다. Consistent 백업 Tibero 를정상적으로종료한상태에서백업하는방법이다. 실행예는 6.4.2. Consistent 백업 을참고한 다. 제 6 장백업과복구 121
Inconsistent 백업 Tibero의데이터베이스가운영중일때백업하거나정상적으로종료되지않은상태에서백업하는방법이다. NOARCHIVELOG 모드에서는이방법을권장하지않는다. 실행예는 6.4.3. Inconsistent 백업 을참고한다. 6.4. 백업의실행 본절에서는 Tibero가제공하는논리적및물리적인백업방법에따라백업을실행하는예를설명한다. 컨트롤파일의경우에는항상논리적인백업만이가능하기때문에, 컨트롤파일을생성하는생성문을백업하는방법만을설명한다. 데이터파일이나로그파일의경우에는데이터베이스상태에따라서백업받는방법이다르므로이를각각데이터베이스가운영중인경우 (Inconsistent 백업 ) 와그렇지않은경우 (Consistent 백업 ) 로나누어서설명한다. 6.4.1. 컨트롤파일의백업 컨트롤파일은물리적인백업을지원하지않는다. Tibero에서는컨트롤파일의논리적인백업만을지원한다. 데이터베이스의구조에변화가일어난경우에는컨트롤파일의생성문을백업하는것이좋다. 다음은컨트롤파일의생성문을 tibero5/backup 디렉터리에있는 ctrlfile1.sql 파일에백업하는예이다. [ 예 6.1] 컨트롤파일의백업 SQL> alter database backup controlfile to trace as '/tibero5/backup/ctrlfile1.sql' reuse NORESETLOGS; Altered. 생성된 ctrlfile1.sql 파일은다음과같은내용을포함한다. [ 예 6.2] 백업된컨트롤파일의생성문 CREATE CONTROLFILE REUSE DATABASE "t4db" LOGFILE GROUP 0 ( '/disk1/log001.log', '/disk2/log002.log' ) SIZE 1M, GROUP 1 ( '/disk1/log003.log', '/disk2/log004.log' ) SIZE 1M, GROUP 2 ( 122 Tibero 관리자안내서
'/disk1/log005.log', '/disk2/log006.log' ) SIZE 1M NORESETLOGS DATAFILE '/disk1/system001.dtf', '/disk1/undo001.dtf' NOARCHIVELOG MAXLOGFILES 255 MAXLOGMEMBERS 8 MAXDATAFILES 100 CHARACTER SET MSWIN949 NATIONAL CHARACTER SET UTF16 ; RESETLOGS 는컨트롤파일의생성문에지정한대로만들어진다. 이생성문은트레이스파일을생성한 후 RESETLOGS 를필요로할경우에사용하며, RESETLOGS 가필요하지않은경우는 NORESETLOGS 로수정하여컨트롤파일을생성할때적용할수있다. 참고컨트롤파일의생성문에는임시파일을생성하는내용이없다. 컨트롤파일을생성한후 Tibero를기동하면임시파일은존재하지않는다. 컨트롤파일을새로생성한경우, 반드시임시파일을추가해야임시파일을이용한기능을사용할수있다. 생성된컨트롤파일은 $TB_SID.tip 파일에경로를설정한다. [ 예 6.3] 컨트롤파일의경로설정 CONTROL_FILES=$TB_HOME/database/$TB_SID/ 다음과같이 MOUNT나 OPEN 상태에서컨트롤파일의목록을조회하려면동적뷰 V$CONTROLFILE를조회한다. [ 예 6.4] 컨트롤파일의조회 SQL> SELECT NAME FROM V$CONTROLFILE; NAME ------------------------------------------------------------ /disk1/c1.ctl /disk2/c2.ctl 2 selected. 제 6 장백업과복구 123
참고 컨트롤파일을다시생성하기위해서는 $TB_SID.tip 파일에설정된컨트롤파일의위치를 [ 예 6.4] 의 질의결과와동일하게설정한후, CREATE CONTROLFILE 문을실행해야한다. 6.4.2. Consistent 백업 본절에서는 Tibero 가정상적으로종료한후에백업하는방법을설명한다. 데이터파일, 온라인로그파일의조회 Consistent 백업을실행하기에앞서백업할컨트롤파일, 데이터파일, 로그파일을조회한다. 다음은 MOUNT나 OPEN 상태에서동적뷰 V$DATAFILE를통해데이터파일을조회하는방법이다. 여기서 MOUNT는 Tibero의인스턴스가시작된상태이며, OPEN은컨트롤파일에정의한모든파일이오픈된상태를의미한다. [ 예 6.5] 데이터파일의조회 SQL> SELECT NAME FROM V$DATAFILE; NAME ------------------------------------------------------------ /disk1/system001.dtf /disk2/undo001.dtf /disk3/user001.dtf 3 selected. 다음은온라인로그파일을 MOUNT 나 OPEN 상태에서조회하는방법이다. [ 예 6.6] 온라인로그파일의조회 SQL> SELECT MEMBER FROM V$LOGFILE; MEMBER ------------------------------------------------------------ /disk1/log001.log /disk2/log002.log /disk2/log003.log /disk3/log004.log /disk3/log005.log /disk1/log006.log 6 selected. 124 Tibero 관리자안내서
온라인로그파일은 ARCHIVELOG 모드가아닌경우에는백업하지않는것이좋다. ARCHIVELOG 모드 에서는온라인로그파일이아카이브되기때문에아카이브된파일을백업하면안된다. 참고로아카이브 된파일은 LOG_ARCHIVE_DEST 초기화파라미터에설정된위치에저장된다. Tibero 의종료 데이터베이스는다음과같이 NORMAL 모드로종료하는것이좋다. SQL> tbdown NORMAL; Tibero instance was terminated. 데이터베이스가정상적으로종료되면, 운영체제별로제공하는파일복사명령을사용하여백업한다. 6.4.3. Inconsistent 백업 본절에서는 Tibero가운영중일때백업하는방법을설명한다. 데이터베이스가운영중이면운영체제의명령어를사용해데이터파일을복사하는것은안전하지않다. 이러면다음과같은문장을실행하여 Tibero에백업의시작과종료를통보해야한다. alter tablespace {tablespace name} begin backup... alter tablespace {tablespace name} end backup begin backup과 end backup 문장사이에는해당테이블스페이스의변경사항에대한로그가늘어나기때문에데이터베이스에부담이가중되게된다. begin backup을시작한이후에는신속하게백업을완료하고 end backup 상태로복귀시켜야한다. Inconsistent 백업의전체과정은다음과같다. 1. 먼저백업할테이블스페이스를선정한다. [ 예 6.7] Inconsistent 백업 - 테이블스페이스의선정 SQL> select name,type from v$tablespace; NAME TYPE ------------------------------ ---- SYSTEM DATA UNDO UNDO USER DATA TEMP TEMP 3 selected. 제 6 장백업과복구 125
2. 백업할테이블스페이스에속한데이터파일을조회한후, begin backup, end backup 명령어를사용하여백업을수행한다. 예를들어, USER 테이블스페이스를백업할경우를가정하고수행한다. [ 예 6.8] Inconsistent 백업 - begin backup, end backup 명령어의사용 SQL> select f.name from v$tablespace t join v$datafile f on t.ts# = f.ts# where t.name = 'USER'; NAME ------------------------------------------------------------ /disk3/user001.dtf 1 selected SQL> alter tablespace SYSTEM begin backup; Altered. SQL>!cp /disk3/user001.dtf /backup/ SQL> alter tablespace SYSTEM end backup; Altered. 6.5. 복구 Tibero를운영하다보면, 예상치못한장애로인해정상적인데이터베이스운영이어려운상황이발생할수있다. 복구는장애가발생하는경우복원하는일련의과정이다. 복구를하려면백업된데이터베이스가있어야한다. Tibero는데이터베이스에서일어나는모든변화를로그파일에기록한다. 따라서, 백업이후에데이터베이스에일어난모든변화에대해서는로그를적용하면복구할수있다. 로그파일에는커밋되지않은트랜잭션이수정한데이터도포함되어있다. 복구할때아카이브로그파일과로그파일모두사용할수있다. 복구과정은다음과같이두가지경우로수행할수있다. 데이터파일에기록되지않는변화를로그를사용하여적용하는과정데이터파일에모든로그의변화를기록하는과정을통해서데이터베이스는안정된상태가된다. 즉, 데이터베이스운영상의특정시점까지모든작업이반영되고그이후의변화는발생하지않아야한다. 데이터베이스에정상적인복구가이루어져안정된상태가되어야만기동할수있다. 커밋되지않는데이터로복구하는과정 126 Tibero 관리자안내서
데이터베이스를종료할때커밋하지않은트랜잭션이수정한내용으로복구하는과정이다. 6.5.1. 부트모드별복구 Tibero는부트모드별로발생되는작업을복구측면에서보면다음과같다. NOMOUNT 모드 NOMOUNT 모드로는언제나복구할수있다. 이모드에서는데이터베이스와컨트롤파일을생성할수있다. MOUNT 모드로동작하기위해서는컨트롤파일이있어야한다. 컨트롤파일이없거나컨트롤파일에장애가발생한경우에는 NOMOUNT 모드로동작하며, 컨트롤파일을생성하면 MOUNT 모드로동작할수있다. MOUNT 모드 MOUNT 모드에서는데이터파일, 온라인로그파일, 컨트롤파일사이의상태를검사하여 Tibero를기동할준비를한다. 세파일이모두최신상태이면 OPEN 모드로동작할수있다. 파일에물리적인장애가발생하였거나, 복원된파일이라면미디어복구가필요하며 MOUNT 모드로동작한다. MOUNT 모드에서는제한된뷰의조회가가능하고, 미디어복구를수행할수있다. OPEN 모드 Tibero의데이터파일, 온라인로그파일, 컨트롤파일이일관성을유지할때에만 OPEN 모드로동작할수있다. OPEN 모드에서 Tibero는세파일을열고정상으로동작한다. 일반사용자는데이터베이스를이용할수있다. 오프라인상태인테이블스페이스에사용자가접근하려면우선해당테이블스페이스를온라인상태로전환해야한다. 이때다른파일들과일관성을유지하기위해해당테이블스페이스에온라인미디어복구를수행해야한다. 6.5.2. 파손복구 파손복구 (Crash Recovery) 는 Tibero를운영하는중에정전, 시스템이상, 강제종료등으로데이터베이스가비정상적으로종료되었을때사용자의명령없이자동으로복구되는것을의미한다. 복구가완료되면 Tibero가정상적으로동작한다. 파손복구는온라인로그파일의내용중아직데이터파일에반영되지않은부분을기록하여 Tibero가비정상적으로종료되기직전에운영시점의상태로복구하는과정과이러한상태로복구된시점에서커밋되지않은트랜잭션이발생시킨변화를되돌리는과정으로나눌수있다. 파손복구의모든과정은파일의손상이없는한, DBA의도움없이자동으로이루어진다. 제 6 장백업과복구 127
6.5.3. 미디어복구 Tibero를구성하는파일이물리적인손상이나정상적으로동작할수없는경우가발생할수있다. 이러한경우에데이터베이스가정상적으로동작할수있도록복구하는과정이미디어복구 (Media Recovery) 이다. 미디어복구과정은자동으로이루어지지않는다. DBA가상황을파악해서필요한과정을지시하는일련의작업이필요하다. 복구완료시점을오류가발생하기이전의가장최근시점까지로할지, 과거의특정시점까지로할지여부에따라서, 완전복구 (Complete Recovery) 와불완전복구 (Incomplete Recovery) 로구분된다. 완전복구 온라인로그파일의가장최근로그까지모두반영하는미디어복구이다. 불완전복구 온라인로그파일의최근까지가아닌그이전의특정시점까지복구하는것을말한다. 불완전복구후에는반드시 RESETLOGS 모드로 Tibero를기동해야한다. RESETLOGS는온라인로그파일을초기화하는것이며, 현재온라인로그파일로데이터베이스를시작하지않을때사용한다. RESETLOGS가필요한경우는다음과같다. 불완전미디어복구를한경우 RESETLOGS로컨트롤파일을생성한경우 RESETLOGS로시작하면새로운데이터베이스가만들어진것과같다. RESETLOGS 이전의데이터파일, 로그파일과 RESETLOGS 이후의파일은서로호환되지않는다. RESETLOGS 이전의백업파일이나로그파일을이용하여 RESETLOGS 이후로복구할수없다. 또한 RESETLOGS 이후의파일을 RESETLOGS 이전상태로불완전복구를하는것도불가능하다. 따라서, RESETLOGS 모드로기동한경우에는반드시새로백업을하기를권장한다. RESETLOGS로데이터베이스를기동하는방법은다음과같다. [ 예 6.9] RESETLOGS를이용한데이터베이스의기동 $ tbboot -t RESETLOGS 미디어복구과정은 MOUNT 모드에서만이루어진다. 백업된파일을사용하여오류가발생한파일을복원하는과정과복원된파일을백업한시점으로부터최근혹은특정시점까지반영되지않은변화를로그파일을사용하여복구하는과정으로나눌수있다. 단순한복원과정만으로는 Tibero의정상적인운영이불가능하다. 128 Tibero 관리자안내서
미디어복구를위해장애가발생한파일을찾아복구해야한다. 이를위해다음과같은뷰를제공한다. V$LOGFILE V$CONTROLFILE V$LOG V$RECOVER_FILE V$RECOVERY_FILE_STATUS 미디어복구는로그파일을하나씩데이터베이스에순서대로반영하여진행한다. 데이터베이스는현재복구에필요한로그파일만을반영할수있다. 현재필요한로그파일을찾기위해시퀀스번호가사용된다. 시퀀스번호는데이터베이스가생성된이후로만들어진로그파일의일련번호이며, 모든로그파일은하나의유일한시퀀스번호를갖는다. 시퀀스번호가큰로그파일이최근로그파일이다. 시퀀스번호는아카이브로그파일의경우파일이름을통해알수있고, 온라인로그파일의경우 V$LOG 뷰를통해알수있다. 6.5.4. 온라인미디어복구 Tibero를운영하는도중에일부데이터파일이물리적으로손상되거나정상적으로동작할수없는경우가발생할수있다. 이러한경우에 OPEN 모드에서해당데이터파일이포함된테이블스페이스만미디어복구를수행할수있다. 이것이온라인미디어복구 (Online Media Recovery) 이다. 온라인미디어복구는완전복구만가능하다. 6.6. 백업및복구사례 본절에서는 NOARCHIVELOG 모드와 ARCHIVELOG 모드로나누어백업및복구사례를설명한다. 6.6.1. NOARCHIVELOG 모드 ARCHIVELOG 모드를사용하지않으면미디어복구를할수없다. 특정데이터파일이손상된경우해당파일의백업으로부터복구하는과정만이가능하다. 백업은 Tibero를종료하고나서 Tibero를구성하는모든파일을그대로백업받으면된다. 단, 임시파일은백업대상에포함하지않는다. 백업된파일을복구하여백업받을당시의 Tibero의상태로만복구할수있으며, 그이후에발생한작업은모두다시수행해야한다. 이과정에서발생할수있는문제는해당디스크에물리적오류가발생하여처음있던위치로복구할수없는경우가발생할수있다. 제 6 장백업과복구 129
데이터파일이나로그파일을해당위치에복원할수없는경우 데이터파일이나온라인로그파일을해당위치에복원할수없는경우에는다른위치로복원을한후에컨트롤파일에설정된데이터파일의위치를수정한다. [ 예 6.10] 데이터파일의위치수정 $ tbboot -t MOUNT $ tbsql sys/tibero SQL> select file#, name from v$datafile; FILE# NAME --------- ---------------------------------------------------- 0 /disk1/database/system001.dtf 1 /disk1/database/undo001.dtf SQL> alter database rename file '/disk1/database/system001.dtf' Altered. to '/disk2/database/system001.dtf'; SQL> tbdown Tibero instance was terminated. SQL> quit $ tbboot 컨트롤파일을해당위치에복구할수없는경우 컨트롤파일이복구되어야하는위치에복구될수없는경우에는백업을다른곳으로복원하면된다. 이 경우에는 $TB_SID.tip 파일에서변경된컨트롤파일의위치를설정하면된다. 6.6.2. ARCHIVELOG 모드 ARCHIVELOG 모드를사용하는경우에는미디어복구를할수있다. 데이터파일과아카이브로그파일을백업하면된다. 예를들어, 로그파일에장애가발생하면해당로그파일이속한로그그룹의다른로그파일을복사하여복구한다. 만약로그그룹에속한모든로그파일에장애가발생하면현재로그그룹에장애가발생한그룹을제거한후다른그룹을추가하면된다. 하지만, 해당로그그룹이현재로그그룹이면커밋시점까지의내용만복구하는불완전한복구를해야한다. 130 Tibero 관리자안내서
시스템테이블스페이스의데이터파일이손상된경우 시스템테이블스페이스에속한데이터파일은 Tibero 운영에필요한구성요소이므로반드시복원되어야한다. 특정데이터파일이손상된경우해당데이터파일을백업으로부터복원하여복구를진행한다. 다음은시스템테이블스페이스의데이터파일을복구하는예이다. [ 예 6.11] 시스템테이블스페이스의데이터파일복구 SQL> col tablespace format a10 SQL> col filename format a50 SQL> select a.name tablespace, b.name filename from v$tablespace a join v$datafile b on (a.ts# = b.ts#); TABLESPACE FILENAME ---------- -------------------------------------------------- SYSTEM /disk1/database/system00.dtf UNDO /disk1/database/undo001.dtf ZZ /disk2/database/tmp001.dtf 3 selected. SQL> tbdown SQL> quit $ rm -f /disk1/database/system00.dtf $ tbboot listener port = 8629 ******************************************************** * Critical Warning : Raise svmode failed. The reason is * TBR-1024 : Database needs media recovery: open \ failed(/disk1/database/system001.dtf) * Current server mode is MOUNT. ******************************************************** Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started suspended at MOUNT mode. $ tbsql sys/tibero tbsql 5 Copyright (c) 2001-2009 Tibero Corporation. All rights reserved. Connected to Tibero. 제 6 장백업과복구 131
SQL> select * from v$recover_file; FILE# ERROR CHANGE# TIME ---------- ----------------------- ---------- ---------- 0 FILE MISSING 4294965795 2006/11/14 1 selected. SQL>!cp /backup/system00.dtf /disk1/database/system00.dtf SQL> select * from v$recover_file; FILE# ERROR CHANGE# TIME ---------- ----------------------- ---------- ---------- 0 WRONG FILE CREATE 4294965795 2006/11/14 1 selected. SQL> alter database recover automatic database; Altered. SQL> select * from v$recover_file; FILE# ERROR CHANGE# TIME ---------- ----------------------- ---------- ---------- 0 selected. SQL> tbdown Tibero instance was terminated. SQL> quit $ tbboot listener port = 8629 Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started up (NORMAL mode). 비시스템테이블스페이스의데이터파일이손상된경우 비시스템테이블스페이스의데이터파일이손상된경우, 해당데이터파일을복원하여복구하는방법과해당테이블스페이스를제거하는방법이있다. 시스템테이블스페이스나 Undo 테이블스페이스가아닌경우에는장애가발생한테이블스페이스만없어질뿐 Tibero RDMBS 운영자체에는문제가발생하지않는다. 데이터파일을복구하는방법은 [ 예 6.11] 과동일한방법으로수행하면된다. 132 Tibero 관리자안내서
다음은테이블스페이스의내용이별로중요하지않거나, 없어져도문제가없는경우에제거하는예이다. [ 예 6.12] 장애가발생한데이터파일이속한테이블스페이스의제거 $ tbboot ******************************************************** * Critical Warning : Raise svmode failed. The reason is * TBR-1024 : Database needs media recovery: open \ failed(/disk1/test1.dtf). * Current server mode is MOUNT. ******************************************************** $ tbsql sys/tibero SQL> select * from v$recover_file; FILE# ERROR CHANGE# TIME ---------- ----------------------- ---------- ---------- 2 FILE MISSING 4294965795 2006/11/14 1 selected. SQL> alter database datafile 2 offline for drop; Altered. SQL> tbdown Tibero instance was terminated. SQL> quit Disconnected. $ tbboot -t resetlogs listener port = 8629 Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started suspended at NORMAL mode. $ tbsql sys/tibero SQL> drop tablespace test_ts including contents and datafiles; Dropped. SQL> select file#, name from v$datafile; FILE# NAME ---------- -------------------- 제 6 장백업과복구 133
0 /disk1/system001.dtf 1 /disk1/undo001.dtf 2 selected. 백업이안된데이터파일에장애가발생한경우 ALTER DATABASE CREATE DATAFILE 문을사용하여데이터파일을새로생성한후복구한다. 다음은데이터파일을생성하여복구하는예이다. [ 예 6.13] 데이터파일의생성을통한복구 SQL> create tablespace z datafile '/disk1/z.dtf' size 10m; Created. SQL> create table z (i number) tablespace z; Created. SQL> insert into z values(1); 1 inserted. SQL> commit; Commit succeeded. SQL> tbdown Tibero instance was terminated. SQL> quit $ rm -f /disk1/z.dtf $ tbboot ******************************************************** * Critical Warning : Raise svmode failed. The reason is * TBR-1024 : Database needs media recovery: open \ failed(/disk1/z.dtf). * Current server mode is MOUNT. ******************************************************** $ tbsql sys/tibero SQL> select * from v$recover_file; FILE# ERROR CHANGE# TIME ---------- ----------------------- ---------- ---------- 134 Tibero 관리자안내서
2 FILE MISSING 4294970441 2006/11/14 1 selected. SQL> alter database create datafile 2; Altered. SQL> select * from v$recover_file; FILE# ERROR CHANGE# TIME ---------- ----------------------- ---------- ---------- 2 WRONG FILE CREATE 4294970441 2006/11/14 1 selected. SQL> alter database recover automatic database; Altered. SQL> select * from v$recover_file; FILE# ERROR CHANGE# TIME ---------- ----------------------- ---------- ---------- 0 selected. SQL> tbdown $ tbboot listener port = 8629 Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started up (NORMAL mode). $ tbsql sys/tibero SQL> select * from z; I ---------- 1 1 selected. 제 6 장백업과복구 135
컨트롤파일에장애가발생한경우 컨트롤파일의경우장애에대비하여여러개의복사본을유지하는미러링 (mirroring) 방식을사용하는것이좋다. 미러링된파일중장애가발생하지않은파일이있으면이를사용하여장애가발생한파일에복사한후 Tibero를다시기동하면된다. 모든컨트롤파일이장애가발생한경우에는 CREATE CONTROLFILE 문을사용하여컨트롤파일을새로생성해야한다. 다음은미러링된파일중에장애가발생하지않은파일을복사하여컨트롤파일의장애를해결하는예이다. [ 예 6.14] 미러링을사용한컨트롤파일의복구 $ grep "CONTROL_FILES" $TB_HOME/config/$TB_SID.tip CONTROL_FILES=/disk1/ctl1.ctl, /disk2/ctl2.ctl $ tbboot ******************************************************** * Critical Warning : Raise svmode failed. The reason is * TBR-1003 : Cannot open file: /disk2/ctl2.ctl. * Current server mode is NOMOUNT. ******************************************************** SQL> tbdown Tibero instance was terminated. $ ls /disk2/*.ctl $ cp /dist1/ctl1.ctl /disk2/ctl2.ctl $ ls /disk2/*.ctl ctl2.ctl $ tbboot listener port = 8629 Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started up (NORMAL mode). 위의예제에서는 $TB_SID.tip 파일에설정되어있는컨트롤파일두개중 ctl2.ctl 파일에장애가발생하여 Tibero 를시작하지못하는경우이다. 컨트롤파일이여러파일로미러링된경우에는정상적인파일을복 사하면 Tibero 를기동할수있다. 136 Tibero 관리자안내서
다음은컨트롤파일을생성한후, RESETLOGS로데이터베이스를시작하는예이다. 단, 컨트롤파일을생성할때임시파일이존재하지않으므로반드시추가해야한다. [ 예 6.15] 컨트롤파일의생성을통한복구 $ tbboot -t NOMOUNT listener port = 8629 Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started up (NOMOUNT mode). $ tbsql sys/tibero SQL> CREATE CONTROLFILE REUSE DATABASE "t3db" LOGFILE GROUP 0 ( '/disk1/log001.log', '/disk2/log002.log' ) SIZE 1M, GROUP 1 ( '/disk1/log003.log', '/disk2/log004.log' ) SIZE 1M, GROUP 2 ( '/disk1/log005.log', '/disk2/log006.log' ) SIZE 1M RESETLOGS DATAFILE '/disk1/system001.dtf', '/disk1/undo001.dtf' NOARCHIVELOG MAXLOGFILES 255 MAXLOGMEMBERS 8 MAXDATAFILES 100 ; Created. SQL> tbdown Tibero instance was terminated. SQL> quit $ tbboot -t RESETLOGS listener port = 8629 제 6 장백업과복구 137
Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started suspended at NORMAL mode. $ tbsql sys/tibero SQL> select file_id, tablespace_name from dba_temp_files; FILE_ID TABLESPACE_NAME ---------- ------------------------------ 0 selected. SQL> alter tablespace temp add tempfile '/disk1/temp01.dtf' size 10m reuse; Altered. SQL> select file_id, tablespace_name from dba_temp_files; FILE_ID TABLESPACE_NAME ---------- ------------------------------ 0 TEMP 1 selected. 로그파일에장애가발생한경우 로그파일에장애가발생한경우에는해당로그파일이속한그룹의다른로그파일을복사하여복원을시도한다. 로그그룹에속한모든로그파일이장애가발생한경우에는현재로그그룹이장애가발생한그룹을제거한후다른그룹을추가하면된다. 하지만해당로그그룹이현재의로그그룹이라면불완전복구를통해복구해야한다. 사용자의실수로테이블의데이터가잘못된경우 사용자가실수로테이블의데이터를잘못조작한경우에는불완전복구를통해복원한다. 다음은사용자의잘못된조작으로테이블 emp의모든 salary의데이터가갱신되었다고가정하고, 백업된파일을이용하여실수이전의시점으로불완전복구를수행하는예이다. 138 Tibero 관리자안내서
[ 예 6.16] 불완전복구를통한테이블의데이터복원 $ tbsql sys/tibero SQL> select * from emp; ENO ENAME SALARY ---------- ---------- ---------- 1 Peter 7200 2 Smith 6480 3 Susan 3240 3 selected. SQL>!date Wed Nov 15 13:33:28 KST 2006 SQL> update emp set salary = salary * 0.9 where eno <> 0; 3 updated. SQL> commit; Commit succeeded. SQL> select * from emp; ENO ENAME SALARY ---------- ---------- ---------- 1 Peter 6480 2 Smith 5832 3 Susan 2916 3 selected. SQL> tbdown Tibero instance was terminated. SQL> $ cp -f back/*.dtf. $ tbboot -t mount listener port = 8629 Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. 제 6 장백업과복구 139
Tibero instance started suspended at MOUNT mode. $ tbsql sys/tibero SQL> alter database recover automatic database until time '2006-11-15 13:32:00'; Altered. SQL> tbdown. $ tbboot -t RESETLOGS listener port = 8629 Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started suspended at NORMAL mode. $ tbdown Tibero instance was terminated. $ tbboot listener port = 8629 Tibero 5 Copyright (c) 2001-2009 Tibero Corporation. All rights reserved. Tibero instance started up (NORMAL mode). $ tbsql sys/tibero SQL> select * from emp; ENO ENAME SALARY ---------- ---------- ---------- 1 Peter 7200 2 Smith 6480 3 Susan 3240 3 selected. SQL> Disconnected. 140 Tibero 관리자안내서
운영중에일부데이터파일이물리적으로손상된경우 운영중에일부데이터파일이물리적으로손상되어해당테이블스페이스에접근할수없는경우온라인미디어복구를통해복원한다. 다음은운영중에삭제된데이터파일을온라인미디어복구를통해복구하는예이다. [ 예 6.17] 온라인미디어복구를통한데이터파일복구 SQL> create tablespace z datafile '/disk1/z.tdf' size 10m; Created. SQL> create table z (i number) tablespace z; Created. SQL> insert into z values (1); 1 row inserted. SQL> commit; Commit succeeded. SQL> tbdown Tibero instance was terminated. SQL> quit $ cp /disk1/z.tdf /disk1/z.tdf.bak $ tbboot Tibero instance started up (NORMAL mode). $tbsql sys/tibero SQL>!rm /disk1/z.tdf SQL> alter system checkpoint; System altered. SQL> select * from z; TBR-1003: Unable to open file /disk1/z.tdf. SQL>!cp /disk1/z.tdf.bak /disk1/z.tdf SQL> select * from z; TBR-1003: Unable to open file /disk1/z.tdf. SQL> alter tablespace z offline immediate; 제 6 장백업과복구 141
Tablespace 'Z' altered. SQL> alter database recover automatic tablespace z; Database altered. SQL> alter tablespace z online; Tablespace 'Z' altered. SQL> select * from z; I ---------- 1 1 row selected. 6.7. 복구관리자 Tibero는다양한백업및복구시나리오를제공한다. 숙련된데이타베이스관리자라면상황에맞는적절한방법을선택하고활용할수있을것이다. 허나너무다양한기능을제공함으로써오히려사용자에게혼란을줄수도있다. 이러한면을보완하기위하여 Tibero는복구관리자 ( 이하 RMGR) 를제공한다. 복구관리자기능 RMGR는다양한백업 / 복구시나리오를가능하게하도록구성되어있다. Tibero 5.0에서제공되는 RMGR 기능은다음과같다. Online Full Backup Tibero 데이타베이스에속한전체데이타파일을온라인백업한다. 온라인백업을위해서는데이타베이스가 ARCHIVELOG 모드이여야한다. RMGR은자동으로데이타베이스의 Begin Backup 기능을사용하여모든테이블스페이스를 Hot Backup 상태로만들고백업을진행한다. 백업을완료하면데이타베이스의 End Backup 기능을사용하여모든테이블스페이스를 Hot Backup 상태로부터해제한다. 백업할데이타파일역시 V$DATAFILE을조회하여자동으로결정해준다. Incremental Full Backup RMGR를통해온라인백업을받았으면이를이용하여 Incremental Backup을할수있다. Incremental Backup이란백업을받을때전체파일을받는것이아니라이전백업과의차이만을기록하는방식으로백업에소모되는디스크공간을획기적으로줄일수있다. 142 Tibero 관리자안내서
Incremental Full Backup 을하려면이전에 RMGR 를통해 Online Full Backup 을받았어야한다. 현재데 이타베이스와백업본과의차이를구하여백업파일을만든다. 이러한기능은 RMGR 를통해서만사용 할수있다. Automatic Recovery RMGR로만들어진백업본을이용하여자동 Recovery를진행한다. 이를위해서는백업을만들당시에만들어진 RMGR info file이필요하다. Online Full Backup/Incremental Full Backup 정보를분석하여자동으로 Merge 후 Recovery해준다. 복구관리자정보파일 RMGR로백업을진행하면 RMGR Info라는텍스트파일이생기게된다. RMGR로받은백업에대한정보가담겨져있으며, Incremental Full Backup시에추가로계속남게된다. 혹시라도이파일을분실하게되면 Incremental Full Backup으로남은백업본은복구할수없으니주의해야한다. 복구관리자옵션 RMGR 는 Shell Command 로실행되며, 다양한옵션을지정하여원하는기능을사용할수있다. 옵션 backup recovery -userid 설명 RMGR를통해백업을진행한다. RMGR로받아놓은백업본을이용하여복구를진행한다. 데이타베이스에접속할사용자명과패스워드및 SID를지정한다. -userid USERID[[/PASSWD][@SID]] 형식으로지정한다. -v, --verbose -h, --help -i, --incremental -b -o RMGR의진행상황을자세하게출력해준다. RMGR의옵션사용법을출력해준다. Incremental Full Backup을한다. RMGR info 파일의위치를지정한다. RMGR info 파일은이전에 RMGR를통해백업받은디렉터리에생성된다. 백업받을디렉터리를지정한다. 복구관리자를이용한백업 / 복구예제 복구관리자를이용한백업 / 복구과정을살펴보겠다. 복구관리자는대부분의과정을자동으로진행해주게되므로처음에실행시키고나면특별히관리해야할과정이없다. 실행할때어떤일을할지지정하여실행한후실행되는과정을볼수있고, RMGR info 파일을통해어떤백업을받았는지를알수있다. 제 6 장백업과복구 143
참고 데이타파일이 raw device 파일인경우에도복구관리자를이용한백업 / 복구가가능하다. [ 예 6.18] Online Full Backup 시나리오 $ tbrmgr backup -o /home/winds/backup -v ============================================================ = Recovery Manager(RMGR) starts = = = = Tibero, Co. Copyright(C) 2010-2019, All rights reserved. = ============================================================ ============================================= RMGR - ONLINE backup ============================================= DB connected DBNAME: tibero archive log check succeeded Database begin backup succeeded RMGR info file created: /home/winds/backup/rmgr.inf RMGR - ONLINE backup target datafile list total datafile count: 3 /home/winds/tibero/database/tibero/system001.dtf /home/winds/tibero/database/tibero/undo001.dtf /home/winds/tibero/database/tibero/usr001.dtf ORG DF: /home/winds/tibero/database/tibero/system001.dtf FULL BACKUP: /home/winds/backup/system001.dtf.000 CUR BACKUP: /home/winds/backup/system001.dtf.000 BACKUP CNT: 1 RUN: /home/winds/tibero/bin/tbrg backup -v \ -o /home/winds/backup/system001.dtf.000 \ /home/winds/tibero/database/tibero/system001.dtf Backup file type: full backup source file : /home/winds/tibero/database/tibero/system001.dtf output file : /home/winds/backup/system001.dtf.000 Analyze source file blksize : 8192 bytes file size : 5376 blocks 100.00% =======================================> 5376/5376 blks 0.12s 144 Tibero 관리자안내서
Synchronizing... 5376 blocks copied. ORG DF: /home/winds/tibero/database/tibero/undo001.dtf FULL BACKUP: /home/winds/backup/undo001.dtf.000 CUR BACKUP: /home/winds/backup/undo001.dtf.000 BACKUP CNT: 1 RUN: /home/winds/tibero/bin/tbrg backup -v \ -o /home/winds/backup/undo001.dtf.000 \ /home/winds/tibero/database/tibero/undo001.dtf Backup file type: full backup source file : /home/winds/tibero/database/tibero/undo001.dtf output file : /home/winds/backup/undo001.dtf.000 Analyze source file blksize : 8192 bytes file size : 1280 blocks 100.00% =======================================> 1280/1280 blks 0.02s Synchronizing... 1280 blocks copied. ORG DF: /home/winds/tibero/database/tibero/usr001.dtf FULL BACKUP: /home/winds/backup/usr001.dtf.000 CUR BACKUP: /home/winds/backup/usr001.dtf.000 BACKUP CNT: 1 RUN: /home/winds/tibero/bin/tbrg backup -v \ -o /home/winds/backup/usr001.dtf.000 \ /home/winds/tibero/database/tibero/usr001.dtf Backup file type: full backup source file : /home/winds/tibero/database/tibero/usr001.dtf output file : /home/winds/backup/usr001.dtf.000 Analyze source file blksize : 8192 bytes file size : 256 blocks 100.00% =======================================> 256/256 blks 0.00s Synchronizing... 256 blocks copied. full backup succeeded Database end backup succeeded. [ 예 6.19] Incremental Full Backup 시나리오 $ tbrmgr backup -i -o /home/winds/backup2 -b /home/winds/backup/rmgr.inf -v 제 6 장백업과복구 145
============================================================ = Recovery Manager(RMGR) starts = = = = Tibero, Co. Copyright(C) 2010-2019, All rights reserved. = ============================================================ ============================================= RMGR - INCREMENTAL backup ============================================= DB connected DBNAME: tibero archive log check succeeded Database begin backup succeeded rmgr info file: /home/winds/backup/rmgr.inf RMGR INFO DATAFILE ORG DF: /home/winds/tibero/database/tibero/system001.dtf FULL BACKUP: /home/winds/backup/system001.dtf.000 CUR BACKUP: /home/winds/backup/system001.dtf.000 BACKUP CNT: 1 ORG DF: /home/winds/tibero/database/tibero/undo001.dtf FULL BACKUP: /home/winds/backup/undo001.dtf.000 CUR BACKUP: /home/winds/backup/undo001.dtf.000 BACKUP CNT: 1 ORG DF: /home/winds/tibero/database/tibero/usr001.dtf FULL BACKUP: /home/winds/backup/usr001.dtf.000 CUR BACKUP: /home/winds/backup/usr001.dtf.000 BACKUP CNT: 1 RMGR info file load finished: /home/winds/backup/rmgr.inf RMGR - INCREMENTAL backup target datafile list total datafile count: 3 /home/winds/tibero/database/tibero/system001.dtf /home/winds/tibero/database/tibero/undo001.dtf /home/winds/tibero/database/tibero/usr001.dtf ORG DF: /home/winds/tibero/database/tibero/system001.dtf FULL BACKUP: /home/winds/backup/system001.dtf.000 CUR BACKUP: /home/winds/backup2/system001.dtf.002 BACKUP CNT: 2 RUN: /home/winds/tibero/bin/tbrg backup -i -b \ /home/winds/backup/system001.dtf.000 -o /home/winds/backup2/system001.dtf.002 \ 146 Tibero 관리자안내서
/home/winds/tibero/database/tibero/system001.dtf 100.00% =======================================> 5376/5376 blks 0.02s 0 blocks copied. ORG DF: /home/winds/tibero/database/tibero/undo001.dtf FULL BACKUP: /home/winds/backup/undo001.dtf.000 CUR BACKUP: /home/winds/backup2/undo001.dtf.002 BACKUP CNT: 2 RUN: /home/winds/tibero/bin/tbrg backup -i -b \ /home/winds/backup/undo001.dtf.000 -o /home/winds/backup2/undo001.dtf.002 \ /home/winds/tibero/database/tibero/undo001.dtf 100.00% =======================================> 1280/1280 blks 0.01s Synchronizing... 10 blocks copied. ORG DF: /home/winds/tibero/database/tibero/usr001.dtf FULL BACKUP: /home/winds/backup/usr001.dtf.000 CUR BACKUP: /home/winds/backup2/usr001.dtf.002 BACKUP CNT: 2 RUN: /home/winds/tibero/bin/tbrg backup -i -b \ /home/winds/backup/usr001.dtf.000 -o /home/winds/backup2/usr001.dtf.002 \ /home/winds/tibero/database/tibero/usr001.dtf 100.00% =======================================> 256/256 blks 0.00s 0 blocks copied. full backup succeeded Database end backup succeeded. [ 예 6.20] Recovery with Online Full Backup 시나리오 $ tbrmgr recovery -b /home/winds/backup/rmgr.inf ============================================================ = Recovery Manager(RMGR) starts = = = = Tibero, Co. Copyright(C) 2010-2019, All rights reserved. = ============================================================ rmgr info file: /home/winds/backup/rmgr.inf ============================================= RMGR - recovery ============================================= Tibero instance terminated (NORMAL mode). listener port = 15048 제 6 장백업과복구 147
Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started up (MOUNT mode). DB connected Database automatic recovery succeeded sess: 18 user: SYS There are active session(s). 1. [W]ait until sessions are closed. 2. Shutdown [I]mmediately. 3. [Q]uit without shutting down. Select action. (Default: 1): 2 Tibero instance terminated (IMMEDIATE mode). listener port = 15048 Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started up (NORMAL mode). [ 예 6.21] Recovery with Incremental Full Backup 시나리오 $ tbrmgr recovery -b /home/winds/backup/rmgr.inf ============================================================ = Recovery Manager(RMGR) starts = = = = Tibero, Co. Copyright(C) 2010-2019, All rights reserved. = ============================================================ rmgr info file: /home/winds/backup/rmgr.inf ============================================= RMGR - recovery ============================================= Tibero instance terminated (NORMAL mode). base file : /home/winds/backup/system001.dtf.000 (uid=37839.8628) output file : /home/winds/tibero/database/tibero/system001.dtf copy base file 100.00% =======================================> 5376/5376 blks 0.12s merging /home/winds/backup2/system001.dtf.002 100.00% 148 Tibero 관리자안내서
1 files Merged.base file : /home/winds/backup/undo001.dtf.000 (uid=37839.8628) output file : /home/winds/tibero/database/tibero/undo001.dtf copy base file 100.00% =======================================> 1280/1280 blks 0.02s merging /home/winds/backup2/undo001.dtf.002 100.00% 1 files Merged.base file : /home/winds/backup/usr001.dtf.000 (uid=37839.8628) output file : /home/winds/tibero/database/tibero/usr001.dtf copy base file 100.00% =======================================> 256/256 blks 0.01s merging /home/winds/backup2/usr001.dtf.002 100.00% 1 files Merged.listener port = 15048 Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started up (MOUNT mode). DB connected Database automatic recovery succeeded sess: 18 user: SYS There are active session(s). 1. [W]ait until sessions are closed. 2. Shutdown [I]mmediately. 3. [Q]uit without shutting down. Select action. (Default: 1): 2 Tibero instance terminated (IMMEDIATE mode). listener port = 15048 Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started up (NORMAL mode). 제 6 장백업과복구 149
제 7 장분산트랜잭션 하나의데이터베이스인스턴스내에서한트랜잭션으로묶인 SQL 문장이모두커밋되거나롤백되듯이네트워크로연결된여러개의데이터베이스인스턴스가참여하는트랜잭션에서도각각다른데이터베이스인스턴스에서수행한 SQL 문장이모두동시에커밋되거나롤백될수있는방법이필요하다. 이렇게여러개의노드또는다른종류의데이터베이스가참여하는하나의트랜잭션을분산트랜잭션 (distributed transaction) 이라한다. Tibero 에서는분산트랜잭션을처리하기위해 XA와데이터베이스링크 (DBLink) 를통해지원한다. 7.1. XA Tibero는 X/Open DTP(Distributed Transaction Processing) 규약의 XA를지원한다. XA는 2PC(Two-phase commit) 를이용하여분산트랜잭션을처리한다. 다음은 XA가어떻게동작하는지를나타내는그림이다. [ 그림 7.1] XA의동작 (AP, TM, DB의상호작용 ) 1. 일반적으로 XA 는트랜잭션매니저 (TM: Transaction Manager, 이하 TM) 에의해코디네이트된다. 가장 먼저애플리케이션프로그램 (AP: Application Program, 이하 AP) 은 TM 에분산트랜잭션의시작을알 린다. 2. TM은 AP의요청을받고어떤데이터베이스의노드가해당분산트랜잭션에참여하는지확인한다. 그다음각데이터베이스노드에분산트랜잭션의시작을알린다. 각데이터베이스노드에분산트랜잭션의시작을알릴때, TM은내부에고유한트랜잭션 ID( 이하 XID) 를만들어서함께전달한다. 그러면각데이터베이스노드는이 XID와관련된분산트랜잭션을시작한다. 앞으로 AP로부터들어오는요청은해당분산트랜잭션에대한작업이라고인식한다. 제 7 장분산트랜잭션 151
3. AP 는각데이터베이스에 SQL 문장을전달함으로써필요한작업을진행한다. 이때각데이터베이스는전달받은요청을해당 XID 와관련된작업이라고인지하고 SQL 문장을실행 한다. 4. 모든작업이완료되면 AP는 TM에분산트랜잭션의종료를알린다. TM은해당 XID로분산트랜잭션에참여했던각데이터베이스노드에커밋과롤백을동시에하도록지시한다. 일부데이터베이스는커밋을하고, 일부데이터베이스는롤백을하는상황이벌어지지않도록 TM은 Two-phase commit mechanism을통해수행한다. 7.2. Two-phase commit mechanism Two-phase commit mechanism은분산컴퓨팅환경에서트랜잭션에참여하는모든데이터베이스가정상적으로수정되었음을보장하는두단계커밋프로토콜이다. 분산트랜잭션에참여한모든데이터베이스가모두함께커밋되거나롤백되는것을보장한다. Two-phase commit mechanism은다음과같이두단계로작업이이루어진다. First Phase ( 또는 prepare phase) First Phase는각데이터베이스노드에커밋을하기위한준비요청단계이다. 다음은 First Phase가실행되는과정이다. 1. TM은각데이터베이스노드에커밋을준비하라는 prepare 메시지를보낸다. 2. 요청을받은각데이터베이스는커밋을준비한다. 커밋을하기위한준비작업에는필요한리소스에잠금 (Lock) 을설정하거나로그파일을저장하는 작업등이있다. 3. 각데이터베이스는커밋준비여부에따라 TM 에성공또는실패여부를알린다. 커밋준비가모두끝나면 prepare 가성공한것이고, 커밋준비를실패하면 prepare 가실패한것이다. Second Phase ( 또는 commit phase) TM 은참여한모든데이터베이스노드로부터 prepare 의완료메시지를받을때까지대기한다. 이단계에서는전달받은 prepare 의메시지에따라해당결과가다르다. 구분 롤백 설명한데이터베이스노드라도 prepare ok 메시지를받지않으면, 이트랜잭션은커밋할수없다고판단하고모든데이터베이스노드에롤백메시지를보내고해당작업을롤백한다. 152 Tibero 관리자안내서
구분 커밋 설명 모든데이터베이스노드로부터 prepare ok 메시지를받으면다시모든데이터베이스 노드에커밋메시지를보내고모든작업을커밋한다. 7.3. XA 의 In-doubt 트랜잭션처리 Two-phase commit mechanism에의해첫번째 prepare 메시지를받으면데이터베이스는분산트랜잭션에해당하는리소스를잠금처리하거나로그를남김으로써커밋할준비를한다. 그런데 prepare까지마친상태에서네트워크의이상으로다음메시지 ( 커밋혹은롤백 ) 를받지못하는경우가발생할수있다. 데이터베이스는해당트랜잭션을커밋해야할지롤백해야할지판단할수없다. 따라서다음메시지가올때까지 prepare된리소스에잠금처리를한채로기다리게되는데, 이러한경우를 In-doubt 트랜잭션이라고한다. 일반적으로네트워크또는 TM 측의문제가해결된다면복구되는즉시 TM은 In-doubt 트랜잭션에커밋또는롤백메시지를다시보낸다. 하지만 In-doubt 트랜잭션이잡고있는리소스가급하게반환되어야하는상황이발생한다면 DBA는임의로 In-doubt 트랜잭션을커밋또는롤백시킴으로써해당리소스를반환할수있다. 이러한경우는DBA의판단에의해결정되므로이후에 TM으로부터전달되는커밋또는롤백메시지가 DBA가결정한판단과다르다면전체분산트랜잭션이일부커밋되거나롤백되는현상이발생할수있다. 따라서전체분산트랜잭션의일관성을위해 TM의다음요청을기다려야한다. 이러한문제를감수하더라도 In-doubt 트랜잭션을처리해야하는경우가발생한다면 DBA_2PC_PENDING 뷰를이용하여이를해결한다. 7.3.1. DBA_2PC_PENDING DBA_2PC_PENDING는현재정체되고있는 XA 트랜잭션브랜치 (XA transaction branch) 의정보를보여주는뷰이다. 다음은 XA 트랜잭션브랜치 (XA transaction branch) 의정보를조회하는예이다. 본예제에서는 XID와 FAIL_TIME 정보를이용하여커밋과롤백을수행할브랜치를선택한다. [ 예 7.1] DBA_2PC_PENDING 뷰의조회 SQL> SELECT LOCAL_TRAN_ID, XID, STATUS, FAIL_TIME, FORCE_TIME FROM DBA_2PC_PENDING; LOCAL_TRAN_ID ------------------------------------- XID ------------------------------------- STATUS FAIL_TIME FORCE_TIME --------------- ---------- ---------- 2.16.18 제 7 장분산트랜잭션 153
1.1000.1000 PREPARED 2006/12/11 1 selected. DBA 는다음과같이원하는 XA 트랜잭션브랜치에커밋명령을실행할수있다. 그러면해당 XA 트랜잭션 브랜치에서잡고있던리소스는반환되고, 해당트랜잭션은커밋된다. SQL> commit force '2.16.18'; Commit succeeded. DBA 는강제커밋 (commit force) 을통해롤백할수있다. SQL> rollback force '2.16.18'; Rollback succeeded. TM 에의한정식커밋이아니고 DBA 의임의의결정으로커밋을실행하면해당 XA 트랜잭션브랜치의정 보는그대로남아있는다. 다음과같이 FORCE_TIME 에 DBA 가강제로커밋한시간이남아있음을알수있다. SQL> SELECT LOCAL_TRAN_ID, XID, STATUS, FAIL_TIME, FORCE_TIME FROM DBA_2PC_PENDING; LOCAL_TRAN_ID ------------------------------------- XID ------------------------------------- STATUS FAIL_TIME FORCE_TIME --------------- ---------- ---------- 1.1000.1000 FORCED_COMMIT 2006/12/11 2006/12/12 1 selected 해당 XA 트랜잭션브랜치의정보는 TM이 xa_forget을이용하여더이상 XA 트랜잭션브랜치정보가필요없다고판단하면해당정보를제거한다. RM에서는 TM의요청이있기전까지는 XA 트랜잭션브랜치의정보를제거하지않는다. 154 Tibero 관리자안내서
7.4. 데이터베이스링크 데이터베이스링크는원격데이터베이스의데이터를마치로컬데이터베이스의데이터처럼접근할수있는방법을제공한다. 데이터베이스링크를사용하면원격데이터베이스의데이터에대한접근, 수정이용이하며손쉽게분산트랜잭션을처리할수있다. 분산트랜잭션은트랜잭션의원자성을보장하기위해 XA 와마찬가지로 Two-phase commit mechanism을사용한다. 7.4.1. 데이터베이스링크의생성, 제거 데이터베이스링크는다음과같은접근권한에따라생성및제거방법이다르다. Public DBLink 데이터베이스링크를생성한사용자와다른사용자들도데이터베이스링크를이용할수있다. Public DBLink 를생성하기위해서는 create public database link 권한이있어야한다. 다음은 Public DBLink를생성하는예이다. create public database link public_tibero using 'remote_2'; 위의예에서 using 절이후의 remote_2는연결할데이터베이스를가리키는이름으로 tbdsn.tbr 파일에해당데이터베이스의연결정보가저장되어있어야한다. 다음은 Public DBLink를제거하는예이다. Public DBLink는 drop public database link 권한을가진사용자만제거할수있다. drop public database link public_tibero; Private DBLink 데이터베이스링크를생성한사용자만데이터베이스링크를사용할수있다. Private DBLink 를생성하기위해서는 create database link 권한이있어야한다. 다음은 Private DBLink를생성하는예이다. create database link remote_tibero using 'remote_1'; 위의예에서는 remote_1은데이터베이스에연결하는 remote_tibero라는이름의데이터베이스링크를생성한다. 이데이터베이스링크는 Private DBLink이므로, 생성한사용자외에는사용할수없다. 다음은 Private DBLink를제거하는예이다. Private DBLink는생성한사용자만제거할수있다. drop database link remote_tibero; 제 7 장분산트랜잭션 155
7.4.2. 원격데이터베이스의연결 원격데이터베이스와의연결에사용하는계정을설정하는방법은다음과같이두가지가있다. 설정방법 지정한계정 설명 지정한 ID 와패스워드를사용해원격데이터베이스에접속한다. 단, 지정한 ID 와 패스워드를가진계정이원격데이터베이스에존재해야한다. 어떤사용자가사용하더라도데이터베이스링크를생성할때에는지정한 ID 와패 스워드를사용해야한다. 현재연결된계정 현재질의를수행한사용자의 ID 와패스워드를사용해원격데이터베이스에접속 한다. 데이터베이스링크를사용하는사용자의 ID 와패스워드가원격데이터베이 스에동일하게존재해야한다. 계정을지정하지않으면기본으로현재연결된계정으로접속하도록설정된다. 따 라서, 데이터베이스링크를사용하는사용자별로다른 ID 와패스워드를사용한다. 원격데이터베이스에연결하기위한계정은 CREATE SESSION 등의권한을가져야하며, 데이터베이스링크를통해원격데이터베이스의연결에사용된계정의권한을로컬사용자가획득하게되므로권한관리에유의해야한다. 특히 Public DBLink의경우에는모든로컬사용자가원격데이터베이스에대한권한을갖기때문에주의하여사용해야한다. 다음은지정한계정을이용하는데이터베이스링크의생성예이다. create database link remote_tibero connect to user1 identified by 'password' using 'remote_1'; 다음은현재연결된계정을이용하는데이터베이스링크의생성예이다. create database link remote_tibero using 'remote_1'; 7.4.3. 게이트웨이 데이터베이스링크를통해질의를수행할때, 데이터베이스링크의대상이 Tibero가아닌타 DBMS라면각각의 DBMS를위한게이트웨이를통해데이터베이스링크를수행할수있다. Tibero 서버는타 DBMS에필요한질의를해당게이트웨이에전달하고, 게이트웨이는원격 DBMS에접속하여 Tibero 서버로부터전달받은질의를수행하고그결과를다시 Tibero 서버로전송한다. 타 DBMS로의데이터베이스링크기능을사용하고자하는경우에는해당 DBMS에대한게이트웨이바이너리와설정파일이필요하다. 156 Tibero 관리자안내서
본절에서는 DBMS 벤더별로게이트웨이의종류를설명하고, 게이트웨이와 Tibero 서버가같은머신에 존재하는경우와다른머신에존재하는경우를알아본다. 또한, 게이트웨이에서제공하는옵션및로깅도 설명한다. DBMS 벤더별게이트웨이 다음은 Tibero 에서데이터베이스링크기능을지원하고있는타 DBMS 의종류와게이트웨이바이너리명 이다. DBMS 벤더명 게이트웨이바이너리명프로그래밍언어 DBMS 버전 Oracle gw4orcl C Oracle 9i, 10g, 11g DB2 gw4db2 C DB2 V8, DB2 9, DB2 9.5 MS-SQL SERVER tbgateway.jar Java MS-SQL SERVER 2000, 2005, 2008 Adaptive Server Enter prise(sybase) tbgateway.jar Java Sybase SQL Server 10.0.2 or later 각각의게이트웨이바이너리는 DBMS 의버전에따라다를수있기때문에버전에맞는게이트웨이바이 너리를사용할것을권장한다. 게이트웨이프로세스생성방식 게이트웨이는연결할 DBMS가제공하는라이브러리가필요하다. 라이브러리를 Tibero 서버가설치된곳에서사용할수있다면, Tibero 서버와같은머신내에서게이트웨이프로세스를생성하여데이터베이스링크기능을수행할수있다. 생성된게이트웨이프로세스는해당데이터베이스링크를사용하는세션이닫힐때종료된다. 다음은 Oracle 서버와연결하는데이터베이스링크를사용하기위해 tbdsn.tbr 파일을설정하는예이다. <tbdsn.tbr> ora_dblink=( (GATEWAY=(PROGRAM=gw4orcl) (TARGET=orcl) (TX_MODE=GLOBAL)) ) 다음은 DB2 서버와연결하는데이터베이스링크를사용하기위해 tbdsn.tbr 파일을설정하는예이다. <tbdsn.tbr> db2_dblink=( (GATEWAY=(PROGRAM=gw4db2) (TARGET=sample) 제 7 장분산트랜잭션 157
) (TX_MODE=GLOBAL)) 항목 PROGRAM 설명 게이트웨이바이너리의절대주소이다. 게이트웨이바이너리가 $TB_HOME/client/bin 디렉터리에있는경우, 바이너리명 만명시할수있다. TARGET DBMS 별로다음과같이의미하는것이다르다. - Oracle 서버인경우 : 네트워크서비스명이다. - DB2 서버인경우 : 데이터베이스명이다. TX_MODE 글로벌트랜잭션 (Global Transaction) 혹은로컬트랜잭션 (Local Transaction) 으로 처리할지의여부를설정한다. 글로벌트랜잭션은커밋을요청할때 Two-phase commit 으로동작하고, 로컬트 랜잭션은 Two-phase commit 으로동작하지않는다. TX_MODE 의값은처리여부에따라다음과같이설정할수있다. - 글로벌트랜잭션인경우 : GLOBAL - 로컬트랜잭션인경우 : LOCAL 멀티스레드서버방식 사용자는 Tibero 서버와같은머신또는원격에있는머신에서게이트웨이를멀티스레드서버방식으로시작할수있다. Tibero 서버의세션은 tbdsn.tbr 파일에명시된접속정보를통해게이트웨이와 TCP/IP 통신을한다. 멀티스레드서버방식의게이트웨이는 Tibero 서버의세션으로부터요청이오면미리생성된워킹스레드중하나가해당요청을처리한다. 특히 Java 프로그래밍언어를사용하는게이트웨이는멀티스레드서버방식만을지원한다. 다음은 ORACLE 서버와연결하는데이터베이스링크를사용하기위해 tbdsn.tbr 파일을설정하는예이다. <tbdsn.tbr> ora_link_remote=( (GATEWAY=(LISTENER=(HOST=12.34.56.78) (PORT=9999)) (TARGET=orcl) 158 Tibero 관리자안내서
) (TX_MODE=GLOBAL)) 다음은 DB2 서버와연결하는데이터베이스링크를사용하기위해 tbdsn.tbr 파일을설정하는예이다. <tbdsn.tbr> db2_link_remote=( (GATEWAY=(LISTENER=(HOST=12.34.56.78) (PORT=9999)) (TARGET=sample) (TX_MODE=GLOBAL)) ) 다음은 MS-SQL SERVER 와연결하는데이터베이스링크를사용하기위해 tbdsn.tbr 파일을설정하는예 이다. <tbdsn.tbr> mssql_link_remote=( (GATEWAY=(LISTENER=(HOST=12.34.56.78) (PORT=9093)) (TARGET=192.168.16.25:1433:master) (TX_MODE=LOCAL)) ) 다음은 Sybase ASE 서버와연결하는데이터베이스링크를사용하기위해 tbdsn.tbr 파일을설정하는예 이다. <tbdsn.tbr> ase_link_remote=( (GATEWAY=(LISTENER=(HOST=12.34.56.78) (PORT=9093)) (TARGET=192.168.16.25:5000:master) (TX_MODE=LOCAL)) ) 항목 LISTENER 설명 - HOST: 원격에있는머신에서게이트웨이가존재하는호스트의 IP 주소를설정 한다. - PORT: 원격에있는머신에서게이트웨이가존재하는호스트의포트번호를설 정한다. TARGET DBMS 별로다음과같이의미하는것이다르다. 제 7 장분산트랜잭션 159
항목 설명 - Oracle 서버인경우 : 네트워크서비스명이다. - DB2 서버인경우 : 데이터베이스명이다. - MS-SQL SERVER인경우 : 서버의연결정보 (IP:PORT:DATABASE NAME) 이다. - Sybase ASE 서버인경우 : 서버의연결정보 (IP:PORT:DATABASE NAME) 이다. TX_MODE 글로벌트랜잭션 (Global Transaction) 혹은로컬트랜잭션 (Local Transaction) 으로 처리할지의여부를설정한다. TX_MODE 의값은처리여부에따라다음과같이설정할수있다. - 글로벌트랜잭션인경우 : GLOBAL - 로컬트랜잭션인경우 : LOCAL 원격에있는게이트웨이를사용하기위해서는먼저원격에있는게이트웨이를실행시켜야한다. 다음은원격에서 Oracle 서버의게이트웨이를실행시키는예이다. $ gw4orcl ORACLE, DB2 게이트웨이는기본적으로 TBGW_HOME 환경변수를통해설정파일을읽고로그파일을기록한다. TBGW_HOME 환경변수가설정되어있지않은경우에는디폴트값은 ${TB_HOME}/client/gateway 이다. Windows 환경에서는디폴트값이 %TB_HOME%\client\gateway로설정된다. 게이트웨이가사용하는설정파일과로그파일이존재하는디렉터리구조는다음과같다. $TBGW_HOME --- DBMS 벤더명 --- config --- tbgw.cfg --- log --- 게이트웨이의로그파일위의디렉터리구조에서 $TBGW_HOME 이라고보이는부분은시스템환경에맞게바꿔서읽어야한다. DBMS 벤더명 /config tbgw.cfg라는게이트웨이설정파일이있다. 사용자가게이트웨이와관련된설정값을변경하고싶을때생성하며, 위의디렉터리구조에맞게위치시키면된다. 160 Tibero 관리자안내서
DBMS 벤더명 /log 게이트웨이와관련된로그파일이있다. 로그파일은 DBMS 벤더명에맞춰생성된다. 다음은 DBMS 벤더별로그파일이다. DBMS 벤더명 Oracle DB2 로그파일명 gw4orcl.log gw4db2.log 리스너의로그명 gw4orcl_lsnr.log gw4db2_lsnr.log tbgw.cfg 파일에초기화파라미터의설정값을명시함으로써게이트웨이와관련된설정을변경할수있다. 다음은게이트웨이를설정하는예이다. <tbgw.cfg> LOG_DIR=${TBGW_HOME}/{DBMS 벤더명 }/log LOG_LVL=2 LISTENER_PORT=9999 MAX_LOG_SIZE=20k MAX_LOG_CNT=5 FETCH_SIZE=32k 초기화파라미터 LOG_DIR LOG_LVL LISTENER_PORT MAX_LOG_SIZE 기본값 ${TBGW_HOME}/{DBMS 벤더명 }/log 2 9999 0 설명게이트웨이의로그파일을저장할경로를설정한다. 로그파일에남길로그레벨을설정한다. 게이트웨이를리스너모드로실행하는경우리스너의포트번호를설정한다. 로그파일의최대크기 (Byte 단위 ) 이다. - 값이 0인경우 : 로그파일의최대크기를설정하는데제한이없다. - 값을명시한경우 : 로그파일이설정된최대크기를초과하면로그파일을백업한다. MAX_LOG_FILE_CNT 0 로그파일을백업하는기능을사용하는경우, 백업로그파일 (Backup log file) 의최대개수이다. - 값이 1 이하인경우 : 백업로그파일을생성하지않는다. - 값을명시한경우 : 로그파일을백업한후, 설정된최대개수를초과하면가장오래된백업로그파일을삭제한다. 제 7 장분산트랜잭션 161
초기화파라미터 FETCH_SIZE SKIP_CHAR_CONV 기본값 32k N 설명 DBMS에질의처리를할때한꺼번에가져오는데이터의크기를설정한다. ( 최댓값 : 64KB) gw4orcl에만해당하는옵션이다. - 값이 Y인경우 Oracle 데이타베이스에있는데이타를캐릭터셋변환없이가져온다. - Oracle에서한글을지원하지않는캐릭터셋과한글데이타를동시에사용하고있는특수한경우에사용된다. MS-SQL SERVER, Sybase ASE 사용자는 ${TB_HOME}/client/bin에있는 tbgateway.zip 파일을설치할디렉터리에복사한후, 압축을해제한다. 기본적으로타깃데이터베이스에대한 JDBC 드라이버파일 (jconn3.jar, sqljdbc.jar) 은제공하지않는다. 따라서사용자는해당 DBMS의웹사이트를접속하여 JDBC 드라이버파일을다운로드한후, LIB 디렉터리에복사한다. 게이트웨이가사용하는설정파일과로그파일이존재하는디렉터리구조는다음과같다. 설치디렉터리 --- tbjavagw --- tbgw --- tbgw.cfg --- tbgwlog.properties --- lib --- tbgateway.jar --- commons-collections.jar --- commons-pool.jar --- log4j-1.2.15.jar --- jconn3.jar --- sqljdbc.jar --- log --- 게이트웨이의로그파일 tbjavagw/tbgw Java 게이트웨이를실행시키는스크립트파일이다. tbjavagw/tbgw.cfg 게이트웨이설정파일이다. 사용자가게이트웨이와관련된설정값을변경하고싶을때생성하며, 위의디렉터리구조에맞게위치시키면된다. 162 Tibero 관리자안내서
tbjavagw/tbgwlog.properties 로그에대한설정파일이다. 로그파일의크기와로그레벨등을설정할수있다. 자세한형식은 LOG4J 를참고하기바란다. tbjavagw/lib Java 게이트웨이에서사용하는 JAR 파일이있는디렉터리이다. 타깃데이터베이스의 JDBC 드라이버도해당디렉터리에있다. tbjavagw/log 게이트웨이와관련된로그파일이생성된다. tbgw.cfg 파일에초기화파라미터의설정값을명시함으로써게이트웨이와관련된설정을변경할수있다. 다음은게이트웨이를설정하는예이다. <tbgw.cfg> DATABASE=SQL_SERVER LISTENER_PORT=9093 INIT_POOL_SIZE=10 MAX_POOL_SIZE=1000 ENCODING=MSWIN949 MAX_LONGVARCHAR=4K MAX_LONGRAW=4K 초기화파라미터 DATABASE 기본값 SQL_SERVER 설명타깃데이터베이스를설정한다. - MS-SQL SERVER: SQL_SERVER - Sybase ASE: ASE LISTENER_PORT INIT_POOL_SIZE MAX_POOL_SIZE MAX_CURSOR_ CACHE_SIZE ENCODING 9093 10 100 100 MSWIN949 리스너의포트번호를설정한다. 게이트웨이가시작할때미리생성할워킹스레드의개수를설정한다. 게이트웨이가최대로생성할수있는워킹스레드의개수를설정한다. 워킹스레드당최대로캐시가능한커서의개수를설정한다. Tibero 서버의세션에문자열을전달할때사용할인코딩을설정한다. 단, Tibero 서버의문자집합과일치시켜야한다. 설정할수있는문자집합은다음과같다. - ASCII 제 7 장분산트랜잭션 163
초기화파라미터 기본값 설명 - EUC-KR - MSWIN949 - UTF-8 - UTF-16 - SHIFT-JIS MAX_LONGVARCHAR MAX_LONGRAW 4KB 4KB 게이트웨이는 LONG, CLOB 타입의데이터를일정간격을정하여가져오는방식 (Deferred 형태 ) 을지원하지않는다. CHAR 나 VARCHAR 타입처럼한번에읽어오게되는데, 그때읽어올수있는최대크기를설정한다. ( 최댓값 : 32KB) 게이트웨이는 LONG RAW, BLOB 타입의데이터를일정간격을정하여가져오는방식을지원하지않는다. RAW처럼한번에읽어오게되는데, 그때읽어올수있는최대크기를설정한다. ( 최댓값 : 32KB) 게이트웨이바이너리의버전 게이트웨이바이너리의버전은다음과같은명령을실행하여확인할수있다. $ gw4orcl -v tbgateway for oracle : Release 4 Trunk (Build 31190) Linux Tibero_Linux 2.6.22-16-generic #1 SMP Mon Nov 24 17:50:35 GMT 2008 x86_64 GNU/Linux version (little-endian) 7.4.4. 데이터베이스링크의사용 데이터베이스링크를통해접근할수있는데이터베이스객체의종류는다음과같다. 테이블 (LOB 와 LONG 타입의컬럼에는접근할수없다.) 뷰 시퀀스 데이터베이스링크를사용할수있는 SQL 문장은 SELECT, INSERT, UPDATE, DELETE 이다. 단, SELECT 문에서 FOR UPDATE 절은사용할수없다. 164 Tibero 관리자안내서
7.4.5. Global Consistency Homogeneous DBLink로구성된분산트랜잭션은 Global Consistency를제공한다. 이를위해분산트랜잭션에참여한데이터베이스간에 TSN을동기화하는작업을한다. TSN을동기화하는작업은데이터베이스사이에메시지교환을할때이루어지며, 커밋을할때에는모든노드의 Commit TSN을동일하게동기화해야한다. 7.4.6. 데이터베이스링크의 In-doubt 트랜잭션처리 정체되고있는 TX에대한처리는 XA의경우와동일하다. 본절에서는 Two-phase commit mechanism에서 XA와의차이점을설명한다. commit point site 데이터베이스링크를사용한분산트랜잭션에서는트랜잭션에참여한노드중에서 commit point site를선정한다. commit point site는 Two-phase commit을시작할때설정하며, 세션트리를따라가며가장큰 commit point strength를가진노드를선택한다. 각데이터베이스는 commit point strength를가지는데, 이값은초기화파라미터 COMMIT_POINT_STRENGTH로설정할수있다. commit point site는 Two-phase commit의 prepare phase에서 prepare를하지않는다. 대신모든노드가 prepare를한이후에 commit point site를바로커밋한다. 그이후에다른노드들은 commit phase를실행한다. 데이터베이스링크에서이와같이수정된 Two-phase commit을사용하는이유는 Global consistency를보장하기위해생기는오버헤드를줄이기위해서이다. 데이터베이스링크에서 Global consistency를보장하기위해서는모든노드의 Commit TSN을동일하게해야한다. Commit TSN은 prepare phase까지완료한노드중가장큰 TSN으로결정하고 commit phase에서결정된 TSN을사용해커밋을한다. commit phase 전에는 Commit TSN을모르기때문에다른트랜잭션에서해당트랜잭션의수정정보의조회여부를결정할수없다. 다른트랜잭션에서 prepare된 TX가수정한내용에접근하는경우다음과같은에러가발생한다. TBR-21019: lock held by in-doubt distributed transaction. 데이터베이스링크를사용할때 prepare 상태에서정체가발생하는경우, 해당데이터에접근할수없기때문에, In-doubt 트랜잭션으로인한문제가발생된다. 이와같은문제를경감하기위해트랜잭션에참여한노드중한노드는 prepare phase를거치지않고, 트랜잭션이 in-doubt 상태가되더라도 commit point site는위와같이데이터를접근하지못하는상황을방지할수있도록하였다. 따라서 commit point strength는데이터접근성이많이필요한데이터베이스일수록큰값을설정해야한다. 제 7 장분산트랜잭션 165
7.4.7. 데이터베이스링크의정보조회 Tibero 에서는생성한데이터베이스링크의정보를제공하기위해다음표에나열된정적뷰를제공하고 있다. 정적뷰 DBA_DB_LINKS 설명 Tibero 내의모든데이터베이스링크의정보를보여주는뷰이다. DBA 만사용할수있는뷰이다. ALL_DB_LINKS USER_DB_LINKS 현재사용자가이용할수있는모든데이터베이스링크의정보를보여주는뷰이 다. 현재사용자가생성한데이터베이스링크의정보를보여주는뷰이다. 참고 정적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. V$DBLINK 동적뷰 V$DBLINK는해당세션에서원격데이터베이스에연결된데이터베이스링크의정보를보여주는뷰이다. 사용자가데이터베이스링크를통해질의를수행하면원격데이터베이스에연결을생성하고해당질의또는트랜잭션이종료되어도연결을해제하지않고계속유지된다. 즉, 같은데이터베이스링크를사용했을때발생하는연결의비용을줄이기위함이다. 이렇게생성된연결은세션이종료될때까지혹은명시적으로연결을종료할때까지계속유지된다. 다음은 remote_tibero를통해 SELECT 문을수행한후, V$DBLINK를통해연결정보를조회하는예이다. SQL> select * from employee@remote_tibero; ID NAME --- --------- 1 KIM 2 LEE 3 HONG 3 rows selected. SQL> select * from V$DBLINK; DB_LINK OWNER_ID OPEN_CURSORS IN_TRANSACTION HETEROGENEOUS ------------- ---------- ------------ -------------- ------------- REMOTE_TIBERO 15 0 YES NO 166 Tibero 관리자안내서
COMMIT_POINT_STRENGTH --------------------- 1 1 row selected. 현재 remote_tibero 의소유자의 ID 는 15 번이고, 현재열려있는커서는없으며, 트랜잭션을수행하고있다. 동일한 Tibero 서버에대한데이터베이스링크이며원격데이터베이스의 commit point strength 는 1 이다. 다음은데이터베이스링크기능을종료하는예이다. SQL> alter session close database link remote_tibero; TBR-12056: database link is in use.... 1... SQL> commit;... 2... Commit succeeded. SQL> alter session close database link remote_tibero;... 3... Session altered. SQL> select * from V$DBLINK;... 4... DB_LINK OWNER_ID OPEN_CURSORS IN_TRANSACTION HETEROGENEOUS -------------- ---------- ------------ -------------- ------------- COMMIT_POINT_STRENGTH --------------------- 0 row selected. 1 데이터베이스링크기능을종료하려는시도가실패한이유는해당데이터베이스링크를사용한트랜잭션이아직수행중이기때문이다. 2 commit 문을통해해당트랜잭션을종료한다. 3 다시데이터베이스링크기능의종료를시도한다. 4 정상적으로데이터베이스링크가종료되며, 이를확인하는방법은 V$DBLINK를통해확인할수있다. 제 7 장분산트랜잭션 167
제 8 장 Tibero Standby Cluster 본장에서는 Tibero Standby Cluster 의구성요소와동작및운영방법을설명한다. 8.1. 개요 Tibero Standby Cluster는데이터베이스의고가용성, 데이터의보호, 재난복구등을목적으로제공하는 Tibero의핵심기능이다. Tibero Standby 서버는물리적으로독립된장소에원본데이터베이스의복사본을트랜잭션단위로보관한다. 복사할대상이되는원본데이터베이스를 Primary DB( 이하 Primary) 라고부르고, 복사된데이터가저장되는데이터베이스를 Standby DB( 이하 Standby) 라고부른다. Tibero Standby Cluster의원리는 Primary에서생성된 Redo 로그를배경프로세스가 Standby로전송하고, Standby는 Redo 로그를이용해 Primary의모든변화를똑같이반영하는것이다. 다음은 Tibero Standby Cluster가어떻게동작하는지를나타내는그림이다. [ 그림 8.1] Tibero Standby Cluster의동작구조 데이터의복사를통해 Primary는서비스가요청한데이터처리에실패했을경우, Standby의데이터를활용해해당서비스를신속히재개할수있다. 또한 Primary의서버만으로는손상된데이터를복구를할수없는경우에도쉽게대처할수있다. 예를들면, Primary의서버의디스크가손상된경우 Standby를통해손상된데이터를보호할수있다. 제 8 장 Tibero Standby Cluster 169
8.2. 프로세스 Tibero Standby Cluster의프로세스는다음과같다. LNW(Log Network Writer) Primary의 Redo 로그를 Standby로전송하는프로세스이다. 로그전송방식과무관하게로그를보내는것은항상 LNW에서이루어진다. Standby는 9개까지설정이가능하며, 각 Standby 마다 LNW가하나씩실행된다. LNR(Log Network Reader) Standby에서 Primary로부터받은 Redo 로그를온라인 Redo 로그파일에기록하는프로세스이다. Standby는 MOUNT나 NORMAL이아닌 RECOVERY 부트모드로동작하며, 이때 log writer는사용되지않고, LNR이 LGWR의역할을대신한다. SMR(Standby Managed Recovery) 온라인 Redo 로그를읽어 Standby에적용하는복구과정을수행하는프로세스이다. LNR, SMR은첫번째워킹프로세스의워킹스레드중하나로동작한다. 따라서, Standby를구성하기위해서는 $TB_SID.tip 파일의 _WTHR_PER_PROC 초기화파라미터의값을 2보다크게설정해야한다. 8.3. 로그전송방식 Primary 에서 Standby 로로그가전송되는방식은다음과같다. 로그전송방식 LGWR SYNC LGWR ASYNC ARCH ASYNC 설명 LGWR가 Redo 로그를디스크에기록할때 LNW를통해 Standby에 Redo 로그를전송한다. LNW가직접온라인 Redo 로그파일을읽어서 Standby로보낸다. ARCH가로그순환을할때아카이브로그를만든후 LNW에게알려주고, LNW는아카이브로그파일을읽어 Standby로보낸다. 8.4. Primary 의동작모드 Primary DB 의동작모드에는다음과같다. 구성요소 PROTECTION 모드 설명 적어도하나이상의 LGWR SYNC 를포함해야한다. 170 Tibero 관리자안내서
구성요소 설명 LGWR는디스크에기록하는것외에도 LGWR SYNC인 Standby 중적어도하나의 Standby로부터성공했다는응답을받아야진행할수있다. 모든 LGWR SYNC인 Standby가실패한경우, Primary도같이실패하고, 더이상진행하지않는다. AVAILABILITY 모드 적어도하나이상의 LGWR SYNC 를포함해야한다. 모든 LGWR SYNC 인 Standby 가실패하면 Standby 와의동기화를포기한다. 하지만 Primary 는계속진행한다. PERFORMANCE 모드 로그전송방식에제한이없고, Standby 의실패와무관하게 Primary 는계속 진행한다. 8.5. Primary 의설정및운용 다음은 Standby로연결할데이터베이스의정보와각 Standby의종류, 그리고동작모드를설정하는방법이다. <$TB_SID.tip> LOG_REPLICATION_MODE = {PROTECTION AVAILABILITY PERFORMANCE} LOG_REPLICATION_DEST_1 = "hostname_1:port_1 {LGWR SYNC LGWR ASYNC ARCH ASYNC}" LOG_REPLICATION_DEST_2 = "hostname_2:port_2 {LGWR SYNC LGWR ASYNC ARCH ASYNC}"... LOG_REPLICATION_DEST_N = "hostname_n:port_n {LGWR SYNC LGWR ASYNC ARCH ASYNC}" 다음은위파일에서설정한각초기화파라미터에대한설명이다. LOG_REPLICATION_MODE 데이터를보호하는수준에중점을둘지혹은성능을최대화할지에대한전체적인동작모드를설정 한다. 한번만설정하면된다. LOG_REPLICATION_MODE 초기화파라미터에설정할수있는항목은다음과같다. 항목 PROTECTION 설명 LGWR SYNC 로설정된 Standby 가하나도없는경우를허용할수없는항목이다. 이항목을설정하면서버를기동할때초기화에러가발생한다. 이에러를해결하 기위해서는모드에따라 Standby 에맞게설정한후, 다시서버를기동해야한다. AVAILABILITY PROTECTION 항목과마찬가지로 LGWR SYNC 로설정된 Standby 가하나도없 는경우를허용할수없는항목이다. 제 8 장 Tibero Standby Cluster 171
항목 설명 이항목을설정하면서버를기동할때초기화에러가발생한다. 이에러를해결하 기위해서는모드에따라 Standby 에맞게설정한후, 다시서버를기동해야한다. PERFORMANCE Standby 로로그가전송되는방식에제한이없고, 동기화를보장하지않으므로시 스템성능을높이는데가장유리한항목이다. LOG_REPLICATION_DEST_N 각 Standby 의데이터베이스의연결정보 (hostname:port) 와로그전송방식을설정한다. 설정할수있 는최대 Standby 의개수 (N) 은 9 이고, 필요한만큼만 LOG_REPLICATION_DEST_1 부터설정한다. LOG_REPLICATION_DEST_N 초기화파라미터에설정할수있는항목은다음과같다. 항목 LGWR SYNC 설명 LGWR SYNC로설정된 Standby는 Primary의 Redo 버퍼의내용을전송받아동작하므로, 가장빈번하게 Redo 로그를전송한다. 따라서데이터가보호될확률도높다. 반면에 Primary의성능저하가심하므로 Standby를 Primary와비슷한수준으로구축할것을권장한다. PERFORMANCE 모드와같이사용할수있는데, 이러한경우데이터를보호하지못하더라도 Primary는계속진행할수있다. 따라서 Standby가느리면온라인 Redo 로그파일이나아카이브로그파일에서 Redo 로그를읽어전송할수있으므로 Primary를 ARCHIVELOG 모드로운영할것을권장한다. LGWR ASYNC LGWR ASYNC 로설정된 Standby 는 LGWR SYNC 와 ARCH ASYNC 의중간수준 의빈도로 Redo 로그를전송한다. 기본적으로온라인 Redo 로그파일을읽어서전송하지만, Standby 가따라오지못 하는경우아카이브로그파일에서읽을수도있으므로 Primary 를 ARCHIVELOG 모드로운영할것을권장한다. ARCH ASYNC ARCH ASYNC 로설정된 Standby 가하나이상존재하면 Primary 는반드시 ARCHIVELOG 모드로동작해야한다. 그렇지않으면서버의기동은정상적으로 되지만, 해당 Standby 는아무런동작도하지못하게된다. 이점을주의해야한다. 비록 ARCH ASYNC 인 Standby 를사용하지않더라도 Standby 기능을사용할때 에는 Primary 를 ARCHIVELOG 모드로운영할것을권장한다. Primary 를 NORMAL 모드로기동하면 $TB_SID.tip 파일에설정된각 Standby 와연결이이루어지고, 배경 프로세스에의해자동으로데이터이중화 (Replication) 가이루어진다. 예를들어 PROTECTION 이나 AVAILABILITY 동작모드로기동하고 LGWR SYNC 인 Standby 가모두연결이불가능한상태라면 Primary 172 Tibero 관리자안내서
도운영이불가능하므로반드시 Standby 를먼저기동해야한다. 그외의경우에는 Standby 를나중에기동 하더라도자동으로연결되므로운영이가능하다. 참고 Primary 에서데이터베이스를생성하는동안에는 $TB_SID.tip 파일에있는 Standby 설정이무시된 다. 따라서 Primary 에서생성된 DB 파일을 DBA 가수동으로 Standby 로복사해야한다. 8.6. Standby 의설정및운용 Standby를운영하기위해필요한설정과정은다음과같다. 1. Primary에서백업한 DB 파일을복사해서 Standby를구성한다. 컨트롤파일, 온라인로그파일, 패스워드파일을포함한모든데이터파일을복사한다. 패스워드파일을함께복사하는이유는 Primary가 Standby에 SYS 권한을가지고, 접속하므로 SYS의패스워드가서로일치해야하기때문이다. 2. Standby 의 $TB_SID.tip 파일을열어 DB_NAME 이 Primary 와같도록수정한다. 3. $TB_SID.tip 파일에서컨트롤파일이위치하는디렉터리경로가 1번에서 Primary 파일을복사한경로와일치하는지확인한다. 또한 DB_BLOCK_SIZE도 Primary에설정된것과같아야한다. 설정이같으면복사한데이터파일을열수있다. Primary의백업을가져다놓은 Standby의디렉터리의경로가원래와달라진경우에는 Standby의 $TB_SID.tip 파일에다음과같이경로변환을위한정보를추가해야한다. [ 예 8.1] Standby의 $TB_SID.tip 파일의경로변환 STANDBY_FILE_NAME_CONVERT="Primary의절대경로, Standby의절대경로 " Primary 의절대경로와 Standby 의절대경로는각각 Primary 와 Standby 의 instance 디렉터리의절대 경로이다. 4. Standby를 MOUNT 모드로기동한후, 다음의 DDL 문장을수행하면변환된경로가컨트롤파일에적용된다. [ 예 8.2] 수정된 Standby의경로적용 SQL> ALTER DATABASE Standby controlfile; 위의과정은같은경로로 DB 파일을가져다놓았다면필요하지않으며, 경로가다른데도위의과정을 수행하지않고 Standby 를기동하는경우컨트롤파일에적힌경로에데이터파일을열수없다는에러 가발생한다. 제 8 장 Tibero Standby Cluster 173
5. Standby를운영하기위한설정을완료하면, 다음의명령을통해 DB가 Standby로동작하도록기동시킨다. [ 예 8.3] Standby의기동 $ tbboot -t RECOVERY NORMAL 모드로 Standby를한번이라도기동하게되면더이상 Standby로서의기능은할수없고, 앞서설명한과정을다시반복하여 Standby를설정해야한다는점에주의한다. Standby가기동하기전에 DB 파일이이전의버전이라하더라도일관성만유지한다면동작에는문제가없다. 내부적으로 Primary가접속하여 Primary와 Standby사이의로그갭 (log gap) 을자동으로맞춰동작한다. 하지만, 이과정이모두 Redo 로그에의존하므로두 DB 사이의차이가크고, Primary가 ARCHIVELOG 모드가아니라면필요한 Redo 로그가존재하지않아동작이불가능할수있다. 따라서 Primary는 ARCHIVELOG 모드로동작시키거나최근에백업한 Primary를 Standby로복사하여두 DB 의 DB 파일을맞춘후에 Primary를동작시키는것이바람직하다. 8.6.1. Standby 의 read only 모드 Standby는내부적으로 Primary로부터받은 Redo 로그를디스크에기록하고, 이를복구하여데이터파일에도반영하는일을수행하는 RECOVERY 모드로동작하기때문에 DB에사용자의접근이제한된다. 하지만, DB의데이터에대해읽기작업만을원하는경우도있다. 이를위해 Standby는 read only 모드를지원한다. read only 모드로실행하기위해서는관리자권한으로다음의 DDL 문장을수행한다. [ 예 8.4] Standby의 read only SQL> ALTER DATABASE open read only; Standby 에반영된여러객체의조회가허용된다. 하지만, read only 모드로동작중일때에는내부적으로 Primary 로부터받은 Redo 로그를복구하는과정이중지되므로 Primary 로부터로그를더이상받지못하 는상태가될수있다. 주의 특히 Primary 를 PROTECTION 이나 AVAILABILITY 모드로운영하는경우에는 DBA 는오랫동안 read only 상태로 Standby 를운영하지않도록주의해야한다. Standby 를다시 RECOVERY 모드로전환시킬때는다음의 DDL 문장을수행한다. [ 예 8.5] RECOVERY 모드의전환 SQL> ALTER DATABASE Standby; 이문장을실행할때, 반드시 read only 모드에서접근한세션은모두해제된상태이어야한다. 174 Tibero 관리자안내서
Standby를 read only 클러스터용으로사용하는경우와같이 Standby에서 Redo 로그를반영하는과정을중단하지않고읽기작업을원하는경우가있다. 그때에는다음의 DDL 문장을실행하면 Standby는복구과정을멈추지않고, read only 세션을허용한다. [ 예 8.6] Standby의 read only continue recovery SQL> alter database open read only continue recovery; Standby가 LGWR SYNC 모드로설정되어 Primary와동기화되어있는경우라면, Primary에접속한경우와같이최근에커밋된내용을 Standby에서도볼수있다. 이상태에서는비록 DB 서버가 read only 모드임에도불구하고, 데이터의내용이변경될수있다는사실에주의해야한다. 만약 read only 모드로변경한시점을기준으로항상일관적인데이터를보고싶은경우에는 [ 예 8.4] 의문장을수행해야한다. read only 모드에서는 Redo 로그를이용해복구하는과정을중단했든아니든간에 Primary와의접속이불가능하다. 따라서 Primary와연결되었는지의여부를동적뷰 V$STANDBY를이용해확인한후 read only 모드로변경하는것이바람직하다. read only 모드로동작시킨상태에서 Primary와의접속을허용하기위해서는 [ 예 8.5] 에서설명한문장을수행하여 RECOVERY 모드로전환하면된다. 8.7. 데이터베이스의역할전환 본절에서는 Standby 를 Primary 로전환하는과정을두가지시나리오로나누어설명한다. 8.7.1. Switchover Primiary를정상적으로셧다운하고, Standby 중하나를 Primary로전환하고싶은경우다음의절차를수행하면된다. 1. Primary에서다음의명령어를입력한다. [ 예 8.7] Switchover 명령어의실행 $ tbdown -t SWITCHOVER 위의명령어를수행하면, 모든 Standby 를 Primary 와동기화시킨다. 그이후에 Primary 가종료된다. 2. Standby 중하나를종료한후, NORMAL 모드로기동하거나다음의 DDL 문장을수행하면그 DB가새로운 Primary가된다. [ 예 8.8] ALTER DATABASE open 문장의실행 SQL> ALTER DATABASE open; read only 모드인상태에서 open 모드로바로전환하는것은지원하지않는다. 제 8 장 Tibero Standby Cluster 175
이전의 Primary를새로운 Standby로사용하고싶다면, 새로 Primary가될 DB의 $TB_SID.tip 파일에 Standby(LOG_REPLICATION_MODE, LOG_REPLICATION_DEST_n 초기화파라미터 ) 를설정하고, 이전 Primary를 RECOVERY 모드로기동한후에새로 Primary가될 DB를 NORMAL 모드로기동하면서로역할을전환하여수행할수있다. 이때, 두 DB는이미동기화된상태이므로 Standby를구성할때필요한새로운 Primary의 DB 파일을복사하고, ALTER DATABASE Standby controlfile을수행하는과정은더이상필요하지않는다. 또한, 새로운 Standby의 $TB_SID.tip 파일에기존의 Standby와관련된설정이남아있더라도 DB가 NORMAL 모드로운용될때만적용된다. 8.7.2. Failover 현재 Primary가갑자기비정상적으로종료되었거나접근이불가능해진경우, Standby 중하나를 Primary 로사용할수있다. Standby를 Primary로사용하기위해서는종료후다시 NORMAL 모드로기동을하거나 ALTER DATABASE open 문을수행해야한다. 참고 기존에사용하던 Primary 는새로운 Primary 가운영된후에는더이상어떤용도 (Primary 나 Standby) 로도 Tibero Standby Cluster 에포함될수없다. 8.8. 클라이언트의설정 Primary와 Standby에모두접속하기위해서는 tbdsn.tbr 파일에각 DB의접속정보를추가해야한다. 예를들면다음과같다. <tbdsn.tbr> PrimaryDB_SID=( (INSTANCE=(HOST=primaryDB_hostname) (PORT=primaryDB_port) (DB_NAME=cluster_DB_NAME) ) ) StandbyDB_SID=( (INSTANCE=(HOST=StandbyDB_hostname) (PORT=StandbyDB_port) (DB_NAME=cluster_DB_NAME) ) ) Primary와 Standby의 $TB_SID.tip 파일을설정할때공통의 DB_NAME을각각 SID별로설정해야한다. 176 Tibero 관리자안내서
참고 Primary 에서장애가발생하면 Standby 에자동으로접속하는방법이있다. 이방법에대한자세한내 용은 Appendix A. tbdsn.tbr 를참고한다. 8.9. 제약사항 Tibero Standby Cluster의기능은 Primary에서생성된 Redo 로그를그대로 Standby에전송하므로서로간의컴퓨팅환경 (CPU bus size, endianness, OS 등 ) 이동일해야하고, $TB_SID.tip 파일의데이터베이스블록의크기도동일해야한다. DB 파일의변화를일으키는 DDL 문장중테이블스페이스의생성, 제거, 변경은지원한다. 그러나로그파일의생성, 제거혹은데이터파일의이름변경과같은 DDL 문장은허용하지않으며, Standby 없이수행해야한다. 즉, 데이터베이스를백업하여 Standby에적용해야하는제약이있다. 8.10. Tibero Standby Cluster 의정보조회 Tibero 에서는 Tibero Standby Cluster 의상태정보를제공하기위해다음표에나열된동적뷰를제공하고 있다. 동적뷰 V$STANDBY_DEST V$STANDBY 설명 Primary에설정된각 Standby의연결정보및 Redo 로그의전송상태를조회하는뷰이다. Primary에서만이뷰를사용할수있다. Standby에서 Primary의연결정보와전달받은 Redo 로그그리고이미반영된 Redo 로그의상태를조회하는뷰이다. Standby에서만이뷰를사용할수있다. 참고 동적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 제 8 장 Tibero Standby Cluster 177
제 9 장 Tibero Cluster Manager 본장에서는 Tibero Cluster Manager 의기본개념과동작모드, 멤버십관리, 환경설정및실행방법을설 명한다. 9.1. 개요 Tibero Cluster Manager( 이하 TBCM) 는클러스터 (Cluster) 의가용성을높이고관리의편의를지원하는 Tibero의부가기능이다. TBCM은클러스터에속한전체노드의 Tibero 서버의동작상태를지속적으로파악한다. 구체적으로클러스터를구성하는 TBCM의노드들은네트워크또는공유디스크를통해주기적으로자신이살아있음을알리는 heartbeat 메시지를서로주고받으면서주변노드들의상태를파악한다. 클러스터의특정노드에서동작하고있는 Tibero 서버가비정상적인경우에는, TBCM이감지하여클러스터의멤버십구성을자동으로변경한다. 즉전체클러스터의서비스가중단되지않도록하기위해서이다. 9.2. TBCM 의동작모드 TBCM 의동작모드는다음과같이두가지로구성된다. 동작모드 ACTIVE_SHARED 설명 SHARED 접미사를가지는동작모드는공유디스크에 TBCM 클러스터파 일을저장하여클러스터를관리한다. ACTIVE_SHARED 동작모드는 TAC (Tibero Active Cluster) 를위해사용하는모드로, 공유디스크를기반으로구성한클러스터에속하는모든노드의 Tibero가클러스터서비스에함께참여한다. 서비스중에특정노드가동작을멈춰도나머지노드의서비스가중지되지않도록클러스터의구성을자동으로변경시키는기능을수행한다. ACTIVE_REPLICATION REPLICATION 접미사를가지는동작모드는공유디스크대신 TBCM 코 디네이터데몬을이용하여클러스터를관리한다. ACTIVE_REPLICATION 동작모드는 Tibero MMDB를위해사용하는모드로, 이중화기능으로연결된클러스터에서서비스하는특정노드가동작을멈춰도나머지노드의서비스가중지되지않도록클러스터의구성을자동으로변경시키는기능을수행한다. 자세한내용은 "Tibero MMDB 관리자안내서 " 를참고한다. 제 9 장 Tibero Cluster Manager 179
9.3. TBCM 의멤버십관리 TBCM에서멤버십 (Membership) 을관리하는방법은다음과같다. 자동멤버십관리자동멤버십관리방법으로 TBCM 클러스터파일을생성한경우에는, 별도의멤버십변경작업을하지않아도, 새로운노드에 TBCM 데몬을실행한경우동작중인클러스터멤버십에자동으로참여할수있다. TBCM 클러스터파일을생성할때, CM_NODES 초기화파라미터를설정하지않으면자동멤버십관리방법으로 TBCM 클러스터파일이생성된다. 수동멤버십관리수동멤버십관리방법으로 TBCM 클러스터파일을생성한경우에는, TBCM의클러스터에새로운 TBCM 노드를추가할때반드시수동으로멤버십변경작업을먼저수행해야새로운노드가멤버십에참여할수있다. 새로운 TBCM에노드를추가또는삭제하기위해서는 tbcm -n 명령어를이용하여해당노드를기존의 TBCM 클러스터에수동으로등록하거나삭제해야한다. 자세한내용은 9.6. TBCM의실행 을참고한다. 9.4. TBCM 의환경설정 TBCM 은 Tibero 와환경변수및환경설정파일을공유한다. 따라서 TB_HOME, TB_SID 환경변수를설 정하고 TBCM 을사용하기위한초기화파라미터를 $TB_SID.tip 파일에설정해야한다. 9.4.1. 환경변수설정 환경변수를설정하는방법은다음과같다. $TB_HOME Tibero가설치된경로를지정한다. TB_HOME=/home/tibero/tibero4 $TB_SID 노드를식별할수있는 ID 를지정한다. 각노드는서로다른값을가져야한다. TB_SID=tac 180 Tibero 관리자안내서
9.4.2. 환경설정파일의설정 TBCM 을사용하기위해서는 $TB_SID.tip 환경설정파일에초기화파라미터를설정해야한다. 다음은 TBCM 의동작모드별로 TBCM 의사용환경을설정하는예이다. ACTIVE_SHARED 모드 <$TB_SID.tip> # 필수입력항목 CM_CLUSTER_MODE=ACTIVE_SHARED CM_PORT=6000 LOCAL_CLUSTER_ADDR=192.168.1.1 LOCAL_CLUSTER_PORT=8000 CM_FILE_NAME=/path/to/cm/file # 선택입력항목 CM_NAME=node1 CM_NODE_ID=1 CM_NODES=node1@192.168.1.1:8000;node2@192.168.1.2:8000 CM_TIME_UNIT=10 CM_HEARTBEAT_EXPIRE=300 CM_WATCHDOG_EXPIRE=200 CM_DOWN_CMD=/path/to/cm_down_cmd.sh LOCAL_CLUSTER_VIP=192.168.100.1 LOCAL_CLUSTER_NIC=eth0 LOCAL_CLUSTER_VIP_NETMASK=255.255.255.0 LOCAL_CLUSTER_VIP_BROADCAST=192.168.100.255 LOG_LVL_CM=2 CM_LOG_DEST=/path/to/log/cm/ CM_LOG_FILE_SIZE=10485760 CM_LOG_TOTAL_SIZE_LIMIT=4294967296 ACTIVE_REPLICATION 모드 다음은코디네이터노드의환경설정한예이다. <$TB_SID.tip> # 필수입력항목 CM_CLUSTER_MODE=ACTIVE_REPLICATION CM_PORT=6000 LOCAL_CLUSTER_ADDR=192.168.1.1 CM_FILE_NAME=/path/to/cm/file CM_COORDINATOR_MODE=Y # 선택입력항목 제 9 장 Tibero Cluster Manager 181
CM_NAME=coordinator CM_NODE_ID=1 CM_TIME_UNIT=10 CM_HEARTBEAT_EXPIRE=300 LOG_LVL_CM=2 CM_LOG_DEST=/path/to/log/cm/ CM_LOG_FILE_SIZE=10485760 CM_LOG_TOTAL_SIZE_LIMIT=4294967296 ACTIVE_REPLICATION 모드 다음은 Worker 노드의환경설정에대한예이다. <$TB_SID.tip> # 필수입력항목 CM_CLUSTER_MODE=ACTIVE_REPLICATION CM_PORT=7000 LOCAL_CLUSTER_ADDR=192.168.1.2 CM_FILE_NAME=/path/to/cm/file CM_COORDINATOR_NAME=coordinator@192.168.1.1:6000 # 선택입력항목 CM_NAME=worker1 CM_NODE_ID=10 CM_TIME_UNIT=10 CM_HEARTBEAT_EXPIRE=300 CM_DOWN_CMD=/path/to/cm_down_cmd.sh LOCAL_CLUSTER_VIP=192.168.100.1 LOCAL_CLUSTER_NIC=lan1 LOCAL_CLUSTER_VIP_NETMASK=255.255.255.0 LOCAL_CLUSTER_VIP_BROADCAST=192.168.100.255 LOG_LVL_CM=2 CM_LOG_DEST=/path/to/log/cm/ CM_LOG_FILE_SIZE=10485760 CM_LOG_TOTAL_SIZE_LIMIT=4294967296 9.4.3. 환경설정파일의초기화파라미터 다음은 TBCM 를사용하기위해 $TB_SID.tip 환경설정파일에설정할수있는초기화파라미터에대한설 명이다. 초기화파라미터 CM_CLUSTER_MODE 설명 필수입력항목으로, TBCM 의동작모드를설정한다. 다음의값중에서하나를선택하여설정할수있다. 182 Tibero 관리자안내서
초기화파라미터 설명 - ACTIVE_SHARED - ACTIVE_REPLICATION CM_PORT CM_FILE_NAME 필수입력항목으로, TBCM 데몬에서접속을받는용도로사용하는포트번호이다. ( 기본값 : LISTENER_PORT + 3) 필수입력항목으로, 현재동작중인클러스터의상태를저장하는 TBCM 클러스터파일의경로명을설정한다. TBCM 클러스터파일은 tbcm -c 명령어로생성된다. 자세한내용은 9.6. TBCM 의실행 을참고한다. TBCM의동작모드에따라 TBCM 클러스터파일의경로명을설정하는방법은다음과같다. - ACTIVE_SHARED: TBCM 클러스터파일로할당된공유디스크파티션의경로명을설정한다. 만약클러스터파일시스템을사용하는환경이라면, 클러스터파일시스템상의파일경로명을설정한다. - ACTIVE_REPLICATION: 각로컬디스크에서클러스터의구성정보를임시로저장할파일의경로명을설정한다. LOCAL_CLUSTER_ADDR 필수입력항목으로, 각각의노드에서 TBCM 데몬간의통신을위해 사용하는개인 IP(Private IP) 를설정한다. TBCM 데몬간의통신뿐만아니라, 클러스터를구성하는 Tibero 서 버간의통신 ( 또는클러스터를구성하는 Tibero MMDB 서버간의 통신 ) 을위해서도사용된다. LOCAL_CLUSTER_PORT CM_NAME 클러스터를구성하는 Tibero 서버간의통신 ( 또는클러스터를구성하는 Tibero MMDB 서버간의통신 ) 을위해사용되는포트번호를설정한다. 클러스터에서각각의노드를구분하기위해노드식별이름에서사용될접두사를설정한다. 생략하면, 기본값은 tbcm으로설정된다. 노드식별이름은다음과같은형태로설정한다. [ 노드이름 ]@[IP 주소 ]:[ 포트번호 ] - [ 노드이름 ]: CM_NAME 초기화파라미터로설정된문자열로, 설정하지않을경우 tbcm이라는문자열이설정된다. - [IP 주소 ]: LOCAL_CLUSTER_ADDR 초기화파라미터에설정된 IP 주소이다. 제 9 장 Tibero Cluster Manager 183
초기화파라미터 설명 - [ 포트번호 ]: CM_PORT 초기화파라미터에설정된포트번호이다. 예를들어, 다음과같이설정이된경우해당노드의식별이름은 node1@192.168.1.1:8000 이된다. - CM_NAME=node1 - LOCAL_CLUSTER_ADDR=192.168.1.1 - CM_PORT=8000 CM_NODE_ID Tibero MMDB 에서각각의노드를구분하기위해숫자로설정한 ID 이다. Tibero MMDB의경우각노드의 TBCM 데몬은노드식별이름이외에도노드 ID라는숫자를통해각노드를구분한다. 본초기화파라미터를설정하지않은노드의경우는, TBCM 데몬을부팅할때클러스터내에서유일한노드 ID를자동으로부여받게된다. 반면에, TBCM 데몬의노드 ID를사용자가설정하기위해서는 CM_NODE_ID 초기화파라미터에설정된해당노드 ID를설정하면된다. 전체클러스터에참여한 TBCM 데몬의모든노드 ID는유일해야하므로, 동작중인클러스터의다른노드에서해당 CM_NODE_ID 초기화파라미터에설정된노드 ID를사용중이라면 TBCM을부팅할때에러가발생된다. CM_NODES 수동멤버십관리방법으로 TBCM 클러스터파일을생성할때설정 한다. 자세한내용은 9.3. TBCM 의멤버십관리 를참고한다. 세미콜론 (;) 으로각노드식별이름을구분하여, 다음과같이표현한다. CM_NODES="node1@192.168.1.1:8000; node2@192.168.1.2:8000;node3@192.168.1.2:8001" CM_TIME_UNIT TBCM 에서사용하는디폴트시간단위 (1 tick) 를설정한다. TBCM 은단위시간마다자신의노드에설치된 Tibero 서버와다른 노드의현재상태를확인한다. 시간은 0.1 초단위로설정한다. ( 기본 값 : 10(= 1 초 )) CM_HEARTBEAT_EXPIRE heartbeat 의제한시간을설정한다. 184 Tibero 관리자안내서
초기화파라미터 설명 본초기화파라미터로설정된시간동안 heartbeat 이전달되지않는 노드가있는경우, 다른노드의 TBCM 데몬은해당노드를장애상 태로판단한다. ( 기본값 : 300 ticks) TBCM의동작모드에따라 hearbeat의제한시간을설정하는방법은다음과같다. - ACTIVE_SHARED: TBCM 데몬간에는네트워크및공유디스크를통해 heartbeat을전달하여각노드의 Tibero의동작상태를파악한다. - ACTIVE_REPLICATION: 공유디스크대신코디네이터노드 (Coor dinator Node) 를이용하여 heartbeat을전달한다. CM_WATCHDOG_EXPIRE ACTIVE_SHARED 모드의경우디스크 I/O 장애등으로인해 TBCM 데몬의동작이멈출수있다. 정상적인다른노드에서는비정상적인노드의 TBCM 데몬이 heartbeat을보내지못하기때문에비정상적인노드를시스템중단상태라고판단하고, 해당노드의 Tibero 서버를제외하고새로운멤버십구성을하게된다. 만약비정상적인노드의 Tibero 서버가여전히공유디스크를계속이용하여작업을수행중이라면, 다른노드의멤버십상태와불일치가발생하게된다. 이로인해데이터베이스의일관성이문제가된다. 이러한현상을해결하기위해서 TBCM은 Watchdog이라는기능을제공한다. 본초기화파라미터에설정된시간동안 TBCM 데몬이반응이없을경우해당노드의 Tibero 서버는동작을자동으로멈추고셧다운 (shutdown) 을한다. 예를들어, CM_WATCHDOG_EXPIRE 초기화파라미터에설정된값을 CM_HEARTBEAT_EXPIRE 초기화파라미터보다작게설정했을경우, 정상적인다른노드에서비정상적인노드의 heartbeat에대한타임아웃이발생하게되면, 해당노드에서 Watchdog 기능에의해 Tibero 서버가반드시셧다운하였음을보장받을수있다. ( 기본값 : 290 ticks) CM_DOWN_CMD 클러스터를구성하는노드간의통신에사용되는 interconnect 네트 워크의연결이끊어진경우에는 Tibero 의서비스가중단되는현상이 발생할수있는데, 이를 split brain 현상이라고한다. TBCM 은 split brain 현상이발생했는지를감시한다. split brain 현상 이발생했을때, 문제가되는노드의 Tibero 서버를강제로종료시킨 다. 이를통해나머지노드는서비스를지속적으로제공할수있다. 제 9 장 Tibero Cluster Manager 185
초기화파라미터 설명 이때, 본초기화파라미터에설정된스크립트파일을이용하여문제가되는노드의 Tibero를강제적으로종료시킨다. Tibero를관리하는시스템관리자는반드시본초기화파라미터에설정된스크립트파일의명령이정상적으로동작하는지를사전에반드시확인해야한다. ( 기본값 : "$TB_HOME/scripts/tbcm_down_cmd.sh") CM_COORDINATOR_MODE ACTIVE_REPLICATION 모드에서만사용되는초기화파라미터로, 공유디스크가존재하지않는경우별도의코디네이터노드 (Coordi nator Node) 로동작하는 TBCM 데몬이필요하다. 각노드별 TBCM 데몬은코디네이터노드를통해서클러스터의구성정보를공유한다. 코디네이터노드로동작할 TBCM의경우본초기화파라미터의값을 Y로설정해야하며, Worker 노드 ( 코디네이터노드가아닌나머지노드 ) 의경우본초기화파라미터를설정하지않거나, 값을 N으로설정해야한다. 이때코디네이터노드가아닌다른노드의경우에는코디네이터노드의노드식별이름을설정해야한다. ( 기본값 : N) 이설정을할경우, TBCM을반드시 OS 관리자권한으로기동시켜야한다. CM_COORDINATOR_NAME ACTIVE_REPLICATION 모드에서동작하는클러스터에서코디네 이터노드이외의 Worker 노드에서코디네이터노드의노드식별이 름을설정한다. Worker 노드에서는반드시코디네이터노드의노드식별이름을미 리설정해야만 TBCM 이정상적으로동작한다. LOCAL_CLUSTER_VIP 클러스터를구성하는 Tibero 서버가가상 IP 주소를이용하여서비 스하는경우, LOCAL_CLUSTER_VIP 초기화파라미터에각각의노 드에서사용할가상 IP 주소를설정한다. 클러스터를구성할때특정한노드에서장애가발생한경우나머지노드로, 클라이언트접속을 Failover 하게되는데, 기존에연결된클라이언트의네트워크접속을빠르게 Failover 하기위해서는가상 IP 를이용한 Failover 기능을구성해야한다. LOCAL_CLUSTER_NIC 각각의 Tibero 서버의노드가가상 IP 주소를이용해서비스를하는 경우, 로컬서버에서가상 IP 를할당할 NIC 의이름을반드시설정한 다. 186 Tibero 관리자안내서
초기화파라미터 LOCAL_CLUSTER_VIP_NETMASK LOCAL_CLUSTER_VIP_BROAD CAST LOG_LVL_CM 설명 각각의 Tibero 서버의노드가가상 IP 주소를이용해서비스를하는경우, 로컬서버에서가상 IP의네트워크마스크 (network mask) 를설정한다. 각각의 Tibero 서버의노드가가상 IP 주소를이용해서비스를하는경우, 로컬서버에서가상 IP의 broadcasting 주소를설정한다. TBCM 로그의출력레벨을설정한다. 1 ~ 6 사이의값중에서설정할수있으며, 값이클수록더많은로그 가출력된다. ( 기본값 : 2) CM_LOG_DEST TBCM 로그가저장되는파일의디렉터리경로이다. 단, 절대경로로 설정을해야한다. ( 기본값 : $TB_HOME/instance/$TB_SID/log/tbcm/) CM_LOG_FILE_SIZE TBCM 로그파일하나의최대크기를설정한다. TBCM 로그파일의크기가설정된값보다커지면, 현재의로그파 일을백업하고새로운로그파일을생성한다. ( 기본값 : 10MB) CM_LOG_TOTAL_SIZE_LIMIT CM_LOG_DEST 초기화파라미터로설정된디렉터리에저장되는각 로그파일의크기를합한총합의크기이다. 설정값을초과하는로그가발생하는경우, 가장오래된로그파일을 삭제하고새로운로그파일을생성한다. ( 기본값 : 4GB) CM_FENCE ACTIVE_SHARED 모드에서공유스토리지와물리적연결이끊어 진장애가발생할경우, TBCM 과서버가공유스토리지에파일을제 대로읽거나쓸수가없어멈추어있을가능성이있다. CM_FENCE 기능을켜면이러한장애상황을감지하는 IO fence 데몬이독립적으로실행되어, 장애가발생한경우로간주하여데이베이스를보호하기위하여시스템를강제로재부팅시켜준다. IO fence 데몬의장애감지와관련된파라미터는 CM_WATCH DOG_EXPIRE이다. IO fence 데몬은 TBCM으로부터 CM_WATCH DOG_EXPIRE( 초 ) 만큼의시간동안 heartbeat를전달받지못하는경우장애로판단한다. 이설정을할경우, TBCM을반드시 OS 관리자권한으로기동시켜야한다. ( 기본값 : N) 제 9 장 Tibero Cluster Manager 187
9.5. VIP 9.5.1. VIP 설정 Tibero는 VIP(Virtual IP) 를이용하여서비스를할수있다. 가상 IP를이용하여서비스를하고자할경우, 아래와같은관련된초기화파라미터를설치환경에맞게설정해주어야한다. LOCAL_CLUSTER_VIP=192.168.100.1 LOCAL_CLUSTER_NIC=eth0 LOCAL_CLUSTER_VIP_NETMASK=255.255.255.0 LOCAL_CLUSTER_VIP_BROADCAST=192.168.100.255 TBCM은 OS 명령을통해서시스템에 VIP를설정하고해제한다. 따라서 VIP 기능을사용하기위해서 TBCM은 OS의관리자권한으로실행되어야한다. 위와같은초기화파라미터를설정한후, TBCM을관리자권한으로기동시키면해당시스템에 VIP가추가되며, ifconfig 와같은 OS 명령을통해서이를확인할수있다. 9.5.2. VIP failover 클러스터의특정노드에서장애가발생하여그노드의 TBCM까지죽은경우, 정상적으로작동하는노드들중에한노드의 TBCM이죽은노드의 VIP를자신의돌고있는시스템에설정한다. 이를통해서 Tibero 는죽은노드의 VIP로도계속해서서비스를할수있다. 만약죽은노드가다시살아나면죽은노드의 VIP 를자신의시스템에설정했던 TBCM은그 VIP를해제하고, 살아난노드의 TBCM은 VIP를자신의시스템에다시설정한다. 9.6. TBCM 의실행 TBCM를실행하기위해서는반드시 TB_HOME 과 TB_SID 환경변수가적절히설정되어있는지를먼저확인해야한다. 자세한내용은 9.4. TBCM의환경설정 을참고한다. TBCM의실행파일은 $TB_HOME/bin 디렉터리에있는 tbcm 파일이다. tbcm 파일의사용방법은다음과같다. $ tbcm [ 옵션 ] [ 추가모드 ] tbcm 파일은다음의옵션과함께실행할수있다. 옵션 -b [LOCK UNLOCK] 설명 TBCM 데몬을실행한다. $TB_SID.tip 환경설정파일에설정한초기화파라미터에따라동작한다. TBCM 데몬이이미동작중인경우, 같은포트번호로데몬을실행하는것은불가능하 188 Tibero 관리자안내서
옵션 설명 다. 이러한경우에는기존의 TBCM 데몬을종료시키거나 $TB_SID.tip 환경설 정파일에서포트번호를수정한후다시실행해야한다. 다음은 -b 옵션에서추가적으로사용할수있는모드이다. - LOCK: TBCM 데몬이 Tibero를강제종료시키지못하는 command lock 모드로 TBCM 데몬을부팅한다. - UNLOCK: 기본값으로, TBCM 데몬이 CM_DOWN_CMD 초기화파라미터를이용하여 Tibero를강제로종료할수있는 command unlock 모드로 TBCM 데몬을부팅한다. ( 예 : tbcm -b LOCK) -d TBCM 데몬을종료시킨다. TBCM 데몬이실행중이지않을때는에러가출력된다. ( 예 : tbcm -d) -s TBCM 데몬이실행중인경우, 현재클러스터의상태정보를화면에출력한다. TBCM 데몬이실행중이지않을때는에러가출력된다. $TB_HOME/scripts 디렉터리에있는 cm_stat.sh 스크립트파일을실행시키면 1초에한번씩주기적으로 tbcm -s 명령어가실행되므로클러스터의상태변화를지속적으로확인할수있다. ( 예 : tbcm -s) -v TBCM 의버전정보를출력한다. ( 예 : tbcm -v) -l TBCM 데몬이실행중일때, TBCM 이 Tibero 를강제로종료시키지못하도록 command lock 모드로변경한다. ( 예 : tbcm -l) -u TBCM 이 Tibero 를자동으로종료시킬수있도록 command unlock 모드로변 경한다. ( 예 : tbcm -u) -c TBCM 에서클러스터의구성상태를저장하는 TBCM 클러스터파일의내용을 초기화시킨다. 만약 CM_FILE_NAME 초기화파라미터에설정된파일이존재하지않는경우, 해당파일을생성한후초기화를한다. 한번초기화된내용은이전상태로복구 할수없으므로, 주의해야한다. 이미클러스터가구성된 TBCM 데몬이실행 제 9 장 Tibero Cluster Manager 189
옵션 설명 중이라면, -c 옵션으로 TBCM 클러스터파일을초기화하는것은데이터베이 스의정합성을해칠수있으므로주의해야한다. ( 예 : tbcm -c) -n 동작중인 TBCM 클러스터에새로운노드를추가하거나, 이미클러스터에포 함된노드를삭제한다. TBCM 클러스터가수동멤버십관리방법으로동작중인경우에는반드시본옵션을통해노드를추가하거나삭제해야한다. 예를들면다음과같다. - 노드추가 : tbcm -n add node1@192.168.1.1:8000 - 노드삭제 : tbcm -n del node2@192.168.1.2:8000 190 Tibero 관리자안내서
제 10 장 Tibero Active Cluster 본장에서는 Tibero Active Cluster 의기본개념과구성요소, 프로세스, 실행및운영방법을설명한다. 10.1. 개요 Tibero Active Cluster ( 이하 TAC) 는확장성, 고가용성을목적으로제공하는 Tibero의주요기능이다. TAC 환경에서실행중인모든인스턴스는공유된데이터베이스를통해트랜잭션을수행하며, 공유된데이터에대한접근은데이터의일관성과정합성유지를위해상호통제하에이뤄진다. 큰업무를작은업무의단위로나누어여러노드사이에분산하여수행할수있기때문에업무처리시간을단축할수있다. 여러시스템이공유디스크를기반으로데이터파일을공유한다. TAC 구성에필요한데이터블록은노드간을연결하는고속사설망을통해주고받음으로써노드가하나의공유캐시 (shared cache) 를사용하는것처럼동작한다. 운영중에한노드가멈추더라도동작중인다른노드들이서비스를지속하게된다. 이러한과정은투명하고신속하게처리된다. 10.2. 구성요소 다음은 TAC 의구조를나타내는그림이다. [ 그림 10.1] TAC 의구조 제 10 장 Tibero Active Cluster 191
TAC 의구조는다음과같은모듈로구성되어있다. CWS(Cluster Wait-lock Service) 기존 Wait-lock( 이하 Wlock) 이클러스터내에서동작할수있도록구현된모듈이다. Distributed Lock Manager( 이하 DLM) 이내장되어있다. Wlock은 GWA를통해 CWS에접근할수있으며, 이와관련된배경프로세스로는 LASW, LKDW, RCOW 이존재한다. Tibero 3에서는 Wlock이싱글인스턴스의리소스만보호했으나, 멀티인스터스를지원하는 TAC 환경에서는 CWS를통해다른노드와의동기화를통제할수있다. GWA(Global Wait-lock Adapter) Wlock은 CWS를사용하기위한인터페이스역할을수행하는모듈이다. CWS에접근하기위한핸들인 CWS Lock Status Block( 이하 LKSB) 과파라미터를설정하고관리한다. Wlock에서사용하는잠금모드 (Lock mode) 와타임아웃 (timeout) 을 CWS에맞게변환하며, CWS에서사용할 Complete Asynchronous Trap( 이하 CAST), Blocking Asynchronous Trap( 이하 BAST) 을등록할수있다. CCC(Cluster Cache Control) 데이터베이스의데이터블록에대한클러스터내접근을통제하는모듈이다. DLM이내장되어있다. CR Block Server, Current Block Server, Global Dirty Image, Global Write 서비스가포함되어있다. Cache layer에서는 GCA(Global Cache Adapter) 를통해 CCC에접근할수있으며, 이와관련된배경프로세스로 LASC, LKDC, RCOC 이존재한다. GCA(Global Cache Adapter) Cache layer에서 CCC 서비스를사용하기위한인터페이스역할을수행하는모듈이다. CCC에접근하기위한핸들인 CCC LKSB와파라미터를설정하고관리하며, Cache layer에서사용하는 block lock mode를 CCC에맞게변환한다. CCC의 lock-down event에맞춰데이터블록이나 Redo 로그를디스크에저장하는기능과 DBWR가 Global wirte를요청하거나 CCC에서 DBWR에게 block write를요구하는인터페이스를제공한다. CCC에서는 GCA를통해 CR block, Global dirty block, current block을주고받는다. MTC(Message Transmission Control) 노드간의통신메시지의손실과 out-of-order 문제를해결하는모듈이다. 문제를해결하기위해 retransmission queue 와 out-of-order message queue 를관리한다. 192 Tibero 관리자안내서
General Message Control(GMC) 을제공하여, CWS/CCC 이외의모듈에서노드간의통신이안전하게이루어지도록보장한다. 현재 Inter-instance call(iic), Distributed Deadlock Detection( 이하 DDD), Automatic Workload Man agement에서노드간의통신을위해 GMC를사용하고있다. INC(Inter-Node Communication) 노드간의네트워크연결을담당하는모듈이다. INC를사용하는사용자에게네트워크토폴로지 (network topology) 와프로토콜을투명하게제공하며 TCP, UDP등의프로토콜을관리한다. NMS(Node Membership Service) TBCM으로부터전달받은정보 (node id, ip address, port, incarnamtion number) 와 node workload를나타내는가중치 (weight) 를관리하는모듈이다. node membership의조회, 추가, 삭제기능을제공하며이와관련된배경프로세스로 NMGR이있다. 10.3. 프로세스 TAC 는 8개의프로세스가추가로생성된다. 이러한프로세스는다음과같은그룹에각각포함된다. Active Cluster Server(Message handler) ACSn 클러스터내의원격노드로부터 CWS/CCC의 lock operation과 reconfiguration 요청 (request) 을받아처리하고응답하는프로세스이다. ACSn 프로세스는다음과같은특징이있다. CR block request를받아주어진스냅샷 (snapshot) 에해당하는 CR block을생성하고요청자에게전송한다. Current block request를받으면 local block cache에존재하는 Current block을읽어서요청자에게전송한다. global write request를받아주어진데이터블록이 dirty이면 BLKW가이를디스크에기록하도록지시한다. MTC IIC request를받아처리한다. MLD(Master Lookup Directory) lookup/remove request를받아처리한다. ACS는여러개가실행될수있기때문에숫자 (1, 2, 3,..., n) 로구분한다. 네종류의스레드 (thread) 로구성된다. 제 10 장 Tibero Active Cluster 193
스레드 acfm (active cluster frame monitor) 설명 ACS 의메인스레드로서, 나머지스레드를감독한다. - stop - resume - kill dspc(dispatcher) rcvr(receiver) 원격노드로부터메시지가도착하기를기다리며, 메시지가도착하면해당소 켓을 rcvr 스레드로전달한다. dspc 스레드로부터받은소켓을읽어서해당메시지의요청을처리한다. rcvr 스레드는모든 dspc 스레드로부터사용할수있는공통풀 (pool) 로생성 되며, ACF_RCVR_CNT 초기화파라미터에설정된값만큼생성된다. sndr(sender) 세션으로부터전송해야할메시지를넘겨받고, 보내야할원격노드의소켓 을찾아네트워크로보내는역할을수행한다. Lock Assistant Server LASW, LASC CWS/CCC에서세션을담당하는워킹스레드가처리해야할비동기적업무를대신수행하는프로세스이다. LASW, LASC 프로세스는다음과같은특징이있다. BAST를맞거나스스로잠금을설정할때, 캐시된 lock mode를 downgrade하기전에 BLKW로부터 disk write notification이나 LOGW로부터 log flush를기다린후, master에게 lock downgrade를통보한다. ( 이특징은 LASC 프로세스만이수행할수있다.) BLKW가 master로부터받은 global write request 처리를완료한후 LASC에게통보해준다. 또한, master에게 write done notify를보낸다. 이특징은 LASC 프로세스만이수행할수있다. shadow resource block를 reclaim하기전에 master에게 MC lock에대한제거요청을보낸다. 요청을보낸후, 이에대한응답을받아서처리한다. Lock Daemon LKDW, LKDC 주기적으로 lock resource을관리하고타임아웃을체크하는프로세스이다. LKDW, LKDC 프로세스는다음과같은특징이있다. DDD(Distributed Deadlock Detection) 를수행하기위해주기적으로타임아웃이발생한 lock waiter 를체크한다. 체크시교착상태가발생하면 DDD를시작한다. 194 Tibero 관리자안내서
MTC retransmission queue에설정된메시지를주기적으로검사해서타임아웃이발생한메시지를다시전송한다. 주기적으로 TSN의동기화를수행한다. ( 이특징은 LKDW 프로세스만이수행할수있다.) lock resource를위한공유메모리가부족하게되면 resource block reclaiming을시작하여필요한리소스를확보한다. Reconfiguration process RCOW, RCOC NMGR 프로세스로부터 node join 및 leave event를받아 CWS/CCC lock remastering/recovery을수행한다. Node Manager NMGR TBCM과통신하여 node join 및 leave event를받아처리하며, node membership을관리한다. 또한, RCOC, RCOW 프로세스에의해수행되는 CWS/CCC reconfiguration을통제 (suspend 또는 resume) 한다. 10.4. TAC 환경설정 TAC 는기본적으로싱글인스턴스일때의설정은그대로사용한다. 이외에는추가로설정해야할초기화파라미터와주의사항이있다. 다음은 TAC 를사용하기위해추가로설정해야하거나주의해야하는초기화파라미터의예이다. <$TB_SID.tip> TOTAL_SHM_SIZE=4096M DB_CACHE_SIZE=2048M CLUSTER_DATABASE=Y THREAD=0 UNDO_TABLESPACE=UNDO0 LOCAL_CLUSTER_ADDR=192.168.1.1 LOCAL_CLUSTER_PORT=12345 CM_CLUSTER_MODE=ACTIVE_SHARED 초기화파라미터 TOTAL_SHM_SIZE 설명 인스턴스가사용할전체공유메모리의크기를설정한다. 제 10 장 Tibero Active Cluster 195
초기화파라미터 DB_CACHE_SIZE CLUSTER_DATABASE 설명 TAC 는버퍼캐시이외에도사용하는공유메모리가많다. 따라서버퍼캐시의크기를싱글인스턴스의경우보다더작게설정해야한다. 일반적으로전체공유메모리크기의절반정도가적절하다. TAC 를사용할때설정한다. 초기화파라미터의값은반드시 'Y' 로설정해야한다. THREAD UNDO_TABLESPACE LOCAL_CLUSTER_ADDR LOCAL_CLUSTER_PORT CM_CLUSTER_MODE Redo 스레드의번호로, 각인스턴스마다고유의번호를부여한다. Undo 테이블스페이스의이름으로, 각인스턴스마다고유하게부여한다. TAC 인스턴스간에통신할내부 IP 주소를설정한다. TAC 인스턴스간에통신할내부포트번호를설정한다. 초기화파라미터의값은반드시 ACTIVE_SHARED로설정해야한다. TBCM 과관련된설명은 제 9 장 Tibero Cluster Manager 를참고한다. 다음은 TAC 를설정할때주의해야할사항이다. Redo 스레드의번호와 Undo 테이블스페이스의이름은동일한데이터베이스를서비스하는서버사이에서유일해야한다. 10.5. TAC 를위한데이터베이스생성 에서생성한이름이어야한다. 모든서버의인스턴스의설정파일에 CONTROL_FILES와 DB_CREATE_FILE_DEST는물리적으로같은파일이거나또는같은디바이스를가리키도록설정해야한다. 10.5. TAC 를위한데이터베이스생성 TAC 는공유디스크기반의클러스터데이터베이스이다. 여러데이터베이스서버의인스턴스가물리적으로같은데이터베이스파일을보고사용하기때문에데이터베이스생성은한서버에서한번만수행하면된다. 모든서버의인스턴스가동일한컨트롤파일및데이터파일을읽고쓰게된다. 반면 TAC 에서는공유디스크에서데이터접근의경합을최소화하기위해 Redo 로그및 Undo에대해서는인스턴스마다별도의파일을가지고있어야한다. Redo 로그및 Undo 정보는각서버의인스턴스들이별도의파일에저장하지만, 복구상황등에따라다른인스턴스의정보를읽어야하므로반드시공유디스크상에존재해야한다. TAC 를위한데이터베이스생성절차는다음과같다. 1. Tibero와관련된환경설정파일을설정한후, TBCM을기동한다. $ tbcm -c... 1... $ tbcm -b LOCK... 2... 1 TBCM 컨트롤파일을초기화하는명령으로, 'y' 를입력하면초기화된다. 196 Tibero 관리자안내서
2 TBCM 을기동했지만, Tibero 를직접제어하지는않는다. 2. NOMOUNT 모드로 Tibero 를기동한다. $ tbboot -t NOMOUNT -c 3. SYS 사용자로접속한후 CREATE DATABASE 문을통해데이터베이스를생성한다. [tibero@tester ~]$ tbsql sys/tibero SQL> CREATE DATABASE "TAC"... 1... USER sys IDENTIFIED BY tibero MAXINSTACE 8... 2... MAXDATAFILES 256 CHARACTER SET MSWIN949 LOGFILE GROUP 0 'log001' SIZE 50M, GROUP 1 'log011' SIZE 50M, GROUP 2 'log021' SIZE 50M MAXLOGFILES 100 MAXLOGMEMBERS 8 NOARCHIVELOG DATAFILE 'system001' SIZE 512M AUTOEXTEND ON NEXT 8M MAXSIZE 3G DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE 'temp001' SIZE 512M AUTOEXTEND ON NEXT 8M MAXSIZE 3G EXTENT MANAGEMENT LOCAL AUTOALLOCATE UNDO TABLESPACE UNDO0 DATAFILE 'undo001' SIZE 512M AUTOEXTEND ON NEXT 8M MAXSIZE 3G EXTENT MANAGEMENT LOCAL AUTOALLOCATE Database created. 1 DB_NAME으로 TAC 를지정한다. 2 접근할서버의최대인스턴스의개수를 8로지정한다. 기존의 CREATE DATABASE 문과비교해달라진부분은없다. 다만, 데이터베이스파일을공유할인스턴스의최대개수를나타내는 MAXINSTANCE 파라미터를주의해야한다. 이파라미터의값은컨트롤파일과데이터파일의헤더등에영향을미치며, 설정된값이상으로 Tibero의인스턴스를추가할수없으므로, TAC 를위해데이터베이스를생성할때, 충분한값을설정해야한다. 앞서설명한것처럼각서버의인스턴스는별도의 Redo 및 Undo 공간을가져야한다. CREATE DATABASE 문을실행한시점에생성된 Undo 테이블스페이스및 Redo 로그파일은첫번째인스턴스를위한것으로다른인스턴스가데이터베이스에접근하기위해서는별도의 Redo 로그그룹과 Undo 테이블스페이스를생성하는것이필요하다. 제 10 장 Tibero Active Cluster 197
생성된 Redo 로그그룹은자동으로 0 번의 Redo 스레드가된다. 따라서 CREATE DATABASE 문을실 행하기전에서버인스턴스의환경설정파일 ($TB_SID.tip) 의 THREAD 초기화파라미터와 UNDO_TA BLESPACE 초기화파라미터는다음과같이설정되어있어야한다. THREAD=0 UNDO_TABLESPACE=UNDO0 4. CREATE DATABASE 문을실행하고나면 Tibero 가자동으로종료된다. Tibero 를다시기동한후, SYS 사용자로접속하여다음과같이 Undo 테이블스페이스와새로운 Redo 로그그룹을만들고 DDL 문장 을수행한다. [tibero@tester ~]$ tbboot [tibero@tester ~]$ tbsql sys/tibero SQL> CREATE UNDO TABLESPACE UNDO1 DATAFILE 'undo011' SIZE 512M AUTOEXTEND ON NEXT 8M MAXSIZE 3G EXTENT MANAGEMENT LOCAL AUTOALLOCATE Tablespace 'UNDO1' created. SQL> ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 3 'log031' size 50M; Database altered. SQL> ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 4 'log041' size 50M; Database altered. SQL> ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 5 'log051' size 50M; Database altered. SQL> ALTER DATABASE ENABLE PUBLIC THREAD 1;... 1... Database altered. 1 Redo 스레드를활성화하는 DDL 문장을실행한다. Redo 로그그룹을추가하기위한기존의 DDL 문장과같지만 THREAD 번호를지정했다는것에주의해야한다. 이예제에서는두번째인스턴스가사용할 Undo 테이블스페이스 UNDO1과 Redo 스레드 1 을위한 Redo 로그그룹을추가하고, 활성화시키는과정을보여주고있다. Redo 스레드는숫자로지정하며, CREATE DATABASE 문을실행할시점에생성한 Redo 로그그룹이 0번스레드가되므로반드시 1부터지정해야한다. 0번스레드는 CREATE DATABASE 문을실행할시점에자동으로활성화된다. 주의할점은 Redo 로그그룹의번호는 Redo 스레드내에서가아니라데이터베이스전체에서유일해야하므로이미사용된 0,1,2를사용할수없다. 또한, 최소한두개이상의 Redo 로그그룹이존재해야만해당 Redo 스레드를활성화시킬수있다. 198 Tibero 관리자안내서
또다른인스턴스를추가하고싶다면, 위와같은과정을참고하여 Undo 테이블스페이스와 Redo 스레 드를생성하고, 스레드를활성화하면된다. 5. TAC raw device 환경또는공유파일시스템이면서 DB_CREATE_FILE_DEST가적절한경로로지정되지않은환경에서는 Tibero가정상적으로기동되지않을수있다. 이와같은경우아래와같이 APM 관련정보를저장할 APM 전용테이블스페이스 (_APM_TS) 를먼저추가해야한다. [tibero@tester ~]$ tbsql sys/tibero SQL> CREATE TABLESPACE _APM_TS DATAFILE '<_APM_TS 위치 >/apm_ts.dtf'...; Tablespace '_APM_TS' created. * 이과정을빠뜨리고다음단계를수행한경우설치안내서의 'Appendix C. TAC 환경구축 - C.4. 설치 후문제해결 ' 부분을참고하기바란다. 6. $TB_HOME/scripts 디렉터리에있는 system.sh 스크립트파일을실행한다. Windows 환경에서는 system.vbs 파일이다. [tibero@tester scripts]$ system.sh $TB_HOME/bin/tbsvr Creating the role DBA... Creating system users & roles... Creating virtual tables(1)... Creating virtual tables(2)... Granting public access to _VT_DUAL... Creating the system generated sequences... Creating system packages: Running /home/tibero/tibero5/scripts/pkg_standard.sql... Running /home/tibero/tibero5/scripts/pkg_dbms_output.sql... Running /home/tibero/tibero5/scripts/pkg_dbms_lob.sql... Running /home/tibero/tibero5/scripts/pkg_dbms_utility.sql... Running /home/tibero/tibero5/scripts/pkg_dbms_obfuscation.sql... Running /home/tibero/tibero5/scripts/pkg_dbms_transaction.sql... Running /home/tibero/tibero5/scripts/pkg_dbms_random.sql... Running /home/tibero/tibero5/scripts/pkg_dbms_lock.sql... Running /home/tibero/tibero5/scripts/pkg_dbms_system.sql... Running /home/tibero/tibero5/scripts/pkg_dbms_job.sql... Running /home/tibero/tibero5/scripts/pkg_utl_raw.sql... Running /home/tibero/tibero5/scripts/pkg_utl_file.sql... Running /home/tibero/tibero5/scripts/pkg_tb_utility.sql... Creating public synonyms for system packages...... 이제다른서버의인스턴스를기동하고, 운영한다. 제 10 장 Tibero Active Cluster 199
10.6. TAC 실행 10.6.1. 실행전준비사항 TAC 는모든인스턴스가같이사용할수있는공유디스크의공간과인스턴스간의통신이가능한네트워크만있으면실행할수있다. TAC 를실행하기전에준비해야할 H/W 요구사항과운영체제설정은다음과같다. 공유디스크의공간 TAC 의실행과운영을위해서는최소 7개의공유파일이필요하다. 컨트롤파일 Redo 로그파일 2개 Undo 로그파일 시스템테이블스페이스파일 임시테이블스페이스파일 TBCM 파일 인스턴스하나를추가할때마다최소 3 개의공유파일이추가로필요하다. Redo 로그파일 2 개 Undo 로그파일 공유디스크의권한 공유파일시스템을사용할경우에는 TAC 가사용할디렉터리의권한을, RAW 파일시스템을사용할경 우에는각 RAW 파일의권한을 TAC 가읽고쓸수있도록설정해야한다. 내부네트워크의설정 TAC 의실행과운영을위해내부네트워크는외부네트워크와분리하는것이데이터베이스성능에좋 다. 내부네트워크의인터페이스와 IP, 속도등을점검한다. 10.6.2. 데이터베이스생성 TAC 를처음기동할때에는데이터베이스를생성해주어야한다. 클러스터로사용할한노드에서생성하면된다. TAC 로 Tibero를기동할때에는 TBCM이필수이므로, TBCM를먼저초기화한후시작하고 Tibero 를 NOMOUNT 모드로기동한다. 200 Tibero 관리자안내서
참고 TBCM를초기화한후, Tibero를처음시작했을때는 node membership을관리하는초기화시간이필요하다. Tibero를너무빨리기동하게되면 TBCM은 node membership에포함되지않은인스턴스로간주하고강제로종료된다. 따라서 15초이상의시간으로기동할것을권장한다. 다음은 TBCM 를초기화하고 Tibero 를 NOMOUNT 모드로기동하는예이다. $tac1> tbcm -c This will erase all contents in [/home/tibero5/instance/cm], and cannot be recovered. Proceed? (y/n) y SUCCESS $tac1> tbcm -b Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero cluster manager started up. Local node name is (cm@xxx.x.x.x:xxxx). $tac1> tbboot -t NOMOUNT listener port = xxxx change core dump dir to /home/tibero5/bin/prof Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started up (NOMOUNT mode). $tac1> NOMOUNT 모드로기동된첫번째 TAC 의인스턴스에접속하여데이터베이스를만든후, 다른클러스터의인스턴스를위한 Redo 로그, Undo 로그를생성한다. 인스턴스의 $TB_SID.tip 환경설정파일에지정한 THREAD, UNDO_TABLESPACE 초기화파라미터의이름과반드시일치해야한다. 10.6.3. TAC 기동 데이터베이스생성과다른인스턴스를위한환경설정파일의생성이모두완료하면, TAC 를기동할수있다. 다음은다른인스턴스를모두실행하고 TBCM, Tibero 순으로 TAC 를기동하는예이다. 제 10 장 Tibero Active Cluster 201
$tac2> tbcm -b Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero cluster manager started up. Local node name is (cm@xxx.x.x.x:xxxx). $tac2> tbboot listener port = xxxx change core dump dir to /home/tibero5/bin/prof Tibero 5 Copyright (c) 2008, 2009, 2011 Tibero Corporation. All rights reserved. Tibero instance started up (NORMAL mode). $tac2> 10.6.4. TAC 모니터링 $TB_HOME/scripts 디렉터리에있는 cm_stat.sh 스크립트파일을통해노드및인스턴스의상태를모니터링할수있다. TAC 에참여한노드의현재상태, IP 정보등을주기적으로확인할수있다. Tibero는글로벌뷰 (Global View) 를제공한다. 싱글인스턴스에서사용하는모든모니터링뷰를 TAC 의인스턴스에서조회할수있다. 다음은모든클러스터에연결되어있는세션을확인하는예이다. tbsql 유틸리티, tbadmin 툴을통해다음과같은 SQL 문장을실행한다. [ 예 10.1] 글로벌뷰의조회 - GV$SESSION SQL> SELECT * FROM GV$SESSION; 10.7. 로드밸런싱 사용자의프로그램은 TAC 를기본적으로하나의 DBMS처럼다룰수있다. 따라서사용자는하나의 DBMS 에접속한것처럼연결을맺고작업을수행하면된다. 장애가발생했을때 Failover 및로드밸런싱기능은클라이언트라이브러리와 TAC 에서자동으로처리된다. 이를위해클라이언트는여러대의이중화서버에접속하는것과같이 Failover와로드밸런싱기능을설정한다. 202 Tibero 관리자안내서
참고 이중화서버를위한클라이언트설정은 A.2. 이중화서버의설정 를, 로드밸런싱설정은 A.3. 로드 밸런싱의설정 를, Failover 설정은 A.4. Failover 의설정 를참고한다. 클라이언트의 LOAD_BALANCE, USE_FAILOVER 설정만으로도기본적인로드밸런싱과 Failover 기능이사용자에게제공된다. 클라이언트는 TAC 를구성하는여러노드중임의의노드를선택하여접속하며, 해당노드에장애가발생했을때다른노드로연결이자동전환된다. 이렇게장애가발생하면수행중이던 SQL 문장에서에러가나며, 다음 SQL부터는새로운노드에서작업이수행된다. 발생하는 SQL은장애유형에따라다르다. 이렇게클라이언트의설정만으로제공되는로드밸런싱기능은별다른부하를발생시키지않는다. 단, 서버의부하상황을고려하지않으므로, 정확한의미의로드밸런싱은아니다. 이것은한꺼번에서버와의연결을많이맺고오래사용하는목적에알맞으며 3-tier(multi-tier) 방식에유용하다. 또한, 서버와의연결과끊김이잦은 2-tier 방식에서도 TAC 서버에로드밸런싱기능을추가하여서버의부하상황을고려하는것이좋다. 다음은서버쪽에로드밸런싱을설정하는가장기본적인예이다. [ 예 10.2] 서버쪽로드밸런싱설정 <$TB_SID.tip> SERVER_SIDE_LOAD_BALANCE=LONG LOAD_METRIC_AUTO_INTERVAL=Y SERVER_LOAD_TOLERANCE=30 초기화파라미터 SERVER_SIDE_LOAD_BAL ANCE 설명 필수항목으로서버쪽에로드밸런싱을하는방법을설정하는파라미 터이다. - NONE: 서버쪽에서는로드밸런싱을하지않는다는의미이다. ( 기본값 ) - SHORT: SQL 문장을수행할때마다서버의연결환경에맞게평균응답시간을기준으로로드밸런싱을한다는의미이다. - LONG: 서버쪽에로드밸런싱이필요하지만, 비교적서버의연결유지시간이긴상황에대비하기위해각서버의연결개수를기준으로로드밸런싱을한다는의미이다. LOAD_METRIC_AUTO_INTER VAL 옵션항목으로서버의부하상황을수집하는것을자동으로할지의여부를결정하는파라미터이다. 이파라미터는부하의변화가많은시간에는자주수집하고반면에부하의변화가거의없는시간에는천천히수집하도록수집주기가자동으로조절된다. 제 10 장 Tibero Active Cluster 203
초기화파라미터 설명 서버쪽에로드밸런싱이시작되면각각의 TAC 서버는주기적으로부하상황을주고받으며이를수집한다. 수집주기는다음의설정에따라다르다. - 수집주기는기본적으로 LOAD_METRIC_COLLECT_INTERVAL_MAX 초기화파라미터에설정된값의한번이다. - 자동주기조절상태 (LOAD_METRIC_AUTO_INTERVAL=Y로설정된경우 ) 라면, LOAD_METRIC_COLLECT_INTERVAL_MIN ~ LOAD_METRIC_COLLECT_INTERVAL_MAX 초기화파라미터에설정된값사이에서수집주기가자동으로결정된다. LOAD_METRIC_COLLECT_ INTERVAL_MIN LOAD_METRIC_COLLECT_ INTERVAL_MAX LOAD_METRIC_HISTORY_ COUNT SERVER_LOAD_TOLERANCE 옵션항목으로자동주기조절상태일때, 자주수집할때의시간간격을설정하는파라미터이다. ( 기본값 : 1초 ) 옵션항목으로자동주기조절상태일때, 천천히수집하도록시간간격을설정하는파라미터이다. ( 기본값 : 10초 ) 옵션항목으로기록할수집된부하정보의개수를설정하는파라미터이다. 수집된부하정보는뷰 (V$INSTANCEMETRIC, V$INSTANCEMET RIC_HISTORY) 를통해확인할수있다. 옵션항목으로서버간의부하상황에대해서어느정도의차이를허용할것인가를설정하는파라미터이다. 약간의차이도허용하지않으면클라이언트의연결이한쪽으로치우치는현상이발생할수있으므로, 이파라미터를설정한다. 다음은 SERVER_SIDE_LOAD_BALANCE 초기화파라미터에설정된값에따라달라지는 SERVER_LOAD_TOLERANCE 초기화파라미터의의미이다. - 초기화파라미터의값이 LONG인경우 : 각서버가담당하는클라이언트의연결개수의차이를의미한다. - 초기화파라미터의값이 SHORT인경우 : 각서버의 SQL 문장에대한평균응답시간의차이를의미한다. ( 단위 : msec) 참고 서버쪽의로드밸런싱은새로연결을시도하는클라이언트에대해서만동작한다. 너무많은부하가 걸리거나너무적게걸리더라도이미맺은연결은강제로끊지않는다. 204 Tibero 관리자안내서
제 11 장데이터암호화 본장에서는 Tibero 에서데이터암호화 (Data Encryption) 기능을사용하고관리하기위한방법을설명한 다. 11.1. 개요 Tibero에서는데이터보안을위해 제5장사용자관리와데이터베이스보안 에서설명한것처럼사용자계정및특권, 역할기능을제공하고있다. 하지만, 데이터베이스내에서데이터에접근하는경우가아니라운영체제에서데이터파일에직접접근하는경우라면위의기능만으로는데이터를안전하게보호할수가없다. 따라서이러한경우에도데이터를보호하기위해서 Tibero는데이터를암호화하여디스크에저장하는기능을제공하고있다. DBA가암호화할데이터 ( 테이블의컬럼또는테이블스페이스 ) 를지정하면, Tibero는데이터를저장할때내부적으로암호화하여저장하고검색할때복호화해서보여준다. 이때사용자나애플리케이션프로그램은데이터의암호화여부를고려할필요가없다. Tibero는다음과같은암호화알고리즘을제공한다. 키워드 DES 3DES168 AES128 AES192 AES256 설명 DES 64 bits key 3 Key Triple DES 168 bits key AES 128 bits key AES 192 bits key AES 256 bits key 11.2. 환경설정 데이터암호화기능을사용하기위해서는우선먼저보안지갑을생성해야한다. 보안지갑은암호화에사용할마스터키를보관하고있다. Tibero는마스터키를이용하여각데이터를암호화할암호화키를생성하고, 이암호화키를이용하여데이터를암호화한다. 데이터암호화를사용하기위해서는다음의절차를수행해야한다. 1. 보안지갑의생성 $TB_HOME/bin/tbwallet_gen 프로그램을실행하고보안지갑의파일이름과패스워드를입력하여보안지갑을생성한다. 제 11 장데이터암호화 205
[ 예 11.1] 보안지갑의생성 $ tbwallet_gen [ Tibero Security Wallet Generator ] Enter wallet file name: TBWALLET Enter wallet password: tibero generate wallet success 2. 보안지갑의위치설정 $TB_SID.tip 파일에 WALLET_FILE 초기화파라미터를추가하여보안지갑의위치를설정한다. [ 예 11.2] 보안지갑의위치설정 <$TB_SID.tip> WALLET_FILE=/path/to/TBWALLET 3. 보안지갑의사용생성한보안지갑을열고데이터암호화기능을사용하려면 DBA 권한을가진사용자가다음의명령을수행해야한다. 단, IDENTIFIED BY 절뒤에입력하는패스워드는보안지갑을생성할때입력했던패스워드를입력한다. [ 예 11.3] 보안지갑열기 SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "tibero"; System altered. 데이터암호화기능을사용하지못하도록보안지갑을닫으려면이역시 DBA 권한을가진사용자가다음의명령을수행해야한다. [ 예 11.4] 보안지갑닫기 SQL> ALTER SYSTEM SET ENCRYPTION WALLET CLOSE; System altered. 주의 보안지갑은데이터베이스인스턴스를종료하면닫히므로, 다시기동할때마다보안지갑을열어야 한다. 206 Tibero 관리자안내서
11.3. 컬럼암호화 컬럼암호화 (Column Encryption) 는테이블의특정컬럼의데이터를암호화하여저장하는기능이다. 컬럼암호화는테이블을생성또는변경하는 DDL 문장을수행할때설정한다. 컬럼암호화를설정할때에는암호화알고리즘과 SALT 옵션을사용할것인지의여부를명시할수있다. 암호화알고리즘은 Tibero에서지원하는범위에서만설정할수있으며, 설정하지않으면 AES192 알고리즘을디폴트로사용한다. 암호화된컬럼은한테이블에여러개가있을수있지만, 한테이블에는하나의암호화알고리즘만사용할수있다. SALT 옵션은같은값의데이터를암호화할때항상같은암호로암호화되지않도록하는기능이다. 이옵션을사용할경우보안의수준을높일수있다. 하지만, SALT 옵션을사용하여암호화한컬럼에는인덱스를생성할수없다. 컬럼암호화를설정할때이옵션을별도로설정하지않아도디폴트는 SALT 옵션을사용한다. 컬럼을암호화하면보안의수준이높아지는장점이있지만, SALT 옵션을사용하지않는컬럼에한해서만인덱스를생성할수있고, 인덱스영역도스캔할수없다는단점이있다. 또한, 해당컬럼에 DML 및 SELECT 명령을실행하면내부에서암호화와복호화를수행하기때문에성능저하가발생한다. 암호화할수있는컬럼의데이터타입은다음과같다. CHAR VARCHAR2 NUMBER DATE TIMESTAMP INTERVAL DAY TO SECOND INTERVAL YEAR TO MONTH RAW NCHAR NVARCHAR2 11.3.1. 암호화컬럼을갖는테이블생성 CREATE TABLE 문에서암호화할컬럼을정의할때 ENCRYPT 절을지정하여테이블을생성한다. [ 예 11.5] 암호화컬럼을갖는테이블생성 - 디폴트암호화옵션 (AES192 알고리즘, SALT) SQL> CREATE TABLE customer ( cust_id CHAR(4) CONSTRAINT cust_id_pk PRIMARY KEY NOT NULL, 제 11 장데이터암호화 207
cust_name VARCHAR(20) NULL, cust_type VARCHAR(18) NULL, cust_addr VARCHAR(40) NULL, cust_tel VARCHAR(15) ENCRYPT NULL, reg_date DATE NULL ); Table 'CUSTOMER' created. 암호화알고리즘은 USING 절을사용하여지정할수있으며, SALT 옵션의사용여부도지정할수있다. 특히암호화알고리즘은한테이블에하나만지정할수있기때문에다른컬럼에또다른알고리즘을지정하면에러가발생한다. [ 예 11.6] 암호화컬럼을갖는테이블생성 - AES256 알고리즘, NO SALT 옵션설정 SQL> CREATE TABLE customer ( cust_id CHAR(4) CONSTRAINT cust_id_pk PRIMARY KEY NOT NULL, cust_name VARCHAR(20) NULL, cust_type VARCHAR(18) NULL, cust_addr VARCHAR(40) ENCRYPT USING 'AES256' NULL, cust_tel VARCHAR(15) ENCRYPT NO SALT NULL, reg_date DATE NULL ); Table 'CUSTOMER' created. 11.3.2. 테이블에암호화컬럼추가 ALTER TABLE 문에서컬럼을추가할때 ENCRYPT 절을지정하면암호화컬럼이된다. 기존테이블에이미암호화컬럼이있으면기존컬럼과동일한암호화알고리즘을사용한다. 반면에암호화컬럼이없으면새로운알고리즘을지정할수있다. 또한, SALT 옵션의사용여부도지정할수있다. [ 예 11.7] 암호화컬럼추가 SQL> ALTER TABLE customer ADD (cust_password VARCHAR(12) ENCRYPT NO SALT); Table 'CUSTOMER' altered. 11.3.3. 일반컬럼을암호화컬럼으로변경 ALTER TABLE 문에서컬럼을변경할때 ENCRYPT 절을지정하면암호화컬럼이된다. 테이블에암호화컬럼을추가할경우와마찬가지로기존테이블에이미암호화컬럼이있으면기존컬럼과동일한암호화알고리즘을사용한다. 반면에암호화컬럼이없으면새로운알고리즘을지정할수있다. 또한, SALT 옵션의사용여부도지정할수있다. 208 Tibero 관리자안내서
[ 예 11.8] 일반컬럼을암호화컬럼으로변경 SQL> ALTER TABLE customer MODIFY (reg_date ENCRYPT NO SALT); Table 'CUSTOMER' altered. 11.3.4. 암호화컬럼을일반컬럼으로변경 ALTER TABLE 문에서컬럼을변경할때 DECRYPT 절을지정하면일반컬럼이된다. [ 예 11.9] 암호화컬럼을일반컬럼으로변경 SQL> ALTER TABLE customer MODIFY (reg_date DECRYPT); Table 'CUSTOMER' altered. 11.3.5. 모든암호화컬럼의알고리즘변경 ALTER TABLE 문에서 REKEY 명령을지정하면해당테이블의모든암호화컬럼의암호화알고리즘이변경된다. [ 예 11.10] 모든암호화컬럼의암호화알고리즘변경 SQL> ALTER TABLE customer REKEY USING '3DES168'; Table 'CUSTOMER' altered. 11.4. 테이블스페이스암호화 테이블스페이스암호화 (Tablespace Encryption) 는컬럼암호화와마찬가지로데이터베이스의데이터를보호하는또다른방법이다. 컬럼암호화와다른점은테이블혹은테이블의컬럼단위가아닌테이블스페이스전체에대해암호화여부와암호화알고리즘을지정한다는것이다. 테이블스페이스암호화와복호화과정은디스크에서읽기와쓰기를한후에바로수행되며, 데이터베이스내부의 SQL 처리또한기존과동일하게진행된다. 이과정때문에컬럼암호화에존재했던제약즉일부타입의컬럼에대해서만컬럼암호화를할수있다거나인덱스영역을스캔할수없다는문제는없어진다. 반면에테이블스페이스의모든데이터블록에암호화와복호화가발생하기때문에테이블스페이스의크기가크거나수정과접근이잦을수록성능저하가높아질수있다. 또한, 컬럼암호화처럼데이터암호화여부를바꿀수없다는문제도있으므로보호할데이터의성격에따라적절한방법을선택해야한다. 11.4.1. 암호화된테이블스페이스의생성 테이블스페이스를생성하는 CREATE TABLESPACE 문에서암호화여부를지정하는 ENCRYPT 절을추가하면그테이블스페이스는암호화된테이블스페이스가된다. 또한, USING를사용하여암호화알고리즘도지정할수있다. 여기서암호화알고리즘은 3DES168, AES128, AES192, AES256 중에서하나만지정할수있다. USING에서 ' 암호화알고리즘 ' 을생략하면 AES128을기본으로사용한다. 제 11 장데이터암호화 209
[ 예 11.11] 암호화된테이블스페이스생성 - 3DES168 알고리즘지정 SQL> CREATE TABLESPACE encrypted_space DATAFILE '/usr/tibero/data/encrypted001.dtf' SIZE 50M AUTOEXTEND ON NEXT 1M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256K ENCRYPTION USING '3DES168' DEFAULT STORAGE (ENCRYPT); Tablespace 'ENCRYPTED_SPACE' created. 암호화된테이블스페이스를생성할때에는다음과같은사항을주의해야한다. 암호화알고리즘지정테이블스페이스암호화에사용할수있는암호화알고리즘의종류가컬럼암호화에비해적다. 따라서 3DES168, AES128, AES192, AES256 이외의암호화알고리즘을지정하게되면암호화된테이블스페이스는생성할수없다. 보안지갑열기암호화된테이블스페이스를생성하기전에반드시보안지갑이열려있어야한다. 보안지갑이열리지않은상태에서 CREATE TABLESPACE 문을실행하게되면다음의예처럼에러가발생하게되고, 테이블스페이스와데이터파일이생성되지않게된다. 따라서이를해결하기위해서는보안지갑을열고, 다시시도하면된다. [ 예 11.12] 암호화된테이블스페이스 - 생성실패 SQL> CREATE TABLESPACE encrypted_space DATAFILE '/usr/tibero/data/encrypted001.dtf' SIZE 50M AUTOEXTEND ON NEXT 1M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256K ENCRYPTION USING '3DES168' DEFAULT STORAGE (ENCRYPT); TBR-12073: wallet not opened. 11.4.2. 암호화된테이블스페이스의변경 암호화된테이블스페이스의저장공간이더필요한경우 ALTER TABLESPACE 문의 ADD DATAFILE 절을이용하여새로운데이터파일을테이블스페이스에추가할수있다. 새로추가된데이터파일은처음테이블스페이스를생성했을때지정한암호화여부와암호화알고리즘의속성을그대로가지게된다. 210 Tibero 관리자안내서
[ 예 11.13] 암호화된테이블스페이스 - 데이터파일추가 SQL> ALTER TABLESPACE encrypted_space ADD DATAFILE '/usr/tibero/data/encrypted002.dtf' SIZE 50M; Tablespace 'ENCRYPTED_SPACE' altered. 일반테이블스페이스를암호화된테이블스페이스로바꾸거나암호화된테이블스페이스를일반테이블스페이스로바꾸는것은불가능하다. 또한, 한테이블스페이스에포함된데이터파일에대해서도암호화여부와암호와알고리즘을다르게지정하는것도불가능하다. 따라서테이블스페이스를생성할때에는이러한사항을고려하고신중히결정해야한다. 이러한사항에도일반테이블스페이스를암호화된테이블스페이스로바꾸기위해서는새로암호화된테이블스페이스를만든다음일반테이블스페이스에포함된데이터를모두암호화된테이블스페이스로옮겨야한다. 11.4.3. 암호화된테이블스페이스의사용 테이블혹은인덱스를생성할때, 암호화된테이블스페이스를지정하면해당세그먼트는물리적으로그테이블스페이스에저장되고, 데이터블록을읽고쓰는과정에서자동으로데이터암호화와복호화가발생한다. [ 예 11.14] 암호화된테이블스페이스 - 테이블생성 SQL> CREATE TABLE customer ( cust_id CHAR(4) NOT NULL CONSTRAINT cust_id_pk PRIMARY KEY, cust_name VARCHAR(20) NULL, cust_type VARCHAR(18) NULL, cust_addr VARCHAR(40) NULL, cust_tel VARCHAR(15) NULL, reg_date DATE NULL ) TABLESPACE secure_space; Table 'CUSTOMER' created. 암호화된테이블스페이스에테이블을생성하고, SQL 문장을통해데이터를조회하고갱신하는과정동안에는보안지갑은항상열려있어야한다. 보안지갑이열리지않은상태에서암호화된테이블스페이스가포함된동작을수행하게되면 [ 예 11.12] 와같은에러가발생한다. 테이블스페이스중에서 SYSTEM, UNDO, TEMP 테이블스페이스는암호화여부를지정할수없다. 즉모든테이블스페이스를암호화할수있는것은아니다. 또한, Redo 로그파일에대해서도암호화여부를지정할수없다. 하지만, 암호화된테이블스페이스에포함된데이터를수정하는과정에서생성된 UNDO, Redo 로그는자동으로암호화되어디스크에저장되고, 이두로그가필요한순간에는자동으로복호화되어데이터베이스내부적으로사용된다. 그리고정렬을수행하는과정에서 TEMP 테이블스페이스에임시로저장되는데이터가암호화된테이블스페이스에속한것이라면 TEMP 영역도자동으로암호화하고복호화된다. 따라서데이터베이스의다른 제 11 장데이터암호화 211
파일 (UNDO, Redo, TEMP 등 ) 을통해암호화된테이블스페이스의데이터가일부라도노출되지않도록 보호할수있다. 11.4.4. 암호화된테이블스페이스의정보조회 Tibero 에서는암호화된테이블스페이스의정보를관리하기위해다음표에나열된뷰를제공하고있다. 뷰 DBA_TABLESPACES 설명 테이블스페이스의전체정보를조회하는뷰이다. ENCRYPTED 컬럼을통해암호화여부를조회할수있다. V$ENCRYPTED_TABLESPACES 암호화된테이블스페이스의정보만을조회하는뷰이다. 테이블스페이스 ID 와암호화알고리즘을조회할수있다. 참고 정적뷰와동적뷰에대한자세한내용은 "Tibero 참조안내서 " 를참고한다. 212 Tibero 관리자안내서
제 12 장통신암호화 본장에서는 Tibero 에서통신암호화기능을사용하고관리하기위한방법을설명한다. 12.1. 개요 Tibero는서버와클라이언트간에송수신되는메시지에대한기밀성을보장하기위하여, 통신암호화기능을제공한다. Tibero의통신암호화기능은 Netscape사의 SSL 통신프로토콜을채택하였으며 Openssl Project에서제공하는라이브러리를사용하여개발되었다. 12.2. 환경설정 통신암호화기능을사용하기위해서는, 통신양자간에보안통신을위한설정이필요하다. 서버에서는보안통신에사용될인증서와개인키를미리소지하고있거나, 없으면새로생성해야한다. 그다음인증서와개인키의위치를환경설정파일에지정해주게되면, 보안통신전용포트가열리게된다. 클라이언트에서는보안통신사용여부를환경설정파일에지정해준다. 이에따라일반혹은보안접속이이루어지게된다. 12.2.1. 개인키및인증서생성 개인키및인증서생성은 X.509 v3(pki ITU-T 표준 ) 을따른다. 개인키및인증서를생성하는방법은다음과같다. [ 예 12.1] 개인키및인증서의생성 $./tb_cert_manager Enter new password: tibero Repeat: tibero Enter basename to make a certificate and a private key.(default: $TB_SID): (enter) TB Enter the number of days to make a certificate valid for.(default: 3650): (enter) 3650 === STEP 1. Generate private key === Generating RSA private key, 1024 bit long modulus...++++++...++++++ e is 65537 (0x10001) 제 12 장통신암호화 213
=== STEP 2. Generate CSR(Certificate Signing Request) === You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]: 82 State or Province Name (full name) [Some-State]: Kyounggi Locality Name (eg, city) []: Seongnam Organization Name (eg, company) [Internet Widgits Pty Ltd]: TIBERO Organizational Unit Name (eg, section) []: RnD Common Name (eg, YOUR name) []: Hong Gil Dong Email Address []: gdhong@tibero.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: (enter) An optional company name []: (enter) === STEP 3. Generate certificate === 입력을마치면전자지갑저장소 ($TB_HOME/config/tb_wallet/) 에다음과같은파일이생성된다. 공개키기반개인키 : [$TB_SID].key 인증서생성요청서 : [$TB_SID].csr 인증서 : [$TB_SID].crt 12.2.2. 개인키및인증서위치설정 $TB_SID.tip 환경설정파일에 CERTIFICATE_FILE과 PRIVKEY_FILE 초기화파라미터를추가하여인증서와개인키의위치를설정한다. [ 예 12.2] 개인키및인증서의위치설정 <$TB_SID.tip> CERTIFICATE_FILE=$TB_HOME/config/tb_wallet/[$TB_SID].crt PRIVKEY_FILE=$TB_HOME/config/tb_wallet/[$TB_SID].key 214 Tibero 관리자안내서
12.2.3. 클라이언트설정 tbdsn.tbr 파일에서통신암호화사용을설정하는방법은다음과같다. [ 예 12.3] 클라이언트설정 <tbdsn.tbr> TB=( (INSTANCE=(HOST= 서버 IP) (PORT= 서버포트 ) (DB_NAME= 데이터베이스이름 ) (USE_SSL=Y) ) ) SID 내의 USE_SSL값을 Y로설정하면통신암호화기능을사용할수있다. 반면에 USE_SSL 초기화파라미터가없거나 Y 외의다른값을입력하면일반접속이된다. PORT는서버포트 (LISTENER_PORT) 를명시하면되는데, 내부적으로 SSL 전용포트 (_LSNR_SSL_PORT = LISTENER_PORT + 2) 가추가지정되게된다. 일반포트를통한통신으로일단 SSL 소켓을생성하기위한핸드쉐이킹을수행하게되고, SSL 소켓이생성된이후에는내부적으로지정된 SSL 전용포트를통해보안통신을하게된다. 제 12 장통신암호화 215
제 13 장 Parallel Execution 본장에서는 Parallel Execution 의기본개념과동작원리를소개하고, 이를유형별로실행하는방법을기술 한다. 13.1. 개요 Parallel Execution( 이하 PE) 은한개의작업을여러개로나누어동시처리를실행하는방법으로, 데이터웨어하우스 (DW: Data Warehouse) 와 BI(Business Information) 를지원하는대용량 DB에서발생하는데이터처리의응답시간을획기적으로줄일수있다. 또한, OLTP (online transaction processing) 시스템에서도배치처리의성능을높일수있다. PE는시스템리소스의활용을극대화하여데이터베이스성능을향상시키고자하는것이기본사상이기때문에, 다음과같은작업에대해성능향상을기대할수있다. 대용량테이블혹은파티션인덱스스캔 (partitioned index scan) 이나조인등의쿼리 대용량테이블의인덱스생성 Bulk insert 나 update, delete Aggregations PE가시스템리소스를최대한활용하는방식인만큼, 잘못사용했을때는리소스고갈로중요한데이터처리가지연되거나, 오히려기대했던성능이나오지못하는경우가발생할수있기때문에사용에주의가필요하다. PE로성능향상을기대할수있는시스템구성과환경은다음과같다. CPU, 클러스터링등시스템측면의 parallel 구성 충분한입출력대역폭 여유있는 CPU 사용률 예 ) CPU 사용량이 30% 이하일때 정렬, 해싱그리고입출력버퍼와같은작업을수행하기충분한메모리 제 13 장 Parallel Execution 217
13.2. Degree of Parallelism Degree of Parallelism( 이하 DOP) 이란하나의연산에얼마나많은시스템리소스를할당하여동시에처리하도록할것인지를결정하기위해사용되는개념으로, 단순하게는하나의연산을함께수행하는워킹스레드 ( 이하 WTHR) 의개수를의미하기도한다. 참고 연산이란 order by, full table scan 과같이하나의쿼리에서해당 WTHR 에할당되는규모의작업단 위를말한다. PE는하나의연산을여러개의 WTHR로동시에수행하도록하는 intra-operation PE와서로다른연산을파이프스트림 (pipe stream) 방식으로연결해동시에수행하도록하는 inter-operation PE로나눌수있다. Tibero에서는 DOP 크기만큼의 WTHR를할당하여 intra-operation PE를구성하고, inter-operation PE에대해서는 2-set을구성하는방식으로최적의 PE를수행한다. 따라서 PE의실행과정을통제하는 Query Coordinator( 이하 QC) 는 PE를위해최대 2*DOP 개수만큼의 WTHR를 PE_SLAVE(Parallel Execution Slave) 로활용하게된다. 단, 동시에두개이상의연산을수행하는 inter-operation PE는지원하지않는다. 13.2.1. DOP 결정 하나의 SQL 문장 ( 쿼리 ) 에서하나의 DOP로 PE를수행하며, 여러개의 parallel hint가있거나혹은 parallel hint도있고 parallel option을가진테이블을쿼리에포함하는경우, 그중가장큰 DOP를그쿼리의 DOP 로결정한다. 명시된 DOP가 0보다작거나같은경우에는디폴트값 4로 DOP를결정한다. DOP는 parallel hint에명시할수있으며, 사용방법은 "Tibero SQL 참조안내서 " 를참고한다. DOP를결정할때참고해야할요소는다음과같다. 시스템의 CPU 개수 시스템의최대프로세스및스레드개수 테이블이분산된경우, 그테이블이속해있는디스크의개수 데이터의위치나쿼리의종류 객체파티션개수 218 Tibero 관리자안내서
보통한사용자만 PE를수행한다고하면, 정렬과같은 CPU bound 작업은 CPU 개수의 1~2배로 DOP를설정하는것이적당하고, 테이블스캔과같은 I/O bound 작업은디스크드라이브개수의 1~2배로 DOP를설정하는것이적당하다. 이처럼쿼리의종류와시스템환경을고려하여 DOP를설정하면 PE를통해더나은성능을기대할수있다. 13.2.2. DOP 에따른워킹스레드할당 Tibero에서는쿼리를수행하는과정에서 parallel 연산을수행할차례가되면, QC가계산된 DOP 만큼의 WTHR를요청하고, 이에가용한만큼의 WTHR를 PE_SLAVE로얻어오게된다. 다음과같이연산하나로수행하는쿼리는 DOP 개수만큼 WTHR를가져와서하나의연산을담당할하나의 PE_SLAVE set을구성한다. 그이외는 2*DOP 개수만큼 WTHR를얻어오고두개의 PE_SLAVE set을구성한다. 이때, WTHR의개수가사용자가명시한 DOP로수행하기에부족하면사용할수있는 WTHR만가지고서 DOP를재정의하여수행하게된다. SELECT * FROM table1; 예를들어 DOP를 4로결정하여힌트에명시한경우, 2*DOP만큼의 WTHR가필요한상황이고 WTHR가 5개뿐이라면 DOP를 2로재정의하고 4개의 WTHR를얻어와 PE를수행한다. 또는사용가능한 WTHR가 1개뿐이라면 parallel plan을만들었더라도차례로수행한다. 즉 PE를수행하지않는다. 그리고 QC가얻어온 PE_SLAVE는쿼리수행이끝나면다시활용이가능한 WTHR로반환되며, 다음쿼리수행을위해리소스를점유하지않게되어있다. 13.3. 동작원리 Tibero에서는 parallel hint가있거나 parallel option이있는테이블을포함한쿼리를실행하면, parallel plan 을작성하게된다. 이때, 생성된 parallel plan의수행순서는다음과같다. 1. SQL을수행하는 WTHR가 QC 역할을담당한다. 2. parallel operator 가있으면, QC 는 DOP 에따라필요한만큼의 WTHR 를 PE_SLAVE 로얻어온다. 3. PE 수행에필요한만큼의 WTHR 가확보되지않으면, 사용자에게알리지않고내부에서차례로처리한 다. 4. QC 는순서에따라연산이 2-set 구조를기반으로수행되도록 PE_SLAVE 를통제하는역할을담당한다. 5. 쿼리수행이끝나면, QC 는 PE_SLAVE 에게서취합한쿼리결과를사용자에게보내고, 작업을종료한 PE_SLAVE 를다시사용가능한 WTHR 로반환한다. 제 13 장 Parallel Execution 219
13.3.1. 2-set 구조 PE는 QC가생성한실행계획을모든 PE_SLAVE가공유하도록구성되어있으며, 각 PE_SLAVE는실행계획의특정부분만을실행하도록 QC가메시지로제어한다. PE는같은부분의실행계획을 DOP 개수만큼의 PE_SLAVE로나누어수행하는 intra-parallelism을지원한다. 이렇게같은연산을수행하는 PE_SLAVE의묶음을 PE_SLAVE set라한다. PE는한번에최대 2개의 PE_SLAVE set을구성함으로써전체실행계획중서로다른두개의연산을동시에수행하는 inter-parallelism을지원한다. 동시에수행되는 PE_SLAVE set는 Producer set와 Consumer set으로나뉜다. Producer set 특정부분의실행계획을수행하면서로우 ( 중간결과 ) 를추출하여실행계획에명시된방법에따라 Consumer set의 PE_SLAVE에게나눠준다. Consumer set Producer set로부터로우를받아주어진연산을수행하고나면, 다시 Producer로역할이바뀌게된다. PE_SLAVE set는 Producer일때만결과를다음수행계획을갖고있는 Consumer set에전달하며, 이러한 PE_SLAVE set을어떤순서로실행계획중어느부분을할당해줄지는 QC가제어한다. 다음은 2-set 구조와 Producer set, Consumer set 를설명하는그림이다. [ 그림 13.1] Parallel Execution 위 [ 그림 13.1] 의쿼리에서 parallel hint 에의해 DOP 를고려한 PE 실행계획이만들어지면각각의연산이 4 개 ( 최종으로결정된 DOP) 의작업단위로분할된다. 다시말해각각의 PE 가 4 개의스레드를가지기때문 220 Tibero 관리자안내서
에하나의 PE_SLAVE set가 4개의 PE_SLAVE로구성되고, 이를다시 Producer Set와 Consumer Set의 2-set 구조로만들기위해총 8 (= 2 x 4) 개의 PE_SLAVE가할당된다. 이때, 할당된 2-set의 PE_SLAVE을각각 set1, set2라고하면각 set가수행하는역할에따라 Producer Set(Tibero Producer Set, 이하 TPS) 와 Consumer Set(Tibero Consumer Set, 이하 TCS) 로전환되면서전체실행계획이수행된다. 즉, TCS가해시조인을처리하기위해 TPS가 T1 테이블에스캔을통해로우를공급해주기를기다리게되며, TPS가테이블스캔을시작함으로써 PE 실행계획에대한작업이시작된다. set1이 TPS를담당하여 T1을스캔하고, set2가 TCS를담당하여 set1이보내는로우에대해해시테이블을구성하게되며, set1이 T1 스캔을마치면계속해서 T2 스캔을수행하면서 TCS를담당하는 set2에게로우를공급한다. set1이 T2의스캔을마치게되면, TCS로역할이전환되면서 sort group by를수행하게되고, 반대로 set2는 TPS로역할이전환되면서해시조인의결과를 set1에공급한다. 마지막으로 set1이 TPS가되어 sort group by 수행의결과를 QC에게보낸다. 이것이 2-set 구조를이용하여 PE의실행계획에서각각의연산을병렬로수행하는 intra-operation paral lelism을수행하면서동시에다양한연산을교차하여 inter-operation parallelism을수행하도록하는기본동작원리이다. 13.3.2. TPS 의분배 TPS는 TCS에연산의결과물을공급하여 TCS가다음연산을처리할수있도록한다. TPS가결과물을분배하는데 Tibero는 hash, range, broadcast, round-robin, send idxm 5가지방식을지원하고있다. 주로 hash, range, broadcast가자주사용된다. 분배방식 hash 설명 TCS 가 hash join, hash group by 등의해시기반의연산을담당하는경우에사용한다. send key 의 hash value 에따라해당로우가보내질 consumer 스레드가정해진다. range TCS 가 order by, sort group by 와같은정렬기반의연산을담당하는경우에사용한다. send key 값의 range 에따라해당로우가보내질 consumer 스레드가정해진다. broadcast Nested Loop 조인이나 pq_distribute 힌트를사용하여 broadcast 를강제하는조인을 TCS 가담당하는경우에사용한다. 자세한내용은 13.4.1. Parallel Query 를참고한다. 모든 consumer 스레드에로우가보내진다. round-robin send idxm 로우를보낼 consumer 를 round-robin 방식으로실행할때사용한다. Parallel DML 에서인덱스와참조제약조건을위해로우를보낼때사용한다. 제 13 장 Parallel Execution 221
본절에서는 [ 그림 13.2] 에서와같이 range 방식을예를들어설명한다. [ 그림 13.2] Parallel Operations DOP가 4로결정된 PE 실행계획에서 inter-operation parallelism으로 TPS와 TCS 2개의 set가상호연동하는방식을선택하면, 총 PE_SLAVE 8개가전체 PE 수행에참여하게된다. PE_SLAVE set 하나가 TPS가되어테이블스캔을하고, TCS로설정된다른 set가 order by를수행할수있도록로우를공급해준다. 이때 4개의 PE_SLAVE는각각 A~G, H~M, N~S 그리고 T~Z로정렬키에대한범위를정하여정렬하게되며, 이에맞게 TPS는 range 방식으로해당로우가담당하는 PE_SLAVE에전달될수있도록한다. TCS가정렬작업을완료하고나면 TPS로역할이전환되면서 PE_SLAVE가설정된 range의순서대로정렬결과를 QC에게전달함으로써전체데이터에대한결과가얻어진다. 13.4. Parallelism 유형 Tibero가제공하는 parallel 연산은다음과같다. 액세스방법테이블스캔그리고 index fast full scan 등 조인방법 Nested Loop, Sort Merge 그리고해시조인 DDL 222 Tibero 관리자안내서