# Database 관리 기본

## **사용자 정의**

사용하는 목적과 역할에 따라 Tibero의사용자의 유형을 아래와 같이 정의 할 수 있습니다.   &#x20;

* DBA
* SYS
* 시스템 관리자(sysadmin)
* 애플리케이션 프로그램 개발자(Application Developers)
* 데이터베이스 사용자(Database Users)

### **DBA**

DBMS는 최소 1명의 DBA가 필요합니다. 데이터베이스를 사용하는 사용자가 많으면 많을수록 이를 관리하는 개인이나 그룹이 필요합니다.&#x20;

DBA는 데이터베이스 환경을 유지하는 데 필요한 제반 활동을 감독하거나 직접 수행하는 개인 또는 그룹입니다.

다양한 데이터베이스 제품에 관한 깊은 경험이 요구되는 DBA는 데이터베이스 내용의 정확성이나 통합성, 데이터베이스의 내부 저장 구조와 접근 관리 대책을 결정하며, 데이터의 보안 정책을 수립하고 점검하는 등 데이터베이스의 성능을 감시해 변화하는 요구에 대응하는 책임이 있습니다.

아래는 DBA가 관리해야 할 항목을 간략히 소개합니다.

<table><thead><tr><th width="174">항목</th><th>설명</th></tr></thead><tbody><tr><td>DBMS</td><td><p>현재 사용하고 있는 DBMS의 특성을 파악</p><p>문제 발생 시 H/W를 확장하거나 데이터베이스를 튜닝</p><ul><li>디스크 용량이 충분한가?</li><li>물리적으로 독립된 디스크인 경우 시스템 부하가 제대로 분산이 되고 있는가?</li><li>데이터 배치는 잘 됐는가?</li><li>CPU와 메모리 사용량, 클라이언트의 응답 시간은 어떠한가?</li></ul></td></tr><tr><td>데이터베이스</td><td><ul><li>자주 사용되는 스키마 객체는 무엇인가?</li><li>자주 사용되는 SQL 문장은 무엇인가?</li><li>자주 사용되는 SQL 문장이 효율적으로 실행되고 있는가?</li></ul></td></tr><tr><td>유지보수</td><td><ul><li>Tibero의 설치 및 패치를 수행</li><li>데이터베이스의 설계 및 분석, 구현</li><li>데이터베이스의 생성 및 권한을 설정</li><li>사용자의 권한을 설정</li></ul></td></tr><tr><td>정책 및 절차 확립</td><td>데이터베이스의 관리, 보안, 유지보수 등에 속하는 정책 및 절차를 확립</td></tr><tr><td>보안</td><td>데이터 누출이나 유실을 막기 위해 보안 정책을 수립</td></tr><tr><td>백업 및 복구</td><td>주기적으로 데이터를 백업하고, 문제가 발생할 경우 복구</td></tr></tbody></table>

{% hint style="info" %}
Tibero는 DBA가 위와 같은 항목을 효율적이고 유연하게 관리할 수 있도록 유틸리티를 제공하고 있습니다.  자세한 내용은 "[Tibero 유틸리티 안내서](https://docs.tibero.com/tibero/topics/administration/database-administration/utility/utility-guide)"를 참고합니다.
{% endhint %}

### **SYS**

Tibero를 설치하고 나면 데이터베이스 자체의 메타데이터를 관리하는 **'SYS'**&#xB77C;는 사용자가 생성됩니다. SYS 사용자에 DBA 역할이 부여되며, 이는 UNIX 계열(Linux 포함)의 루트 사용자와 비슷한 역할을 담당합니다.

Tibero의 데이터 사전, 기반 테이블, 뷰 등은 모두 SYS 사용자의 스키마에 저장됩니다. 특히 기반 테이블, 뷰 는 Tibero가 동작하는 데 매우 중요한 역할을 하므로 SYS 사용자 외 다른 사용자가 이를 수정하거나 조작하지 않습니다.

아래는 SYS 사용자의 접속 계정 입니다.

#### 시스템 관리자

시스템 관리자(또는 sysadmin, 네트워크 관리자 포함)는 컴퓨터 시스템이나 네트워크를 운영하고 유지 보수하는 개인이나 그룹으로, 일부 사이트는 1명 이상의 시스템 관리자가 있습니다. 서버나 다른 컴퓨터에 운 영체제를 설치하고, 유지 보수하며 서비스 정지 등의 문제에 대해 관리 책임이 있습니다.&#x20;

또한  시스템 관리자에게는 약간의 프로그래밍 실력 및 시스템과 관련된 프로젝트에 대한 관리, 감시, 운영 기술이 요구되며 컴퓨터 문제에 대해 기술적 지원을 하는 역할도 수행해야 합니다.

#### 애플리케이션 프로그램 개발자

애플리케이션 프로그램 개발자(Application Developers)는 보통 넓은 영역의 컴퓨터 프로그래밍이나 전문적인 프로젝트 관리 분야에서 소프트웨어 개발 작업을 하는 개인을 지칭합니다.&#x20;

애플리케이션 프로그램 개발자는 일반적으로 개별 프로그램 작업보다는 애플리케이션 프로그램의 수준에서 전반적인 프로젝트에 기여하고 데이터베이스 사용 측면에서 데이터베이스 애플리케이션 프로그램을 설계하고 구현하는 역할을 수행합니다.

#### 애플리케이션 프로그램 개발자 역할

* 데이터베이스 애플리케이션 프로그램의 설계와 개발
* 애플리케이션 프로그램을 위한 데이터베이스 구조 설계 및 명세
* 애플리케이션 프로그램을 위한 저장 공간 요청
* DBA와 데이터베이스 정보 공유
* 개발 중에 애플리케이션 프로그램 튜닝
* 개발 중에 애플리케이션 프로그램의 보안 정책 수립

#### 데이터베이스 사용자

데이터베이스 사용자(Database Users)는 Tibero를 사용하는 DBA, 업무 분석가, 애플리케이션 프로그램개발자, 사용자 모두를 지칭합니다.

###

***

## **설치 환경**

Tibero가 설치되면 시스템에 아래와 같은 환경변수가 설정됩니다.

<table><thead><tr><th width="143">환경변수</th><th>설명</th></tr></thead><tbody><tr><td>$TB_HOME</td><td><p>Tibero가 설치된 홈 디렉터리</p><p>Tibero 서버, 클라이언트 라이브러리, 다양한 부가 기능을 수행하는 파일이 설치</p></td></tr><tr><td>$TB_SID</td><td>한 머신에서 Tibero의 인스턴스를 여러 개로 운영할 때 필요한 서비스 ID</td></tr><tr><td>$PATH</td><td>파일 시스템을 통해 특정 파일에 접근하기 위한 디렉터리 경로를 설정</td></tr></tbody></table>

환경변수를 제대로 설정하지 않으면 Tibero를 사용할 수 없으므로, 환경변수를 확인하는 절차가 필요합니다.

{% hint style="info" %}
본 안내서에서는 UNIX 셸 명령어를 실행할 때 [**GNU Bash**](https://www.gnu.org/software/bash/) 문법을 따릅니다.&#x20;

사용하는 셸의 종류에 따라 문법이 다를 수 있으며, 자세한 내용은 현재 사용 중인 운영체제의 안내서를 참고합니다.
{% endhint %}

아래는UNIX 셸 프롬프트에서 환경변수를 확인하는 방법 입니다.

#### **$TB\_HOME**

```markup
$ echo $TB_HOME
/home/tibero/tibero7
```

{% hint style="info" %}
이 디렉터리 안에는 Tibero 서버, 클라이언트 라이브러리, 부가 기능을 지원하는 파일이 있습니다.
{% endhint %}

#### **$TB\_SID**

```
$ echo $TB_SID
Tb7
```

{% hint style="info" %}
서비스 ID는 데이터베이스의 이름과 동일하게 설정할 것을 권장합니다.
{% endhint %}

#### **$PATH**

```markup
$ echo $PATH
...:/home/tibero/tibero7/bin:/home/tibero/tibero7/client/bin:...
```

\
$PATH는 다음의 디렉터리를 포함하고 있어야 합니다.

<table><thead><tr><th width="227">디렉터리</th><th>설명</th></tr></thead><tbody><tr><td>$TB_HOME/bin</td><td>Tibero의 실행 파일과 서버 관리를 위한 유틸리티가 위치한 디렉터리</td></tr><tr><td>$TB_HOME/client/bin</td><td>Tibero의 클라이언트 실행 파일이 있는 디렉터리</td></tr></tbody></table>

###

***

## tbSQL 유틸리티 사용

tbSQL은 Tibero에서 제공하는 대화형 SQL 명령어 처리 유틸리티로, SQL 질의, 데이터 정의어, 트랜잭션과 관련된 SQL 문장 등을 실행할 수 있습니다.&#x20;

본 절에서는 **tbSQL** 유틸리티를 이용하여 데이터베이스에 접속하는 방법과 그 이후에 간단한 SQL 문장을 실행하는 방법을 설명합니다.

### **1. tbSQL 유틸리티** <a href="#d5e1446" id="d5e1446"></a>

tbSQL 유틸리티의 실행 예시는 아래와 같습니다.&#x20;

#### **tbSQL 유틸리티의 실행** <a href="#d5e1446" id="d5e1446"></a>

```
$ tbsql

tbSQL 7

TmaxData Corporation Copyright (c) 2008-. All rights reserved. 

SQL>
```

tbSQL 유틸리티가 정상적으로 실행되면 이처럼 **SQL 프롬프트**가 나타납니다. 이 프롬프트에서 데이터베이스 사용자는 SQL 문장을 실행할 수 있습니다.

{% hint style="info" %}
SQL 프롬프트가 나타나지 않고 데이터베이스 접속에 실패한 경우 "[문제 해결”](https://technet.tmax.co.kr/upload/download/online/tibero/pver-20240502-000002/tibero_admin/appendix_c.html)을 참고하여 해결합니다.
{% endhint %}

### **2. 데이터베이스 접속**

tbSQL 유틸리티를 실행한 후 SQL 프롬프트가 나타나면 데이터베이스에 접속할 수 있는 상태입니다.

데이터베이스에 접속하는 방법 예시는 아래와 같습니다.&#x20;

\
**tbSQL 유틸리티를 이용한 데이터베이스 접속**

```
$ tbsql SYS/tibero

tbSQL 7

TmaxData Corporation Copyright (c) 2008-. All rights reserved. 

Connected to Tibero.

SQL>
```

{% hint style="info" %}
본 예제에서는 UNIX 셸 프롬프트에서 tbSQL 유틸리티의 실행과 함께 사용자명과 패스워드를 입력합니다.
{% endhint %}

&#x20;

**사용자명**과 **패스워드**를 입력할 때에는 아래와 같은 규칙이 있습니다.

<table><thead><tr><th width="114">항목</th><th>설명</th></tr></thead><tbody><tr><td>사용자명</td><td><p>스키마 객체의 이름과 마찬가지로 대소문자 미 구분</p><p>(단, 큰따옴표 “ ” 에 사용자명을 입력하는 경우는 예외)</p></td></tr><tr><td>패스워드</td><td><p>패스워드로 대소문자 미 구분</p><p>(단, 작은따옴표' '에 패스워드를 입력하는 경우는 예외)</p></td></tr></tbody></table>

####

#### **tbSQL 유틸리티 명령어** <a href="#d5e1510" id="d5e1510"></a>

tbSQL 유틸리티에서 사용할 수 있는 명령어는 대소문자를 구분하지 않고 사용할 수 있으며 SQL 문장을 실행하거나 데이터베이스 관리에 필요한 명령어가 포함되있습니다.

대괄호(\[ ])에 포함된 내용은 입력하지 않아도 명령어를 실행할 수 있으며, tbSQL 유틸리티에서 사용할 수 있는 명령어는 아래와 같습니다.

<table><thead><tr><th width="177">명령어</th><th>설명</th></tr></thead><tbody><tr><td>!</td><td>운영체제의 명령어를 실행한다. HOST 명령어와 동일하다.</td></tr><tr><td>%</td><td>히스토리 버퍼에 저장된 명령어를 재수행한다.</td></tr><tr><td>@, @@</td><td>스크립트를 실행한다. START 명령어와 동일하다.</td></tr><tr><td>/</td><td>현재 SQL 버퍼 내의 SQL 문장 또는 tbPSM 프로그램을 실행한다. RUN 명령 어와 동일하다.</td></tr><tr><td>ACC[EPT]</td><td>사용자의 입력을 받아 바인드 변수의 속성을 설정한다.</td></tr><tr><td>ARCHIVE LOG</td><td>Redo 로그 파일 정보를 출력한다.</td></tr><tr><td>C[HANGE]</td><td>SQL 버퍼의 현재 라인에서 패턴 문자를 찾아 주어진 문자로 변환한다.</td></tr><tr><td>CL[EAR]</td><td>설정된 옵션을 초기화하거나 지우는 명령어이다.</td></tr><tr><td>COL[UMN]</td><td>컬럼의 출력 속성을 설정한다.</td></tr><tr><td>CONN[ECT]</td><td>특정 사용자 ID로 데이터베이스에 접속한다.</td></tr><tr><td>DEF[INE]</td><td>바인드 변수를 정의하거나 출력한다.</td></tr><tr><td>DEL</td><td>SQL 버퍼에 저장된 라인을 지우는 명령어이다.</td></tr><tr><td>DESC[RIBE]</td><td>지정된 객체의 컬럼 정보를 출력한다.</td></tr><tr><td>DISC[ONNECT]</td><td>현재 데이터베이스로부터 접속을 해제한다.</td></tr><tr><td>ED[IT]</td><td>특정 파일 또는 SQL 버퍼의 내용을 외부 편집기를 이용하여 편집한다.</td></tr><tr><td>EXEC[UTE]</td><td>단일 tbPSM 문장을 수행한다.</td></tr><tr><td>EXIT</td><td>tbSQL 유틸리티를 종료한다. QUIT 명령어와 동일하다.</td></tr><tr><td>EXP[ORT]</td><td>SELECT 문장의 수행 결과나 테이블 데이터를 파일로 출력한다.</td></tr><tr><td>H[ELP]</td><td>도움말을 출력한다.</td></tr><tr><td>HIS[TORY]</td><td>실행한 명령어의 히스토리를 출력한다.</td></tr><tr><td>HO[ST]</td><td>운영체제 명령어를 실행한다. ! 명령어와 동일하다.</td></tr><tr><td>I[NPUT]</td><td>SQL 버퍼의 현재 라인 뒤에 새로운 라인을 추가한다.</td></tr><tr><td>L[IST]</td><td>SQL 버퍼 내의 특정 내용을 출력한다.</td></tr><tr><td>LOAD[FILE]</td><td>Tibero의 테이블을 Oracle의 SQL*Loader 툴이 인식할 수 있는 형식으로 저장 한다.</td></tr><tr><td>LOOP</td><td>단일 명령어를 무한 반복 수행한다.</td></tr><tr><td>LS</td><td>현재 사용자가 생성한 데이터베이스 객체를 출력한다.</td></tr><tr><td>PASSW[ORD]</td><td>사용자 패스워드를 변경한다.</td></tr><tr><td>PAU[SE]</td><td>사용자가 &#x3C;Enter> 키를 누를 때까지 실행을 멈춘다.</td></tr><tr><td>PING</td><td>특정 데이터베이스에 대해 접속 가능한 상태인지를 출력한다.</td></tr><tr><td>PRI[NT]</td><td>사용자가 정의한 바인드 변수의 값을 출력한다.</td></tr><tr><td>PRO[MPT]</td><td>사용자가 정의한 SQL 문장이나 빈 라인을 그대로 화면에 출력한다.</td></tr><tr><td>Q[UIT]</td><td>tbSQL 유틸리티를 종료한다. EXIT 명령어와 동일하다.</td></tr><tr><td>REST[ORE]</td><td>선택한 정보를 파일로부터 복원한다.</td></tr><tr><td>R[UN]</td><td>현재 SQL 버퍼 내의 SQL 문장이나 tbPSM 프로그램을 실행한다. / 명령어와 동일하다.</td></tr><tr><td>SAVE</td><td>선택한 정보를 파일에 저장한다.</td></tr><tr><td>SET</td><td>tbSQL 유틸리티의 시스템 변수를 설정한다.</td></tr><tr><td>SHO[W]</td><td>tbSQL 유틸리티의 시스템 변수를 출력한다.</td></tr><tr><td>SPO[OL]</td><td>화면에 출력되는 내용을 모두 외부 파일에 저장하는 과정을 시작하거나 종료 한다.</td></tr><tr><td>STA[RT]</td><td>스크립트 파일을 실행한다. @ 명령어와 동일하다.</td></tr><tr><td>TBDOWN</td><td>Tibero를 종료한다.</td></tr><tr><td>UNDEF[INE]</td><td>하나 이상의 바인드 변수를 삭제한다.</td></tr><tr><td>VAR[IABLE]</td><td>사용자가 정의한 바인드 변수를 선언한다.</td></tr><tr><td>WHENEVER</td><td>에러가 발생한 경우의 동작을 정의한다.</td></tr></tbody></table>

{% hint style="info" %}
tbSQL 유틸리티에 대한 자세한 내용은 "[Tibero 유틸리티 안내서](https://docs.tibero.com/tibero/topics/administration/database-administration/utility/utility-guide)"를 참고합니다.
{% endhint %}

자신의 스키마에 어떤 객체들이 있는지 알아보기 위해서는 기본적으로 LS 명령어를 사용하며, SYS 사용자로 데이터베이스에 접속하여 **LS** 명령어를 실행하는 예시는 아래와 같습니다.<br>

#### **LS 명령어의 실행**

```
SQL> LS

NAME                           SUBNAME       OBJECT_TYPE
------------------------------ ------------- --------------------
SYS_CON100                                   INDEX
SYS_CON400                                   INDEX
SYS_CON700                                   INDEX
_DD_CCOL_IDX1                                INDEX
        ......중간 생략......
UTL_RAW                                      PACKAGE
DBMS_STATS                                   PACKAGE BODY
TB_HIDDEN2                                   PACKAGE BODY

SQL>
```

위 예시에서는 SYS 사용자의 스키마에 존재하는 모든 객체가 출력됩니다. SYS 스키마에는 Tibero가 스스로를 관리하기 위해 내부적으로 사용되는 객체가 많으므로 객체가 많이 출력됩니다. <br>

LS 명령어는 tbSQL 유틸리티를 사용할 때 사용자의 편의를 위해 제공되는 명령어로서 SQL 문장을 실행할 때 지원하는 명령어는 아니며 오직 tbSQL 유틸리티에서만 사용할 수 있습니다. 즉, tbSQL 유틸리티가 아닌 JDBC, CLI 등을 이용하여 접속한 경우에는 LS 명령어를 사용할 수 없습니다.

<br>

아래는 LS 명령어를 실행하여 현재 시스템에 접속하고 있는 **사용자**를 조회하는 예시입니다.

#### **LS 명령어의 실행 - 사용자 조회**

```
SQL> LS USER

USERNAME
------------------------------
SYS
```

아래는 LS 명령어를 실행하여 현재 데이터베이스에 존재하는 **테이블 스페이스**를 조회하는 예시입니다.

#### **LS 명령어의 실행 - 테이블 스페이스 조회**

```
SQL> LS TABLESPACE

TABLESPACE_NAME
------------------------------
SYSTEM
UNDO
TEMP
USER
```

### **3. SQL 문장 실행**

V$SESSION은 각각의 세션 ID를 나열하는 뷰로, 아래는 **V$SESSION** 뷰를 이용하여 TYPE 컬럼이 **'WTHR'**&#xC778; 데이터를 조회하는 SQL 문장을 실행 하는 예시 입니다.&#x20;

#### **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.
```

#### **SQL 표준**

일반적으로 SQL 문장을 실행 시 지켜야 할 규칙이 있습니다.&#x20;

이 규칙은 ANSI(American National Standard Institute)와 ISO/IEC(International Standard Organization/International Electrotechnical Commission)에서 공동으로 제정한 관계형(relational) 또는 객체 관계형(object-relational) 데이터베이스 언어로, SQL 표준을 따릅니다.

SQL 표준은 1992년과 1999년에 각각 버전 2와 버전 3가 제정되었습니다.&#x20;

* 1992년에 발표된 SQL 표준: SQL2 또는 SQL-92라고 불리며, 관계형 데이터베이스를 위한 언어로 정의되었습니다.&#x20;
* 1999년에 제정된 SQL 표준: SQL3 또는 SQL-99라고 불리며, SQL2에 객체지향 개념을 추가하여 확장한 객체관계형 데이터베이스 언어입니다.<br>

#### **SQL 표준에서 정의하고 있는 SQL 문장**

* 데이터 조작어(Data Manipulation Language, 이하 DML)
* 데이터 정의어(Data Definition Language, 이하 DDL)
* 데이터 제어어(Data Control Language, 이하 DCL)

{% hint style="info" %}
본 안내서에서는 DCL에 포함되는 COMMIT, ROLLBACK 등의 SQL 명령어 일부를 트랜잭션 및 세션 언어로 재구성했습니다. 따라서 전체 DCL에 대한 내용은 관련 문서를 참고합니다.
{% endhint %}

DML에 포함되는 **SELECT 문**을 아래와 같이 실행합니다.

#### **SQL 문장의 실행 (2)**

```
SQL> select SID, STATUS, TYPE, WTHR_ID from v$session where type = 'WTHR';
......SQL 문장의 실행 (1)의 실행 결과와 동일......

SQL> select SID, STATUS, TYPE, WTHR_ID from V$SESSION where type = 'WTHR';
......SQL 문장의 실행 (1)의 실행 결과와 동일......

SQL> select SID, STATUS, TYPE, WTHR_ID From v$session Where type = 'WTHR';
......SQL 문장의 실행 (1)의 실행 결과와 동일......
```

SQL 표준은 대소문자를 구분하지 않으므로 큰따옴표(" ") 또는 작은따옴표(' ')로 묶은 부분을 제외하고는 대소문자를 혼용하여 사용할 수 있습니다. 위 예제는 모두 'SQL 문장의 실행 (1)' 예제를 실행한 결과와 동일하며 그 의미도 같습니다.&#x20;

그러나 아래와 같은 SQL 문장을 실행하면 그 결과와 의미는 달라집니다.

```
SQL> SELECT SID, STATUS, TYPE, WTHR_ID FROM V$SESSION WHERE TYPE = 'wthr';
0 row selected.
```

###

***

## **사용자 및 테이블 생성**

본 절에서는 데이터베이스를 사용하기 위해 사용자와 테이블을 생성하는 방법을 안내합니다.

### 사용자 생성

사용자 생성 시 **CREATE USER** 문을 사용합니다.

아래는 'ADMIN'이라는 사용자를 생성하고 세션(CREATE SESSION)과 테이블을 생성(CREATE TABLE) 할 수 있는 특권을 부여하는 예시 입니다.

#### 사용자의 생성

```
SQL> CREATE USER ADMIN IDENTIFIED BY 'password123';
...'ADMIN'이라는 이름의 사용자를 생성하고 패스워드는 'password123'으로 한다.
User 'ADMIN' created.

SQL> GRANT CREATE SESSION TO ADMIN;
...ADMIN 사용자에게 세션을 시작할 수 있는 특권을 부여한다.
Granted.

SQL> GRANT CREATE TABLE TO ADMIN;
...ADMIN 사용자에게 테이블을 생성할 수 있는 특권을 부여한다.
Granted.

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
...방금 생성된 사용자이므로 스키마 객체가 없다.
SQL>
```

위  예시를 모두 완료하면 Tibero에 'ADMIN'이라는 새로운 사용자가 추가됩니다.

### 테이블의 생성

테이블 생성 시 **CREATE TABLE** 문을 사용합니다.

아래는 'PRODUCT'라는 테이블을 생성하고 4개의 로우 데이터를 삽입(INSERT)하는 예시 입니다.

#### **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에 설정하면 스키마 객체나 사용자명을 영문 대문자가 아닌
   임의의 글자로 사용할 수 있다.
...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**를 비롯한 여러 정적 뷰를 제공합니다. 이 뷰를 통해 현재 데이터베이스에 접속한 사용자가 접근할 수 있는 스키마 객체의 다양한 정보를 볼 수 있습니다.

{% hint style="info" %}
정적 뷰에 대한 내용은 "[Tibero 참조 안내서](https://docs.tibero.com/tibero/topics/administration/reference-guide#undefined-10)"를 참고합니다.
{% endhint %}

테이블 생성과 데이터 삽입 완료 후에는 이 콘솔 창을 그대로 두고 또 다른 콘솔 창을 실행합니다.&#x20;

본 예제에서는 tbSQL 유틸리티를 이용하여 \[[#undefined-12](#undefined-12 "mention")]\(#undefined-11) 예제에서 생성한 ADMIN으로 Tibero에 접속합니다.

```
$ tbsql ADMIN/password123 

tbSQL 7

TmaxData Corporation Copyright (c) 2008-. All rights reserved. 

Connected to Tibero.

SQL> SELECT * FROM "PRODUCT"; 

0 row selected.
```

위 예시를 보면 [#create-table](#create-table "mention")예시같은 4개의 로우 데이터가 출력되지 않는 것을 알 수 있습니다. 그 이유는 Tibero는 트랜잭션을 지원하기 때문에 한 세션에서 입력한 데이터라도 커밋을 하기 전까지는 다른 세션에서 보이 지 않기 때문 입니다.&#x20;

따라서 4개의 로우 데이터 확인은 이전 콘솔 창 [#create-table](#create-table "mention")으로 이동하여 트랜잭션의 commit 명령을 실행해야 합니다.

#### **commit** 명령 실행방법

```
SQL> COMMIT; 
Commit succeeded.
```

커밋 완료 후 두 번째 콘솔 창에서 SELECT 문을 실행하여 4개의 로우 데이터가 출력되는지 확인합니다.

### 사용 예제

아래는 가상의 시나리오를 설정하여 SQL 문장을 실행하는 예시입니다.&#x20;

#### 시나리오

* 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.
...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 문장을 실행할 수 있습니다.&#x20;

특권이 부여되지 않았다면 매번 SYS 사용자나 DBA 역할을 가진 다른 사용자로 접속하여 특권을 부여해줘야 하는 불편함이 있으므로 이를 해결하기 위해 여러 특권을 모아 하나의 역할로 생성하는 방법을 사용할 수 있습니다.

{% hint style="info" %}
특권과 역할에 대한 자세한 내용은 “특권”과 “역할”을 참고합니다.
{% endhint %}

아래는 SYS 사용자로 데이터베이스에 접속한 후 [#undefined-12](#undefined-12 "mention")예시에서 생성한 ADMIN 사용자에게 DBA 역할을 부여하는 예시입니다.

```
$ tbsql SYS/tibero

tbSQL 7

TmaxData Corporation Copyright (c) 2008-. 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](https://docs.tibero.com/tibero/error-help/no.-7000-7999#id-7139-cascade-is-required-to-remove-this-user-from-the-system) 가 발생하고, ADMIN 사용자는 더 이상 데이터베이스에 접속할 수 없게 됩니다.

###

***

## **기동과 종료**

본 절에서는 Tibero를 기동하고 종료할 때 사용하는 명령어와 이를 사용하는 방법을 안내합니다.

### **tbboot**

tbboot는 Tibero가 설치된 머신에서 실행합니다. 또한 위의 [#undefined-6](#undefined-6 "mention") 에서 언급된 것과 같이 tbboot를 실행하기 전에 반드시 환경변수가 정상적으로 설정되있어야 합니다.

* 이 명령어와 관련된 환경변수는 $TB\_HOME 과 $TB\_SID 입니다.&#x20;
* tbboot는 실행 파일을 실행할 수 있는 권한이 있는 사용자라면 어느 누구든 Tibero를 기동할 수 있습니다.&#x20;

{% hint style="info" %}
이는 보안 문제가 발생할 수 있으므로 정책상 Tibero를 설치한 사용자만 Tibero의 실행 파일에 접근할 수 있도록 권한 설정할 것을 권장합니다.
{% endhint %}

#### 파일 권한(permission) 설정 방법

```
$ cd $TB_HOME/bin
$ chmod 700 tbsvr tblistener tbboot tbdown tbctl
$ ls -alF
total 56

drwxr-xr-x 4 tiberotibero 4096 Dec 28 18:12 ./
drwxr-xr-x 13 tiberotibero 4096 Dec 20 11:59 ../
...... 중간 생략......

-rwx------ 1 tbboot*
-rwx------ 1 tbctl*
-rwx------ 1 tbsvr*
lrwxrwxrwx 1 tblistener*
lrwxrwxrwx 1 ... tbdown -> $TB_HOME/bin/tbsvr*
```

#### tbboot 사용방법

```
tbboot 
tbboot -v 
tbboot -h 
tbboot -C 
tbboot -c
tbboot [-t] [ normal | mount | nomount | resetlogs | 
              NORMAL | MOUNT | NOMOUNT | RESETLOGS ]
tbboot -w
```

<table><thead><tr><th width="104">옵션</th><th>설명</th></tr></thead><tbody><tr><td></td><td>옵션이 없는 경우 Tibero를 부트 모드(bootmode) 중 NORMAL로 기동하는 옵션</td></tr><tr><td>-h</td><td>tbboot를 사용하기 위한 간단한 도움말을 보여주는 옵션</td></tr><tr><td>-v</td><td>Tibero의 버전 정보를 보여주는 옵션</td></tr><tr><td>-C</td><td>Tibero에서 사용 가능한 character set 정보와 nls_date_lang 정보를 보여주는 옵션.</td></tr><tr><td>-c</td><td>Tibero가 replication mode로 설정되어 있을 경우 replication mode를 사용하지 않는 옵션</td></tr><tr><td>-t</td><td><p>Tibero 서버를 기동할 수 있는 옵션 (생략가능)</p><p></p><ul><li>NORMAL : 정상적으로 데이터베이스의 모든 기능을 사용할 수 있는 모드</li><li>NOMOUNT : Tibero의 프로세스만 기동시키는 모드</li><li>MOUNT : 미디어 복구를 위해 사용하는 모드</li><li>RESETLOGS : Tibero 서버를 기동하는 과정에서 로그 파일을 초기화하며 미디어 복구 이후에 사용하는 모드</li></ul><p></p><p>Tibero에서는 tbboot에 부트 모드(bootmode)를 제공합니다. 각 모드에 대한 자세한 내용은 해당 절의 내용을 참고합니다.</p><p></p></td></tr><tr><td>-w</td><td><p>Tibero가 보안 지갑을 열고 기동하는 옵션</p><p></p><ul><li>기동 시 안내에 따라 보안 지갑의 패스워드 입력필요</li><li>입력된 보안 지갑의 패스워드가 일치하는 경우, NORMAL 모드로 기동</li><li>불일치 하는 경우 MOUNT 모드로 기동, MOUNT 모드로 기동하는 경우에는 해당 옵션으로 보안지갑을 열 수 없음</li></ul></td></tr></tbody></table>

#### **NORMAL**

정상적으로 데이터베이스의 모든 기능을 사용할 수 있는 모드 입니다.

NORMAL 모드사용 예시

```
$ tbboot NORMAL
listener port = 8629 

Tibero 7

TmaxData Corporation Copyright (c) 2008-. All rights reserved.

Tibero instance started suspended at NORMAL mode.
```

{% hint style="info" %}
데이터베이스를 비정상적으로 종료한 경우 Tibero가 기동할 때 자동으로 파손 복구(crash recovery)를 실행합니다.

자세한 내용은 “파손 복구”를 참고합니다.
{% endhint %}

#### **NOMOUNT**

Tibero의 프로세스만 기동시키는 모드 입니다.&#x20;

{% hint style="info" %}
일반적으로 NOMOUNT 모드를 사용하는 경우는 매우 드물며, Tibero를 기동한 다음 CREATE DATABASE 문을 이용해데이터베이스를 생성 시 이 모드를 사용합니다.&#x20;
{% endhint %}

NOMOUNT 모드  사용 예시

```
$ tbboot NOMOUNT
listener port = 8629 

Tibero 7

TmaxData Corporation Copyright (c) 2008-. All rights reserved.

Tibero instance started suspended at NOMOUNT mode.
```

#### **MOUNT**

미디어 복구를 위해 사용하는 모드 입니다.

MOUNT 모드  사용 예시

```
$ tbboot MOUNT
listener port = 8629 

Tibero 7

TmaxData Corporation Copyright (c) 2008-. All rights reserved.

Tibero instance started suspended at MOUNT mode.
```

#### **RESETLOGS**

Tibero 서버를 기동하는 과정에서 로그 파일을 초기화하며 미디어 복구 이후에 사용하는 모드 입니다.

{% hint style="info" %}
RESETLOGS 부트모드는 직전에 데이터베이스가 비정상적으로 종료 됐을 시 사용할 수 없으며 우선 Tibero가 기동되면 NORMAL 모드와 동일하게 동작합니다.

자세한 내용은 “미디어 복구”를 참고합니다.
{% endhint %}

RESETLOGS 모드  사용 예시

```
$ tbboot RESETLOGS
listener port = 8629 

Tibero 7

TmaxData Corporation Copyright (c) 2008-. All rights reserved.

Tibero instance started suspended at NORMAL mode.
```

### **tbdown**

tbdown은 현재 동작 중인 Tibero를 종료하는 역할을 수행합니다.&#x20;

tbdown 사용 예시

```
tbdown 
tbdown -h
tbdown [-t] [ normal | post_tx | immediate | abort | switchover | abnormal |
              NORMAL | POST_TX | IMMEDIATE | ABORT | SWITCHOVER | ABNORMAL ]
tbdown clean
```

<table data-header-hidden><thead><tr><th width="112"></th><th></th></tr></thead><tbody><tr><td>옵션</td><td>설명</td></tr><tr><td></td><td>옵션이 없는 경우 Tibero를 정상 모드로 종료하는 옵션</td></tr><tr><td>-h</td><td>tbdown을 사용하기 위한 간단한 도움말을 보여주는 옵션</td></tr><tr><td>-t</td><td><p>Tibero 서버를 종료할 수 있는 옵션 (생략가능)</p><p></p><ul><li>NORMAL : 일반적인 종료 모드</li><li>POST_TX : 모든 트랜잭션이 끝날 때까지 기다리고 나서 Tibero를 종료하는 모드</li><li>IMMEDIATE : 현재 수행 중인 모든 작업을 강제로 중단시키며, 진행 중인 모든 트랜잭션을 롤백하고 Tibero를 종료하는 모드</li><li>ABORT : Tibero의 프로세스를 강제로 종료하는 모드</li><li>SWITCHOVER : Standby DB와 Primary DB를 동기화시킨 후 Primary DB를 NOR MAL 모드처럼 종료하는 모드</li><li>ABNORMAL : Tibero 서버에 접속하지 않고, 서버 프로세스를 무조건 강제로 종료시키는 모드</li></ul><p></p><p>Tibero에서는 tbdown에 다운 모드(downmode)를 제공합니다. 각 모드에 대한 자세한 내용은 해당 절의 내용을 참고합니다.</p><p></p><p></p></td></tr><tr><td>clean</td><td>Tibero 서버가 비정상 종료된 상태에서 운영 중에 사용하였던 공유 메모리나 세마포어 자원들을 해제하는 옵션, Tibero 서버가 운영 중일 때는 사용 불가</td></tr></tbody></table>

{% hint style="info" %}
Tibero 서버가 kill과 같은 시스템 내부 명령어에 의해 비정상적으로 종료된 경우, 운영 중에 사용하였 던 공유 메모리나 세마포어 자원들이 해제되지 않을 수 있습니다.&#x20;

* 재부팅에 실패하고, 관리자는 오류 메시지를 통해서 서버가 비정상 종료됨을 인지할 수 있습니다.&#x20;
* 서버를 재부팅하기 전에 반드시 tbdown clean으로 이전에 사용한 자원을 해제시켜야 합니다.<br>

서버가 비정상적으로 종료되었더라도 초기화 파라미터 BOOT\_WITH\_AUTO\_DOWN\_CLEAN을 Y 로 설정하면 자동으로 이전에 사용한 자원을 해제하고 부팅시킬 수 있습니다.&#x20;

* 이 경우 콘솔에 "tbdown clean" is executed automatically. 메시지가 출력됩니다.&#x20;
* Tibero 7은 기본적으로 Y로 설정되어 있으므로 위 메시지가 출력될 경우, 외부 프로그램 또는 사용자가 프로세스를 강제로 kill 하였는지 여부 확인이 필요합니다.
  {% endhint %}

tbdown 명령으로 Tibero 서버 종료 시, ABNORMAL 모드를 제외한 모든 다운 모드(downmode) 에서는 tbdown 프로세스가 서버에 직접 접속하여 세션을 맺고 명령을 내려 서버를 종료시킵니다.

tbdown 프로세스가 서버에 접속하기 위한 호스트 네임은 locahost로 고정되어 있으며 포트 번호는 초기화 파라미터 '\_LSNR\_SPECIAL\_PORT'와 같습니다.

\_LSNR\_SPECIAL\_PORT의 기본값은 LISTENER\_PORT+ 1 입니다. 다만 직접적으로 \_LSNR\_SPECIAL\_PORT로 접속 시 호스트 네임에 localhost는 사용할 수 없으며 다른 호스트 네임이나 IP를 명시적으로 사용해야 합니다.

리스너는 tbdown프로세스의 접속 요청을 받아서 일반 워킹 프로세스가 아닌 전용 워킹 프로세스의 워킹 스레드에게 접속을 할당합니다.

&#x20;tbdown 프로세스가 ABNORMAL 모드로 Tibero 서버 종료시, 서버에 직접 접속하지 않고 OS의 강제 종료 시그널을 사용하여 서버 프로세스들을 강제로 종료시킵니다.

{% hint style="info" %}
현재 Tibero 서버에 접속된 세션이 존재하는 경우, 다운 모드 옵션이 없는 tbdown 명령을 사용한다면 종료 방식을 선택해야합니다.

* 선택 1: NORMAL 모드로 세션이 완료될때까지 대기하다 종료
* 선택 2: IMMEDIATE 모드로 즉시 종료&#x20;
* 선택 3: 서버종료를 취소
  {% endhint %}

{% hint style="info" %}
이 장에서 설명하는 tbdown 명령과 다운 모드는 SYS 사용자로 접속한 tbSQL의 SQL 프롬프트에서도 가능합니다. 이를 통해 Tibero 서버가 설치되지 않은 원격에서 tbSQL를 이용하여 서버를 종료 시킬 수 있습니다. 단, ABNORMAL 모드의 tbdown 명령은 tbSQL에서 사용할 수 없습니다.
{% endhint %}

{% hint style="info" %}
Windows에서 서비스 관리자를 통해 Tibero 서비스를 중지시킬 경우 기본적으로 IMMEDIATE 모드로 Tibero 서버가 종료됩니다. 그러나 사용자 의사에 따라 초기화 파라미터 'SERVICE\_CONTROL\_STOP\_DOWN'을 이용하여 종료 모드를 설정할 수 있습니다.
{% endhint %}

#### **NORMAL**

일반적인 종료 모드로, Tibero에 SYS 사용자로 접속 후 다른 모든 세션의 접속이 끊어질 때까지 기다린 다음 서버를 종료시킵니다. 일단 tbdown을 실행하면 어떤 사용자도 더 이상 데이터베이스에 접속할 수 없게 됩니다. 그러나 tbdown이 실행되기 전에 이미 데이터베이스에 접속한 사용자는 스스로 접속을 끊을 때까지 제한 없이 데이터베이스를 계속 사용할 수 있습니다.

NORMAL 사용 예시

```
$ tbdown

Tibero instance terminated (NORMAL mode).
```

#### **POST\_TX**

모든 트랜잭션이 끝날 때까지 기다리고 나서 Tibero를 종료하는 모드 입니다.

POST\_TX는 Tibero에 SYS 사용자로 접속한 다음 모든 트랜잭션이 끝날 때까지 기다린 후 그 다음 Tibero를 종료시킵니다. tbdown 실행이 시작되면 더는 데이터베이스에 접속할 수 없고 이미 열려 있던 세션에서도 새로운 트랜잭션을 시작할 수 없게 됩니다. 다만, 현재 수행 중인 트랜잭션은 커밋 또는 롤백할 때까지 제한 없이 수행할 수 있으며, 커밋이나 롤백을 하는 순간 자동으로 데이터베이스 접속을 종료하게 됩니다.

또한 tbdown 실행이 시작되면 데이터베이스에 접속한 클라이언트에게 서버 종료를 알리는 메시지를 보내지 않습니다. tbSQL 유틸리티 등에서는 클라이언트가 서버 종료를 즉시 알지 못하고 그 다음 명령을 실행 할 때 비로소 Tibero가 종료되었음을 알 수 있습니다.

예시

```
$ tbsql admin/password123 

tbSQL 7

TmaxData Corporation Copyright (c) 2008-. 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;
      COL1 
----------
        10
        
1 row selected.
...이 시점에서 tbdown POST_TX 명령을 실행한다. 
...tbdown 명령은 트랜잭션이 끝나기를 기다린다.

SQL> COMMIT; 
Commit succeeded.
...이 시점에서 실제로 서버가 종료되고 tbdown 실행이 끝난다.

SQL> SELECT * FROM T1; 
TBR-2131: Generic I/O error.
IMMEDIATE
...서버가 종료되었으므로 tbSQL 유틸리티의 프롬프트에서는 TBR-2131 에러가 발생된다.
```

#### **IMMEDIATE**

현재 수행 중인 모든 작업을 강제로 중단시키며, 진행 중인 모든 트랜잭션을 롤백하고 Tibero를 종료하는 모드입니다. IMMEDIATE는 Tibero에 SYS 사용자로 접속한 다음 현재 수행 중인 모든 작업을 강제로 종료하고 진행 중이던 모든 트랜잭션을 롤백한 후 Tibero를 종료시킵니다. 클라이언트에서 Tibero 종료를 알지 못하는 것은 POST\_TX 모드와 같습니다. 트랜잭션이 오래 걸리는 작업 중에 있었다면, 이를 모두 롤백하기 위 해서 다소 시간이 걸릴 수 있습니다.

IMMEDIATE 사용 예시

```
$ tbdown immediate

Tibero instance terminated (IMMEDIATE mode).
```

#### **ABORT**

Tibero의 프로세스를 강제로 종료하는 모드입니다. ABORT는 Tibero에 SYS 사용자로 접속한 다음 Tibero 의 MONP 프로세스가 모든 프로세스를 OS의 강제 종료 시그널을 전달하여 강제로 종료시키는 모드이므로 비상시에 사용하며, 다음 번에 Tibero를 기동할 때 파손 복구 과정이 필요합니다.

ABORT 사용 예시

```
$ tbdown abort

Tibero instance terminated (ABORT mode).
```

ABORT는 Tibero가 강제로 종료시키므로 사용하던 시스템 리소스를 해제할 기회가 없습니다.&#x20;

따라서 서버가 종료된 다음에도 공유 메모리(Shared Memory), 세마포어(Semaphore) 등의 시스템 리소스가 남아있을 수 있으며, 로그 파일이나 데이터 파일도 동일합니다. 또한 다음 번에 Tibero를 기동할 때 파손 복구에 많은 시간이 걸릴 수 있습니다.&#x20;

{% hint style="info" %}
**ABORT**는 아래와 같은 경우에만 제한적으로 사용할 것을 권장합니다.

* Tibero의 내부 에러로 인한 정상적인 종료가 불가능한 경우
* H/W에 문제가 발생하여 Tibero를 즉시 종료해야 하는 경우
* 해킹 등의 비상 상태가 발생하여 Tibero를 즉시 종료해야 하는 경우
  {% endhint %}

#### **SWITCHOVER**

SWITCHOVER는 Standby DB와 Primary DB를 동기화시킨 후 Primary DB를 NORMAL 모드처럼 종료하는 모드 입니다.&#x20;

{% hint style="info" %}
관련된 자세한 내용은 “Tibero Standby Cluster”의 “Switchover”를 참고합니다.
{% endhint %}

#### **ABNORMAL**

Tibero 서버에 접속하지 않고 서버 프로세스를 무조건 강제로 종료시키는 모드입니다.

ABNORMAL은 Tibero 서버에 접속하지 않고 현재 Tibero 서버 상태와 상관없이 OS의 강제 종료 시그널을 사용하여 무조건 서버 프로세스를 강제로 종료시키는 모드이므로 비상 시에 사용하며, 다음번에 Tibero를 기동할 때 파손 복구 과정이 필요합니다.

ABNORMAL 사용 예시

```
$ tbdown abnormal

Tibero instance terminated (ABNORMAL mode).
```

ABNORMAL는 Tibero가 강제로 종료시키므로 사용하던 시스템 리소스를 해제 못할 수 있습니다.  &#x20;

따라서 서버가 종료된 다음에도 공유 메모리(Shared Memory), 세마포어(Semaphore) 등의 시스템 리소스가 남아있을 수 있으며, 로그 파일이나 데이터 파일도 동일합니다. 또한 다음 번에 Tibero를 기동할 때 파손 복구에 많은 시간이 걸릴 수도 있습니다.

{% hint style="info" %}
**ABNORMAL**은 다음과 같은 경우에만 제한적으로 사용할 것을 권장합니&#xB2E4;**.**

* Tibero의 내부 에러로 인한 정상적인 종료가 불가능한 경우
* ABNORMAL 외 다른 종료 모드로 종료 명령을 내린 후 종료가 지연되고 있을 때 강제로 즉시 종료해야 하는 경우
* H/W나 OS 등의 외부적인 요인으로 인하여 문제가 발생하여 ABNORMAL 외 다른 종료 모드의 실행이 실패한 경우
* H/W에 문제가 발생하여 Tibero를 즉시 종료해야 하는 경우
* 해킹 등의 비상 상태가 발생하여 Tibero를 즉시 종료해야 하는 경우
  {% endhint %}

###

***

## Binary TIP 사용 <a href="#bookmark114" id="bookmark114"></a>

Binary TIP(이하 BTIP)은 Tibero Initialization Parameter 값을 바이너리 파일 형태로 저장하는 기능입니다. 기존의 TIP 파일과 차이점은 운영 중 변경한 파라미터의 값을 저장하여 다음 부팅할 때 반영할 수 있습니다.

BTIP의 생성은 아래의 DDL 구문을 실행합니다.

```
SQL> CREATE BTIP FROM TIP;
...$TB_HOME/config 하위의 TIP 파일로부터 BTIP을 
...$TB_HOME/config/$TB_SID.btip로 생성한다.

SQL> CREATE BTIP='PATH' FROM TIP;
...BTIP을 $TB_HOME/config 아닌곳에 생성하고
...싶은 경우 BTIP 파일명의 절대경로를 주면된다.
...파일 확장명은 반드시 .btip 이어야 한다.
```

BTIP 파일로 부팅하기 위해서는 $TB\_HOME/config 하위에 $TB\_SID.tip에 BTIP\_FILE\_PATH를 추가해야 합니다. 이 파라미터는 BTIP 파일의 절대경로를  나타냅니다.&#x20;

기본적으로 부팅할 때 $TB\_SID.tip 파일에 BTIP\_FILE\_PATH 파라미터가 설정되어 있다면, BTIP\_FILE\_PATH의 BTIP 파일에서 파라미터를 읽어옵니다. BTIP 파일을 사용하기 위해서는 $TB \_SID.tip 파일에는 BTIP\_FILE\_PATH만 설정되어 있어야 합니다.

사용 중인 TIP 파일 정보는 아래와 같이 조회할 수 있습니다.

```
SQL> SELECT TIP_FILE FROM V$INSTANCE; 
TIP_FILE
-------------------------------------------------------------------------------- 
/home/tibero/work/7/config/t7.btip

...$TB_HOME/config 하위의 BTIP 파일을 사용중이다.
```

운영 중 파라미터 동적 변경을 BTIP에 저장 시, 아래의 DDL 구문을 이용하여 반영할 scope을 지정합니다.

```
SQL> ALTER SYSTEM SET PARAMETER1 = NEW_VALUE SCOPE BTIP ;
...PARAMETER1의 변경된 값 NEW_VALUE는 BTIP에만 반영하여
...다음 부팅부터 PARAMETER1의 값은 NEW_VALUE로 동작한다.
...DDL 구문수행 후 PARAMETER1의 값은 OLD_VALUE이다.

SQL> ALTER SYSTEM SET PARAMETER1 = NEW_VALUE SCOPE MEMORY ; 
...PARAMETER1의 변경된 값 NEW_VALUE는 운영 중인 시점에만 반영하고 
...다음 부팅시 PARAMETER1의 값은 OLD_VALUE이다.

SQL> ALTER SYSTEM SET PARAMETER1 = NEW_VALUE SCOPE BOTH ;
...PARAMETER1의 변경된 값 NEW_VALUE는 운영 시점과 BTIP 모두 반영하며
...다음 부팅시 PARAMETER1의 값은 NEW_VALUE이다.
...DDL 구문 수행 후 PARAMETER1의 값도 NEW_VALUE이다.
```

BTIP에서 TIP 파일 생성은 운영 중인 서버가 BTIP을 사용중일 때 가능합니다.

```
SQL> CREATE TIP FROM BTIP;
```

###
