Only this pageAll pages
1 of 54

Technical Guides

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

시작하기

클라우드 최적화 DBMS Tibero에 대한 소개부터 처음 사용 시 필요한 정보들을 안내합니다.

저작권 안내

티맥스티베로 기술문서에 일반적으로 공통 적용되는 저작권 안내사항 입니다.

주소

경기도 성남시 분당구 정자일로 45 티맥스타워

Website

기술서비스센터

Tel : +82-1544-8629

E-Mail : gitbook@tibero.com

Restricted Rights Legend

이 소프트웨어(Tibero®) 사용설명서의 내용과 프로그램은 저작권법과 국제 조약에 의해서 보호받고 있습니다. 사용설명서의 내용과 여기에 설명된 프로그램은 TmaxTibero Co., Ltd.와의 사용권 계약 하에서만 사용이 가능하며, 사용설명서는 사용권 계약의 범위 내에서만 배포 또는 복제할 수 있습니다. 이 사용설명서의 전부 또는 일부분을 TmaxTibero의 사전 서면 동의 없이 전자, 기계, 녹음 등의 수단을 사용하여 전송, 복제, 배포, 2차적 저작물 작성 등 의 행위를 해서는 안 됩니다.

이 소프트웨어 사용설명서와 프로그램의 사용권 계약은 어떠한 경우에도 사용설명서 및 프로그램과 관련된 지적 재산권(등록 여부를 불문)을 양도하는 것으로 해석되지 않으며, 브랜드나 로고, 상표 등을 사용할 권한을 부여하지 않습니다. 사용설명서는 오로지 정보의 제공만을 목적으로 하고, 이로 인한 계약상의 직접적 또는 간접적 책임을 지지 않으며, 사용설명서 상의 내용은 법적 또는 상업적인 특정한 조건을 만족시키는 것을 보장하지는 않습니다.

사용설명서의 내용은 제품의 업그레이드나 수정에 따라 그 내용이 예고 없이 변경될 수 있으며, 내용상의 오류가 없음을 보장하지 않습니다.

Tibero® 는 TmaxTibero Co., Ltd.의 등록 상표입니다. 기타 모든 제품들과 회사 이름은 각각 해당 소유주의 상표로서 참조용으로만 사용됩니다.

본 제품의 일부 파일 또는 모듈은 다음의 라이선스를 준수합니다. : OpenSSL, RSA Data Security, Inc., Apache Foundation, Jean-loup Gailly and Mark Adler, Paul Hsieh's hash 관련 상세한 정보는 제품의 다음의 디렉터리에 기재된 사항을 참고해 주십시오. : ${INSTALL_PATH}/license/oss_li censes

Introduction

Tibero DBMS는 고성능, 고가용성 및 확장성의 문제를 해결하는 엔터프라이즈 데이터베이스관리시스템 입니다.

About Tibero DBMS

현재 기업의 비즈니스는 폭발적인 데이터의 증가와 다양한 환경 및 플랫폼의 등장으로 빠르게 확장되고 있습니다. 새로운 비즈니스 환경이 도래함에 따라 보다 더 효율적이고 유연한 데이터 서비스와 정보의 처리, 데이터 관리 기능이 필요하게 되었습니다.

Tibero는 이러한 변화에 맞춰 기업 비즈니스 구현의 기반이 되는 데이터베이스 인프라 구성을 지원하며 고성능, 고가용성 및 확장성의 문제를 해결하는 엔터프라이즈 데이터베이스 관리 시스템 입니다.

  • 기존 DB의 단점을 보완하기 위해 Tibero 는 독자적인 Tibero Thread Architecture를 채택, 구현했습니다.

  • 한정된 서버 프로세스의 CPU 및 메모리 등의 시스템 리소스를 효율적으로 사용하면서 뛰어난 성능과 안정성 및 확장성을 보장하고 편리한 개발 환경과 관리 기능을 제공합니다.

  • RDBMS 환경에서 요구되는 주요 기능인 분산 데이터베이스 링크(Distributed Database Link), 데이터 이중화(Data Replication), 데이터베이스 클러스터(Data Cluster), 병렬 질의 처리 (Parallel Query Processing) 등의 기능을 갖추고 있습니다.

Tibero Database 설치 on Linux

Linux 환경에서 Tibero DB 설치 방법 (Tibero DBMS Install on Linux)을 안내합니다.

주제별

티베로 DBMS 사용 가이드를 주제별로 안내합니다. 설치부터 전환, 관리, 개발, 보안 관련 정보를 확인하세요.

Tibero Database 설치 on Windows

Windows 환경 내 티베로 DB 설치 방법을 안내합니다.

Trademarks

Open Source Software Notice

Tibero는 초기 설계부터 대규모 사용자, 대용량 데이터, 강화된 안정성, 향상된 호환성 측면 등에서 다른 DBMS와 차별화를 고려하여 개발된, 대용량의 데이터를 관리하고 안정적으로 비즈니스의 연속성을 보장하는 데이터 관리 솔루션 입니다.

이처럼 Tibero는 기업이 원하는 최적의 데이터베이스 환경을 제공하는 대표적인 DB 입니다.

Tibero 문서 네비게이션 맵 바로가기

설치 가이드 (for Client)

Linux 환경에서 티베로 DBMS 클라이언트 설치 관련하여 사전 준비사항, 고려사항, DB 설치방법에 대해서 설명합니다.

안내서 구성

본 문서는 총 2개의 장으로 구성됩니다.

Tibero 클라이언트 설치 전 준비사항과 주의사항 및 설치 후 고려사항에 대해서 설명합니다.

🔎 설치 전, 후 고려사항 바로가기

UNIX 환경에서Tibero 클라이언트를 수동 모드로 설치하는 방법을 설명합니다.

🔎 설치 바로가기

Tibero Technical Guides

티맥스티베로 기술문서를 한 곳에서 확인하세요! Tibero DBMS 관련 다양한 기술 가이드와 참고 자료를 검색하여 활용하실 수 있습니다.

설치가이드 (for Client)

Linux와 Windows 환경 내 티베로 DBMS 클라이언트 설치 관련하여 사전 준비사항, 고려사항, 설치 방법에 대해 설명합니다.

본 문서는 총 2개의 장으로 구성됩니다.

Tibero 클라이언트 설치 전 준비사항과 주의사항 및 설치 후 고려사항에 대해서 설명합니다.

Tibero 클라이언트를 수동 모드로 설치하는 방법을 설명합니다.

설치 가이드 (for Client)

Windows 환경 내 티베로 DBMS 클라이언트 설치 관련하여 사전 준비사항, 고려사항, 설치 방법에 대해 설명합니다.

본 문서는 총 2개의 장으로 구성됩니다.

Tibero 클라이언트 설치 전 준비사항과 주의사항 및 설치 후 고려사항에 대해서 설명합니다.

🔎

Windows 환경에서 Tibero 클라이언트를 수동 모드로 설치하는 방법을 설명합니다.

🔎

Tibero 안내서 바로가기

안내서 구성

Database Languages

(SQL, tbPSM, Text and tbESQL)

설치

Linux, Windows 등 다양한 환경에서 Tibero DB 설치 방법을 안내합니다.

관리

전환

타 DB, 대용량 DB 등을 Tibero DBMS 전환 이관 방법에 대해 안내합니다.

안내서 구성

설치 전, 후 고려사항 바로가기
설치 바로가기

티베로 시작하기

클라우드 최적화 Tibero DBMS 소개부터 처음 사용 시 필요한 정보들을 안내합니다.

주제별

티베로 DBMS 사용 가이드를 주제별로 안내합니다. 설치부터 전환, 관리, 개발, 보안 관련 정보를 확인하세요.

전환 전 확인

티베로 DB전환 전 고려사항에 대해서 설명합니다.

고려사항

전환 수행 절차

다음은 DB 전환 수행 절차 입니다. 전환을 위해서는 DB 전환팀과 AP 전환 및 테스트팀이 필요합니다.

[그림 1] 전환 수행 절차

전환 난이도

다른 DB에서 Tibero DB로 전환할 때 상황에 따라 난이도가 구분되며 난이도에 따라 전환 방법이 달라질 수 있습니다.

아래는 각 난이도에 대한 상황의 설명입니다.

난이도
상황

전환 검증 시간을 줄이기 위하여 전환을 시작하기 전 고객사의 DB 담당자는 Source DB의 INVALID한 Object를 정리하는 것이 좋습니다.


T-UP의 Analysis 기능을 이용해 전환 전 호환성 검증을 진행합니다.

검증

DBMS 업그레이드 검증 방법 입니다.

Source DB 페이지에서 설명한 "체크리스트 및 체크 방법"의 "Object Count 확인" 및 "Constraint 확인"을 Target DB의 Object 및 Constraint 개수와 비교하여, 개수가 맞지 않다면 아래와 같이 View를 조사합니다.

Table - DBA_TABLES 
Partition Table - DBA_TAB_PARTITIONS
Subpartition Table - DBA_TAB_SUBPARTITIONS
View - DBA_VIEWS
Mview - DBA_MVIEWS
Synonym - DBA_SYNONYMS
Sequence - DBA_SEQUENCES
Package - DBA_SOURCE(TYPE = 'PACKAGE') / DBA_OBJECTS(OBJECT_TYPE= 'PACKAGE')
Package Body - DBA_SOURCE(TYPE = 'PACKAGE BODY') / DBA_OBJECTS(OBJECT_TYPE= 'PACKAGE BODY')
Function - DBA_SOURCE(TYPE = 'FUNCTION') / DBA_OBJECTS(OBJECT_TYPE= 'FUNCTION')
Procedure - DBA_SOURCE(TYPE = 'PROCEDURE') / DBA_OBJECTS(OBJECT_TYPE= 'PROCEDURE')
Index - DBA_INDEXES
Partition Index - DBA_IND_PARTITIONS
Subpartition Index - DBA_IND_SUBPARTITIONS
Constraint - DBA_CONSTRAINTS
Grant - DBA_TAB_PRIVS / DBA_ROLE_PRIVS / DBA_SYS_PRIVS
Trigger - DBA_TRIGGERS

Target DB의 Object 및 Constraint를 조회할 경우 체크 방법의 ""과 ""를 참고합니다.

또한 미지원되는 사항 이외의 데이터가 이관되지 않았다면 별도 확인이 필요합니다.

전환

타 DB에서 Tibero DB로 전환하는 방법에 대해 안내합니다.

안내서 구성

본 문서는 총 4개의 장으로 구성됩니다.

전환 전 확인해야 할 사항에 대해서 설명합니다.

🔎 전환 전 확인 바로가기

DB를 전환할 때 사용하는 방법들에 대해서 설명합니다.

🔎 전환 방법 바로가기

타사 DB에서 Tibero DB로 전환하는 절차 및 방법을 설명합니다.

🔎

Tibero와 다른 DBMS의 컬럼 데이터 타입을 비교하여 설명한 참고자료 입니다.

🔎

설치 전, 후 고려사항

Windows 환경 내 Tibero 클라이언트 설치 관련하여 사전 준비 사항 및 주의 사항, 고려 사항에 대해서 설명합니다.

설치 전 준비사항

1. 디스크 용량 확인

Tibero를 설치하기 위해서는 각 플랫폼별로 약간의 차이가 있지만 최소 2GB 이상의 하드디스크 여유 공간이 필요합니다. 이는 Tibero 설치 후 데이터베이스를 생성할 때 최소로 필요한 하드디스크 공간을 의미하기도 합니다.

2. JDK 설치 확인

Tibero 클라이언트 인스톨러를 이용해 설치하기 위해서는 JDK 1.5.17 이상이 반드시 설치되어 있어야 합니다.

[그림 1] JDK 설치 확인

[그림 1] JDK 설치 확인

현재 JDK 1.9 이상은 지원하지 않습니다. 만약 JDK가 설치되어 있지 않다면 아래의 위치에서 JDK를 다운로드 할 수 있습니다.

🔎

Tmax group의 TechNet에서 회원가입 후 설치파일을 다운로드합니다.

🔎


Tibero를 설치한 후 타 제품과 연동을 위해 JDBC를 제공합니다.

JDBC 연동을 할 경우 Tibero DB 서버의 해당 경로에서 드라이버 파일을 받아 연동합니다.

아래는 Tibero 버전 별 드라이버 파일명에 대한 설명입니다.

Tibero 버전
파일명

보안

계정 및 권한, 파일환경 점검 등 Tibero DBMS 운용과 관리에 대한 보안 위험분석 및 영향도, 그리고 해결방안을 제시합니다.

안내서 구성

본 문서는 총 5개의 장으로 구성됩니다.

계정 관리에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.

🔎 계정 관리 바로가기

권한 관리에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.

🔎 권한 관리 바로가기

DBMS 보안 설정에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.

🔎

환경 파일 점검에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.

🔎

보안 감사 설정에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.

🔎

설치 전, 후 고려사항

Linux 환경 내 Tibero DB Client 설치 관련하여 사전 준비사항과 주의사항, 설치 후 고려사항에 대해 설명합니다.

설치 전 준비사항

1. 디스크 용량 확인

Tibero를 설치하기 위해서는 각 플랫폼별로 약간의 차이가 있지만 최소 2GB 이상의 하드디스크 여유 공간이 필요합니다. 이는 Tibero 설치 후 데이터베이스를 생성할 때 최소로 필요한 하드디스크 공간을 의미하기도 합니다.

2. JDK 설치 확인

Tibero 클라이언트 인스톨러를 이용해 설치하기 위해서는 JDK 1.5.17 이상이 반드시 설치되어 있어야 합니다.

[그림 1] JDK 설치 확인

[그림 1] JDK 설치 확인

현재 JDK 1.9 이상은 지원하지 않습니다. 만약 JDK가 설치되어 있지 않다면 아래의 위치에서 JDK를 다운로드 할 수 있습니다.

🔎

Tmax group의 TechNet에서 회원가입 후 설치파일을 다운로드합니다.

🔎

구분
파일명

Tibero를 설치한 후 타 제품과 연동을 위해 JDBC를 제공합니다.

JDBC 연동을 할 경우 Tibero DB 서버의 해당 경로에서 드라이버 파일을 받아 연동합니다.

아래는 서버의 운영체제별 드라이버 파일 위치에 대한 설명입니다.

구분
위치

아래는 Tibero 버전 별 드라이버 파일명에 대한 설명입니다.

Tibero 버전
파일명

설치

UNIX 환경 내 Tibero Database Client 수동 모드 설치 방법을 안내합니다.

  1. 설치 파일(tar.gz)과 라이선스 파일(license.xml)을 준비합니다.

  1. 클라이언트 계정을 생성합니다.

성능 개선 방법

상황별 DBMS 성능 개선 방법에 대해 설명합니다.

Tibero 클라이언트는 데이터가 지정한 크기만큼 바인딩되기 전까지 서버로 업로드되지 않으므로 대용량 의 데이터를 업로드할 때 효율적으로 사용할 수 있습니다.

tbLoader에서 제공하는 아래의 옵션을 사용하여 이관합니다.

옵션
설명

SQL Execution Work Area 크기 산정

Tibero DB SQL Execution Work Area 크기 산정 방법에 대해 설명합니다.

다른 워킹 프로세스 및 워킹 스레드와 공유되지 않은 독립적인 메모리 공간으로 세부 영역은 다음과 같습니다.

  • 세션 정보 영역 로그온 및 세션 관련 정보

  • 커서 정보 영역 (SQL영역) SQL 문 처리할 때 필요한 메모리 공간

I/F Driver 변경

  • JDBC 4.0 SPEC를 준수합니다. (JDK 1.6이상)

  • JDBC 파일 : $TB_HOME/client/lib/jar/tibero6-jdbc.jar

  • JDBC 4.0 SPEC을 준수합니다. (JDK 1.7 이상)

수행 방법

DB 전환 전 고려사항에 대해서 설명합니다.

table_migrator.zip 바이너리 압축 파일을 해제하면 다음과 같은 파일이 생성됩니다.

파일
설명

Temp 테이블 스페이스 크기 산정

Tibero DBMS Temp 테이블 스페이스 크기 산정방법에 대해 설명합니다.

Join이나 대량 Sort 처리가 많은 경우 Temp 테이블 스페이스에서의 I/O가 다발적으로 발생합니다. (CREATE INDEX / ANALYZE / SELECT DISTINCT / ORDER BY / GROUP BY / UNION / SORT-MERGE)

Temp 테이블 스페이스 크기 산정을 위해서는 SQL Execution Work Area와 Temp 테이블 스페이스 간의 관계 이해가 필수입니다.


아래는 Temp 테이블 스페이스의 크기를 산정할 때 고려할 사항입니다.

  • 시스템유형 : OLTP, DSS, DW, Batch Job

DB 환경 파일 점검

티베로 데이터베이스 환경 파일 점검에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.

Tibero를 사용하여 DBMS에 접근할 경우 명령어 행의 계정 및 패스워드를 붙여서 사용하면 쉘 히스토리 (.history 또는 .sh_history) 파일에 사용한 계정과 패스워드의 기록이 남습니다.

계정 및 패스워드가 유출될 가능성이 있습니다.

Tibero 명령을 사용할 경우 명령어 행에 계정과 패스워드를 Line Mode가 아닌 Interactive Mode로 실행합니다. 쉘 히스토리(.history 또는 .sh_history) 파일에 대한 보호를 위하여 접근 권한 설정을 600으로 설정합니다.

UTL_FILE_DIR은 UTL_FILE을 통해 호스트의 파일 시스템 접근 허용 디렉터리를 제한합니다.

만약 UTL_FILE_DIR의 설정값이 '*'로 설정된 경우 전체 파일 시스템에 접근이 가능하므로 '*'로 설정할 경우에는 매 우 제한적으로 사용해야 합니다.

호스트의 전체 파일 시스템에 접근이 가능합니다.

'*' 설정값을 제거합니다.

업그레이드

티베로 DBMS 업그레이드 방법을 안내합니다.

논리적 백업 및 복구(exp 및 imp)를 이용해 Tibero 6에서 Tibero 7로 업그레이드 방법을 안내합니다.

[Tibero6 to Tibero7 전환 구성도]

  • Tibero 유틸리티 exp 및 imp 사용을 위한 JDK 1.7 이상 설치

  • exp 및 imp 덤프 파일을 생성, 복사할 충분한 디스크 공간

Object Count 확인
Constraint 확인

문서 다운로드

전환 바로가기
데이터 타입 비교 바로가기
10MB
Tibero_7_전환 가이드.pdf
PDF
Open

문서 다운로드

DBMS 보안 설정 바로가기
환경 파일 점검 바로가기
보안 감사 설정 바로가기
5MB
Tibero_7_보안 가이드.pdf
PDF
Open

쉬움

몇 개의 Schema(=사용자)로 구성되어 있습니다.

Object들 사이에 의존성이 복잡하게 구성되어 있지 않습니다.

실제 사용하는 Object들로 구성되어 있으며 모두 VALID 상태 입니다.

어려움

다수의 Schema(=사용자)로 구성되어 있으며 Object들 사이에 의존성이 복잡하게 구성되어 있습니다.

Object들이 사용되지 않는 것들이 많으며 INVALID 상태입니다.

전환 전 권장사항

Source DB에서 에러가 발생하면 Tibero에서도 에러가 발생합니다.

전환 전 분석

[그림 2.1] T-UP Analysis
[그림 2.2] T-UP Analysis
[그림 3.1] T-UP Analysis Report
[그림 3.2] T-UP Analysis Report

Tibero 7

tibero7-jdbc.jar

3. 설치 파일 준비

설치 후 고려사항

JDBC

Technet 바로가기
JDK 다운로드 바로가기

UNIX, Linux 계열

Technet의 tar.gz 파일을 다운받아 사용합니다.

UNIX 계열

$TB_HOME/client/lib/jar

Tibero 7

tibero7-jdbc.jar

3. 설치 파일 준비

수동 모드로 설치할 경우

설치 후 고려사항

JDBC

Technet 바로가기
JDK 다운로드 바로가기

바이너리 압축을 해제합니다.

  1. profile을 설정합니다. 클라이언트 서버의 profile에 해당 내용을 환경에 맞게 수정한 후 추가합니다.

  1. gen_tip.sh를 실행합니다.

  1. 네트워크 파일 (tbdsn)을 설정합니다. tbdsn.tbr 파일은 서버의 접속 경로를 설정하는 파일로 $TB_HOME/client/config에 위치합니다. 아래와 같이 tbdsn.tbr 파일을 수동으로 설정합니다.

  1. Tibero Client를 이용해서 Tibero Server로 접속합니다.

Tibero 클라이언트 수동 모드 설치

bindsize

배열에 사용될 최대 바이트 수를 지정하는 파라미터 (기본값 : 64KB)


Direct Path Load 방식으로 데이터를 로드할 때 테이블에 존재하는 인덱스의 생성 방법을 MULTI INSERT 방식과 FAST BUILD 방식 중에 하나 선택할 수 있습니다.

아래는 인덱스 생성 방법에 대한 설명입니다.

파라미터
설명

MULTI INSERT INDEXES

인덱스를 여러 개의 레코드 단위로 최적화 하여 한 번에 생성

FAST BUILD INDEXES

기존의 인덱스를 무시하고 데이터 파일의 데이터를 모두 로드하여 다시 생성

인덱스 생성 방법을 지정하는 컨트롤 파일의 세부 내용은 아래와 같습니다.

rows

Conventional Path Load 방식으로 이관할 경우

사용자가 대용량 데이터를 업로드할 때 Commit을 수행할 레코드 개수를 지정하는 파라미터 (단, tbLoader는 성능을 고려하여 지정한 레코드의 개수를 정확히 맞춰 서버로 데이터를 보내지는 않음)

인덱스가 생성된 테이블에 데이터를 Upload할 경우

tbLoader 유틸리티를 사용하기 전에 대상 테이블에 기존 데이터가 많으면 MULTI INSERT 방식으로 인덱스를 생성하는 것이 유리하고 그 외는 FAST BUILD 방식이 유리합니다.

(단, tbLoader 유틸리티를 사용하여 DPL할 때 데이터 중복 등의 문제로 인해 인덱스가 Unusable 상태로 변경될 수 있습니다.)

JDBC 파일 : $TB_HOME/client/lib/jar/tibero7-jdbc.jar


Tibero 7 ODBC를 설치하여 기존 드라이버를 변경합니다.

OLE DB의 경우 지원이 중단되어, 아래와 같은 방법으로 우회가 필요합니다.

  1. ADO 환경(VB)에서는 MADASQL(Microsoft에서 제공하는 제너럴 OLE DB Driver)로 우회합니다.

  2. ADO.NET(C#, VB.NET) 환경에서는 TDP.NET으로 우회합니다.

DSN 방식은 동일하며 WIndows 계열의 IP/PORT 접속방식이면 아래와 같이 변경이 필요합니다.


Gateway를 사용 중이라면 Tibero 7에서 제공하는 Gateway로 변경 후 기동합니다.

JAVA External Procedure의 Agent를 사용 중이라면 Tibero 7에서 제공하는 Agent로 변경 후 기동합니다.

Tibero 6의 해당 파일을 열어 외부 라이브러리 참조에 필요한 셋팅을 Tibero 7에 적용한 후 관련 라이브러리를 가져옵니다.

JDBC

Tibero 6

Tibero 7

Tibero URL Setting

Tibero 6,7

참고

Tibero 7부터는 클라이언트의 JVM Locale을 따르는 방식으로 변경되었습니다. 기존에는 DB 서버의 Locale을 기준으로 설정되었습니다.

ODBC 및 OLE DB

Connection String(ODBC)

Tibero 6

Tibero 7

참고

Tibero 7의 경우 DB NAME 체크가 강화되므로, 고객사에 해당하는 DB NAME을 추가합니다.

UNIX 계열(Linux 포함)에서는 SQLDriverConnect를 사용하여 IP/PORT를 명시하더라도 환경변수 TB_SID를 참고하여 DSN 방식으로 동작합니다.

기타(DB Link, EXTERNAL 등)

DB Link

External Procedure

외부라라이브러리(JAR) 참조

Tibero 6

Tibero 7

internal-jdbc-16.jar

Tibero JDBC 드라이버

migrator.bat

Windows 계열 실행 파일

migrator.sh

POSIX 계열 실행 파일

migrator.properties.eg

Table Migrator 컨트롤파일

msllogger-14.jar

로그 관련 인터페이스 클래스

antlr-4.3-complete.jar

문자열 파싱 관련 인터페이스 클래스

postgresql-42.2.27.jre6.jar

PostgreSQL JDBC 드라이버


UNIX 계열인 경우 migrator.sh, Windows 계열인 경우는 migrator.bat 파일을 수정합니다.

classpath 설정에 Source DB의 JDBC 드라이버가 설정되어 있는지 확인하고 없을 경우 추가합니다.


아래는 Table Migrator를 실행하는 2가지 예로 UNIX 계열인 경우 migrator.sh, Windows 계열인 경우는migrator.bat 명령어를 입력합니다.

파라미터의 값을 컨트롤 파일에 설정한 후 실행합니다.

migrator_cli.jar

Table Migrator 클래스

toolcom.jar

Tibero 유틸리티 공통 라이브러리

1. 압축 파일 해제

실행에 필요한 클래스 라이브러리 toolcom.jar, internal-jdbc-16.jar는 Target DB(Tibero)의 버전에 맞는 라이브러리로 교체하여 실행합니다.

(라이브러리 기본 위치 : $TB_HOME/client/lib/jar)

2. migrator.sh 수정 (또는 .bat)

3. Table Migrator 수행

명령 프롬프트에서 파라미터 지정 실행

컨트롤 파일 지정 실행

파라미터의 값이 동시에 컨트롤 파일과 명령 프롬프트에 설정된 경우, 명령 프롬프트에서 지정한 파라미터 값을 우선순위로 합니다.

UTL_SMTP 패키지를 Public 그룹에서 사용할 수 있도록 권한을 부여하면 허가받지 않은 메일의 전송이 발생 할 수 있습니다.

시스템 내부의 파일을 외부로 전송할 수 있습니다.

Public 그룹과 같은 사용자에게 권한을 부여하지 않고 특정 사용자에게 부여하여 해당 사용자에게만 메일이 전송될 수 있게 합니다.

Tibero DBMS를 초기에 설치할 경우 디폴트로 포함되는 Sample DB(TEST DB)를 제거하여 DBMS 운영정보 관련 공격이 침투할 때 환경 정보를 제거합니다.

데이터베이스의 운영 환경정보 노출 가능성이 있습니다.

Sample DB를 제거합니다.

Tibero의 중요 파일 중에 하나인 initialization 파일의 변경으로 시스템 장애가 발생합니다.

DB 기동 및 운영에 위협적인 영향을 줄 수 있습니다.

$ chmod 640 $TB_HOME/config/$TB_SID.tip 파일의 접근 권한을 설정합니다. (권장값 : 600 또는 640)

Tibero의 중요 파일인 Control 파일, Redo 로그 파일, 데이터 파일의 삭제 및 변경으로 시스템 장애가 발생합니다.

DB 운영 정지 및 데이터의 유실 위험이 있습니다.

Control 파일, Redo 로그 파일, 데이터 파일의 접근 권한을 설정합니다. (권장값 : 600 또는 640)

접근 권한을 640으로 설정한 경우

OS 명령어 히스토리 검사

위험 분석

위험 영향

해결 방안

$ tbsql <username>/<password>로 접속하지 않습니다.

UTL_FILE_DIR 사용 제한

위험 분석

위험 영향

해결 방안

UTL_SMTP 사용 제한

위험 분석

위험 영향

해결 방안

Sample DB 제거

위험 분석

위험 영향

해결 방안

TIP(Tibero Initialize Parameter) 파일 접근 권한 설정

위험 분석

위험 영향

해결 방안

Control 파일, Redo 로그 파일, 데이터 파일 접근 제한

위험 분석

위험 영향

해결 방안

$ useradd -d /home/tibero7_client -g dba tibero7_client
$ passwd tibero7_client
$ ls
tibero7-bin-FS02-windows64_2008-269353-20240314021215.zip

$ unzip tibero7-bin-FS02-linux64_3.10-254994.tar.gz
```shell
$ vi ~/.bash_profile
export TB_HOME=/home/tibero7_client/tibero7
export TB_SID=tibero
export PATH=$TB_HOME/bin:$TB_HOME/client/bin:$PATH
export LD_LIBRARY_PATH=$TB_HOME/client/lib:$LD_LIBRARY_PATH

$ source ~/.bash_profile
$ cd $TB_HOME/config

$ sh gen_tip.sh Using TB_SID "tibero"
/home/tibero7_client/tibero7/config/tibero.tip generated
/home/tibero7_client/tibero7/config/psm_commands generated
/home/tibero7_client/tibero7/client/config/tbdsn.tbr generated. 
Running client/config/gen_esql_cfg.sh
Done.
$ cd $TB_HOME/client/config

$ ls
gen_esql_cfg.sh tbco_file_id tbdsn.tbr	tbimport_hl.config.default tbpcb.cfg 
tbc_file_id	tbdfdump.cfg tbertl.cfg tbpc.cfg

$ vi tbdsn.tbr 
#------------------------------------------------------------
# /home/tibero7_client/tibero7/client/config/tbdsn.tbr 
# Network Configuration File.
# Generated by gen_tip.sh at 2023. 06. 12. (월) 14:30:16 KST
tibero=(
    (INSTANCE=(HOST=192.168.xxx.xxx) 
              (PORT=8629)
              (DB_NAME=tibero)
     )
)
/tbsql tibero/tmax


TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.

Connected to Tibero.

SQL> SELECT
    IPADDR, USERNAME 
FROM
    V$SESSION;	2	3	4

IPADDR
----------------------------------------------------------
USERNAME
-----------------------------------------------------------------------------------
192.168.xxx.xxx
TIBERO
# MULTI INSERT INDEXES 적용
$cat control.ctl 
LOAD DATA
...
MULTI INSERT INDEXES
... 
(...)

# FAS BUILD INDEXES 적용
$cat control.ctl 
LOAD DATA
...
FAST BUILD INDEXES
... 
(...)
Single : jdbc:tibero:thin:@192.168.11.49:8629:tibero
TAC : "jdbc:tibero:thin:@(description=
(failover=on)(load_balance=on)
(address_list=(address=(host=192.168.11.49)(port=8629))
(address=(host=192.168.11.50)(port=8629))
)(DATABASE_NAME=tibero7))”
DRIVER={Tibero 6 ODBC Driver};SERVER=127.0.0.1;PORT=8629;UID=tibero;PWD=tmax;
DRIVER={Tibero 7 ODBC Driver};SERVER=127.0.0.1;PORT=8629;DB=tb7;UID=tibero;
PWD=tmax;
$TB_HOME/client/bin/ (해당 경로에 연결 대상 DB에 따른 Gateway 존재)
$TB_HOME/bin/psmjavac
$TB_HOME/client/bin/tbjavaepa
$TB_HOME/bin/psmjavac
$TB_HOME/client/bin/tbjavaepa
java -classpath migrator_cli.jar:ojdbc6.jar:postgresql-42.2.27.jre6.jar:msllogger-
14.jar:toolcom.jar:internal-jdbc-16.jar:antlr-4.3-complete.jar com.m.migrator.Main "$@”
sh migrator.sh SOURCE_TYPE=ORACLE \
SOURCE_URL=jdbc:oracle:thin:@127.0.0.1:1521:orcl \
SOURCE_USER=system SOURCE_PASSWORD=manager SOURCE_LOGIN_AS=NORMAL \
SOURCE_SCHEMA=scott SOURCE_TABLE=emp \
TARGET_URL=jdbc:internal:thin:@127.0.0.2:8629:t7 \
TARGET_USER=dbtech TARGET_PASSWORD=dbtech
sh migrator.sh PROPERTY_FILE=migrator.properties
$ chmod 640 [Control 파일|Redo 로그 파일|데이터 파일]
SQL Work Area (SQL 작업 영역) Sort, hash-Join, Bitmap 생성 및 Merge(병합) 작업할 때 사용되는 메모리 영역

아래는 관련 파라미터에 관한 설명입니다.

구분

설명

총 SQL Execution Work Area

  • 산정방법 MEMORY_TARGET - TOTAL_SHM_SIZE

MEMORY_TARGET

총 메모리 사용량이다.

TOTAL_SHM_SIZE

총 공유 메모리 사용량이다.


대용량의 데이터를 Full Table Scan으로 읽어들여 정렬, 조인 및 분석을 수행하는 쿼리가 대부분이고 Parallel Execution을 이용하는 환경입니다. 읽어들이는 데이터의 크기가 물리적인 메모리 크기에 담을 수 없을 정도의 크기인 경우가 많기 때문에 효율적인 Buffer Cache 이용을 기대할 수가 없는 상황이므로 공유 메모리 영역에서 Buffer Cache의 크기를 줄이고 독립적으로 사용 가능한 SQL Execution Work Area 메모리 크기에 따라 성능이 크게 좌우되는 정렬, 조인 및 분석 작업을 위해 대부분의 물리 메모리 를 SQL Work Area에 할당하는 것이 효율적입니다.


다음은 SQL Execution Work Area 크기 산정하는 방법입니다.

항목

설명

일반적인 온라인 업무 환경 (OLTP)

  • SQL Execution Work Area (SQL 실행 작업 영역) : 20%

  • TOTAL_SHM_SIZE : MEMORY_TARGET 값의 80% (OS 및 다른 서비스 사용 영역 제외) EX_MEMORY_OPERATION_LIMIT : 5000

  • _OP_MEM_MAX_SIZE (Tibero 7 기준 (IPARAM(MEMORY_TARGET) - IPARAM(TOTAL_SHM_SIZE)) * 0.05

데이터 분석 업무 환경

(OLAP)

  • SQL Execution Work Area (SQL 실행 작업 영역) : 80% (가용 메모리 한계 내에서 최적의 작업 영역을 지정하여 디스크 I/O를 줄이고 SQL의 수행 속도를 높일 수 있도록 조절하기 위해서)

  • TOTAL_SHM_SIZE : MEMORY_TARGET 값의 20%

  • EX_MEMORY_OPERATION_LIMIT : 20000 (Tibero 7 기준 Deprecated)

총 SQL Execution

Work Area

최대 MEMORY_TARGET - TOTAL_SHM_SIZE만큼 사용이 가능하다.

개요

고려사항

SQL Execution Work Area 크기 산정 시 고려사항

일반적인 온라인 업무 환경(OLTP)

온라인 업무에서는 대량의 데이터를 읽어서 정렬하거나 분석하는 쿼리보다는 특정 값을 조회 및 수정 하기 위해 index를 이용하는 쿼리가 대부분입니다. 이런 경우에는 SQL에서 독립적으로 사용하는 SQL Execution Work Area의 사용량이 많지 않고 오히려 Index를 이용한 Table Random Access IO를 줄이기 위해 Buffer Cache 영역을 대부분 사용하는 것이 바람직합니다.

데이터 분석 업무 환경(OLAP)

용량 산정

User Load
  • Transaction Volume

  • Data Size

  • Query & Statements 튜닝

  • Temp 테이블 스페이스 자체를 여러 개의 데이터 파일로 작성해서 분산 관리 또는 User별 다른 Temp테이블 스페이스 할당

  • Temp 테이블 스페이스 Group 설정


  • 구분

    설명

    EXTENT SIZE

    SORT_AREA_SIZE*2 + Block Size (기본 1MB 권장)

    SORT AREA의 최대 크기

    SORT_AREA_SIZE → 6KB, 세션 → 1000이라면 Sort 영역의 최대 크기는 16MB가 된다.

    (기본값: (MEMORY_TARGET - TOTAL_SHM_SIZE) * 0.3)

    SORT SEGMENT

    인스턴스 시작 후 첫 SQL이 Temp 테이블 스페이스를 이용하여 Sort Segment를 생성한다. DB가 shutdown되면 release된다.

    • V$SORT_SEGMENT : SORT_SEGMENT영역 할당 및 해제 확인한다.

    • V$SORT_USAGE : SORT_SEGMENT를 사용하고 있는 사용자를 확인 한다.

    • V$TEMPFILE, DBA_TEMP_FILES : Temp 테이블 스페이스에 할당된 tempfiles을 확인한다.

    개요

    고려 사항

    용량 산정

    Temp 테이블 스페이스의 용량 사용 방법

    Temp 테이블 스페이스의 용량을 산정하기 위해서 MEMORY_TARGET 파라미터를 이용하고, Autoextending Temp Files을 설정할 것을 권장합니다.

  • Tibero의 SYS 계정 또는 DBA 계정

  • 본 문서는 총 4개의 장으로 구성됩니다.

    Source DB인 Tibero6의 업그레이드 진행을 위한 작업 절차를 설명합니다.

    🔎 Source DB 작업 바로가기

    Target DB인 Tibero 7의 작업 절차를 설명합니다.

    🔎 Target DB 작업 바로가기

    Target DB의 Object 및 Constraint 개수와 비교하여 Object Count 및 Constraint를확인합니다.

    🔎 검증 바로가기

    JDBC, ODBC, DB Link 등 활용한 I/F Driver 변경을 안내합니다.

    개요

    사전 준비 사항

    안내서 구성

    Target DB 작업

    업그레이드 Target DB인 Tibero 7 업그레이드 작업 절차를 설명합니다.

    작업은 다음과 같은 순서로 진행합니다.

    1. 설치

    2. IMPORT 수행

    3. 후 처리

    Tibero 7를 설치하는 순서는 아래와 같습니다.

    기본 절차에 대한 자세한 내용은 "Tibero 설치 가이드"를 참고합니다.

    TIP은 $TB_HOME/config 안에 $TB_SID.tip 파일명으로 되어있습니다.

    Tibero 6과 기본 문법은 같고 기존에 사용하던 Alias 등을 추가합니다.

    Source DB에서 아래와 같은 설정 파일을 사용한다면 Tibero 7의 해당 설정 파일에도 적용이 필요합니다.

    • ESQL

    • C/JAVA External Procedure

    • DB Link 관련 Gateway

    • External Procedure (so 또는 class 파일 복사) Source DB와 Targer DB의 OS, BIT가 동일하면 복사를 하고 다르면 원본 소스를 통해 재컴파일을 수행합니다.

    • 디렉터리 관련 파일

    "체크리스트 및 체크 방법"의 ""의 조회 결과 파일을 복사합니다.

    의 내용을 참고하여 Tibero 6 설정에 맞게 수정한 후 DB를 생성합니다. 단, Archivelog 모드일 경우 후처리를 적용합니다.


    Import를 수행하는 순서는 아래와 같습니다.

    tbexport에서 생성된 tibero6_exp.log 파일을 열어 CREATE TABLESPACE 구문을 참조해 데이터 파일경로 및 size를 조정합니다. 단, CREATE DATABASE에서 생성된 SYSTEM, UNDO,TEMP, USR 부분은 생성하지 않습니다.

    tbexport에서 생성된 tibero6_exp.log 파일을 열어 CREATE USER 구문을 참조해 USER의 PASSWORD, DEFAUTL_TABLESPACE 등의 설정을 조정합니다.

    Export 한 데이터 파일을 미리 복사해서 가져온 후 tbimport의 Database(FULL) 모드로 수행합니다.

    아래는 Target DB 서버에서 tbimport의 사용 방법 입니다.

    항목
    설명

    다음은 Source DB 서버에서 Tibero 7 버전의 tbimport 사용 예시 입니다.


    미지원 목록에 대한 생성구문을 Source DB 스크립트 형태로 실행합니다.

    기존 Tibero 6이 Archive 모드였거나 Archive 운영이 필요할 경우 적용합니다.

    데이터베이스 보안 설정

    티베로 DBMS 보안 설정에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.

    데이터 Dictionary 보호 설정 점검

    위험 분석

    데이터 Dictionary는 물리적 및 논리적 구조, 객체 정의 및 공간 할당, 사용자, 룰, 권한, 감사 등 데이터베이스의 핵심에 해당하는 정보를 담고 있으므로 사용자 및 외부로부터 보호해야 합니다.

    보호되지 않을 경우 누구나 DROP ANY TABLE 명령어로 데이터 Dictionary의 내용을 삭제할 수 있습니다.

    위험 영향

    데이터 Dictionary 정보의 삭제가 가능합니다.

    해결 방안

    Tibero는 해당 기능이 없으므로 해당사항이 없습니다.

    Listener logging 설정 점검

    위험 분석

    Listener logging 기능이 활성화 되어있지 않으면 공격자에 의한 악의적인 Listener command 사용 또는Listener 패스워드를 알아내기 위한 Brute Force 공격의 파악이 불가능합니다.

    위험 영향

    침해 사고 또는 장애 발생의 경우 원인 파악이 어렵습니다.

    해결 방안

    $TB_HOME/instance/$TB_SID/log/lsnr/trace_list.log 파일을 디폴트로 남깁니다.

    tbdsn.tbr 설정 및 보호 점검

    위험 분석

    Listener는 클라이언트로부터 접속 요구를 감시하는 프로세스로 클라이언트는 Listener를 통해 데이터베이스 에 접속합니다. Listener 설정 파일은 Listener가 기동할 때 읽혀져 클라이언트의 접근을 가능하게 하며 악의적인 사용자에 의해 사용될 경우 원격으로 Listener의 구성 설정을 변경할 수 있습니다.

    버퍼 오버플로우, 정보 유출, 악의적인 목적으로 파일을 변조할 수 있습니다.

    Tibero는 Oracle과 아키텍처 차이로 Listener가 별도로 존재하지 않습니다.

    백업 관리를 통해 장애 및 외부 침입에 대해서 대비해야 합니다.

    데이터베이스의 장애가 발생할 경우 복구가 불가능합니다.

    백업 정책을 수립하여 주기적인 백업 또는 각기 다른 미디어에 복사본을 보유하고 시스템 유지 보수, Upgrade, Migration 등의 서비스 운휴 및 수정 작업의 경우는 가장 가까운 시간까지의 백업본을 보유합니다.

    침해 사고가 발생할 경우 계정별 수행 Query와 시스템 및 응용 애플리케이션에 대한 로그를 관리합니다.

    침해 사고 또는 장애 발생의 경우 원인 파악이 어렵습니다.

    데이터베이스에서 발생하는 각종 로그는 원격지 관리 시스템을 통해 일정 기간(3개월 이상) 저장 관리하여 특이사항이 발생할 경우 원활한 분석이 가능하도록 지원해야 합니다.

    UTL_FILE, UTL_SMTP 등 여러 PL/SQL 패키지는 시스템과 데이터베이스에 영향을 미치는 취약점을 가지고 있 으므로 해당 패키지의 사용 권한이 Public에 부여되는 것을 제한해야 합니다.

    파일 시스템의 접근 또는 내부 파일의 외부 유출이 가능합니다.

    아래와 같은 패키지의 실행 권한을 사용하지 않는 경우 Public role에서 ‘실행 권한’을 제거합니다.

    데이터베이스 보안 감사 설정

    티베로 DB 보안 감사 설정에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.

    일반 계정의 System Catalog 접근 제한

    위험 분석

    일반 계정으로 데이터베이스의 관리 및 통계 등의 Meta 데이터를 가지고 있는 System Catalog에 접근하여 데이터베이스의 정보를 획득할 수 있습니다.

    위험 영향

    데이터베이스의 System Catalog 정보 유출 가능성이 있습니다.

    해결 방안

    데이터베이스의 Meta 데이터를 가지고 있는 System Catalog는 소수의 데이터베이스 관리자만 사용할 수 있도록 설정합니다.

    Public으로부터 권한을 제거하는 방법

    REVOKE <privilege> ON <system catalog object> FROM PUBLIC;

    네트워크 액세스 제한

    위험 분석

    원격 서버로부터 DBMS 정보가 노출될 수있습니다.

    위험 영향

    인가되지 않은 IP 주소 사용자에게 정보 유출 가능성이 있습니다.

    해결 방안

    $TB_SID.tip 파일에 아래의 항목들을 정의하여 접근 허용 및 접근 제한 IP 주소를 지정합니다.

    LSNR_INVITED_IP
    LSNR_DENIED_IP
    LSNR_INVITED_IP_FILE
    LSNR_DENIED_IP_FILE

    다음은 LSNR_INVITED_IP 항목의 등록 예제 입니다.

    위와 같이 등록하면 $TB_HOME/instance/$TB_SID/log/lsnr/trace_list.log 파일에 다음과 같이 등록됩니다.

    다음은 LSNR_INVITED_IP_FILE 항목의 등록 예제 입니다.

    위와 같이 등록한 후 LSNR_INVITED_IP_FILE 항목에 등록한 파일(invited.list)에 허용할 IP 주소 List를 작성합니다.

    DB Link는 클라이언트 또는 현재의 데이터베이스에서 네트워크 상의 다른 데이터베이스에 접속하기 위한 접속설정을 정의하는 Tibero 객체입니다.

    클라이언트와 데이터베이스 간의 DB Link가 암호화되지 않으면 원격 서버에 접근할 경우 패스워드와 같은 중요 정보가 노출될 수 있습니다.

    악의가 있는 사용자가 스니핑 등의 네트워크 공격을 통해 패스워드를 노출할 가능성이 있습니다.

    Tibero는 DB Link를 설정할 때 원격 서버의 패스워드가 암호화되므로 해당사항이 없습니다.

    감사를 수행할 수 있게 설정하여 사용자에 의한 문장, 권한, 객체에 대해 감사를 수행할 수 있습니다. 침해 사고 및 장애가 발생할 때 감사 자료를 이용하여 정확한 분석을 할 수 있습니다.

    침해 사고 또는 장애 발생의 경우 원인 파악이 어렵습니다.

    감사를 활성화하기 위하여 TIP 파일에 'AUDIT_TRAIL'의 값을 { NONE | DB | DB_EXTENDED | OS } 중에서 하나 선택합니다.

    다음은 $TB_HOME/config/$TB_SID.tip 파일의 설정 예제 입니다.

    감사 로그를 다른 사용자가 읽기, 쓰기 할 수 있는 경우 서버의 중요 정보가 노출될 위험성이 있습니다.

    비인가 사용자에 의한 파일의 변조 및 노출이 가능합니다.

    AUDIT_FILE_DEST에 설정된 경로의 디렉터리 권한을 750 또는 700 이하로 설정합니다.

    Shared Memory 크기 산정

    티베로 DB Shared Memory 크기 산정 방법에 대해 설명합니다.

    개요

    Tibero Shared Memory는 부팅할 때 고정된 용도로 사용되는 Fixed 영역과 운영 중에 자동으로 할당되어 사용되는 Shard Pool 영역으로 구분할 수 있습니다.

    • Fixed Memory DB가 부팅할 때 파라미터 값을 바탕으로 크기가 고정되는 영역입니다.

      • Buffer Cache(Database Buffer)

      • Log Buffer

      • 그 외 항목 : 전역 변수를 위한 공간, 워킹 스레드 정보와 세션 정보를 관리하는 영역

    • Shared Pool Memory 운영 중에 동적으로 할당되어 사용되는 영역입니다.

      • DD Cache

      • PP Cache(Library Cache)

      • 그 외 항목


    아래는Shared Memory 크기를 산정할 때 고려해야 할 사항입니다.

    • Shared Memory 크기를 운영 중에 동적으로 늘릴 수 없습니다.

    • Buffer Cache와 Shared Pool 사용 패턴을 분석하여 전체 Shared Memory 크기를 알맞게 정해야 합니다.

    • Buffer Cache


    Shared Memory 각 영역의 크기는 v$sga에서 확인할 수 있습니다.

    Shared Memory의 크기는 초기화 파라미터로 설정해서 조회할 수 있습니다.

    싱글 모드 : TOTAL_SHM_SIZE의 2/3 TAC 모드 : TOTAL_SHM_SIZE의 1/2

    • 싱글 모드 전체 shared pool 크기가 MIN_SHARED_POOL_SIZE보다 커야 합니다. (MIN_SHARED_POOL_SIZE 기본값: 1M * MAX_SESSION_COUNT)

    • TAC 모드 TAC를 위한 CCC와 CWS 공간이 충분히 확보되어야 합니다. CCC와 CWS를 위해 전체 Buffer Cache 크기의 25% 가량을 Shared Pool에서 사용합니다. CCC와 CWS를 위한 공간을 제외한 Shared Pool 영역이 _MIN_SHARED_POOL_SIZE 보다 커야 합니다.

    PP Cache와 DD Cache 등을 위한 Free Shared Pool 크기는 CCC와 CWS 공간보다 커야 합니다.

    물리 설계

    Tibero DBMS 설치 및 운영하기 전 효율적 시스템 사용을 위한 DB 물리 설계 방법을 제시합니다.

    개요

    Redo Log Files, Undo 및 Temp 테이블 스페이스 그리고 메모리 영역의 크기 산정을 위해서는 먼저 Tibero의 특성에 대한 이해가 필요하며 관련 정보는 Tibero 관리자 안내서를 참고합니다.

    또한, Table 및 Index 크기를 산정하기 위해 필요한 정보와 산정 방식은 Tibero의 Data Block Architecture 특성을 고려합니다.

    Tibero 특성에 대한 상세정보는Tibero 관리자 안내서의 "'', "스키마 객체의 관리"를 참고합니다.

    안내서 구성

    본 문서는 총 8개의 장으로 구성됩니다.

    테이블 크기 산정

    Tibero의 테이블 크기를 산정하기 위해 필요한 정보와 방법에 대해 안내합니다.

    🔎

    인덱스 크기 산정

    Tibero의 인덱스 크기를 산정하기 위해 필요한 정보와 방법에 대해 안내합니다.

    🔎

    데이터 타입별 크기 산정

    데이터 타입별 크기를 산정하는방법을안내합니다.

    🔎

    Redo 로그 파일 크기 산정

    Tibero의 Redo 로그 파일 크기 산정방법에 대해 안내합니다.

    🔎

    Undo 테이블 스페이스 크기 산정

    Tibero의 Undo 테이블 스페이스 크기 산정방법에 대해 안내합니다.

    🔎

    Temp 테이블 스페이스 크기 산정

    Tibero의 Temp 테이블 스페이스 크기 산정방법에 대해 안내합니다.

    🔎

    Shared Memory 크기 산정

    Tibero의 Shared Memory 크기 산정방법에 대해 안내합니다.

    🔎

    SQL Execution Work Area 크기 산정

    Tibero의 SQL Execution Work Area 크기 산정방법에 대해 안내합니다.

    🔎

    문서 다운로드

    4MB
    Tibero_7_물리설계 안내서.pdf
    PDF
    Open

    설치

    Windows 환경 내 Tibero DB 클라이언트 수동 모드 설치 및 제거방법을 설명합니다.

    1. 설치 파일을 준비합니다. Tibero 클라이언트를 설치할 폴더를 생성하고 압축을 해제하면 폴더들이 생성됩니다.

    2. 환경변수를 설정합니다.

    (1) Windows에서 [시스템 환경 변수 편집] -> [고급] -> [환경변수]를 선택한 후 [시스템 변수]를 설정합니다.

    Undo Tablespace 크기 산정

    Tibero Database Undo 테이블스페이스 크기 산정 방법에 대해 설명합니다.

    데이터의 갱신이 많은 시스템인 경우 Undo 테이블스페이스(Undo Tablespace)의 I/O가 많이 발생하므로 Undo 테이블 스페이스를 여러 개의 데이터 파일로 작성하여 데이터 파일을 분산시킵니다.

    • 설계 및 관리 용이(rollback,segment)

    • UNDO Data의 overwrite 방지

    • 영역확장 용이

    SQL 변환 및 전환

    기존 데이터베이스를 Tibero DBMS로 전환하는 Table Migrator 유틸리티에 대해 안내합니다.

    기존 데이터베이스를 Tibero로 전환하는 Table Migrator 유틸리티에 대해 안내합니다.

    Table Migrator 유틸리티의 특징 입니다.

    • Command 기반이며, 내부적으로 JAVA의 JDBC 드라이버를 이용하여 DBMS에 접속합니다.

    • 별도 컴퓨터(클라이언트)가 필요하지 않으며 Source 또는 Target 서버에서 수행 가능합니다.

    데이터베이스 권한 관리

    DB 권한 관리에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.

    개발 시스템과 운영 시스템을 하드웨어적으로 분리하여 Link가 설정되지 않아야 하며, 운영 시스템의 데이터를 개발 시스템으로 이전할 때 중요 데이터의 삭제 같은 통제와 검증 절차를 거쳐야 합니다.

    운영 시스템의 중요 데이터가 개발 시스템으로 누출될 가능성이 있습니다.

    개발 시스템과 운영 시스템의 분리를 회사의 정책으로 정의하고 개발자와 운영자를 원칙적으로 분리합니다. 만약 분리할 수 없다면 개발자가 운영 시스템에 접근할 경우 통제 절차를 거치도록 해야 합니다.

    DBA가 SYS 패스워드를 입력하지 않고 접근하면 그룹을 가진 멤버들이 SYS 권한으로 로그인이 가능하므로 SYS 암호를 반드시 입력해야 합니다.

    인증 없이 SYS 권한 획득이 가능합니다.

    Tibero에는 Oracle의 sqlplus /as sysdba와 같은 접속 방법이 없으므로 해당사항이 없다.

    Listener를 구동 또는 중지하는 작업은 DBA와 같은 특권자에게만 부여하며 Listener에 대한 접근 통제를 위해Listener 접근 패스워드를 설정해야 합니다.

  • DBA_TEMP_FREE_SPACE

  • _OP_MEM_MAX_SIZE (Tibero7 기준) (IPARAM(MEMORY_TARGET) - IPARAM(TOTAL_SHM_SIZE)) * 0.3
    _OP_MEM_MAX_SIZE(Tibero 7 기준) (IPARAM(MEMORY_TARGET) - IPARAM(TOTAL_SHM_SIZE)) * 0.2
  • _OP_MEM_MAX_SIZE(Tibero 7 기준) (IPARAM(MEMORY_TARGET) - IPARAM(TOTAL_SHM_SIZE)) * 0.3

  • _OP_MEM_MAX_SIZE

    하나의 operation(정렬, 조인, 분석)에서 사용할 최대 메모리 사용량이다. (Tibero 7 기준)

    _OP_MEM_PX_MAX_SIZE

    하나의 operation(정렬, 조인, 분석)이 parallel로 수행될 때 slave들이 사용 할 수 있는 총 최대 메모리 사용량이다. (Tibero 7 기준)

    EX_MEMORY_OPERA TION_LIMIT

    하나의 operation에서 사용할 최대 메모리 사용량을 계산한다. (단위: MB) parallel 쿼리에서 slave들도 위의 최대 메모리 사용량을 쓰려고 하기 때문에 과다 메모리를 사용하려고 하고 memory tunner에 의해 나중에 수행되는 slave 의 경우 메모리 사용에 불이익을 받게 될 수도 있다.

    Cover
    Cover
    테이블 크기 산정 바로가기
    인덱스 크기 산정 바로가기
    데이터 타입별 크기 산정 바로가기
    Redo 로그 파일 크기 산정 바로가기
    Undo 테이블 스페이스 크기 산정 바로가기
    Temp 테이블 스페이스 크기 산정 바로가기
    Shared Memory 크기 산정
    바로가기
    SQL Execution Work Area 크기 산정 바로가기
    파일 및 데이터 관리

    sid

    Import 할 DB의 이름

    file

    Tibero6에서 import 한 데이터 파일

    log

    생성될 로그 파일의 이름

    ignore

    이미 존재하는 스키마 객체로 인한 생성 에러 무시 여부를 결정

    username

    Import 할 DB 계정으로 sys 계정 또는 dba 계정 중에서 하나를 선택

    password

    Import 할 DB 계정의 비밀번호

    port

    Import 할 DB의 포트 번호

    설치

    기본절차

    파일 설정

    Tibero Initial Parameter(tip파일)

    Tibero 6에서 사용하던 파라미터중 변경되거나 사라진 파라미터가 있으므로 Tibero 7에서의 적용 확인이 필요합니다.

    또한 _로 시작하는 히든파라미터를 사용하는것이 있다면 Tibero 7에서의 적용 확인이 필요합니다.

    tbdsn.tbr

    기타 파일

    데이터베이스 생성

    system.sh 수행

    Import 수행

    사용자 Tablespace 생성

    Tablespace를 미리 생성하지 않은 상태에서 Import를 수행하면 Source DB 정보 그대로 데이터파일을 생성하게 되고, 이 경우 의도하지 않은 경로에 데이터 파일을 생성하거나 데이터파일 생성 실패 및 불필요한 스토리지 사용의 문제를 일으킬 수 있습니다.

    사용자 생성

    USER를 미리 생성하지 않은 경우 Tibero 6 에서 수행한 Export를 Tibero 7에서 Import 수행 시, 두 버전의 default 암호화 방식이 변경되어 유저 생성이 실패합니다.

    tbimport

    후처리

    미지원 목록처리

    JOB

    DB LINK

    External Procedure - Library

    External Procedure – JAVA SOURCE

    Wrapped PL/SQL

    디렉터리 경로 변경

    Archive 모드 적용

    DB 종료

    Mount 모드 기동

    모드 변경

    DB 종료 및 기동

    확인

    디렉터리 확인
    "체크리스트 및 체크 방법"

    위험 영향

    해결 방안

    tbdsn.tbr 보호 점검에 대한 자세한 내용은 "환경설정 파일 보호 점검”과 “TIP(Tibero InitializeParameter) 파일 접근 권한 설정”을 참고합니다.

    백업 관리

    위험 분석

    위험 영향

    해결 방안

    로그 관리

    위험 분석

    위험 영향

    해결 방안

    PSM 패키지 사용

    위험 분석

    위험 영향

    해결 방안

    패키지의 실행 권한 제거

    DB Link 암호화 설정 점검

    위험 분석

    위험 영향

    해결 방안

    Audit Trail 기록 설정

    위험 분석

    위험 영향

    해결 방안

    Audit 로그 파일 접근 제한

    위험 분석

    위험 영향

    해결 방안

    주요 Workload를 돌려본 후 APM 리포트의 Buffer Cache Hit율을 보고 판단합니다.
  • Hit율이 90 % 이하 : Buffer Cache 크기 늘려야 합니다.

  • Shared Pool Memory

    • Workload를 돌려본 후 v$sga의 ‘SHARED POOL MEMORY’ 항목의 사용률 보고 판단합니다.

    • Shared Pool 사용률이 너무 높으면 (Free 영역이 적은 경우) Shared Pool 크기를 늘려야 합니다.

    • 세션당 최소 1M 이상의 Shared Pool 영역 확보가 필요합니다.

  • 고려 사항

    용량 산정

    Shared Memory 아래는TOTAL_SHM_SIZE 파라미터를 설정해서 조회하는 예입니다.

    Buffer Cach 아래는 DB_CACHE_SIZE 파라미터를 설정해서 조회하는 예입니다.

    Log Buffer 아래는 LOG_BUFFER 파라미터를 설정해서 조회하는 예입니다. (LOG_BUFFER 파라미터의 기본값 :10MB)

    Shared Pool Memory 전체 Shared Memory 크기에서 Fixed 영역을 뺀 나머지 영역입니다.

    비인가자의 Listener 접근이 가능합니다.

    Tibero는 Listener와 서버 프로세스가 동시에 기동되기 때문에 해당사항이 없습니다.

    운영에 중요한 환경 파일을 아무나 접근해서 수정할 경우 침입자가 환경 파일을 열어 설정값을 변경함으로써DB 운영에 영향을 줄 수 있습니다.

    악의적인 목적으로 파일을 변조할 수 있습니다.

    • $TB_HOME/config/$TB_SID.tip 파일의 퍼미션값을 변경합니다. (권장값 : 600 또는 640)

    • OS 계정에 의해 수정 및 관리되도록 하고 일반 계정의 접근을 금지합니다.

    중요 파일에 불필요한 소유권 또는 그룹 권한이 주어질 경우 해당 파일로 인해 인증되지 않은 사용자가 정보를 획득할 수 있습니다.

    시스템 또는 네트워크 환경설정 파일의 권한이 취약하게 설정되어 있거나 Tibero 사용자가 소유권을 가져야 하는 파일을 권한없는 사용자가 소유한다면비인가자가 시스템 권한을 획득하거나 중요 데이터를 파괴할 수 있습니다.

    $TB_HOME/client/config/tbdsn.tbr 파일의 퍼미션값을 변경합니다. (권장값 : 600 또는 640)

    Object의 사용 권한을 Public에 부여하면 Object 사용 권한이 없는 모든 계정이 해당 Object에 접근 가능하고Object의 정보를 획득할 수 있습니다.

    새로 생성된 계정의 Object 사용 권한이 Public에 불필요하게 부여된 경우 권한 남용의 위험이 있습니다.

    Object의 사용 권한이 불필요하게 Public에 부여된 경우 권한을 제한합니다.

    다음은Public으로부터 권한을 제거하는 방법입니다.

    GRANT 옵션과 함께 권한을 받은 사용자는 해당 권한을 다른 사용자에게 부여할 수 있습니다.

    불필요하게 GRANT 옵션이 부여된 계정이 있는 경우 권한 남용의 위험이 있습니다. (단, 담당자가 확인하여 권한이 필요하다고 인정하는 경우는 제외합니다.)

    GRANT 옵션 권한 부여는 DBA만 할 수 있도록 제한합니다. 불필요하게 GRANT 옵션이 부여된 계정은 권한을 제 거하고 GRANT 옵션 없이 권한을 다시 부여합니다.

    ADMIN 옵션과 함께 시스템 권한을 받은 사용자는 해당 권한을 다른 사용자에게 부여할 수 있습니다.

    불필요하게 ADMIN 옵션이 부여된 계정이 있는 경우 권한 남용의 위험이 있습니다. (단, 담당자가 확인하여 권한이 필요하다고 인정하는 경우는 제외합니다.)

    ADMIN 옵션 권한 부여는 DBA만 할 수 있도록 제한합니다. 불필요하게 ADMIN 옵션이 부여된 계정은 권한을 제 거하고 ADMIN 옵션 없이 권한을 다시 부여합니다.

    개발 및 운영 시스템 분리 사용

    위험 분석

    위험 영향

    해결 방안

    SYSDBA 권한 제한

    위험 분석

    위험 영향

    해결 방안

    Listener 패스워드 설정 점검

    위험 분석

    위험 영향

    해결 방안

    환경설정 파일 보호 점검

    위험 분석

    위험 영향

    해결 방안

    중요 파일 소유자 또는 그룹 설정 점검

    위험 분석

    위험 영향

    해결 방안

    Public에 대한 권한 제한

    위험 분석

    위험 영향

    솔루션을 설치할 때 디폴트로 Object 사용 권한이 Public에 부여되거나 소유자가 시스템 계정인 경우에는 양호합니다.

    해결 방안

    GRANT 옵션 사용 제한

    위험 분석

    위험 영향

    해결 방안

    권한 Revoke

    권한 Grant

    ADMIN 옵션 사용 제한

    위험 분석

    위험 영향

    해결 방안

    권한 Revoke

    권한 Grant

    tb6=(
    (INSTANCE=(HOST=192.168.1.129) 
    (PORT=8629)
    (DB_NAME=tb6) 
    )
    hidden=(
    (INSTANCE=(HOST=192.168.1.129) 
    (PORT=8630)
    (DB_NAME=tb6) 
    )
    $TB_HOME/client/config/tbpc.cfg
    $TB_HOME/client/config/tbpcb.cfg
    $TB_HOME/client/epa/java/config/tbepa.cfg
    (Tibero 6의 경우 : $TB_HOME/client/epa/java/config/epa.cfg)
    $TBGW_HOME/oracle/config/tbgw.cfg
    $tbJavaGW/tbgw.cfg(Tibero 6의 경우 : $tbJavaGW/jgw.cfg)
    create database
    user sys identified by tibero
    character set MSWIN949 
    national character set UTF16
    logfile group 0 ('log001.log','log002.log') size 50M,
    group 1 ('log011.log','log012.log') size 50M,
    group 2 ('log021.log','log022.log') size 50M
    maxdatafiles 8192
    maxlogfiles 100
    maxlogmembers 8
    noarchivelog
    datafile 'system001.dtf' size 1G autoextend on next 256M maxsize unlimited 
    default tablespace USR
    datafile 'usr001.dtf' size 1G autoextend on next 256M maxsize unlimited    
    default temporary tablespace TEMP
    tempfile 'temp001.dtf' size 1G autoextend off
    undo tablespace UNDO
    datafile 'undo001.dtf' size 1G autoextend off
    SYSSUB datafile 'syssub001.dtf' size 1G autoextend on next 32M maxsize unlimited;
    $TB_HOME/scripts/system.sh
    tbimport username={sys | dba계정} password=<password> port=<port_no> sid=<SID>
    file=<file name> log=<log-file name> full=y script=y ignore=y
    tbimport username=sys password=pwd port=8629 sid=tb7 
    file=tibero6_all.dat log=tibero7_imp.log full=y ignore=y
    DECLARE
    job_no number;
    BEGIN
    DBMS_JOB.SUBMIT(job_no,'dbms_output.put_line(''ok'');',SYSDATE,'SYSDATE+1');
    END;
    /
    CREATE DATABASE LINK olink CONNECT TO scott IDENTIFIED BY 'tiger' USING 'oragw';
    CREATE OR REPLACE LIBRARY extproc IS '/home/tibero/cepa/libextproc.so';
    CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "JavaExtproc" AS
    public class SimpleMath {
    public static int findMax(int x, int y) {
    if (x >= y) return x;
    else return y;
    }
    }
    /
    CREATE OR REPLACE PROCEDURE wrap_test WRAPPING
    IS
    BEGIN
    DBMS_OUTPUT.PUT_LINE('Hello World');
    END;
    /
    CREATE OR REPLACE DIRECTORY dir_ext AS '/home/tibero/t7/work/external/external'
    /
    tbdown immediate
    tbboot -t mount
    tbsql sys/tibero
    SQL> alter database archivelog;
    tbdown immediate
    tbboot
    tbsql sys/tibero
    SQL> SHOW PARAM LOG_ARCHIVE_DEST
    NAME                    TYPE     VALUE
    ----------------------- -------- --------------------------------------------
    LOG_ARCHIVE_DEST        DIRNAME  /home/tibero/t7/tibero7/database/t7/archive/
    ​
    SQL> alter system switch logfile;
    System altered.
    ​
    SQL> !ls -la /home/tibero/t7/tibero7/database/t7/archive/
    total 23572
    -rw-------. 1 tibero dba 24126976 Apr 4 22:40 log-t0-r0-s1.arc
    ​
    SQL> select log_mode from v$database;
    LOG_MODE
    -------------- -
    ARCHIVELOG
    UTL_HTTP, UTL_FILE, DBMS_RANDOM, DBMS_LOB, DBMS_SQL, DBMS_JOB, 
    DBMS_OBFUSCATION_TOOLKIT
    SQL> REVOKE EXECUTE ON <패키지명> FROM PUBLIC;
    LSNR_INVITED_IP="192.168.20.0/24;192.168.10.101"
    *** listener started and got into main loop ***
    [INVITED-IP] 192.168.20.0 / 255.255.255.0
    [INVITED-IP] 192.168.10.101 / 255.255.255.255
    LSNR_INVITED_IP_FILE="/home/tibero/tibero7/invited.list"
    # WAS_JEUS
    192.168.22.20
    192.168.44.10
    ### END OF FILE ###
    #AUDIT Setting
    AUDIT_TRAIL=OS
    AUDIT_SYS_OPERATIONS=Y
    AUDIT_FILE_DEST=/tibero/tbdata/audit/
    SQL> select * from v$sga;	
    
    NAME		                        TOTAL		        USED
    -------------------------------------  --------------------    ---------------
    SHARED MEMORY		                1258291200		1258291200
    FIXED MEMORY		                1032962080		1032962080
    SHARED POOL MEMORY		        225312768		222298112
    SHARED POOL ALLOCATORS (LC)		25165824		24048688
    SHARED POOL ALLOCATORS (DD)		16777216		3620240
    SHARED POOL ALLOCATORS (SLAB)		79691776		76092320
    SHARED POOL ALLOCATORS (MISC)		100663296		98956536
    SHARED POOL ALLOCATORS (Total)		222298112		202717784
    Database Buffers		        838860800		838860800
    Redo Buffers		                10485760		10485760
    10 rows selected.				
    
    SQL> show param total_shm_size
    
    NAME		                        TOTAL		        USED
    -------------------------------------  --------------------    ---------------
    TOTAL_SHM_SIZE                          INT64                   1258291200
    SQL> show param db_cache_size
    
    NAME		                        TOTAL		        USED
    -------------------------------------  --------------------    ---------------
    DB_CACHE_SIZE                           UINT64                  838860800
    SQL> show param log_buffer
    
    NAME		                        TOTAL		        USED
    -------------------------------------  --------------------    ---------------
    FLASHBACK_LOG_BUFFER		        UINT32		        0
    LOG_BUFFER		                UINT32		        10485760
    TOTAL_SHM_SIZE - [Fixed Memory]
    [전체 Shared Pool 크기] = _MIN_SHARED_POOL_SIZE + [CCC 공간] + [CWS 공간]
    + [Free Shared Pool 크기]
    [Free Shared Pool 크기] > ([전체 Shared Pool 크기] - _MIN_SHARED_POOL_SIZE) / 2
    SQL> REVOKE <권한> ON <object> FROM PUBLIC
    SQL> REVOKE <권한> ON <object명> FROM <user_name>;
    SQL> GRANT <권한> ON <object명> TO <user_name>;
    SQL> REVOKE <권한> ON <object명> FROM <user_name>;
    SQL> GRANT <권한> ON <object명> TO <user_name>;
    [그림 2] 시스템 변수 설정
    [그림 2] 시스템 변수 설정

    (2) [환경변수]에서 [시스템 변수] -> [새로 만들기]를 선택 한 후 TB_HOME, TB_SID를 설정합니다.

    [그림 3] TB_HOME, TB_SID 설정

    [그림 3] TB_HOME, TB_SID 설정

    (3) C:\Tibero 디렉터리에서 압축된 바이너리 실행 파일(tar.gz)을 해제합니다. 그 후에 %TB_HOME%의 license라는 하위 디렉터리에 발급받은 라이선스 파일(license.xml)을 복사합니다.

    (4) tbinstall.vbs 실행 후 레지스트리 등록을 확인합니다.

    [그림 4] 설치완료 확인창

    [그림 4] 설치완료 확인창

    레지스트리 확인(regedit)에서 HKEY_LOCAL_MACHINE\SOFTWARE\TmaxTibero\Tibero\tibero 경로에 TB_HOME과 TB_SID가 등록되었는지 확인합니다.

    [그림 5] TB_HOME, TB_SID 등록 확인

    [그림 5] TB_HOME, TB_SID 등록 확인

    (5) gen_tip.bat를 실행합니다.

    (6) 필요없는 폴더를 제거합니다. bin과 client 폴더를 남기고 나머지는 제거합니다.

    (7) 네트워크 파일(tbdsn)을 설정합니다. tbdsn.tbr 파일은 서버의 접속 경로를 설정하는 파일로 "%TB_HOME%\client\config"에 위치합니다.

    (8) Tibero Client를 이용해서 Tibero Server로 접속합니다.


    1. tbuninstall.vbs를 실행하여 레지스트리에서 제거합니다.

    [그림 6] 제거완료 확인창

    [그림 6] 제거완료 확인창

    1. 물리 파일을 삭제합니다. %TB_HOME%으로 설정된 경로의 디렉터리를 삭제하여 Tibero 클라이언트를 삭제합니다.

    Tibero 클라이언트 수동 모드 설치

    $ echo %TB_HOME% %TB_SID%
    $ cd %TB_HOME%\bin
    $ tbinstall.vbs %TB_HOME% %TB_SID%
    $ echo %TB_HOME% %TB_SID%
    $ cd %TB_HOME%\config
    $ gen_tip.bat\
    tibero=(
        (INSTANCE=(HOST=192.168.xxx.xxx) 
                  (PORT=8629)
                  (DB_NAME=tibero)
              )
    )
    C:\Users\tmax\Desktop\tibero7\config>tbsql tibero/tmax
    SQL> SELECT IPADDR, USERNAME FROM V$SESSION;
    
    IPADDR
    -----------------------------------------------
    USERNAME
    ---------------------------------------------------------------------------------
    192.168.xxx.xxx
    TIBERO
    
    1 row selected.
    $ echo %TB_HOME% %TB_SID%
    $ cd %TB_HOME%\bin
    $ tbuninstall.vbs

    디스크의 용량이 충분한 경우, 위 과정을 생략합니다.

    Tibero 클라이언트 제거

    플래시백 쿼리 이용 가능


    다음은 Undo 테이블 스페이스 크기를 산정할 때 고려할 사항입니다.

    • 데이터 파일 용량, UNDO_RETENTION, Undo Segment 수

    • 자동 관리일 경우 Undo Segment의 개별 공간은 자동으로 관리되므로 전체 Undo Segment의 최소/최대개수와 데이터 파일 용량만 설정합니다.

      • 최소 Undo Segment 개수(_USGMT_ONLINE_MIN)는 보통 10(default)으로 설정합니다. 단, 동시 수행 트랜잭션 수가 많은 경우 부하 중에 추가 Undo Segment를 생성하는 오버헤드가 있을 수 있다. 이경우예상되는동시수행트랜잭션수만큼최소 Undo Segment 개수를 설정해두면 Undo Segme 추가 생성 오버헤드를 줄일 수 있습니다.

      • 최소 Undo Segment 설정 개수가 이미 만들어져 있는 Undo Segment 개수보다 많은 경우 부팅 과정에 서 Undo Segment를 추가로 생성합니다. TAC의 경우 각 노드별로 적용한다. 예를 들어 NODE1은 _USGMT_ONLINE_MIN=30, NODE2는 40 으 로설정하고부팅하면각각 30개와 40개의 Undo Segment가 생성되어있는것을확인할 수 있습니다.


    Undo 테이블스페이스(Undo Tablespace)를 생성하는데 필요한 최소 크기와 예상 동시 수행 트랜잭션수를 기준으로 한 예상 크기, 그리고 APM 정보를 이용한 실제 사용 크기로 나누어 생각해 볼 수 있습니다.

    최초로 DB를 설치하는 경우 최소 크기 및 예상 크기 중 큰 값을 기준으로 Undo 테이블 스페이스 크기를 산정하고 이후 APM에서 최대 부하가 들어 올때 초당 소모하는 UNDO block 수를 기준으로 실제 크기와 산정한 크기가 맞는지 검증할 수 있습니다.

    • 최소 크기

    • 예상 크기

    • 실제 크기

    항목

    설명

    Undo 테이블 스페이스당 Undo Segment 최소 개수

    Single/TAC 모두 경우 _USGMT_ONLINE_MIN 값이다.

    Undo Tablespace당 Undo Segment 최대 개수

    예상되는 최대 동시 수행 트랜잭션 수이다.

    • Single의 경우 : _USGMT_ONLINE_MAX 값

    • TAC의 경우 : _USGMT_ONLINE_MAX / 노드수

    _USGMT_UNIFORM_EXTSIZE * 2

    Undo Segment는 최소 2개의 UNDO extent가 필요하고

    Undo extent 하나의 크기는_USGMT_UNIFORM_EXTSIZE이다.

    개요

    자동 관리 장점

    (Undo 테이블 스페이스당 Undo Segment 최소 개수 * _USGMT_UNIFORM_EXTSIZE * 2
    * Block size(8KB)) + 여유값
    (Undo 테이블 스페이스당 Undo Segment 최대 개수 * _USGMT_UNIFORM_EXTSIZE * 2
    * Block size(8KB)) + 여유값
    (초당 UNDO Block 소모량 * UNDO retention * Block size(8KB)) + 여유값

    Tibero는 수동 관리는 지원하지 않습니다.

    고려사항

    용량 산정

    Undo Tablespace 산정 방법

    Undo Tablespace 산정 공식에 사용되는 항목

    전체, 사용자별 이관은 불가능하며 Table 단위로 데이터 이관만 가능합니다. (스키마 객체 및 Table에 정의된 각종 제약조건은 전환되지 않음)

  • 옵션을 사용하여 다양한 방법으로 전환이 가능합니다. (SELECT 옵션, DPL, P-DPL 지원)

  • 아래는 Table Migrator 유틸리티 실행 전 준비사항 입니다.

    • JRE 1.6 이상 설치

    • Table Migrator 설치 전 아래의 파일이 준비여부 확인

      - table_migrator.zip : Table Migrator 바이너리

      - Source DB의 JDBC 드라이버

    DBMS
    JDBC 드라이버

    Oracle

    ojdbc6.jar (Source DB 버전에 맞는 드라이버 사용)

    MSSQL

    sqljdbc4.jar (Source DB 버전에 맞는 드라이버 사용)

    DB2

    db2jcc.jar (Source DB 버전에 맞는 드라이버 사용)

    • Table Migrator 바이너리를 Source DB 또는 Target DB(Tibero)에 위치합니다.

    • 이관 대상 Table을 생성 DDL을 이용하여 Target DB(Tibero)에 미리 생성합니다.

    Table Migrator 유틸리티를 실행할 때 아래와 같은 사항에 유의합니다.

    • Source DB의 Table을 이관할 경우 Target DB(Tibero)에 Tablespace, User, Table을 미리 생성 후 TableMigrator를 수행합니다.

    • DBMS 접속 계정에 DBA 권한이 필요합니다.

    만약, 고객사의 정책상 DBA 권한을 부여받지 못할 경우 이관 작업을 위한 사용자별 최소한의 권한 예시는 아래와 같습니다.

    계정
    권한

    Oracle (SOURCE DB)

    CONNECT, SELECT ANY TABLE, SELECT ANY DICTIONARY, ALTER SESSION

    Tibero (TARGET DB)

    CONNECT, SELECT ANY TABLE, SELECT ANY DICTIONARY, RESOURCE, ALTER SESSION

    • long, longraw 컬럼을 지원하지 않습니다.

    • index가 존재하는 Table일 경우 DPL 옵션을 사용하지 못합니다.

    본 문서는 총 3개의 장으로 구성됩니다.

    Table Migrator 유틸리티 실행 방법을 안내합니다.

    🔎 수행 방법 바로가기

    파라미터 지정 과정을 예시와 함께 설명합니다.

    🔎 파라미터 지정 바로가기

    타사 DB에서 Tibero DB로 전환에 대한 예시입니다.

    🔎 수행 예제 바로가기

    개요

    해당 바이너리는 TechNet의 T-UP 에서 다운 받을 수 있는 T-UP 파일에 포함되어 있습니다.

    특징

    사전 준비사항

    유의사항

    안내서 구성

    문서 다운로드

    995KB
    Tibero_7_전환 유틸리티 가이드.pdf
    PDF
    Open
    🔎 I/F Driver 변경 바로가기

    대용량 이관

    대용량 데이터 이관 방법 및 고려사항, 예제와 데이터베이스 성능 개선에 대해 안내합니다.

    개요

    이기종 데이터베이스를 이관할 때 대용량 테이블이 있다면 이관 방법을 통해 수행 시간을 단축할 수 있습니다. 고객사의 환경(네트워크, Disk I/O, 데이터 속성)을 고려하여 적절한 방법을 선택합니다.

    아래는 이관 방법들의 특징에 대한 설명입니다.

    이관 방법
    특징

    T-UP

    아래는 각 데이터 이관 방법들이 지원하는 방식에 대한 설명입니다.

    방식
    T-UP
    Table Migrator
    DB Lin
    tbLoader

    아래는 대용량 데이터를 이관할 때 고려해야 할 사항입니다.

    • 충분한 네트워크 대역을 확보합니다.

    • IO 대역을 고려하여 스케줄 또는 DOP를 적용한다. DPL, Parallel DPL을 최대한 활용합니다.

    • DPL, Parallel DPL이 불가능할 때에는 CPL을 병렬로 수행합니다. (Multi Insert)

    • Index, Constraint, Trigger 등은 데이터 이관이 끝난 다음 생성합니다.

    • Parallel DPL의 경우 Tibero 5 r69848 이후부터 지원합니다.

    • SUBPARTITIONED TABLE은 DPL 또는 Parallel DPL을 미지원합니다.

    • IOT는 DPL 또는 Parallel DPL을 미지원합니다.

    • Partitioned INDEX의 경우 Normal Index만 DPL을 지원합니다.

    본 문서는 총 2개의 장으로 구성됩니다.

    대용량 데이터 이관 방법의 예제를 설명합니다.

    🔎

    각 상황에 따른 성능 개선 방법에 대해 설명합니다.

    🔎

    전환 방법

    티베로 DB전환 방법의 다양한 유형을 설명합니다.

    T-UP

    아래는 T-UP의 데이터 전환 과정을 보여주는 그림입니다.

    [그림 4] T-UP 마이그레이션 예시

    특징

    • 내부적으로 JAVA의 JDBC Driver를 이용하여 Source DB와 TIbero에 접속합니다. 단, Source DB와 Tibero JDBC Drvier가 필요하고 JDK 또는 JRE가 미리 설치되어 있어야 합니다.

    • Source DB가 이기종 RDBMS라면 Source DB의 JDBC Driver도 필요합니다.

    • Source DB > T-UP > Tibero 방향으로 네트워크를 총 2번 거쳐 데이터가 이동합니다. T-UP을 기점으로 Source DB와 Tibero의 네트워크를 거쳐 데이터 이동을 하므로 대용량으로 이관할 경우 불리할 수 있습니다.

    • 전체, 사용자, 테이블 모두 가능하고 GUI 형태로 보여주므로 조작하기 쉽습니다.

    • 중간에 문제가 발생해도 멈추지 않으며 전환이 모두 완료된 후에 문제를 처리합니다.

    • Tablespace 내의 데이터 파일 경로 및 이름을 변경하려면 생성문 추출 후 미리 수동으로 생성합니다.

    • Schema(=사용자)에 대해 Default Tablespace를 변경하려면 생성문 추출 후 미리 수동으로 생성합니다.


    아래는 Table Migrator의 데이터 전환 과정을 보여주는 그림입니다.

    • Command 기반으로 내부적으로 JAVA의 JDBC Driver를 이용하여 Source DB와 Tibero에 접속합니다. 단, Source DB와 Tibero JDBC Driver가 필요하고 JDK 또는 JRE가 미리 설치되어 있어야 합니다.

    • 별도의 컴퓨터(클라이언트)가 필요하지 않고 Source DB 서버 또는 Tibero 서버에서 기동합니다.

    • 중간 서버가 필요하지 않으므로 네트워크를 1번 거쳐서 데이터가 이동합니다.

    Table Migrator를 사용하여 DB를 전환하기 전에 이관할 Table을 미리 생성해야 합니다.


    아래는 DB Link의 데이터 전환 과정을 보여주는 그림입니다.

    • Source DB 또는 Tibero에 DB Link Object를 생성합니다.

    • 중간 서버가 필요하지 않으므로 네트워크를 1번 거쳐서 데이터가 이동합니다.

    • 1개의 테이블 데이터만 이관 가능하고 대용량 테이블을 이관할 경우 유리합니다.

    DB Link를 사용하여 DB를 전환하기 전에 DB Link 구성 작업을 진행합니다.


    아래는 tbLoader의 데이터 전환 과정을 보여주는 그림입니다.

    • 데이터만 SAM 파일로 만들어서 한 번에 적재할 수 있습니다.

    • 대용량 데이터를 이관할 경우 유리합니다.

    tbLoader를 사용하여 DB를 전환하기 전에 Source DB에서 미리 텍스트 파일(SAM 파일)을 만들어서 Tibero 서버로 복사해야 합니다.


    아래는 수동 이관으로 데이터를 전환하는 과정을 보여주는 그림입니다.

    • Source DB에 클라이언트 Tool을 이용하여 스크립트를 추출한 후 Tibero에 수동으로 적용하는 방식입니다.

    • 데이터의 경우 수동으로 옮기기가 불가능하므로, T-UP과 같은 Tool을 이용하여 이관합니다.

    • 중간에 문제가 발생하면 바로 문제 처리를 한 후 다음을 진행할 수 있습니다.

    • Shell 스크립트와 연동하면 자동화할 수 있습니다.

    수동이관을 사용하기 전에 클라이언트 Tool을 이용하여 미리 DDL 생성문을 추출해야 합니다.


    다음은 전환 방법 적용할 때 고려사항입니다.

    • 전환을 수행할 때 한 가지 방법으로 수행하는 것이 아니라 여러 가지 방법을 혼합하여 사용할 수 있습니다.

    • 고객사에서 실제 운영을 전환할 때 최소한의 Down Time이 필요합니다. 해당 고객사에서 각 전환 방법의 테스트 및 시간 측정을 통해 최소한의 전환 시간을 확보해야 합니다.

    전환 방법
    적용 시기

    Redo 로그 파일 크기 산정

    Tibero DB Redo 로그 파일 크기 산정 방법에 대해 설명합니다.

    개요

    Redo 로그 파일은 최소 2개 그룹을 권장하며, Archivelog 모드인 경우 최소 3개 그룹을 권장합니다. 이는 Redo 로그가 순환할 때 rewrite 방지를 위한 hangup 현상을 막기 위함이며 최소 2개의 멤버를 권장합니다. 성능을 위해 각각 다른 물리 디스크에 배치하도록 합니다.

    Redo 로그 파일의 크기를 사전에 정확하게 추측하기가 어렵기 때문에 수행하는 업무의 일부를 수행한 후 Redo 로그 양을 측정하고 전체 업무를 수행했을 때의 Redo 로그 파일의 크기를 예측하는 것을 권장합니다.


    고려사항

    아래는 Redo 로그 파일 크기를 산정할 때 고려할 사항입니다.

    • 트랜잭션 처리 중 Log Switch가 발생하는 경우 트랜잭션 성능 저하가 발생합니다.

    • OLTP 중심의 시스템에서 트랜잭션 처리의 피크 타임에 Log Switch가 빈번하게 일어나지 않도록 Redo로그 크기의 조정이 필요합니다.

    • Redo 로그 파일의 크기가 크면 Log Switch 발생 가능성이 낮은 반면 Recovery 시간은 길어집니다.

    위 고려 사항을 참고해서 다음의 모드 중에 하나를 선택합니다.

    • LOGGING / NOLOGGING 모드

      • 테이블/인덱스에 대한 모든 변경사항은 기본적으로 Redo 로그로 기록되지만 NOLOGGING 테이블/ 인덱스에 대해 Direct-Path(DP) 방식으로 데이터를 추가하는 경우 Redo 로그를 기록하지 않습니다. DP에 대한 Redo 로그가 남지 않는 경우에 Media Recovery가 수행될 때 DP로 추가한 테이블 데이터 가 복구되지 않기 때문에 DP로 데이터를 추가한 후에는 백업을 받도록 권장합니다.

    아래는 LOGGING 모드에서 하나의 DML당 로그 발생량 및 확인 방법입니다.

    • 로그의 발생량을 DML 한 건으로 측정하기가 쉽지 않기 때문에 여러 건의 DML을 수행한 후 전체 로그 발생량을 측정해서 건수로 나누는 방법을 권장합니다.

    • 로그 발생량은 v$sysstat 테이블의 'name' 컬럼이 'Redo log size'인 항목으로 확인 가능하며 alter system clear stat 명령으로 v$sysstat 테이블의 내용을 clear할 수 있습니다.

      • ARCHIVELOG / NOARCHIVELOG 모드 Redo 로그 파일은 Cache Recovery될 때 더 이상 필요없는 경우에 재사용됩니다. (일반적으로 3개의 Redo 로그 파일들을 생성해서 순차적으로 돌면서 재사용하는 구조입니다.)


    Redo 로그에는 사용자 데이터에 가해지는 변경사항이 저장되며 DML의 종류에 따라 아래와 같은 내용이 저장됩니다.

    추가로 아래와 같은 내용을 포함합니다.

    • 트랜잭션 처리(begin/commit)를 위한 Redo 로그

    • Segment의 공간 관리(extent add, block format, index split)에 대한 Redo 로그

    • Undo 블록에 대한 변경사항

    • 블록 내 각 ROW에서 수행했던 트랜잭션의 commit 여부를 확인하고 변경하는 Redo 로그



    Redo 로그 파일에 쓰여지는 데이터량은 SQL 및 갱신 데이터량에 의해 크게 바뀌기 때문에 운영 전 사전에 정확한 추측이 불가능합니다.

    시스템의 크기에 따라서 다음과 같이 사전 설정 후 실제 운영 중 REDO 발생량을 보고 조정해야 합니다.

    DB 계정 관리

    데이터베이스 계정 관리에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.

    개발 및 운영 시스템 분리 사용

    위험 분석

    개발 시스템과 운영 시스템을 하드웨어적으로 분리하여 Link가 설정되지 않아야 하며, 운영 시스템의 데이터를 개발 시스템으로 이전할 때 중요 데이터의 삭제 같은 통제와 검증 절차를 거쳐야 합니다.

    위험 영향

    운영 시스템의 중요 데이터가 개발 시스템으로 누출될 가능성이 있습니다.

    해결 방안

    개발 시스템과 운영 시스템의 분리를 회사의 정책으로 정의하고 개발자와 운영자를 원칙적으로 분리합니다. 만약 분리할 수 없다면 개발자가 운영 시스템에 접근할 경우 통제 절차를 거치도록 해야 합니다.

    DBA 권한 제한

    위험 분석

    인가되지 않은 사용자가 DBA 권한으로 DBMS를 오용 및 남용할 수 있습니다.

    위험 영향

    DBA 권한을 사용하여 시스템 장애 및 데이터베이스를 변조할 가능성이 있습니다.

    해결 방안

    DBA 권한이 있는 계정의 사용자와 필요성을 확인합니다. 만약 불필요하게 DBA 권한이 허용된 계정이 있다면 계정을 없애거나 DBA 권한을 제거하고 데이터 누출 및 유실을 막기 위해 보안 정책을 수립합니다.

    다음은 DBA 권한 제거 방법입니다.

    잘 알려진 디폴트 계정과 디폴트 패스워드를 이용하여 데이터베이스에 접근할 수 있습니다.

    데이터베이스 접근 또는 상위 권한을 획득하여 데이터를 열람, 수정, 삭제할 수 있습니다.

    • OS, DB 레벨에서 원천적으로 접근을 제한하기 위해 사용하지 않는 애플리케이션 계정을 삭제합니다.

    • 계정은 다른 용도로 사용하고 특정 데이터베이스의 접근만 제한해야 하는 경우 SUPER USER 또는 설치 계정 의 GROUP에서 삭제합니다.

    디폴트 생성 DB 사용자(SYSCAT, SYSGIS, OUTLN, TIBERO, TIBERO1)의 디폴트 패스워드를 이용하여 인가되 지 않은 사용자가 DBMS에 접근할 수 있습니다.

    데이터베이스 접근 및 상위 권한을 획득하여 데이터를 열람, 수정, 삭제할 수 있습니다.

    사용하지 않는 디폴트 DB 계정은 삭제하거나 Lock 시키고, 사용하는 계정이라면 디폴트 패스워드를 수정합니다.

    무제한으로 로그인 시도가 가능한 경우 Brute Force 공격으로 무제한 로그인 시도가 발생할 수 있습니다.

    Brute Force 공격의 피해가 발생할 수 있습니다.

    로그인 실패 횟수를 설정하는 FAILED_LOGIN_ATTEMPTS 항목을 설정하여 일정 횟수로 로그인을 실패할 경우 계정이 Lock 되게 합니다.

    profile은 사용자 패스워드 관리 정책을 다양하게 생성하고 각각의 사용자에게 특정 정책을 사용하도록 지정 함으로써 사용자별로 그룹화된 패스워드 정책을 관리할 수 있는 기능을 제공합니다.

    악의적인 사용자의 Brute Force 공격으로 무제한 로그인 시도가 발생할 수 있습니다.

    Brute Force 공격의 피해가 발생할 수 있습니다.

    패스워드 Lock 기간을 설정하는 PASSWORD_LOCK_TIME 항목을 설정하여 일정 시간동안 로그인을 할 수 없도록 계정이 Lock 되게 합니다. (기본값 : UNLIMITED, 권장값 : 1 또는 2 또는 24)

    DBA_USERS 계정에 대해 주기적으로 패스워드를 변경하지 않고 취약한 패스워드로 설정할 경우 인증되지 않은 사용자에게 DBA 또는 USER 권한을 줄 수 있습니다.

    권한이 노출되어 남용될 수 있습니다.

    profile의 PASSWORD_LIFE_TIME 항목 설정값을 변경합니다. (기본값 : UNLIMITED, 권장값 : 30 ~ 90days)

    profile 변경

    DBA_USERS 계정의 패스워드를 변경할 때 패스워드 재사용 기간을 설정하지 않고 동일 패스워드를 사용할 경우 인증되지 않은 사용자에게 DBA 권한을 줄 수 있습니다.

    권한이 노출되어 남용될 수 있습니다.

    PASSWORD_REUSE_TIME에 지정한 날짜 동안에는 전에 사용했던 패스워드를 재사용하지 못하게 profile의 PASSWORD_REUSE_TIME 항목 설정값을 변경합니다. (기본값 : UNLIMITED, 권장값 : 30 ~ 90 days)

    profile 변경

    초당 UNDO block 소모량

    운영 중 최대 부하 당시의 APM 리포트에서 Undo Statistics의 Undo blocks값을 APM 구간(초)로 나눈 값이 다

    UNDO_RETENTION

    TIP 설정 값이다. (기본값: 900초)

    여유값

    KB 값이다. Long 트랜잭션이 비정기적으로 들어올 경우 (INDEX rebuild등도 포함)를 대비하여 충분한 크기를 잡 아 두는 것이 좋다.

    MYSQL

    mysql-connector-java-5.1.4.jar (Source DB 버전에 맞는 드라이버 사용)

    PostgreSQL

    postgresql-42.2.27.jre6.jar (Source DB 버전에 맞는 드라이버 사용)

    Sybase ASE

    jconn3.jar (Source DB 버전에 맞는 드라이버 사용)

    Informix

    ifxjdbc.jar (Source DB 버전에 맞는 드라이버 사용)

    Select Condition

    X

    O

    O

    X

    Direct Path Load

    O

    O

    O

    O

    Multi Thread

    O

    O

    X

    O

    Rows Per Commit

    X

    X

    X

    O

    LONG 컬럼이 포함된 255개 이상의 Column을 가진 테이블은 DPL을 미지원합니다.

  • LOB 계열의 컬럼이 있는 경우 DPL만 지원합니다.

  • INDEX가 생성되어 있는 경우 DPL만 지원합니다.

    • GUI 기반의 클라이언트 (네트워크 오버헤드가 커서 대용량 데이터를 이관할 경우 미권장)

    • DPL을 지원

    Table Migrator

    • 테이블 단위로 데이터를 옮기는데 최적화된 툴

    • SELECT 옵션의 CONDITION, PARTITION을 지원

    • DPL, P-DPL을 지원

    DB Link + DPI

    • SOURCE DB에 맞는 Gateway를 설치하고 DB LINK를 설정

    • APPEND 힌트를 통해 DPI를 지원

    SAM 파일 + tbLoader

    • 변화가 없는 테이블에 대해 SAM 파일로 내려 tbLoader를 이용하여 데이터를 로드

    • DPL, P-DPL을 지원

    • External Table + DPI 이용가능

    Parallel Processing

    O

    O

    O

    O

    데이터 이관 지원 방식

    데이터 이관 시 고려 사항

    주요 용어

    CPL (Conventional Path Loading) 컬럼 데이터를 읽어 컬럼 배열에 담고 일괄 처리 방식으로 데이터를 로드하는 방법입니다.

    DPL (Direct Path Loading) 특정 컬럼의 데이터 타입에 맞게 데이터를 컬럼 배열 형태로 만든 다음 블록 형식기를 거쳐 로드하는 방법으로, 아래와 같은 제약 사항이 있습니다.

    DOP (Degree Of Parallelism) 병렬도라고 하며, 단일 병렬 작업에서 사용되는 병렬 실행 서버의 수입니다.

    안내서 구성

    문서 다운로드

    대용량 데이터 이관 예제 바로가기
    성능 개선 방법 바로가기
    1MB
    Tibero_7_대용량 이관 가이드.pdf
    PDF
    Open

    ARCHIVELOG 모드 Media Recovery 를 수행해야 하는 경우 DB를 백업 받은 이후 생성된 전체 Redo 로그 파일들이 필요하며 Redo 로그파일들을재사용하기전 Media Recovery에서 사용할 목적으로 Redo 로그들을 다른곳에 복사해두는 방식입니다.

  • NOARCHIVELOG 모드 및 LOGGING 모드 NOARCHIVELOG 모드인 경우 Media Recovery가 지원되지 않기 때문에 LOGGING 테이블인 경우 라도 성능 개선을 목적으로 DP를 수행할 때 Redo 로그를 남기지 않습니다. ARCHIVELOG/NOARCHIVELOG 모드는 Redo 로그를 재사용하기 전 백업 수행 여부에 대한 판단이 기 때문에 LOGGING/NOLOGGING과는 개념상 큰 연관성은 없습니다.

  • Direct-Path Loading / Direct-Path Insert (DPL/DPI) 모드

    DP로 데이터를 추가하는 경우 데이터를 row 단위로 건건이 추가하는 방식이 아니라 batch 단위로 추가 하기 때문에 성능이 빠르며 Redo 로그의 양도 row 단위로 건건이 추가할 때보다 적게 생성됩니다.

  • 최대 크기

    • Tibero 5 SP1 : 4GB

    • Tibero 6 이상 : 2TB

    • Tibero 7 : 2TB

    구분

    설명

    로그 파일 최대 개수

    CREATE DATABASE 절의 MAXLOGFILES 파라미터

    Group당 로그 파일 최대 개수

    Unlimited

    최소 크기

    4MB

    구분

    설명

    소규모 시스템

    4MB~100MB

    중규모 시스템

    100MB~1GB

    대규모 시스템

    1GB 이상

    용량 산정

    INSERT

    UPDATE

    DELETE

    Redo 로그 제한 사항

    Redo 로그 크기

    디폴트 계정 사용

    위험 분석

    위험 영향

    해결 방안

    디폴트 DB 패스워드 사용

    위험 분석

    위험 영향

    해결 방안

    계정 Lock

    패스워드 변경

    무제한 로그인 시도 차단

    위험 분석

    위험 영향

    해결 방안

    profile 생성

    profile 변경

    profile 할당

    패스워드 Lock 기간 설정 점검

    위험 분석

    위험 영향

    해결 방안

    profile 변경

    profile 할당

    패스워드 주기적 변경

    위험 분석

    위험 영향

    해결 방안

    profile 할당

    DB 계정에 대한 패스워드 재사용 기간 설정 점검

    위험 분석

    위험 영향

    해결 방안

    profile 할당

    INSERT 하는 ROW의 내용(TABLE row 전체 + INDEX key 전체) + 
    INSERT에 대한 UNDO(delete할 rowid + delete할 INDEX key)
    UPDATE 내용(ROW의 내용 중 새로 변경되는 내용 + 변경되는 컬럼의 INDEX key delete/insert)
    + UPDATE에 대한 UNDO(row 변경을 되돌리는 내용 + INDEX key delete/insert)
    DELETE되는 ROW에 대한 내용(rowid 정보 + INDEX key 전체)
    + DELETE에 대한 UNDO(row 전체 + INDEX key 전체)
    SQL> REVOKE DBA FROM <username>;
    SQL> ALTER USER <username> ACCOUNT LOCK;
    SQL> ALTER USER <username> IDENTIFIED BY ‘<new_password>’;
    SQL> CREATE PROFILE <profile_name>
        LIMIT PASSWORD_VERIFY_FUNCTION verify_function 
        FAILED_LOGIN_ATTEMPTS <횟수>;
    SQL> ALTER PROFILE <profile_name> LIMIT FAILED_LOGIN_ATTEMPTS <횟수>;
    SQL> ALTER USER <username> PROFILE <profile_name>;
    SQL> ALTER PROFILE <profile_name> LIMIT PASSWORD_LOCK_TIME <시간>;
    SQL> ALTER USER <username> PROFILE <profile_name>;
    SQL> ALTER PROFILE <profile_name> LIMIT PASSWORD_LIFE_TIME <일수>;
    SQL> ALTER USER <username> PROFILE <profile_name>;
    SQL> ALTER PROFILE <profile_name> LIMIT PASSWORD_REUSE_TIME <일수>;
    SQL> ALTER USER <username> PROFILE <profile_name>;
    1개의 테이블 데이터만 이관 가능하고 대용량 테이블을 이관할 경우 유리합니다.
  • 조건절 또는 파티션 테이블 사용이 가능합니다.

  • tbLoader

    Source DB에서 SAM 파일 생성이 가능할 경우 사용합니다.

    수동 이관

    전환 난이도가 어려워 다른 전환 방법을 적용하기가 힘든 경우와 동일한 전환을 특정 기간에 걸쳐 반복적으로 수행해야 할 경우 사용합니다. (자동화 스크립트를 이용하면 2차 이상의 반복적인 수행일 경우에 간편합니다.)

    T-UP

    GUI 기반으로 간편하게 전환을 할 경우(전체, 사용자 모드)와 수동 이관할 때 데이터 이관 용도로 사용합니다.

    Table Migrator

    DB Link 구성이 어렵고 대용량 테이블 데이터를 이관할 때 사용합니다.

    DB Link

    Table Migrator 사용이 어렵고 대용량 테이블 데이터를 이관할 때 사용합니다.

    사전 작업 (선택)

    T-UP 사용법은 “Tibero 유틸리티 안내서”의 “T-UP” 을 참고합니다.

    Table Migrator

    특징

    사전 작업 (필수)

    Table Migrator 가이드가 필요할 경우 티맥스티베로기술지원팀에 요청해주십시오.

    DB Link

    특징

    사전 작업 (필수)

    Source DB가 Oracle일 경우 Tibero To Oracle 구성을 하는 것이 제약사항이 적습니다.

    DB Link 구성 방법은 제공되는 기술문서 중 "DB Link 가이드"를 참고합니다.

    tbLoader

    특징

    사전 작업 (필수)

    tbLoader 사용법은 "Tibero 유틸리티 안내서"의 ""를 참고합니다.

    수동 이관

    특징

    사전 작업 (필수)

    수동이관 사용법은 본 가이드 문서를 참고합니다.

    전환방법 선택 시 고려사항

    [그림 5] Table Migrator 과정
    [그림 6] DB Link 과정
    [그림 7] tbLoader 과정
    [그림 8] 수동 이관 과정

    데이터 타입 비교

    타 DBMS와 Tibero DBMS 컬럼 데이터 타입을 비교하여 설명합니다.

    ORACLE

    다음은 Oracle과 Tibero의 데이터 타입 비교표 입니다.

    Oracle
    Tibero

    CHAR

    CHAR

    VARCHAR


    다음은 MS-SQL과 Tibero의 데이터 타입 비교표 입니다.

    MS-SQL
    Tibero

    다음은 Sybase와 Tibero의 데이터 타입 비교표 입니다.

    Sybase
    Tibero
    티베로 | 대한민국 대표 데이터베이스 전문 기업티베로

    UNIQUEIDENTIFIER

    VARCHAR

    SQL_VARIANT LONG

    RAW

    BIGINT

    NUMBER

    NTEXT

    CLOB

    NUMERIC(P,S)

    NUMBER(n,n)

    DECIMAL(P,S)

    NUMBER(n,n)

    FLOAT(PRECISION)

    NUMBER

    DOUBLE(PRECISION)

    NUMBER

    REAL NUMBER

    NUMBER

    SMALLMONEY

    NUMBER(10,4)

    MONEY

    NUMBER(19,4)

    SMALLDATETIME

    DATE 또는 TIMESTAMP

    DATETIME

    DATE 또는 TIMESTAMP

    CHAR(N)

    CHAR(N)

    VARCHAR(N)

    VARCHAR(N)

    UNICHAR(N)

    NCHAR(N)

    UNIVARCHAR(N)

    NVARCHAR(N)

    NCHAR(N)

    NCHAR(N)

    NVARCHAR(N)

    NVARCHAR(N)

    BINARY(N)

    CLOB

    VARBINARY(N)

    BLOB

    BIT

    NUMBER(1) 또는 CHAR(1)

    TEXT CLOB

    CLOB

    IMAGE

    BLOB

    VARCHAR

    VARCHAR2

    VARCHAR2 (내부적으로는 VARCHAR로 생성하지만 Oracle의 VARCHAR2와 동작방식이 동일)

    NCHAR

    NCHAR

    NVARCHAR

    NVARCHAR

    NVARCHAR2

    NVARCHAR2(내부적으로는 NVARCHAR로 생성하지만 Oracle의 NVARCHAR2와 동작 방식이 동일)

    BLOB

    BLOB

    CLOB

    CLOB

    NCLOB

    NCLOB

    LONG

    LONG

    NUMBER

    NUMBER

    NUMERIC

    NUMERIC(내부적으로 NUMBER를 생성함)

    INT

    INT(내부적으로 NUMBER를 생성함)

    DECIMAL

    DECIMAL(내부적으로 NUMBER를 생성함)

    DOUBLE

    NUMBER

    FLOAT

    FLOAT(내부적으로 NUMBER를 생성함)

    REAL

    REAL(내부적으로 NUMBER를 생성함)

    SMALLINT

    SMALLINT(내부적으로 NUMBER를 생성함)

    BINARY_FLOAT

    NUMBER

    BINARY_DOUBLE

    NUMBER

    DATE

    DATE

    TIMESTAMP

    TIMESTAMP

    BFILE

    TIBERO BFILE 지원하지 않음, BLOB으로 우회

    RAW

    RAW

    LONG RAW

    LONG RAW

    XMLTYPE

    XMLTYPE(생성문법이 일부 다르므로 문법 변경이 필요 Oracle : SYS.XMLTYPE, Tibero : XMLTYPE)

    GEOMETRY

    GEOMETRY

    VARCHAR(MAX)

    CLOB

    NVARCHAR(MAX)

    NCLOB

    VARBINARY(MAX)

    BLOB

    TINYINT NUMBER

    NUMBER

    SMALLINT NUMBER

    NUMBER

    INT NUMBER

    NUMBER

    MS-SQL

    Sybase

    tbLoader
    Logo

    Source DB 작업

    Tibero6의 업그레이드 진행을 위한 Source DB 업그레이드 사전 작업 절차를 설명합니다.

    작업 절차는 다음과 같은 순서로 진행합니다.

    1. 체크리스트 및 체크 방법

    2. Export 수행

    Tibero 6에서 Tibero 7로 업그레이드 하기 위해 다음의 항목들을 확인합니다.

    데이터 타입별 크기 산정

    티베로 DB 데이터 타입별 크기 산정 방법에 대해 설명합니다.

    아래 표는 테이블과 인덱스 크기 시트의 계산식에서 적용되는 데이터 타입별 실제 소비 사이즈이며 저장 되는 크기는 산정 길이 +1로 합니다. 예를 들면 데이터의 산정 길이는 8bytes이며 실제 저장 데이터는 8+1=9bytes입니다.

    • 문자형

    수행 예제

    Table Migrator 유틸리티로 Oracle(Source DB)에서 Tibero(Target DB)로 DBMS 전환을 수행하는 예제입니다.

    Oracle에 테스트 Table, 데이터, 접속할 계정을 생성합니다.


    Oracle에 테스트 Table, 데이터, 접속할 계정을 생성합니다.

    1. 테스트 환경 구성

    2. 전환 수행

    --DBTECH 계정에 Tablespace, User, Table, Table Data 생성
    SQL> create tablespace DBTECH_TBS
    2 datafile 'dbtech_tbs01.dtf' size 50M
    3 AUTOEXTEND ON NEXT 20M MAXSIZE 5G
    4 EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
    
    Tablespace created.
    
    SQL> create user dbtech identified by dbtech
    2 default tablespace DBTECH_TBS;
    
    User created.
    
    SQL> grant connect, resource to dbtech;
    
    Grant succeeded.
    
    CONNECT dbtech/dbtech;
    
    SQL> create table board (no number,
    2 empno number(4),
    3 title varchar(20),
    4 contents clob,
    5 regdate date default sysdate,
    6 hit number default 0)
    7 PCTFREE 10
    8 INITRANS 2;
    
    Table created.
    
    SQL> INSERT INTO BOARD VALUES
    (1, 7369, 'introduction', 'Hello, my name is SMITH.', sysdate, 0);
    
    1 row created.
    
    SQL> INSERT INTO BOARD VALUES
    (2, 7499, 'introduction', 'Hello, my name is ALLEN.', sysdate, 0);
    
    1 row created.
    
    SQL> INSERT INTO BOARD VALUES
    (3, 7521, 'introduction', 'Hello, my name is WARD.', sysdate, 0);
    
    1 row created.
    
    SQL> INSERT INTO BOARD VALUES
    (4, 7566, 'introduction', 'Hello, my name is JONES.', sysdate, 0);
    
    1 row created.
    
    SQL> INSERT INTO BOARD VALUES
    (5, 7654, 'introduction', 'Hello, my name is MARTIN.', sysdate, 0);
    
    1 row created.
    
    SQL> commit;
    
    Commit complete.
    
    --Migration할 때 접속할 계정(DBTECH_TEST) 생성
    SQL> CONNECT /as sysdba
    Connected.
    
    SQL> create user dbtech_test identified by dbtech_test
    2 default tablespace DBTECH_TBS;
    
    User created.
    
    --DBTECH_TEST 계정에 권한 부여(connect)
    SQL> grant connect to dbtech_test;
    
    Grant succeeded.
    
    --DBTECH_TEST 계정에 Table 조회 권한 부여(select on dbtech.board)
    SQL> grant select on dbtech.board to dbtech_test;
    
    Grant succeeded.
    
    --DBTECH_TEST 계정에 권한 부여(select any dictionary)
    SQL> grant select any dictionary to dbtech_test;
    
    Grant succeeded.
    SQL> create tablespace DBTECH_TBS
       2 datafile 'dbtech_tbs01.dtf' size 50M
       3 AUTOEXTEND ON NEXT 20M MAXSIZE 5G
       4 EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
    
    Tablespace 'DBTECH_TBS' created.
    
    SQL> create user dbtech identified by dbtech
       2 default tablespace DBTECH_TBS;
    
    User 'DBTECH' created.
    
    SQL> grant connect, resource, select any dictionary to dbtech;
    
    Granted.
    
    SQL> conn dbtech/dbtech
    Connected to Tibero.
    
    SQL> create table board (no number, 
       2                     empno number(4),
       3                     title varchar(20),
       4                     contents clob,
       5                     regdate date default sysdate,
       6                     hit number default 0)
       7 PCTFREE 10
       8 INITRANS 2;
    
    Table 'BOARD' created.
    
    SQL> exit
    Disconnected.
    
    $ ls -lrt
    -rw-r--r--. 1 tibero dba 1340431 Nov 15 15:29 antlr-4.3-complete.jar
    -rw-r--r--. 1 tibero dba    1376 Nov 15 15:29 ANTLR4_License.txt
    -rw-r--r--. 1 tibero dba 1604783 Nov 15 15:29 internal-jdbc-16.jar
    -rw-r--r--. 1 tibero dba     167 Nov 15 15:29 migrator.bat
    -rw-r--r--. 1 tibero dba    8313 Nov 15 15:29 migrator.properties.eg
    -rw-r--r--. 1 tibero dba     170 Nov 15 15:29 migrator.sh
    -rw-r--r--. 1 tibero dba  167137 Nov 15 15:29 migrator_cli.jar
    -rw-r--r--. 1 tibero dba  352917 Nov 15 15:29 msllogger-14.jar
    -rw-r--r--. 1 tibero dba    1320 Nov 15 15:29 pgjdbc_License.txt
    -rw-r--r--. 1 tibero dba  850563 Nov 15 15:29 postgresql-42.2.27.jre6.jar
    -rw-r--r--. 1 tibero dba    4054 Nov 15 15:29 readme.txt
    -rw-r--r--. 1 tibero dba  123556 Nov 15 15:29 toolcom.jar
    -rwxr-xr-x. 1 tibero dba 4210517 Nov 16 13:54 ojdbc6.jar
    
    $sh migrator.sh SOURCE_TYPE=ORACLE SOURCE_URL=jdbc:oracle:thin:@localhost:1525:oraclesb SOURCE_USER=dbtech_test SOURCE_PASSWORD=dbtech_test SOURCE_LOGIN_AS=NORMAL SOURCE_SCHEMA=dbtech SOURCE_TABLE=board TARGET_URL=jdbc:internal:thin:@localhost:6213:JSH_T7_DB TARGET_USER=dbtech TARGET_PASSWORD=dbtech TARGET_SCHEMA=dbtech TARGET_TABLE=board 
    SOURCE_USER=dbtech_test SOURCE_PASSWORD=dbtech_test SOURCE_LOGIN_AS=NORMAL
    SOURCE_SCHEMA=dbtech SOURCE_TABLE=board
    TARGET_URL=jdbc:internal:thin:@localhost:6213:JSH_T7_DB TARGET_USER=dbtech 
    TARGET_PASSWORD=dbtech TARGET_SCHEMA=dbtech TARGET_TABLE=board
    INFO[16:51:45,676][main]TableMigrator.initAndDoMigrate()(1429) 
    ********************************************************************************
    *
    * Start Log for table migrator.
    *     Vendor:  tibero
    *     Product: table migrator
    *     Version: 263750
    *
    * Trace is started on 16:51:45.675
    *     Log level: INFO
    *
    ********************************************************************************
    
     INFO[16:51:45,679][main]TableMigrator.initAndDoMigrate()(1431) 
    === Parameters ===
    SOURCE_TYPE=ORACLE
    SOURCE_DRIVER=oracle.jdbc.OracleDriver
    SOURCE_URL=jdbc:oracle:thin:@localhost:1525:oraclesb
    SOURCE_USER=DBTECH_TEST
    SOURCE_PASSWORD=************
    SOURCE_LOGIN_AS=NORMAL
    SOURCE_SCHEMA=dbtech
    SOURCE_SCHEMAORIGN=dbtech
    SOURCE_TABLE=board
    SELECT_SUBPARTITION=
    BATCH_THRESHOLD=128
    EXTRACT_PARALLEL=N
    EXTRACT_THREAD_COUNT=1
    SOURCE_TABLE_DEDUPLICATE=N
    USE_PARALLEL_HINT=N
    PARALLEL_HINT_CNT=-1
    USE_OBJECT_PARALLEL_HINT=N
    TARGET_TYPE=DEFAULT
    TARGET_DRIVER=com.m.internal.jdbc.MInternalDriver
    TARGET_URL=jdbc:internal:thin:@localhost:6213:JSH_T7_DB
    TARGET_USER=DBTECH
    TARGET_PASSWORD=************
    TARGET_SCHEMA=dbtech
    TARGET_TABLE=board
    COMMIT_SIZE=-1
    INDEX_DISABLE=N
    SELECT_FETCH_SIZE=1024
    SELECT_AS_BYTE=N
    DB_FILE_MULTIBLOCK_READ_COUNT=-1
    INSERT_METHOD=dpl
    INSERT_BATCH=Y
    INSERT_PARALLEL=N
    INSERT_THREAD_COUNT=1
    INSERT_ZERO_LENGTH_STRING_AS_NULL=Y
    DPL_LOG_UNIT=500
    LOG_FILE_NAME=tableMigrator.log
    LOG_LEVEL=INFO
    CHECK_COLUMN_METADATA=N
    ==================
     INFO[16:51:45,784][TabMig[16:51:45.680]]TbCmdConnection.connect()(58) Connect To The Source- URL : jdbc:oracle:thin:@localhost:1525:oraclesb ID : DBTECH_TEST
     INFO[16:51:45,983][TabMig[16:51:45.680]]TbCmdConnection.connect()(58) Connect To The Target- URL : jdbc:internal:thin:@localhost:6213:JSH_T7_DB ID : DBTECH
     INFO[16:51:46,228][TabMig[16:51:45.680]]TableMigrator.migrate()(256) SOURCE_TYPE : ORACLE
     INFO[16:51:46,228][TabMig[16:51:45.680]]TableMigrator.migrate()(257) SOURCE_SCHEMA : dbtech
     INFO[16:51:46,228][TabMig[16:51:45.680]]TableMigrator.migrate()(275) SOURCE_TABLE : board
     INFO[16:51:46,229][TabMig[16:51:45.680]]TableMigrator.migrate()(277) TARGET_TYPE : DEFAULT
     INFO[16:51:46,229][TabMig[16:51:45.680]]TableMigrator.migrate()(278) TARGET_SCHEMA : dbtech
     INFO[16:51:46,229][TabMig[16:51:45.680]]TableMigrator.migrate()(293) TARGET_TABLE : board
     INFO[16:51:46,236][TabMig[16:51:45.680]]OracleTableInfo.getTableInfo()(52)  SELECT column_name, data_type, virtual_column, hidden_column FROM DBA_TAB_COLS WHERE OWNER=? AND TABLE_NAME=? order by column_id
     INFO[16:51:46,292][TabMig[16:51:45.680]]OracleTableInfo.getTableInfo()(55) setString(1) : DBTECH
     INFO[16:51:46,292][TabMig[16:51:45.680]]OracleTableInfo.getTableInfo()(58) setString(2) : BOARD
     INFO[16:51:46,308][TabMig[16:51:45.680]]OracleTableInfo.getTableInfo()(125) SELECT iot_type FROM dba_tables WHERE OWNER = ? and TABLE_NAME = ?
     INFO[16:51:46,309][TabMig[16:51:45.680]]OracleTableInfo.getTableInfo()(128) setString(1) : DBTECH
     INFO[16:51:46,309][TabMig[16:51:45.680]]OracleTableInfo.getTableInfo()(131) setString(2) : BOARD
     INFO[16:51:46,311][TabMig[16:51:45.680]]TableMigrator.migrate()(375) start extracting thread...
     INFO[16:51:46,315][TabMig[16:51:45.680].E0]OracleDataExtractor.run()(86) run
     INFO[16:51:46,315][TabMig[16:51:45.680].E0]DataExtractor.loggingTabAndColInfo()(531) Extract Information
     INFO[16:51:46,316][TabMig[16:51:45.680].E0]DataExtractor.loggingTabAndColInfo()(532) table name : DBTECH.BOARD
     INFO[16:51:46,316][TabMig[16:51:45.680].E0]DataExtractor.loggingTabAndColInfo()(538) columns [6] - "NO" "EMPNO" "TITLE" "REGDATE" "HIT" "CONTENTS" 
     INFO[16:51:46,318][TabMig[16:51:45.680].E0]OracleDataExtractor.run()(93) TabMig[16:51:45.680].E0 - sql : SELECT '0', t."NO", t."EMPNO", t."TITLE", t."REGDATE", t."HIT", t."CONTENTS" FROM DBTECH.BOARD t
     INFO[16:51:46,327][TabMig[16:51:45.680]]TableMigrator.migrate()(536) start loading thread...
     INFO[16:51:46,328][TabMig[16:51:45.680]]DataLoader.setRemainThr()(85) Set Remain Threads [0], to [1]
     INFO[16:51:46,332][L0]TbDPLDataLoader.setDirPathStream()(525) DPL Loading Information
     INFO[16:51:46,332][L0]TbDPLDataLoader.setDirPathStream()(526) table name : dbtech.board
     INFO[16:51:46,332][L0]TbDPLDataLoader.setDirPathStream()(532) columns [6] - "NO" "EMPNO" "TITLE" "REGDATE" "HIT" "CONTENTS" 
     INFO[16:51:46,337][TabMig[16:51:45.680].E0]OracleDataExtractor.run()(282) 
      Total Extract Time : 20ms
      Time For Putting Row on Queue : 0ms
      Time For Executing Query Time : 12ms
      Time For Executing Fetch Time : 4ms
      Percentage of Query and Fetch => 80.00%
     INFO[16:51:46,337][TabMig[16:51:45.680].E0]OracleDataExtractor.run()(283) TOTAL Extracted ROWS: 5 (source schema = DBTECH, source table = BOARD)
     INFO[16:51:46,338][TabMig[16:51:45.680]]TableMigrator.migrate()(580) Extractor termFlag : [true], isError : [false]
     INFO[16:51:46,338][TabMig[16:51:45.680].E0]DataExtractor.setTermFlag()(543) Set termFlag and isError : [false]
     INFO[16:51:46,338][TabMig[16:51:45.680].E0]DataExtractor.setTermFlag()(544) complete
     INFO[16:51:46,354][L0.TbDPLDataLoader0]DataLoaderManager.run()(47) run
     INFO[16:51:46,361][L0.TbDPLDataLoader0]DataLoaderManager.run()(240)  Total Insert Time : 29ms
      Time For Taking Row From Queue: 0ms
      Time For Executing Batch : 4ms
      Time For Executing Commit : 2ms
      Percentage of Batch and Commit Time => 20.69%
     INFO[16:51:46,361][L0.TbDPLDataLoader0]DataLoaderManager.run()(242) [L0.TbDPLDataLoader0]1700121106361 TOTAL Loaded ROWS: 5 (target schema = dbtech, target table = board)
     INFO[16:51:46,374][TabMig[16:51:45.680]]TableMigrator.migrate()(613) Loader remainThr : [0], isError : [false]
     INFO[16:51:46,374][L0.TbDPLDataLoader0]DataLoader.finish()(80) Decrement remainThr : [0] and isError : [false]
     INFO[16:51:46,375][TabMig[16:51:45.680]]TableMigrator.resetThrs()(1359) terminate extract thread...1
     INFO[16:51:46,375][TabMig[16:51:45.680]]TableMigrator.resetThrs()(1373) terminate loader thread...1
     INFO[16:51:46,375][TabMig[16:51:45.680]]TableMigrator.migrate()(627) [VERIFICATION] Source Info : dbtech.board : 5 Rows, Target Info : dbtech.board : 5 Rows [OK]
     INFO[16:51:46,375][TabMig[16:51:45.680]]TableMigrator.migrate()(686) extract conneciton close
     INFO[16:51:46,377][TabMig[16:51:45.680]]TableMigrator.migrate()(695) loader connection close
     INFO[16:51:46,377][TabMig[16:51:45.680]]TableMigrator.migrate()(705) Elapsed Time (milliseconds) : 697
     INFO[16:51:46,377][TabMig[16:51:45.680]]TableMigrator.migrate()(707) End Migration

    CHARACTERSET

  • Redo 확인

  • Undo 확인

  • Temp Tablespace 확인

  • User Tablespace 확인

  • 로그 모드 확인

  • 컨트롤 파일 확인

  • JOB 확인

  • DB Link 확인(Tibero to Tibero, Tibero to Oracle 등)

  • External Procedure 사용여부 확인

  • Wrapped PSM(PL/SQL) 확인

  • 디렉터리 확인

  • Object Count 확인

  • Constraint 확인

  • NLS_CHARACTERSET과 NLS_NCHAR_CHARACTERSET의 VALUE를 확인합니다. TARGET DB를 생성할 경우 해당 내용에 맞춰 생성합니다.

    각 로그 그룹별 MEMBER 및 각 그룹별 size(mb)와 MEMBERS를 확인합니다.

    DB에서 사용중인 UNDO의 TABLESPACE_NAME과 해당 TABLESPACE가 사용중인 데이터 파일의 FILE_NAME, size, maxsize, AUTOEXTENSIBLE을 확인합니다.

    Temp 파일을 쓰고 있는 TABLESPACE_NAME 및 해당 파일의 FILE_NAME, size,AUTOEXTENSIBLE, maxsize를 확인합니다.

    Default Tablespace를 제외한 Tablespace들에 대해 TABLESPACE_NAME과 각 Tablespace에서 사용중인 데이터 파일의 FILE_NAME, size, maxsize, AUTOEXTENSIBLE을 확인합니다.

    ARCHIVELOG일 경우 LOG_ARVHIVE_DEST, LOG_ARVHIVE_FORMAT, LOG_ARVHIVE_OVERWRITE, LOG_ARVHIVE_RETRY_TIME을 확인합니다. 로그 모드 외에 기본값과 다른 값이 있다면 Target DB의 tip 파일에 설정합니다.

    경로 및 파일명을 알맞게 수정합니다. Target DB의 데이터베이스를 생성할 때 수정한 경로 및 파일명을 참고합니다.

    JOB은 이관되지 않으므로 Target DB에 수동으로 생성이 필요합니다.

    DB Link는 이관되지 않으므로 Target DB에 수동으로 생성이 필요합니다.

    외부 참조 라이브러리를 확인하여 결과가 존재할 경우 후처리 파일인 so 및 class 파일을 Target DB의 동일 경로에 복사하거나 Target DB에서 재컴파일 합니다. 라이브러리는 이관되지 않으므로 Target DB에 수동으로 생성이 필요합니다.

    다음은 외부 참조 라이브러리의 확인 예시 입니다.

    다음은 JAVA의 Class 위치 확인 예시 입니다.

    Tibero 7부터는 JEPA에서 사용자에 따라 class를 구분하도록 변경되어, JAVA_CLASS_PATH 경로에 사용자별 디렉토리가 생성되며 각 사용자별 class가 존재합니다.

    Wrapped PL/SQL은 DB에서 내용을 조회할 수 없으므로 수동으로 생성하기 위한 생성문을 얻을 수 없습니다. 그래서 이관을 위해서는 원본 생성문이 필요합니다. Wrapped PSM(PL/SQL)은 이관되지 않으므로 Target DB에 수동으로 생성이 필요합니다.

    다음은 Wrapped PSM(PL/SQL) 확인 예시 입니다.

    External table에서 사용하는 디렉터리가 존재하는지 확인한 후 디렉터리가 존재한다면 해당 파일을 Target DB 시 스템 경로에 맞게 복사 및 재생성합니다.

    쿼리 수행 후 나온 조회 결과를 저장하고 Object Count를 확인 합니다.

    쿼리 수행 후 나온 조회 결과를 저장하고 Constraint를 확인합니다.


    Export 하는 동안 데이터 변경이 일어나지 않게 하려면 Source DB에 연결된 모든 애플리케이션을 종료합니다.

    아래는 접속된 세션 확인 예시 입니다.

    Export 하는 동안 JOB이 수행되면 데이터 변경이 일어날 수 있으므로 JOB 수행을 중지합니다.

    아래는 JOB 번호가 100번인 JOB을 중지하는 예시 입니다.

    tbexport의 Database(FULL) 모드로 수행합니다.

    아래는 tbexport의 사용 방법 입니다.

    항목
    설명

    username

    Export 할 DB 계정으로 sys 계정 또는 dba 계정 중에서 하나를 선택

    password

    Export 할 DB 계정의 비밀번호

    port

    Export 할 DB의 포트 번호

    아래는 Source DB 서버에서 Tibero 6 버전의 tbexport 사용 예시 입니다.

    체크리스트 및 체크 방법

    SQL> SET LINESIZE 120 
    SQL> COL name FOR a30
    SQL> COL value FOR a20 
    SQL> SELECT name, value 
    FROM sys._dd_props
    WHERE name like '%CHARACTERSET%'
    ORDER BY 1;
    
    NAME                                VALUE
    --------------------------------    ----------
    NLS_CHARACTERSET                    UTF8
    NLS_NCHAR_CHARACTERSET              UTF16
    SQL> SET LINESIZE 120
    SQL> COL member FOR a50
    SQL> SELECT * FROM v$logfile;
    
    GROUP#             STATUS  TYPE   MEMBER
    -----------      --------  -----------------------------
    0                  ONLINE /data2/tb6/tbdata/log001.log
    0                  ONLINE /data2/tb6/tbdata/log002.log
    1                  ONLINE /data2/tb6/tbdata/log003.log
    1                  ONLINE /data2/tb6/tbdata/log004.log
    2                  ONLINE /data2/tb6/tbdata/log005.log
    2                  ONLINE /data2/tb6/tbdata/log006.log
    
    SQL> SELECT group#, bytes/1024/1024 as "size(mb)", members, archived FROM v$log;
    
    GROUP#             size(mb)   MEMBERS    ARCHIVED
    -----------      --------  -----------   -----------
    0                   50        2          NO
    1                   50        2          NO
    2                   50        2          NO
    SQL> SET LINESIZE 120
    SQL> COL tablespace_name FOR a20
    SQL> COL file_name FOR a50
    SQL> SELECT tablespace_name 
    FROM dba_tablespaces
    WHERE contents = 'UNDO';
    
    TABLESPACE_NAME
    --------------------
    UNDO
    
    
    SQL> show parameter UNDO_TABLESPACE;
    
    NAME                  TYPE      VALUE
    -----------------     --------  ---------
    UNDO_TABLESPACE       STRING    UNDO
    
    SQL> SELECT tablespace_name,
    file_name,
    bytes/1024/1024 "size(mb)", 
    maxbytes/1024/1024 "maxsize(mb)", 
    autoextensible
    FROM dba_data_files
    WHERE tablespace_name like 'UNDO%';
    
    TABLESPACE_NAME  FILE_NAME                    size(mb) maxsize(mb) AUTOEXTENSIBLE
    ---------------- ---------------------------- -------- ----------- --------------
    UNDO          /data2/tb6/tbdata/undo001.tdf   400      1024        YES
    SQL> SET LINESIZE 150
    SQL> COL tablespace_name FOR a30
    SQL> COL file_name FOR a50
    SQL> SELECT tablespace_name,
    file_name, bytes/1024/1024 "size(mb)", 
    autoextensible,
    maxbytes/1024/1024 "max(mb)" 
    FROM dba_temp_files;
    
    TABLESPACE_NAME  FILE_NAME                      size(mb) AUTOEXTENSIBLE max(mb)
    ---------------- -----------------------------  -------- -------------- --------
    TEMP             /data2/tb6/tbdata/temp001.tdf  400      YES            1024        
    SQL> SET linesize 150
    SQL> COL tablespace_name FOR a30
    SQL> COL file_name FOR a50
    SQL> SELECT tablespace_name, 
    file_name,
    bytes/1024/1024 "size(mb)", 
    maxbytes/1024/1024 "maxsize(mb)", 
    autoextensible
    FROM dba_data_files
    WHERE tablespace_name not in('SYSTEM', 'UNDO', 'USR');
    
    TABLESPACE_NAME  FILE_NAME                    size(mb) maxsize(mb) AUTOEXTENSIBLE
    ---------------- ---------------------------- -------- ----------- --------------
    DBTECH_TBS       /tb6/tbdata/dbtech_tbs01.dtf 50       5120        YES
    DBTECH_IDX       /tb6/tbdata/dbtech_idx01.dtf 50       1024        YES
    SQL> SELECT log_mode FROM v$database; 
    LOG_MODE
    ---------------
    ARCHIVELOG
    
    SQL> SHOW PARAM ARCHIVE
    NAME                    TYPE     VALUE
    ----------------------- -------- ------------------------------------------
    LOG_ARCHIVE_DEST        DIRNAME  /data2/tb6/tibero6/database/tb4/archive/ 
    LOG_ARCHIVE_FORMAT      STRING   log-t%t-r%r-s%s.arc
    LOG_ARCHIVE_OVERWRITE   Y_N      NO 
    LOG_ARCHIVE_RETRY_TIME  UINT32   60
    SQL> alter database backup controlfile to trace 
    as '/data2/tb6/tb6_export/controlfile_tb6.sql'; 
    Database altered.
    SQL> !cat /data2/tb6/tb6_export/controlfile_tb6.sql
    CREATE CONTROLFILE REUSE DATABASE "tb6" LOGFILE
    GROUP 0 (
    '/data2/tb6/tbdata/log001.log', 
    '/data2/tb6/tbdata/log002.log'
    ) SIZE 50M, 
    GROUP 1 (
    '/data2/tb6/tbdata/log003.log', 
    '/data2/tb6/tbdata/log004.log'
    ) SIZE 50M,
    GROUP 2 (
    '/data2/tb6/tbdata/log005.log', 
    '/data2/tb6/tbdata/log006.log'
    ) SIZE 50M
    NORESETLOGS DATAFILE
    '/data2/tb6/tbdata/system001.tdf', 
    '/data2/tb6/tbdata/undo001.tdf', 
    '/data2/tb6/tbdata/usr001.tdf', 
    '/data2/tb6/tbdata/dbtech_tbs01.dtf', 
    '/data2/tb6/tbdata/dbtech_idx01.dtf' 
    ARCHIVELOG
    MAXLOGFILES 255
    MAXLOGMEMBERS 8
    MAXDATAFILES 100 CHARACTER SET MSWIN949
    NATIONAL CHARACTER SET UTF16
    ;
    --ALTER DATABASE MOUNT
    ---- Recovery is required in MOUNT mode.
    --ALTER DATABASE RECOVER AUTOMATIC;
    --ALTER DATABASE OPEN ;
    ---- Adding Tempfiles is required in OPEN mode.
    -- ALTER TABLESPACE TEMP ADD TEMPFILE '/data2/tb6/tbdata/temp001.tdf'
    -- SIZE 400M REUSE AUTOEXTEND ON NEXT 10M MAXSIZE 1G;
    
    SQL> SET LINESIZE 150
    SQL> COL what FOR a30
    SQL> COL interval FOR a30
    SQL> COL username FOR a20
    SQL> alter session set NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
    SQL> SELECT job as job_no, 
    b.username,
    what,
    to_char(next_date, 'yyyy/mm/dd HH24:MI:SS') as next_date, 
    interval,
    broken
    FROM dba_jobs a, dba_users b 
    WHERE a.schema_user=b.user_id;
    
    
    JOB_NO USERNAME WHAT                        NEXT_DATE           INTERVAL  BROKEN
    ------ -------- --------------------------- ------------------- --------- ------
    1       DBTECH  dbms_output.put_line('ok');  2013/06/30 00:00:00 SYSDATE+1 N
    SQL> SET LINESIZE 150
    SQL> COL owner FOR a15
    SQL> COL db_link FOR a20
    SQL> COL username FOR a20
    SQL> COL host FOR a10
    SQL> COL created FOR a10
    SQL> SELECT owner, db_link, username, host, created FROM dba_db_links;
    OWNER           DB_LINK              USERNAME             HOST       CREATED
    --------------- -------------------- -------------------- ---------- ----------
    DBTECH          TBLINK                DBTECH2             tb6        2013/06/12
    SQL> SET LINESIZE 120
    SQL> COL owner FOR a10
    SQL> COL library_name FOR a30
    SQL> COL file_spec FOR a50
    SQL> COL status FOR a10
    SELECT owner, library_name, file_spec, status FROM dba_libraries;
    SET LINESIZE 120
    COL owner FOR a10
    COL name FOR a30
    COL source FOR a50
    SELECT owner, name, source FROM dba_java_classes;
    SQL> SHOW PARAM JAVA_CLASS_PATH;
    NAME             TYPE     VALUE
    ---------------- -------- --------------------------
    JAVA_CLASS_PATH  DIRNAME  /data2/tb6/tbdata/java/
    SQL> SET LINESIZE 120
    SQL> COL owner FOR a30
    SQL> COL object_name FOR a40
    SQL> SELECT owner, object_name, functionable, wrapped 
    FROM dba_procedures
    WHERE wrapped = 'YES';
    OWNER                      OBJECT_NAME              FUNCTIONABLE WRAPPED
    ------------------------- ------------------------- ------------ -------
    DBTECH                     WRAP_TEST                NO           YES
    SQL> SET LINESIZE 120
    SQL> COL name FOR a20
    SQL> COL path FOR a60
    SQL> SELECT * FROM dba_directories;
    NAME                 PATH
    -------------------- ----------------------
    SAM                  /data2/tb6/DIR_SAM
    SQL> SET LINESIZE 150
    SQL> SET PAGES 500
    SQL> COL owner FOR a20
    SQL> SELECT owner, object_type, status, count(*)
    FROM dba_objects
    WHERE owner not in ('SYS', 'SYSCAT', 'SYSGIS', 'OUTLN')
    GROUP BY owner, object_Type, status
    ORDER BY owner, object_type, status;
    
    OWNER     OBJECT_TYPE     STATUS  COUNT(*)
    -------- --------------  ------  --------
    DBTECH    DATABASE LINK   VALID          1
    DBTECH    FUNCTION        VALID          3
    DBTECH    INDEX           VALID          9
    DBTECH    JAVA            VALID          1
    DBTECH    LIBRARY         VALID          1
    DBTECH    PROCEDURE       VALID          3
    DBTECH    SEQUENCE        VALID          3
    DBTECH    SYNONYM         VALID          6
    DBTECH    TABLE           VALID         10
    DBTECH    TRIGGER         VALID          2
    DBTECH    VIEW            VALID          1
    DBTECH2   FUNCTION        VALID          1
    DBTECH2   INDEX           VALID          7
    DBTECH2   LOB             VALID          2
    DBTECH2   PACKAGE         VALID          2
    DBTECH2   PACKAGE BODY    VALID          2
    DBTECH2   PROCEDURE       VALID          4
    DBTECH2   SEQUENCE        VALID          1
    DBTECH2   TABLE           VALID          7
    DBTECH2   TRIGGER         VALID          1
    DBTECH2   VIEW            VALID          1
    PUBLIC    SYNONYM         VALID        565
    TIBERO    TABLE           VALID          1
    SQL> SET LINESIZE 150
    SQL> COL owner FOR a30
    SQL> SELECT owner
    ,constraint_type
    ,count(constraint_name) as con_cnt
    FROM dba_constraints
    WHERE owner not in ('SYS', 'SYSCAT', 'SYSGIS', 'OUTLN')
    GROUP BY owner, constraint_type
    ORDER BY owner ,constraint_type;
    
    OWNER     CONSTRAINT_TYPE  CON_CNT
    -------- ---------------  -------
    DBTECH    C                     21
    DBTECH    O                      0
    DBTECH    P                      7
    DBTECH    R                      3
    DBTECH    U                      1
    DBTECH2   C                      7
    DBTECH2   P                      7
    DBTECH2   R                      1
    SQL> SELECTcount(*) FROM v$session;
    
    COUNT(*)
    ---------- -
    2
    BEGIN
    DBMS_JOB.BROKEN(100, true);
    END;
    /
    tbexport username={sys | dba계정} password=<password> port=<port_no> sid=<SID> 
    file=<file name> log=<log-file name> full=y script=y
    tbexport username=sys password=pwd port=8629 sid=tibero6
    file=tibero6_all.dat log=tibero6_exp.log full=y script=y

    CHARACTERSET

    Redo 확인

    Undo 확인

    Temp Tablespace 확인

    User Tablespace 확인

    로그 모드 확인

    컨트롤 파일 확인

    JOB 확인

    DB Link 확인 (Tibero to Tibero, Tibero to Oracle 등)

    External Procedure 사용여부 확인

    C External Procedure

    JAVA External Procedure

    JAVA External Procedure에서 외부 라이브러리를 참조할 때 $TB_HOME/bin/tbjavac와 $TB_HOME/client/bin/tbjavaepa 설정을 확인합니다.

    Wrapped PSM(PL/SQL) 확인

    디렉터리 확인

    Object Count 확인

    해당 결과는 에서 이관된 Object Count를 확인하는 기준으로 사용됩니다.

    Constraint 확인

    해당 결과는 “”에서 이관된 Constraint 를 확인하는 기준으로 사용됩니다.

    Export 수행

    DB에 연결된 모든 애플리케이션 종료

    JOB 수행 중지

    tbexport

    길이 산정 예

    설명

    CHAR

    고정/ 가변

    CHAR(10) = 10bytes

    • CHAR(10 BYTE), CHAR(10 CHAR) 문자열의 길이는 byte와 문자를 기준으로 지정한다.

    • CHAR(10)의 형태로 선언하면, byte로 문자 열의 길이가 지정된다.

    • CHAR로 길이를 선언하면 문자가 몇 byte로 표현되는지에 따라 그 길이가 달라진다.

    VARCHAR

    가변

    VARCHAR 가변 VARCHAR(10) =

    (10*0,7)= 7bytes

    지정된 데이터 길이의 0.7로 가정

    NCHAR

    고정

    NCHAR(10) = 30bytes(UTF8),

    20bytes(UTF16 )

    • UTF8 : size의 최대 3배

    • UTF16 : size의 최대 2배

    NVARCHAR

    가변

    NVARCHAR(10) = (10*0.7)*3 =

    21bytes(UTF8), 14bytes(UTF16)

    • UTF8 : size의 최대 3배

    • UTF16 : size의 최대 2배

    RAW

    가변

    실제로 저장되는 데이터의 길이

    LONG

    가변

    실제로 저장되는 데이터의 길이

    LONG RAW

    가변

    실제로 저장되는 데이터의 길이

    • 숫자형

    타입

    고정/ 가변

    길이 산정 예

    설명

    NUMBER

    가변

    NUMBER(7)

    =roundup(7/2) = 4bytes

    roundup(size/2) size가 38 자리수보다 크면 38 로 정 의하고 38 자리수 미만의 음수는 1byte를 더한다.

    • 날짜형

    타입

    고정/가변

    길이 산정 예

    DATE

    고정

    8bytes

    TIME

    고정

    • 간격형

    타입

    고정/가변

    길이 산정 예

    INTERVAL YEAR TO MONTH

    고정

    5bytes

    INTERVAL DAY TO SECOND

    고정

    • 대용량 객체형

    타입

    고정/가변

    길이 산정 예

    설명

    CLOB

    가변

    실제로 저장되는 데이터의 길이 ("" 참조)

    • 내재형

    타입

    고정/가변

    길이 산정 예

    설명

    ROWID

    고정

    10bytes


    • NULL일 때

    • 크기가 0일 때

    • 크기가 4000보다 작을 때

    • 크기가 96KB 보다 작을 때

    • 그 이상일 때

    위 계산에서 LOB 데이터를 별도 segment로 저장하기 위한 overhead는 계산하지 않습니다.

    long의 경우 데이터의 길이가 길어지면 chained row piece로 나뉘어서 저장되는데, row piece를 연결시키기 위한 추가 overhead는 고려하지 않습니다.

    타입

    데이터 타입별 크기 산정 방법

    고정/ 가변

    0byte
    16bytes(lob locator)
    16bytes(lob locator) + 16bytes(lob inode)
    16bytes(lob locator) + 16bytes(lob inode) + 48bytes(12 page dbas)
    16bytes(lob locator) + 16bytes(lob inode) + 48bytes * (LOB 컬럼 크기 / 64KB)(lob index)

    LOB Type 저장에 필요한 overhead

    Tibero 문서 네비게이션 맵

    개발, 운영 등 업무에 따라 필요한 티베로 기술정보를 아래 문서 목록에서 확인하세요.

    구분1
    구분2
    가이드

    INTEGER

    가변

    NUMBER와 같다.

    FLOAT

    가변

    NUMBER와 같다.

    8bytes

    TIMESTAMP

    가변

    12bytes

    TIMESTAMP WITH TIME ZONE

    고정 1

    7bytes

    TIMESTAMP WITH LOCAL TIME ZONE

    고정

    12bytes

    12bytes

    BLOB

    가변

    실제로 저장되는 데이터의 길이 ("LOB Type 저장에 필요한 overhead" 참조)

    XMLTYPE

    가변

    CLOB과 같다.

    LOB Type 저장에 필요한 overhead

    sid

    Export 할 DB의 이름.

    file

    생성될 파일 이름

    log

    생성될 로그 파일의 이름

    “검증”
    검증

    설치

    전체

    패치

    이관

    Tools

    유틸리티

    인터페이스/연동

    Driver

    Web server

    클라우드

    분석

    로그/덤프

    모니터링/점검

    TPR

    빅데이터

    성능

    Storage

    트랜잭션

    튜닝

    App

     

    Language

    C

    COBOL

    SQL

    API

    Interface

    장애해결

     

    보안

     


    구분1
    구분2
    가이드

    일반

    기본관리

    일반

    기본관리

    운영자 가이드

    개발

    용어

    운영

    Tibero 도커 이미지 가이드

    독립적인 가상화 환경을 생성하는 도커 플랫폼의 이미지를 활용함으로써 더욱 편리하고 안정적으로 Tibero를 설치하는 방법을 안내합니다.

    1. 도커 이미지 사용

    아래 두 가지 방법 중 적합한 방식으로 도커 이미지를 사용합니다.

    • 공식 도커 이미지 사용

    • 도커 이미지 커스텀 생성

    공식 도커 이미지 사용

    아래 경로에서 Tibero 공식 도커 이미지를 다운로드 합니다.

    Tibero 공식 도커 이미지 다운로드

    • Tibero 7 패치셋 버전 업데이트

    적합한 바이너리를 다운로드 받아 tibero.tar.gz 파일명으로 변경합니다. Dockerfile 과 동일한 경로에 바이너리 파일을 위치합니다.

    도커 이미지 빌드를 위해 도커파일(Dockerfile)을 생성합니다.

    아래 예시는 rockylinux9 을 사용합니다. 준비한 티베로 바이너리의 Major 버전으로 TB_VERSION 을 수정합니다.

    컨테이너 이미지에 필요한 패키지를 설치하는 스크립트입니다.

    필요한 패키지가 있다면 스크립트에 추가합니다. Dockerfile 과 같은 경로의 scripts 디렉토리 내 install_dependency.sh 파일명으로 생성합니다.

    Dockerfile에 작성한 ENTRYPOINT 로 컨테이너 생성, 재시작 시 수행되는 스크립트입니다. Dockerfile 과 같은 경로의 scripts 디렉토리 내 entrypoint.sh 파일명으로 생성합니다.

    Tibero 설치 스크립트로 바이너리 내 tb_create_db.sh 를 사용합니다. Dockerfile 과 같은 경로의 scripts 디렉토리 내 install_tibero.sh 파일명으로 생성합니다.

    아래 커맨드를 통해 도커 이미지를 빌드합니다. 원하는 이미지명과 태그로 수정해서 사용합니다.

    이때 도커 이미지 빌드를 위해 필요한 파일은 아래와 같습니다.


    아래 Tibero 공식 도커허브를 참고하여, 빌드한 도커 이미지를 통해 컨테이너를 생성합니다.

    Tibero 공식 도커 허브

    DB 파라미터 지정

    데이터베이스 파라미터 지정 과정을 예시와 함께 설명합니다.

    파라미터를 지정하는 컨트롤 파일은 기본으로 migrator.properties 파일로 지정됩니다.

    (migrator.properties 파일에 설정)

    각 파라미터의 설명은 아래와 같습니다.

    파라미터
    설명

    도커 이미지 커스텀 생성

    1. Tibero 바이너리 준비

    2. Dockerfile 준비

    3. 스크립트 생성

    의존성 패키지 설치 스크립트

    엔트리포인트 스크립트

    Tibero 설치 스크립트

    4. 도커 이미지 빌드

    참고

    커맨드의 마지막 '.' 은 현재 경로에 Dockerfile이 존재함을 의미합니다.

    주의

    Tibero 바이너리 압축파일명은 반드시 "tibero.tar.gz" 로 지정 합니다.

    2. Tibero 컨테이너 생성

    https://hub.docker.com/r/tiberoofficial/tibero
    https://hub.docker.com/r/tiberoofficial/tibero
    FROM rockylinux:9
    
    # Tibero 설치를 위한 환경 변수 설정
    ENV TB_VERSION=7
    ENV TB_BASE=/opt
    ENV TB_HOME=$TB_BASE/tibero$TB_VERSION
    ENV LD_LIBRARY_PATH=$TB_HOME/lib:$TB_HOME/client/lib
    ENV PATH=$PATH:$TB_HOME/bin:$TB_HOME/client/bin
    
    # Tibero 바이너리 파일 복사
    COPY tibero.tar.gz /tmp/tibero.tar.gz
    
    # 필수 패키지 설치
    COPY ./scripts/install_dependency.sh /opt/install_dependency.sh
    RUN chmod +x /opt/install_dependency.sh
    RUN /opt/install_dependency.sh
    
    
    # Tibero 설치
    COPY ./scripts/install_tibero.sh /opt/install_tibero.sh
    RUN chmod +x /opt/install_tibero.sh
    
    # Entrypoint 스크립트 복사 및 권한 설정
    COPY ./scripts/entrypoint.sh /opt/entrypoint.sh
    RUN chmod +x /opt/entrypoint.sh
    
    ENTRYPOINT ["/opt/entrypoint.sh"]
    #!/bin/bash
    set -e
    
    # Install dependencies for Tibero
    dnf update -y
    
    dnf install -y gcc
    dnf install -y gcc-c++
    dnf install -y libaio
    dnf install -y libaio-devel
    dnf install -y sysstat
    dnf install -y glibc-utils
    dnf install -y ncurses-devel
    dnf install -y libnsl
    dnf install -y libnsl2
    dnf install -y gdb
    dnf install -y gdb-doc
    dnf install -y gdb-gdbserver
    dnf install -y gdb-headless
    dnf install -y gdb-minimal
    dnf install -y gdbm-libs
    dnf install -y tar
    dnf install -y vim
    dnf install -y vi
    dnf install -y hostname
    
    # Tibero process 확인용 (pgrep)
    dnf install -y procps-ng
    
    dnf clean all
    
    
    curl -O https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
    rpm -ivh epel-release-latest-9.noarch.rpm
    
    dnf install -y nmon
    dnf install -y java-1.8.0-openjdk-devel
    dnf install -y ncurses-compat-libs
    
    ln -s /usr/lib64/libncurses.so.6.2 /usr/lib64/libncurses.so.5 || true
    ln -s /usr/lib64/libtinfo.so.6.2 /usr/lib64/libtinfo.so.5 || true
    ln -s /usr/lib64/libform.so.6.2 /usr/lib64/libform.so.5 || true
    #!/usr/bin/env bash
    set -euo pipefail
    
    # BOOT_POLICY=auto(기본) | manual
    : "${BOOT_POLICY:=auto}"
    : "${INSTALL_TGZ:=/tmp/tibero.tar.gz}"
    : "${TB_PROC:=tbsvr}"          # Tibero 메인 프로세스명
    : "${TB_START_CMD:=tbboot}"    # Tibero 기동 명령
    : "${TB_DOWN_CMD:=tbdown}"     # Tibero 종료 명령
    
    if [ -f /etc/bashrc ]; then
      set +u
      # /etc/bashrc 내부에서 BASHRCSOURCED를 사용할 수 있으므로 기본값 보장
      : "${BASHRCSOURCED:=0}"
      source /etc/bashrc || true
      set -u
    fi
    
    if [ -f "${HOME}/.bashrc" ]; then
      set +u
      : "${BASHRCSOURCED:=0}"
      source "${HOME}/.bashrc" || true
      set -u
    fi
    
    graceful_shutdown() {
      echo "[signal] Shutting down database (if running)..."
      ${TB_DOWN_CMD} immediate >/dev/null 2>&1 || true
      exit 0
    }
    trap graceful_shutdown SIGINT SIGTERM
    
    # ===== 수동 모드: 설치/기동 모두 생략, 컨테이너만 유지 =======================
    if [[ "${BOOT_POLICY}" == "manual" ]]; then
      echo "[mode] BOOT_POLICY=manual → skip install/boot. keeping container alive."
      echo "[note] even if ${INSTALL_TGZ} exists, will NOT install. will NOT run tbboot."
      # 컨테이너 생존 유지
      exec sleep infinity
    fi
    
    # ===== 자동 모드: 설치 및 기동 시도 ==========================================
    # 1) 최초 생성 판단: tar.gz 존재시 설치 시도
    if [ -f "${INSTALL_TGZ}" ]; then
      echo "[init] Found ${INSTALL_TGZ} → running /opt/install_tibero.sh ..."
      /opt/install_tibero.sh
    fi
    
    # 2) 서버 기동 시도
    if ! pgrep "${TB_PROC}" >/dev/null 2>&1; then
      echo "[start] Starting Tibero..."
      if ! ${TB_START_CMD} >/dev/null 2>&1; then
        echo "[error] Failed to start Tibero (${TB_START_CMD}). Check logs."
        exit 1
      fi
    fi
    
    # 3) 기동 검증
    if pgrep "${TB_PROC}" >/dev/null 2>&1; then
      echo "#########################"
      echo "Tibero is Ready To Use!"
      echo "#########################"
    else
      echo "[error] Tibero process not found after start attempt."
      exit 1
    fi
    
    # 4) 컨테이너 생존 유지 (로그 tail이 필요 없으면 단순 sleep으로 유지)
    exec sleep infinity
    #!/bin/bash
    set -e
    
    if [ -f "/tmp/tibero.tar.gz" ]; then
      : "${TB_BASE:?TB_BASE is required}"
      mkdir -p "${TB_BASE}"
      tar -xzf "/tmp/tibero.tar.gz" -C "${TB_BASE}" && rm -f "/tmp/tibero.tar.gz"
      chmod -R 775 $TB_HOME
    fi
    echo "10% complete"
    
    echo "Setting Environment Variables"
    
    if [[ -n "${TB_USER_FILE:-}" && -f "${TB_USER_FILE}" ]]; then
      TB_USER="$(< "${TB_USER_FILE}")"
      export TB_USER
    fi
    
    if [[ -n "${TB_PASSWORD_FILE:-}" && -f "${TB_PASSWORD_FILE}" ]]; then
      TB_PASSWORD="$(< "${TB_PASSWORD_FILE}")"
      export TB_PASSWORD
    fi
    
    # 루트 패스워드 필수
    if [[ -z "${TB_ROOT_PASSWORD:-}" ]]; then
      echo "[ERROR] TB_ROOT_PASSWORD environment variable is not set. Exiting." >&2
      exit 1
    fi
    if [[ -n "${TB_ROOT_PASSWORD_FILE:-}" && -f "${TB_ROOT_PASSWORD_FILE}" ]]; then
      TB_ROOT_PASSWORD="$(< "${TB_ROOT_PASSWORD_FILE}")"
      export TB_ROOT_PASSWORD
    fi
    
    : "${TB_HOME:?TB_HOME is required}"
    if [ -f "${TB_HOME}/bin/base_env.sh" ]; then
      sed -i "s|^svr_sys_password=\"tibero\"$|svr_sys_password=\"${TB_ROOT_PASSWORD}\"|" \
        "${TB_HOME}/bin/base_env.sh"
    fi
    
    : "${TB_SID:=tibero}"
    export TB_SID
    echo "export TB_VERSION=\"${TB_VERSION}\"" >> "${HOME}/.bashrc"
    echo "export TB_BASE=\"${TB_BASE}\"" >> "${HOME}/.bashrc"
    echo "export TB_HOME=\"${TB_HOME}\"" >> "${HOME}/.bashrc"
    echo "export LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}\"" >> "${HOME}/.bashrc"
    echo "export PATH=\"${PATH}\"" >> "${HOME}/.bashrc"
    echo "export TB_SID=\"${TB_SID}\"" >> "${HOME}/.bashrc"
    
    echo "20% complete"
    
    
    # Generating Tip file
    echo "Generating tip file"
    TIP_FILE_PATH=${TB_HOME}/config/${TB_SID}.tip
    
    "${TB_HOME}/config/gen_tip.sh" -s "${TB_SID}"
    
    # LOG_ARCHIVE_DEST 반영 (있으면 교체, 없으면 추가)
    if [ -n "${LOG_ARCHIVE_DEST:-}" ]; then
      if grep -q "^LOG_ARCHIVE_DEST=" "${TIP_FILE_PATH}"; then
        sed -i "s|^LOG_ARCHIVE_DEST=.*|LOG_ARCHIVE_DEST=${LOG_ARCHIVE_DEST}|" "${TIP_FILE_PATH}"
      else
        printf "\nLOG_ARCHIVE_DEST=%s\n" "${LOG_ARCHIVE_DEST}" >> "${TIP_FILE_PATH}"
      fi
    fi
    
    echo "30% complete"
    
    # # Setting DB Create environment variables
    args=()
    [ -n "$CHAR_SET" ] && args+=("-ch" "$CHAR_SET")
    [ -n "$NCHAR_SET" ] && args+=("-nch" "$NCHAR_SET")
    [ -n "$MAX_DATAFILE" ] && args+=("--max-datafile" "$MAX_DATAFILE")
    [ -n "$MAX_LOGGROUP" ] && args+=("--max-loggroup" "$MAX_LOGGROUP")
    [ -n "$MAX_LOGMEMBER" ] && args+=("--max-logmember" "$MAX_LOGMEMBER")
    [ -n "$LOG_SIZE" ] && args+=("--log-size" "$LOG_SIZE")
    [ -n "$LOG_GROUP" ] && args+=("--log-group" "$LOG_GROUP")
    [ -n "$LOG_FILE" ] && args+=("--log-file" "$LOG_FILE")
    [ -n "$LOG_DIR" ] && args+=("--log-dir" "$LOG_DIR")
    [ -n "$SYS_SIZE" ] && args+=("--sys-size" "$SYS_SIZE")
    [ -n "$SYS_DIR" ] && args+=("--sys-dir" "$SYS_DIR")
    [ -n "$SYS_AUTOEXTEND" ] && args+=("--sys-autoextend" "$SYS_AUTOEXTEND")
    [ -n "$SYS_NEXTSIZE" ] && args+=("--sys-nextsize" "$SYS_NEXTSIZE")
    [ -n "$SYS_MAXSIZE" ] && args+=("--sys-maxsize" "$SYS_MAXSIZE")
    [ -n "$TEMP_SIZE" ] && args+=("--temp-size" "$TEMP_SIZE")
    [ -n "$TEMP_DIR" ] && args+=("--temp-dir" "$TEMP_DIR")
    [ -n "$TEMP_AUTOEXTEND" ] && args+=("--temp-autoextend" "$TEMP_AUTOEXTEND")
    [ -n "$TEMP_NEXTSIZE" ] && args+=("--temp-nextsize" "$TEMP_NEXTSIZE")
    [ -n "$TEMP_MAXSIZE" ] && args+=("--temp-maxsize" "$TEMP_MAXSIZE")
    [ -n "$UNDO_SIZE" ] && args+=("--undo-size" "$UNDO_SIZE")
    [ -n "$UNDO_DIR" ] && args+=("--undo-dir" "$UNDO_DIR")
    [ -n "$UNDO_AUTOEXTEND" ] && args+=("--undo-autoextend" "$UNDO_AUTOEXTEND")
    [ -n "$UNDO_NEXTSIZE" ] && args+=("--undo-nextsize" "$UNDO_NEXTSIZE")
    [ -n "$UNDO_MAXSIZE" ] && args+=("--undo-maxsize" "$UNDO_MAXSIZE")
    [ -n "$USR_SIZE" ] && args+=("--usr-size" "$USR_SIZE")
    [ -n "$USR_DIR" ] && args+=("--usr-dir" "$USR_DIR")
    [ -n "$USR_AUTOEXTEND" ] && args+=("--usr-autoextend" "$USR_AUTOEXTEND")
    [ -n "$USR_NEXTSIZE" ] && args+=("--usr-nextsize" "$USR_NEXTSIZE")
    [ -n "$USR_MAXSIZE" ] && args+=("--usr-maxsize" "$USR_MAXSIZE")
    [ -n "$SYSSUB_SIZE" ] && args+=("--syssub-size" "$SYSSUB_SIZE")
    [ -n "$SYSSUB_DIR" ] && args+=("--syssub-dir" "$SYSSUB_DIR")
    [ -n "$SYSSUB_AUTOEXTEND" ] && args+=("--syssub-autoextend" "$SYSSUB_AUTOEXTEND")
    [ -n "$SYSSUB_NEXTSIZE" ] && args+=("--syssub-nextsize" "$SYSSUB_NEXTSIZE")
    [ -n "$SYSSUB_MAXSIZE" ] && args+=("--syssub-maxsize" "$SYSSUB_MAXSIZE")
    [ -n "$BACKUP_CTRLFILE" ] && args+=("--backup-ctrlfile" "$BACKUP_CTRLFILE")
    [ -n "$SYSTEM_SCRIPT" ] && args+=("--system-script" "$SYSTEM_SCRIPT")
    
    
    # creating the database
    echo "Creating the database"
    $TB_HOME/bin/tb_create_db.sh "${args[@]}"
    echo "70% complete"
    
    # Setting Archive log mode
    if [ -n "$ARCHIVE_LOG_MODE" ] && [ "$ARCHIVE_LOG_MODE" == "Y" -o "$ARCHIVE_LOG_MODE" == "y" ]; then
      echo "Setting Archive log mode"
      tbdown
      tbboot mount
      tbsql sys/"$TB_ROOT_PASSWORD" <<EOF
    ALTER DATABASE ARCHIVELOG;
    EOF
      tbdown
      tbboot
    fi
    echo "90% complete"
    
    
    # Setting up the database user
    echo "Setting up the database user"
    
    if { [ -n "${TB_USER:-}" ] && [ -z "${TB_PASSWORD:-}" ]; } || \
       { [ -z "${TB_USER:-}" ] && [ -n "${TB_PASSWORD:-}" ]; }; then
      echo "Cannot create database user: both TB_USER and TB_PASSWORD must be provided."
    fi
    
    if [ -n "${TB_USER:-}" ] && [ -n "${TB_PASSWORD:-}" ]; then
      tbsql "sys/${TB_ROOT_PASSWORD}" <<EOF
    create user ${TB_USER} identified by '${TB_PASSWORD}';
    grant dba to ${TB_USER};
    EOF
    fi
    
    echo "100% complete"
    echo "Tibero installation and database creation completed successfully."
    docker build -t <이미지명>:<태그> .
    .
    ├── Dockerfile
    ├── tibero.tar.gz
    └── scripts
        ├── entrypoint.sh
        ├── install_dependency.sh
        └── install_tibero.sh

    SOURCE_TYPE

    Source DB의 타입을 설정하는 파라미터 – ORACLE(기본값) : Source DB가 Oracle일 때 설정하며 SOURCE_LOGIN_AS 파라미터의 설정이 필요 – GENERIC : Source DB가 일반 DB일 때 설정한다. 특정 벤더별 API를 사용하지 않고 표준 JDBC API만을 이용하여 동작하며 SOURCE_DRIVER 파라미터의 설정이 필요 – DEFAULT : Source DB가 Tibero일 때 설정

    SOURCE_DRIVER

    Source DB에 접속할 때 사용하는 JDBC Driver 클래스를 설정하는 파라미터로 SOURCE_TYPE=GENERIC일 경우 설정이 필요 – Oracle(기본값) : oracle.jdbc.OracleDriver – MSSQL : com.microsoft.sqlserver.jdbc.SQLServerDriver – DB2 : com.ibm.db2.jcc.DB2Driver – MYSQL : com.mysql.jdbc.Driver – PostgreSQL : org.postgresql.Driver – Sybase ASE : com.sybase.jdbc3.jdbc.SybDriver – Informix : com.informix.jdbc.IfxDriver

    SOURCE_URL

    Source DB의 JDBC 연결 URL을 설정하는 파라미터 – Oracle(기본값) : jdbc:oracle:thin:@localhost:1521:orcl – MSSQL : jdbc:sqlserver://127.0.0.1:1433;databaseName=master – DB2 : jdbc:db2://127.0.0.1:50000/logdb – MYSQL : jdbc:mysql://127.0.0.1:3306/mysql – PostgreSQL : jdbc:postgresql://127.0.0.1:5432/postgres – Sybase ASE : jdbc:sybase:Tds:127.0.0.1:7100?ServiceName=sybase – Informix : jdbc:informix-sqli://127.0.0.1:18220/informix:INFORMIXSERVER=informix

    SOURCE_USER

    Source DB에 로그인하는 사용자 이름을 설정하는 파라미터

    기본적으로 대문자로 인식되며 큰따옴표를 통해 대소문자 구분이 가능 (기본값 : sys)

    SOURCE_PASSWORD

    파라미터
    설명

    TARGET_TYPE

    Target DB의 타입을 설정하는 파라미터 – DEFAULT : Target DB가 Tibero일 때 설정

    TARGET_DRIVER

    Target DB에 접속할 때 사용하는 JDBC Driver 클래스를 설정하는 파라미터 (기본값 : com.m.internal.jdbc.MInternalDriver)

    TARGET_URL

    Target DB의 JDBC 연결 URL을 설정하는 파라미터 (기본값 : jdbc:internal:thin:@localhost:8629:tibero)

    파라미터
    설명

    EXTRACT_PARALLEL

    SOURCE DB에서 데이터를 추출하는 Thread의 parallel 동작 여부를 설정하는 파라미터 SOURCE_TYPE이 Oracle, default, postgresql인 경우에만 사용 가능

    row가 rowid Hashing을 통해 나눠지므로 이관 동안 rowid 변경이 발생하지 않도록 주의 - Y - N (기본값)

    EXTRACT_PARALLEL_RANGE_BY_ROWID

    rowid의 범위를 지정하여 row를 나누도록 설정하는 파라미터

    SOURCE_TYPE=Oracle, EXTRACT_PARALLEL=Y인 경우에만 설정 가능ora_hash function을 지원하지않는 Oracle 9버전 이하에서 성능적 이점 존재

    IOT 테이블은 해당 옵션 사용불가 - Y - N

    EXTRACT_THREAD_COUNT

    데이터를 추출하는 Thread의 수를 설정하는 파라미터

    EXTRACT_PARALLEL_RANGE_BY_ROWID 옵션을 사용하는 경우 테이블의 extent 수에 따라 적절한 값으로 설정 (기본값 : 1)

    파라미터
    설명

    INSERT_METHOD

    데이터의 INSERT 방식을 지정하는 파라미터

    – DPL(기본값) : DIRECT PATH LOADING – CPL : CONVENTIONAL PATH LOADING

    COMMIT_SIZE

    TARGET_DB에 데이터를 commit하는 사이즈를 지정하는 파라미터

    INSERT_METHOD=cpl인 경우에만 동작하며 COMMIT_SIZE=-1로 설정하는 경우 기본값인 commit only once로 동작 (기본값 : commit once after loading)

    INDEX_DISABLE

    TARGET_TABLE의 INDEX를 자동으로 DISABLE 하도록 설정하는 파라미터 - Y - N (기본값)

    파라미터
    설명

    BYTEA_TO_BLOB

    bytea 타입을 blob 타입으로 전환하도록 설정하는 파라미터 - Y - N(기본값)

    TEXT_TO_CLOB

    text 타입을 clob 타입으로 전화하도록 설정하는 파라미터 - Y - N(기본값)

    파라미터
    설명

    MONITORING_LOG

    모니터링 로그 출력 여부를 설정하는 파라미터

    이관에 사용된 동작에 대한 평균 시간 로그를 출력 - Y - N (기본값)

    MONITORING_LOG_UNIT

    모니터링 로그에서 시간을 평균 낼 때 사용할 로우의 수를 설정하는 파라미터 (기본값 : 500)

    MONITORING_SESS_STAT

    모니터링할 stat을 설정하는 파라미터

    여러개의 stat을 설정할 경우 ;로 구분해주며 해당 옵션은 SOURCE_TYPE=ORACLE인 경우에만 설정 가능 (기본값 : 미사용) - 예 : MONITORING_SESS_STAT=CPU used by this session;parse time cpu;parse count (hard)

    SOURCE_TYPE=ORACLE
    SOURCE_DRIVER=oracle.jdbc.OracleDriver
    SOURCE_URL=jdbc:oracle:thin:@localhost:1539:orcl
    SOURCE_USER=sys
    SOURCE_PASSWORD=oracle
    SOURCE_LOGIN_AS=sysdba
    SOURCE_SCHEMA=SCOTT
    SOURCE_TABLE=t1
    SOURCE_TABLE_DEDUPLICATE=N
    TARGET_TYPE=DEFAULT
    TARGET_DRIVER=com.m.internal.jdbc.MInternalDriver
    TARGET_URL=jdbc:internal:thin:@localhost:59166:tibero
    TARGET_USER=tibero
    TARGET_PASSWORD=tmax
    TARGET_SCHEMA=TIBERO
    TARGET_TABLE=t1
    EXTRACT_PARALLEL=N
    EXTRACT_PARALLEL_RANGE_BY_ROWID=N
    EXTRACT_THREAD_COUNT=1
    SELECT_TSN=17322052
    SELECT_CONDITION= c1>1
    SELECT_FETCH_SIZE=1024
    SELECT_PARTITION=part1
    SELECT_SUBPARTITION=subpar1
    SELECT_AS_BYTE=N
    DB_FILE_MULTIBLOCK_READ_COUNT=-1
    OPTIMIZER_HINT=/*+ FULL(t) PARALLEL(t, 4) */
    USE_PARALLEL_HINT=N
    USE_OBJECT_PARALLEL_HINT=N
    PARALLEL_HINT_CNT=-1
    INSERT_METHOD=dpl
    COMMIT_SIZE=-1
    INDEX_DISABLE=N
    INSERT_BATCH=Y
    BATCH_THRESHOLD=128
    DPL_LOG_UNIT=500
    INSERT_PARALLEL=N
    INSERT_THREAD_COUNT=1
    INSERT_PARTITION=
    INSERT_ZERO_LENGTH_STRING_AS_NULL=Y
    TRIM=
    BYTEA_TO_BLOB=N
    TEXT_TO_CLOB=N                              
    MONITORING_LOG=N
    MONITORING_LOG_UNIT=500
    MONITORING_SESS_STAT=CPU used by this session;parse time cpu;parse count(hard)
    CHECK_COLUMN_METADATA=N
    ROW_QUEUE_TYPE=ARRAY(10240)
    VERIFY_TABLE=N
    VERIFY_TABLE_NAME=VERIFY_TBL
    LOG_LEVEL=INFO
    LOG_FILE_NAME=tableMigrator.log
    LOG_DIR=

    파라미터 예시

    Source 접속 정보 관련

    Target 접속 정보 관련

    데이터 Extractor 관련

    데이터 Loader 관련

    POSTGRESQL 관련

    일반 설정

    파라미터 표준설정 가이드

    Object 활용 가이드

    구조

    물리 설계 안내서

    Language

    TAC/ TAS

    용어

    설치

    전체

    설치 가이드

    Client 설치가이드

    패치

    패치 가이드

    업그레이드

    업그레이드가이드

    이관

    Tools

    전환 가이드

    대용량 이관 가이드

    유틸리티

    전환 유틸리티 가이드

    백업/복구

    백업/복구 가이드

    인터페이스/연동

    Driver

    Web server

    WAS 연동 가이드

    클라우드

    성능

    Storage

    통계

    분석

    로그/덤프

    모니터링/점검

    TPR

    TPR 가이드

    빅데이터

    보안

     

    보안 가이드

    장애해결

     

    설치 가이드
    Client 설치가이드
    패치 가이드
    전환 가이드
    대용량 이관 가이드
    전환 유틸리티 가이드
    WAS 연동 가이드
    TPR 가이드
    보안 가이드
    운영자 가이드
    대량 입력 업무 설정 가이드
    Driver 연결 가이드
    모니터링 가이드

    테이블 크기 산정

    Tibero DB 테이블 크기 산정 방법에 대해 설명합니다.

    Row의 데이터 길이

    테이블 크기를 산정하기 위해서는 컬럼의 데이터 타입별 실제 소비 크기와 저장되는 길이를 산정해야 합니다. 이 정보는 테이블 크기를 산정하기 위한 항목별 크기 산정 방법에 사용됩니다.

    데이터 타입별 크기는 “”을 참고합니다.

    아래는 컬럼 정의 및 계산 방식의 예입니다. 크기 산정 테이블은 5개의 컬럼으로 구성되었다고 가정합니다.

    이름

    데이터타입

    데이터길이

    비고

    ""의 데이터 타입별 사이즈 표를 참고하여 위 테이블을 구성하는 각 컬럼의 데이터 타입별 실제 소비사이즈를 산정하면 아래와 같습니다.

    테이블 크기를 산정하기 위해 필요한 항목은 아래와 같습니다.

    크기 예는 각 항목별로 기본으로 정해진 크기, 파라미터로 설정할 수 있는 크기와 운영할 시스템에서 사전 조사된 수치를 나타냅니다.

    250bytes 이하 및 초과 컬럼 개수는 Row의 데이터 길이 테이블을 참고합니다. 초기 예상 건수, 월중 예상 추가 건수, 데이터 보관 월 수는 운영할 시스템의 사용자 환경의 정보입니다.


    본 절에서는 Tibero에서 테이블 크기를 산정하는 방법에 대해서 설명합니다.

    항목
    사전 정보 크기
    실제 저장 크기
    비고

    block당 사용 가능한 데이터 공간 크기입니다.

    Source DB에 로그인 하는 사용자 패스워드를 설정하는 파라미터 (기본값 : oracle)

    SOURCE_LOGIN_AS

    Oracle에 접속할 때 권한을 설정하는 파라미터로 SOURCE_TYPE=ORACLE인 경우에만 설정 – SYSDBA(기본값) – NORMAL

    SOURCE_SCHEMA

    Source DB에서 이관하는 Table의 실제 사용자 이름을 설정하는 파라미터기본적으로 대문자로 인식되며 큰따옴표를 통해 대소문자 구분이 가능 (기본값 : SOURCE_USER에서 설정한 사용자 이름)

    SOURCE_TABLE

    Source DB에서 이관하는 Table 이름을 설정하는 파라미터

    기본적으로 대문자로 인식되며 큰따옴표를 통해 대소문자 구분이 가능

    (필수 입력)

    SOURCE_TABLE_DEDUPLICATE

    dedup 옵션이 사용된 테이블의 이관 동안 발생하는 deadlock 에러를 무시하는 파라미터

    BATCH_THRESHOLD=2 이상일 경우 데이터 무결성이 보장되지 않으므로 BATCH_THRESHOLD=1인 경우에만 설정 - Y - N

    TARGET_USER

    Target DB에 로그인하는 사용자 이름을 설정하는 파라미터

    기본적으로 대문자로 인식되며 큰따옴표를 통해 대소문자 구분이 가능 (기본값 : sys)

    TARGET_PASSWORD

    Target DB에 로그인하는 사용자 패스워드를 설정하는 파라미터 (기본값 : tibero)

    TARGET_SCHEMA

    Target DB에 이관 받는 Table의 실제 사용자 이름

    기본적으로 대문자로 인식되고 큰따옴표를 통해 대소문자 구분이 가능 (기본값 : TARGET_USER에서 설정한 사용자 이름)

    TARGET_TABLE

    Target DB에 이관 받는 Table 이름을 설정하는 파라미터

    기본적으로 대문자로 인식되고 큰따옴표를 통해 대소문자 구분이 가능 (기본값 : SOURCE_TABLE에서 설정한 Table 이름)

    SELECT_TSN

    특정 TSN (Oacle에서는 SCN) 시점 이후의 데이터를 추출하도록 설정하는 파라미터 (기본값 : 미사용)

    SELECT_CONDITION

    Table 데이터 전체가 아닌 조건절에 해당하는 데이터만 추출하도록 설정하는 파라미터 (기본값 : 미사용)

    SELECT_FETCH_SIZE

    Source DB에서 추출해온 결과 set을 fetch 해오는 단위 (row 수)를 설정하는 파라미터 (기본값 : 1024)

    SELECT_PARTITION

    파티션 Table에서 지정한 파티션에서만 데이터를 추출하도록 설정하는 파라미터 (기본값 : 미사용)

    SELECT_SUBPARTITION

    파티션 Table에서 지정한 서브 파티션에서만 데이터를 추출하도록 설정하는 파라미터 SELECT_PARTITION 옵션과 같이 사용할 경우 SELECT_PARTITION 옵션이 적용 (기본값 : 미사용)

    SELECT_AS_BYTE

    Table의 char, varchar와 같은 문자열을 저장하기 위한 열에 데이터베이스 설정과 다른 캐릭터셋을 사용하여 실제 문자열이 저장되면 문자열 형태로 데이터를 가져올 시 문자열의 정상적 배열 불가

    이를 방지하기 위하여 문자열이 아닌 바이너리 형태로 데이터를 가져오고, 바이너리 형태로 Tibero에 옮기도록 설정하는 파라미터 - Y - N (기본값)

    DB_FILE_MULTIBLOCK_READ_COUNT

    이관 전 해당 세션에 대한 DB_FILE_MULTBLOCK_READ_COUNT 값을 설정하는 파라미터

    SOURCE_TYPE=Oracle인 경우에만 설정 가능하며 값을 -1로 설정 시 동작하지 않음 (기본값 : -1)

    OPTIMIZER_HINT

    SOURCE DB로 부터 데이터를 SELECT 할 때 사용할 힌트를 설정하는 파라미터

    테이블 이름은 't'를 사용하며 SOURCE_TYPE=Oracle, SOURCE_TYPE=Default인 경우에만 사용 가능 만약 USE_PARALLEL_HINT 옵션과 동시에 사용된다면, OPTIMIZER_HINT 옵션이 우선적으로 적용 - 예 : OPTIMIZER_HINT=/*+ FULL(t) PARALLEL(t, 4)

    USE_PARALLEL_HINT

    SOURCE DB에서 데이터를 SELECT 할 때 PARALLEL 힌트 사용 여부를 설정하는 파라미터 SOURCE_TYPE=Oracle, SOURCE_TYPE=Default인 경우에만 사용 가능 - Y - N (기본값)

    USE_OBJECT_PARALLEL_HINT

    PARALLEL 힌트 사용 시 Table 이름을 명시할 수 있도록 설정하는 파라미터

    해당 옵션을 활성화하기 위해서는 USE_PARALLEL_HINT=Y 설정이 필요, SOURCE_DB가 Default, Oracle인 경우에만 사용 가능 - Y - N (기본값)

    PARALLEL_HINT_CNT

    PARALLEL 힌트 사용 시 DOP를 설정하는 파라미터

    해당 옵션을 활성화하기 위해서는 USE_PARALLEL_HINT=Y 설정이 필요

    (기본값 : -1)

    INSERT_BATCH

    Table의 데이터를 Batch Insert 방식으로 load 하도록 설정하는 파라미터

    INSERT_METHOD=CPL인 경우에만 동작 - Y - N

    BATCH_THRESHOLD

    TARGET_DB에 Batch를 실행할 때 단위(row 수)를 설정하는 파라미터

    INSERT_METHOD=CPL, INSERT_BATCH=Y 인 경우에만 동작하며 -1 값을 입력하면 미 동작 (기본값 : 32)

    DPL_LOG_UNIT

    로그를 출력하는 row의 로딩 단위를 설정하는 파라미터

    INSERT_METHOD=DPL인 경우에만 사용 가능하며 0으로 설정하는 경우 로그가 미 출력 (기본값 : 500)

    INSERT_PARALLEL

    데이터를 load하는 Thread의 parallel 동작 여부를 설정하는 파라미터 - Y(기본값) - N

    INSERT_THREAD_COUNT

    데이터 loader thread 개수를 설정하는 파라미터 INSERT_PARALLEL=Y인 경우에만 동작 (기본값 : 4)

    INSERT_PARTITION

    지정한 파티션에 이관할 경우 설정하는 파라미터 (기본값 : 미사용)

    INSERT_ZERO_LENGTH_STRING_AS_NULL

    길이가 0인 String 타입 데이터가 이관 시 NULL로 들어가도록 설정하는 파라미터 INSERT_ZERO_LENGTH_STRING_AS_NULL=N으로 설정 시 길이가 0인 데이터는 공백('')으로 들어가며 SOURCE_TYPE=Oracle인 경우 설정이 무시 - Y(기본값) - N

    TRIM

    CHAR 타입 데이터의 선행, 후행에 있는 pad 문자 제거 - Y - N(기본값)

    CHECK_COLUMN_METADATA

    INSERT_METHOD=dpl인 경우 이관하기 전에 SOURCE DB table과 TARGET DB table의 메타데이터를 확인하는 옵션 - Y(기본값) - N

    ROW_QUEUE_TYPE

    추출한 데이터를 저장하는 queue 타입을 설정하는 파라미터 EXTRACT_PARALLEL=Y, INSERT_PARALLEL=Y 인 경우 SYNCHRO 타입을 사용하는 것이 성능상 좋으며 ARRAY 타입은 사이즈 특정 가능 - ARRAY (기본값 : 10240) - SYNCHRO

    VERIFY_TABLE

    이관 검증 테이블 사용 여부를 설정하는 파라미터 - Y - N (기본값)

    VERIFY_TABLE_NAME

    검증 테이블 이름을 설정하는 파라미터 (기본값 : VERIFY_TBL)

    LOG_LEVEL

    로그 레벨을 설정하는 파라미터 (기본값 : INFO)

    LOG_FILE_NAME

    로그 파일 이름을 설정하는 파라미터 (기본값 : tableMigrator.log)

    LOG_DIR

    로그 파일이 생성되는 디렉토리 경로를 설정하는 파라미터 (기본값 : Migrator 실행 경로)

    Driver 연결 가이드
    모니터링 가이드

    VARCHAR

    지정된 길이의 70%로 가정한다. VARCHAR(3000) = 3,000 * 0,7 = 2,100

    3

    bytes

    row 하나당 bytes

    250bytes 이하 컬럼개수

    3

    개수

    위의 Row의 데이터 길이 테이블에 c1, c2, c3가 대상

    250bytes 초과 컬럼개수

    2

    개수

    위의 Row의 데이터 길이 테이블에 c4, c5가 대상

    Block Size

    8192

    개수

    기본값: 8192 (파라미터)

    Block Header

    48

    bytes

    고정 (Fixed Header)

    INITRANS

    2

    개수

    기본값: 2 (파라미터)

    PCTFREE

    10

    %

    기본값: 10% (파라미터)

    ITL 공간

    48

    bytes

    24 * 2 (24 * INITRANS)

    초기 예상 건수

    100,000

    Rows

    사용자 환경

    월중 예상 추가 건수

    20,000

    Rows

    사용자 환경

    데이터 보관 월 수

    120

    개월

    사용자 환경

    3

    Row의 데이터 길이

    2,622

    2622

    250bytes 이하 컬럼개수

    3

    1 * 3

    1 * 250bytes 이하 컬럼개수

    250bytes 초과 컬럼개수

    2

    3 * 2

    3 * 250bytes 초과 컬럼개수

    Row Space

    2,636

    2+3+2622+(1*3)+(3*2)

    48

    48

    ITL공간

    48

    48

    24 * 2 (24 * INITRANS)

    PCTFREE

    10

    10

    Data Space per Block

    7,286

    (8192-48-48)*(100-10)/100

    2,636

    2,636

    Row Size per Block

    2

    7,286 / 2,636

    20,000

    20,000

    데이터 보관 월 수

    120

    120+1

    <데이터 보관 월 수> + 1

    Total Row Size

    2,520,000

    100,000 +20,000 *(120+1)

    2,520,000

    2,520,000

    Row Size per Block

    2

    2

    Total Table Size

    10,321,920,000 (9.613037GB)

    8,192 * 2,520,000 / 2

    c1

    CHAR(10)

    10

    c2

    DATE

    8

    c3

    NUMBER(7,2)

    4

    roundup(7/2)

    c4

    CHAR(500)

    500

    c5

    VARCHAR(3000)

    2,100

    3,000 * 0,7

    Row의 데이터 길이

    2,622

    c1 + c2+ c3 + c4 + c5

    구분

    설명

    CHAR

    문자열의 길이는 byte와 문자를 기준으로 지정한다. CHAR(10) = 10, CHAR(500) = 500

    DATE

    고정 8bytes 이다.

    NUMBER

    크기를 2로 나누어 반올림한 값이다. NUMBER(7,2) = roundup(7/2) = 4

    항목

    크기 예

    단위

    설명

    Row Directory

    2

    bytes

    row 하나당 bytes

    Row Directory

    2

    2

    Row Header

    항목

    사전 정보 크기

    실제 저장 크기

    비고

    Block Size

    8192

    8192

    항목

    사전 정보 크기

    실제 저장 크기

    비고

    Data Space per Block

    7,286

    7,286

    항목

    사전 정보 크기

    실제 저장 크기

    비고

    초기 예상 건수

    100,000

    100,000

    항목

    사전 정보 크기

    실제 저장 크기

    비고

    Block Size

    8,192

    8,192

    항목별 크기 산정

    테이블 크기 산정 방법

    한 Row 저장에 필요한 공간

    산정 공식

    한 블록의 데이터 공간

    산정 공식

    한 블록에 들어갈 수 있는 Row 개수

    산정 공식

    총 데이터 Row 개수

    산정 공식

    필요한 총 데이터 공간

    산정공식

    데이터 타입별 크기 산정
    데이터 타입별 크기 산정

    Row Header

    3

    Block Header

    Row Space

    월중 예상 추가 건수

    Total Row Size

    한 Row 저장에 필요한 공간 = Row Directory + Row Header + Row의 데이터 길이
    + (1 * <250bytes 이하 컬럼개수>) + (3 * <250bytes 초과 컬럼개수>)
    한 블록의 데이터 공간 = (Block Size - Block Header - ITL공간) * (100 - PCTFREE) / 100
    / Row Space ( 한 블록의 데이터 공간 / 한 Row의 저장에 필요한 공간 )
    총 데이터 Row 개수 = <초기 예상 건수> + <월중 예상 추가 건수> * (<데이터 보관 월 수> + 1)
    필요한 총 데이터 공간 = Block Size * Total Row Size / Row Size per Block (Block Size
    * 총 데이터 Row 개수 / 한 블록에 들어갈 수 있는 Row 개수)

    인덱스 크기 산정

    Tibero DB 인덱스 크기 산정 방법에 대해 설명합니다.

    사전 정보

    Tibero에서 인덱스 크기 산정에 필요한 사전 정보로 Key Column 총 길이, Base RowID 산정 기준 그리고 항목별 크기 산정 정보가 필요합니다.

    아래는 Key Column 총 길이, Base RowID 산정 기준 그리고 항목별 크기 산정의 예입니다.

    Key Column 총 길이

    인덱스 크기를 산정하기 위해서는 컬럼의 데이터 타입별 실제 소비 크기와 저장되는 길이을 산정해야하며 이 정보는 인덱스 크기를 산정하기 위한 항목별 크기 산정방법에 사용됩니다. 인덱스 크기를 산정할 때 컬럼에 지정된 데이터 타입별 저장되는 크기 산정이 필요합니다.

    아래는 컬럼 정의 및 계산 방식의 예입니다. 크기 산정 테이블은 5개의 컬럼으로 구성되었다고 가정합니다.

    ""의 데이터 타입별 사이즈 표를 참고하여 위 테이블을 구성하는 각 컬럼의 데이터 타입별 실제 소비사이즈를 산정한 수치입니다. 자세한 항목별 수치 산정 방법은 ""를 참고합니다.

    크기 선정 대상인 위 테이블의 인덱스는 Local Index와 Not Unique Index로 선별 되었습니다.

    인덱스 크기를 산정하기 위해 필요한 항목은 아래와같습니다.

    크기 예는 각 항목별로 기본으로 정해진 크기, 파라미터로 설정할 수 있는 크기와 운영할 시스템에서 사전 조사된 수 치를 나타냅니다.


    본 절에서는 Tibero에서 인덱스 크기를 산정하는 방법을 설명합니다.

    Leaf Block 일정수마다 Branch Block이 생성됩니다.

    ""의 산정방식 (Block Size * (A+B)) 중 A는 Leaf Block을 B는 Branch Block을 의미합니다.

    Index Split이 일어난 경우 실제 블록의 50% 공간만 차지하게 되므로 사용 공간 최대 값은 최종 계산 결과 * 2를 해 줍니다.

    1. 인덱스의 경우 Create Index로 데이터를 처음 적재하는 경우 PCTFREE로 지정된 비율을 제외하고 블록을 최 대한 사용하여 데이터를 저장합니다.

    2. 인덱스 생성 이후 신규로 인덱스 키 데이터가 추가되는 경우 해당 인덱스 키가 추가되어야 하는 블록에 여유 공 간이 없을 때 SPLIT이 발생하게 됩니다.

    3. SPLIT이 발생하게 되면 새로운 블록이 할당되고 기존 블록에 있던 인덱스 키 데이터를 통상 5:5 비율로 분할하 여 나누어 가지기 때문에 두 개의 블록에 빈 공간이 50% 생깁니다.

    따라서, 인덱스에 데이터 추가가 계속된다고 하면 특정 시점 이후에 Index Split이 얼마나 발생했는지는 정확하게 예측하기는 어렵습니다. 다만, 처음 SPLIT이 발생된 이후, 다음 번 SPLIT이 발생되기까지 빈 공간이 0% ~ 50% 범위에서 유지되기 때문에 평균적으로 절반 정도의 블록이 SPLIT이 되어 있다라고 가정하는 것이 가장 근사하게 추정하는 방법일 것입니다.

    Index Size시트의 크기 산정 방식에서 최종 계산 결과(Total Table Size for Index Spli)에 2를 곱한 것은 모 든 블록이 SPLIT되어 있을 때 최대 사용공간을 가정하여 산출한것이며 만약 평균 개념으로 추정한다면 1.5를 곱해서 계산하는 것이 현실적일 수 있습니다.

    대용량 데이터 이관 예제

    대용량 데이터 이관 방법의 예제를 설명합니다.

    데이터 이관은 다양한 방법을 이용하여 수행할 수 있고 이로 인해 수행 속도를 최적화 시킬 수 있습니다.

    단, 테이블에 대한 데이터 이관만 가능하므로 Object에 대한 이관은 수동으로 수행해야 합니다.

    아래는 예제에서 사용하는 테이블 정보입니다.

    CREATE TABLE DBTECH.LINEITEM ( 
    L_ORDERKEY NUMBER,
    L_PARTKEY NUMBER, 
    L_SUPPKEY NUMBER, 
    L_LINENUMBER NUMBER, 
    L_QUANTITY NUMBER(15,2),
    L_EXTENDEDPRICE NUMBER(15,2), 
    L_DISCOUNT NUMBER(15,2), 
    L_TAX NUMBER(15,2), 
    L_RETURNFLAG CHAR(1), 
    L_LINESTATUS CHAR(1), 
    L_SHIPDATE DATE,
    L_COMMITDATE DATE, 
    L_RECEIPTDATE DATE, 
    L_SHIPINSTRUCT CHAR(25), 
    L_SHIPMODE CHAR(10), 
    L_COMMENT VARCHAR(44)
    ) NOLOGGING;


    Table Migrator 예제

    Table Migrator 방법으로 대용량 데이터를 이관하는 순서입니다.

    1. migrator.properties 파일에 속성값을 설정합니다.

    $ cat migrator.properties
    
    
    #######################
    # Source DB Connection 
    #######################
    
    # Source DB type (Optional, generic | default | ORACLE) 
    # ORACLE option needs SOURCE_LOGIN_AS property
    # GENERIC option needs SOURCE_DRIVER property
    SOURCE_TYPE=ORACLE
    
    # Source DB JDBC driver class name
    # Use with SOURCE_TYPE=GENERIC option 
    SOURCE_DRIVER=oracle.jdbc.OracleDriver 
    #SOURCE_DRIVER=com.mysql.jdbc.Driver
    
    # Source DB JDBC connection URL (Optional, 
    Default=jdbc:oracle:thin:@localhost:1521:orcl) 
    SOURCE_URL=jdbc:oracle:thin:@localhost:1539:orcl 
    #SOURCE_URL=jdbc:mysql://127.0.0.1:3306/mysql
    # Source DB login ID (Optional, Default=sys) 
    #SOURCE_USER="user1"
    SOURCE_USER=tibero
    
    # Source DB login password (Optional, Default=oracle)
    SOURCE_PASSWORD=tmax
    
    
    # Oracle source DB login option (Optional, Default=sysdba) 
    # Use with SOURCE_TYPE=ORACLE option 
    SOURCE_LOGIN_AS=NORMAL
    
    # Source table schema (Optional)
    # Default value is the same with SOURCE_USER 
    #SOURCE_SCHEMA=SCOTT
    #SOURCE_SCHEMA="dbo" 
    #SOURCE_SCHEMA=
    
    # Source table name (Mandatory) 
    #SOURCE_TABLE=tableName1 
    #SOURCE_TABLE="tableName2" 
    #SOURCE_TABLE=bt_scen_tran 
    SOURCE_TABLE=t1
    
    # Ignore deadlock error that occur during migration for the tables created using the dedup option
    # Use when BATCH_THRESHOLD=1
    # If not, Data integrity is not guaranteed 
    SOURCE_TABLE_DEDUPLICATE=N
    
    #######################
    # Target DB Connection 
    #######################
    
    # Target DB type (Optional, DEFAULT)
    TARGET_TYPE=DEFAULT
    
    # Target DB JDBC driver class name 
    #TARGET_DRIVER=com.tmax.tibero.jdbc.TbDriver 
    TARGET_DRIVER=com.m.internal.jdbc.MInternalDriver
    
    # Target DB JDBC connection URL (Optional, 
    Default=jdbc:internal:thin:@localhost:8629:tibero) 
    #TARGET_URL=jdbc:tibero:thin:@192.1.5.63:39208:tibero 
    TARGET_URL=jdbc:internal:thin:@localhost:59166:tibero
    
    # Target DB login ID (Optional, Default=sys) 
    #TARGET_USER="user1"
    TARGET_USER=tibero
    
    # Target DB login password (Optional, Default=tibero)
    TARGET_PASSWORD=tmax
    
    # Target table schema (Optional)
    # Default value is the same with TARGET_USER 
    # TARGET_SCHEMA=TIBERO
    
    # Target table name (Optional)
    # Default value is the same with SOURCE_TABLE 
    # TARGET_TABLE=t1
    
    #################
    # Data Extractor 
    #################
    # Use parallel Extracting (Optional, Y | N Default=N)
    EXTRACT_PARALLEL=N
    
    # Number of data extractor thread (Optional, Default=1)
    EXTRACT_THREAD_COUNT=1
    
    # Use TSN(or SCN) option (Optional) 
    #SELECT_TSN=17322052
    
    # Where conditions (Optional)
    # ex. column1 > 10 AND column2 = 'abc' 
    #SELECT_CONDITION= c1>1
    
    # Fetch size of source table cursor (Optional, Default=1024) 
    # Some DB is not supported this feature. 
    #SELECT_FETCH_SIZE=1024
    
    # Source table partition name (Optional) 
    #SELECT_PARTITION=
    
    # Source table subpartition name (Optional) 
    #SELECT_SUBPARTITION=subpar1 
    #SELECT_SUBPARTITION="subpart2" 
    #SELECT_SUBPARTITION=
    
    # Ignore source/target DB character set (Optional, y | N )
    SELECT_AS_BYTE=N
    
    # db_file_multiblock_read_count (Optinal, Option for Oracle), Defalut=-1)
    DB_FILE_MULTIBLOCK_READ_COUNT=-1
    
    # Use parallel excution of SQL statements (Optinal, Option for Oracle), Defalut=N)
    USE_PARALLEL_HINT=N
    
    # Use with USE_PARALLEL_HINT=Y (Defalut=-1)
    PARALLEL_HINT_CNT=-1
    
    ##############
    # Data Loader 
    ##############
    
    # Use direct path loading (Optional, cpl | DPL) 
    # CPL means conventional path loading
    # DPL means direct path loading I
    NSERT_METHOD=dpl
    
    # Use commit size option(Optinal, Default = commit once after loading) 
    # Use with INSERT_METHOD=CPL option
    # set commit_size-1 to commit only once 
    COMMIT_SIZE=-1
    
    # Use index disable option(Optional, Default = N, Y/N)
    INDEX_DISABLE=N
    
    # Use batch insert (Optional, Y | n) 
    # Use with INSERT_METHOD=CPL option 
    INSERT_BATCH=Y
    
    # batch threshold size (Optional, Default=32)
    BATCH_THRESHOLD=128
    
    # Use parallel loading (Optional, Y | n)
    INSERT_PARALLEL=N
    
    # Number of data loader thread (Optional, Default=4) 
    # Use with INSERT_PARALLEL=Y option 
    INSERT_THREAD_COUNT=1
    
    # Target table partition name (Optional) 
    #INSERT_PARTITION=
    
    # Specifies whether to keep the column names of the source table case-sensitive. 
    (Optional, Y | n )
    # If set to Y, the original column name format will be preserved by enclosing it in 
    double quotes.
    # If set to N, the column name format will follow the database naming rules.
    INSERT_COLUMN_NAME_CASE_SENSITIVE=N
    
    # Use zero length string data migration as null (Optional, Y | n, Default=Y, Option ignored for Oracle)
    # If set to N, the zero length data will be inserted as ' '. 
    INSERT_ZERO_LENGTH_STRING_AS_NULL=Y
    
    # Trim leading and trailing pad character of CHAR type data. (Optional, Y | n, Default=N)
    #TRIM=
    
    ##############
    # Common 
    ##############
    
    # Use MetaData Checking for DPL. (Optional, Default=Y)
    CHECK_COLUMN_METADATA=N
    
    
    # Log 
    LOG_LEVEL=INFO
    LOG_FILE_NAME=tableMigrator.log 
    #LOG_DIR=

    전체 건수를 균등하게 나눌 수 있는 조건을 검토합니다.(SELECT_CONDITION 부분에 설정)

    만족하는 조건이 있는 경우 SQL문을 나눈 후에 병렬 세션(터미널 또는 다른 컴퓨터)으로 수행하며 Temp와 Undo Tablespace 사용량의 모니터링이 필요합니다.

    1. Background Process를 이용하여 병렬 프로세싱으로 migrator를 수행합니다.

    1. 수행 결과와 로그 파일을 확인합니다.


    DB Link로 insert ... select ... 구문을 수행할 때 parallel 힌트를 사용하면 select는 serial하게 동작하고, insert일 때만 parallel로 동작합니다. 따라서 DB Link 원본 데이터가 존재하는 서버의 사양이 좋을 경우 parallel 힌트를 사용하여 view를 생성하고 해당 view를 Tibero에서 select하는 방식으로 이관하면 성능 향상을 기대할 수 있습니다.

    아래는 DB Link 방법으로 대용량 데이터를 이관하는 순서입니다.

    1. 전체 건수를 균등하게 나눌 수 있는 조건을 검토합니다.

    만족하는 조건이 있는 경우 SQL문을 나눈 후에 병렬 세션(터미널 또는 다른 컴퓨터)으로 수행하며 Temp와 Undo Tablespace 사용량의 모니터링이 필요합니다.

    1. SQL문에 append, parallel 힌트를 사용합니다.

    append Insert하는 대상 테이블에 대해서 nologging 옵션이 적용되있어야 합니다.

    parallel 힌트를 적용하기 위해 해당 세션에 parallel dml 옵션을 enable해야 합니다.

    아래는 세션이 2개일 경우 DB Link를 수행하는 예입니다.

    세션 1수행 L_LINESTATUS가 '0'에 대해서 Insert합니다.

    세션 2수행 L_LINESTATUS가 'F'에 대해서 Insert합니다.

    COMMIT된 데이터 확인


    Load할 SAM 파일을 n등분하고 직접 로딩과 병렬 프로세싱을 동시에 사용합니다.

    데이터를 로딩하는 방식으로 디스크에서 wait만 발생하지 않는다면 최적의 수행 속도가 보장됩니다.

    아래는 tbLoader 방법으로 대용량 데이터를 이관하는 순서입니다.

    1. Unload(spool 또는 unload 유틸을 이용하여 데이터 unload) 및 SAM 파일을 전송합니다.

    2. Load할 SAM 파일을 n등분 하여 n개의 SAM 파일을 준비합니다.

    3. 각 SAM 파일을 읽는 n개의 컨트롤 파일을 작성하고, 작성할 때 append 옵션을 사용합니다.

    아래는 2개의 컨트롤 파일을 작성하는 방법입니다.

    1. Background Process를 이용하여 병렬 프로세싱으로 tbloader를 실행하고, tbloder 명령어에 'direct=y dpl_parallel=y' 옵션을 사용합니다.

    아래는 2개의 SAM 파일 및 컨트롤 파일을 가지고 tbLoader를 수행하는 예입니다.

    세션 1 수행

    세션 2 수행

    Unique Index

    6

    Global, Local 선별

    B

    Unique Index

    0

    Unique, Not Unique 선별

    Not Unique Index

    1

    Unique, Not Unique 선별

    Base RowID 총 길이

    8

    A + B의 합계

    2

    bytes

    기본값: 2

    250bytes 이하 컬럼 개수

    2

    개수

    위의 Key Column 총 길이 테이블에 c1, c2 가 대상이다.

    250bytes 초과 컬럼 개수

    0

    개수

    Block Size

    8192

    개수

    기본값: 8192 (파라미터)

    Block Header

    224

    bytes

    INITRANS

    2

    개수

    기본값: 2 (파라미터)

    PCTFREE

    10

    %

    기본값: 10% (파라미터)

    ITL공간

    48

    bytes

    24 * 2 (24 * INITRANS)

    초기 예상 건수

    100,000

    Rows

    사용자 환경

    월중 예상 추가 건수

    20,000

    Rows

    사용자 환경

    데이터 보관 월 수

    120

    개월

    사용자 환경

    Base RowID

    7

    bytes

    6 + 1

    2

    2

    Base RowID

    7 7

    6 +1

    Key Column 총 길이

    18

    18

    250bytes 이하 컬럼개수

    2

    1 * 2

    1 * 250bytes 이하 컬럼개수

    250bytes 초과 컬럼개수

    0

    3 * 0

    3 * 250bytes 초과 컬럼개수

    Index Entry Space

    31

    2+2+7+18+(1*2)+(3*0)

    224

    224

    ITL공간

    48

    48

    24 * 2 (24 * INITRANS)

    PCTFREE

    10

    10

    Data Space per Block

    7,128

    (8192-224-48)*(100-10)/100

    31

    31

    Entry Size per Block

    229.9355

    7,128 / 31

    20,000

    20,000

    데이터 보관 월 수

    120

    120+1

    <데이터 보관 월 수> + 1

    Total Row Size

    2,520,000

    100,000 + 20,000 * (120+1)

    0.004349046

    1 / 229.9355

    2,520,000

    2,520,000

    Entry Size

    per Block

    229.9355

    229.9355

    Total Index Size

    90,161,152

    8192*(TRUNC(2520000/229.9355,0)

    +TRUNC(2520000/229.9355^2,0))

    180,322,304

    90,161,152 *2

    이름

    데이터타입

    데이터길이

    비고

    c1

    CHAR(10)

    10

    c2

    DATE

    8

    c3

    NUMBER(7,2)

    4

    roundup(7/2)

    c4

    CHAR(500)

    500

    c5

    VARCHAR(3000)

    2,100

    3,000*0,7

    Key Column 총 길이

    18

    c1 + c2

    Name

    Type

    데이터길이

    비고

    A

    Global Index

    10

    Global, Local 선별

    항목

    크기 예

    단위

    설명

    Row Directory

    2

    bytes

    기본값: 2

    항목

    사전 정보 크기

    실제 저장 크기

    비고

    Row Directory

    2

    2

    항목

    사전 정보 크기

    실제 저장 크기

    비고

    Block Size

    8192

    8192

    항목

    사전 정보 크기

    실제 저장 크기

    비고

    Data Space per Block

    7,128

    7,128

    항목

    사전 정보 크기

    실제 저장 크기

    비고

    초기 예상 건수

    100,000

    100,000

    항목

    사전 정보 크기

    실제 저장 크기

    비고

    Entry Size per Block

    229.9355

    229.9355

    항목

    사전 정보 크기

    실제 저장 크기

    비고

    Block Size

    8,192

    8,192

    항목

    사전 정보 크기

    실제 저장 크기

    비고

    Total Index Size

    90,161,152

    90,161,152

    Base RowID 산정 기준

    항목별 크기 산정

    인덱스 크기 산정방법

    한 Index Entry의 저장에 필요한 공간

    산정 공식

    한 블록의 데이터 공간

    산정 공식

    한 블록에 들어가는 Entry 개수

    산정 공식

    총 데이터 Row 개수

    산정 공식

    Index Leaf 블록에 필요한 Index Branch 블록의 비율

    산정 공식

    필요한 총 데이터 공간

    산정 공식

    Index Split이 일어난 경우

    산정 공식

    데이터 타입별 크기 산정
    Row의 데이터길이
    필요한 총 데이터 공간

    Index Header

    Index Header

    Block Header

    Index Entry Space

    월중 예상 추가 건수

    Index Branch Ratio

    Total Row Size

    Total Index Size for Index Split

    DB Link 예제

    세션이 2개일 경우 동시에 수행합니다.

    Select하는 부분에 병렬 수행을 적용하기 위해서는 DB Link의 테이블에 대해서 parallel을 적용한 View를 만 들어 조회해야 합니다.

    tbLoader 예제

    Loader 방법 사용 시 Source 데이터의 unload 시간을 고려합니다. 또한Source 서버에서 Tartget 서버로 파일 전송 시간을 고려합니다.

    dpl_parallel 옵션은 하나의 테이블에 대해 병렬 프로세싱으로 tbloader를 수행할 때 사용하며 Tibero5r70450 이후 버전에서 사용이 가능합니다.

    Row Directory + Index Header + Base RowID
    + Key Column 총 길이 + (1 * <250bytes 이하 컬럼개수>) + (3 * <250bytes 초과 컬럼개수>)
    (Block Size - Block Header - ITL 공간) * (100 - PCTFREE) / 100
    /Data Space per Block / Index Entry Space (한 블록의 데이터 공간
    / 한 Index Entry의 저장에 필요한 공간)
    초기 예상 건수 + 월중 예상 추가 건수 * (데이터 보관 월 수 + 1)
    1 / Entry Size per Block (1 / 한 블록에 들어가는 Entry 개수)
    Block Size *( Total Row Size / Entry Size per Block + Total Row Size
    / Entry Size per Block ^ 2 )
    Index Split이 일어난 경우 데이터 공간 = Total Index Size * 2 (필요한 총 데이터 공간 * 2 )
    $ cat run.sh
    # dbtech.lineitem 테이블 (조건 l_linestatus='0'에 해당하는 데이터) 
    nohup migrator.sh SOURCE_TYPE=ORACLE \
    SOURCE_URL=jdbc:oracle:thin:@localhost:1521:ORCL \ 
    SOURCE_USER=dbtech SOURCE_PASSWORD=dbtech SOURCE_LOGIN_AS=NORMAL \
    SOURCE_SCHEMA=dbtech SOURCE_TABLE=lineitem \ 
    TARGET_URL=jdbc:tibero:thin:@localhost:8629:tibero \
    TARGET_USER=dbtech TARGET_PASSWORD=dbtech SELECT_CONDITION="l_linestatus='O'" >
    migrator_a_set.log &
    
    # dbtech.lineitem 테이블 (조건 l_linestatus='F'에 해당하는 데이터) 
    nohup migrator.sh SOURCE_TYPE=ORACLE \
    SOURCE_URL=jdbc:oracle:thin:@localhost:1521:ORCL 
    \ SOURCE_USER=dbtech SOURCE_PASSWORD=dbtech SOURCE_LOGIN_AS=NORMAL \
    SOURCE_SCHEMA=dbtech SOURCE_TABLE=lineitem \ 
    TARGET_URL=jdbc:tibero:thin:@localhost:8629:tibero \
    TARGET_USER=dbtech TARGET_PASSWORD=dbtech SELECT_CONDITION="l_linestatus='F'" > 
    migrator_b_set.log &
    # dbtech.lineitem 테이블의 조건 l_linestatus='0' migrator 수행 로그 확인
    $ cat migrator_a_set.log
    === Parameters ===
    
    PROPERTY_FILE=migrator.properties 
    SOURCE_TYPE=ORACLE
    SOURCE_URL=jdbc:oracle:thin:@localhost:1521:ORCL
    SOURCE_USER=dbtech 
    SOURCE_PASSWORD=************ 
    SOURCE_LOGIN_AS=NORMAL
    SOURCE_SCHEMA=dbtech
    SOURCE_TABLE=lineitem 
    TARGET_TYPE=DEFAULT
    TARGET_URL=jdbc:tibero:thin:@localhost:8629:tibero
    TARGET_USER=dbtech 
    TARGET_PASSWORD=************ 
    SELECT_CONDITION=l_linestatus='F' 
    SELECT_FETCH_SIZE=1024 
    SELECT_AS_BYTE=N 
    INSERT_METHOD=DPL
    INSERT_BATCH=Y 
    INSERT_PARALLEL=Y 
    INSERT_THREAD_COUNT=4
    
    ==================
    
    
    [E0]1373322363068	- STARTED
    [L0]1373322363189	Loader started
    [L1]1373322363192	Loader started
    [L2]1373322363196	Loader started
    [L3]1373322363198	Loader started
    [L1]	1000
    [L0]	1000
    [L3]	1000
    [L2]	1000
    ... 중략 ...		
    [E0]1373322793890	- TOTAL Extracted ROWS: 3004998
    [L3]1373322793913	  TOTAL Loaded ROWS:	617366
    [L0]1373322793921	  TOTAL Loaded ROWS:	893541
    [L1]1373322793924	  TOTAL Loaded ROWS:	898889
    [L2]1373322793935	  TOTAL Loaded ROWS:	595202
    Loading is ended.		
    Elapsed Time : 431636 
    ADD BATCH : 0 
    EXECUTE BATCH : 0
    [VERIFICATION] Source Info : dbtech.lineitem: 3004998 Rows, Target Info :
    dbtech.lineitem : 3004998 Rows [OK]
    
    # dbtech.lineitem 테이블의 조건 l_linestatus='F' migrator 수행 로그 확인
    $ cat migrator_b_set.log
    === Parameters === 
        PROPERTY_FILE=migrator.properties
    SOURCE_TYPE=ORACLE
    SOURCE_URL=jdbc:oracle:thin:@localhost:1521:ORCL 
    SOURCE_USER=dbtech
    SOURCE_PASSWORD=************ 
    SOURCE_LOGIN_AS=NORMAL
    SOURCE_SCHEMA=dbtech 
    SOURCE_TABLE=lineitem 
    TARGET_TYPE=DEFAULT
    TARGET_URL=jdbc:tibero:thin:@localhost:8629:tibero 
    TARGET_USER=dbtech
    TARGET_PASSWORD=************ 
    SELECT_CONDITION=l_linestatus='O' 
    SELECT_FETCH_SIZE=1024 
    SELECT_AS_BYTE=N 
    INSERT_METHOD=DPL
    INSERT_BATCH=Y 
    INSERT_PARALLEL=Y 
    INSERT_THREAD_COUNT=4
    
    ==================
    
    [E0]1373322363042	- STARTED
    [L0]1373322363168	Loader started
    [L1]1373322363172	Loader started
    [L2]1373322363176	Loader started
    [L3]1373322363215	Loader started
    [L1]	1000
    [L0]	1000
    [L3]	1000
    [L2]	1000
    ...(중략)		
    [E0]1373322795287     - TOTAL Extracted ROWS:   2996217
    [L1]1373322795290	TOTAL Loaded ROWS:	767331
    [L3]1373322795303	TOTAL Loaded ROWS:	759888
    [L2]1373322795312	TOTAL Loaded ROWS:	739667
    [L0]1373322795314       TOTAL Loaded ROWS:	729331
    Loading is ended.	
    Elapsed Time : 432951 
    ADD BATCH : 0 
    EXECUTE BATCH : 0
    [VERIFICATION] Source Info : dbtech.lineitem: 2996217 Rows, Target Info :
    dbtech.lineitem : 2996217 Rows [OK]
    -- nologging 테이블 확인
    select logging from user_tables where table_name = 'LINEITEM';
    
    -- DB Link를 통해 ITAS 수행 (appned)
    insert /*+ append */ into dbtech.lineitem b
    select * from lineitem@olink where l_linestatus='O';
    -- dml 병렬 파라미터 활성화
    alter session enable parallel dml;
    
    -- DB Link를 통해 ITAS 수행 (parallel)
    insert /*+ parallel(b 4) */ into dbtech.lineitem b 
    select * from lineitem@olink where l_linestatus='O';
    -- 세션1과 세션2에서 입력한 최종 데이터
    SQL> select l_linestatus, count(*) from dbtech.lineitem@olink group by l_linestatus;
    
    
    L_LINESTATUS COUNT(*)
    ------------ --------
    F            2996217
    O            3004998
    
    2 rows selected
    SQL> set timing on
    SQL> alter session enable parallel dml;
    
    Session altered.
    
    Total elapsed time 00:00:00.005235
    
    SQL> insert /*+ append parallel(b 4) */ into dbtech.lineitem b 
    select * from lineitem@olink where l_linestatus='O';
    
    3004998 rows inserted.
    
    Total elapsed time 00:07:07.806974
    
    SQL> commit;
    
    Commit completed.
    
    Total elapsed time 00:00:00.000307
    SQL> set timing on
    SQL> alter session enable parallel dml;
    
    Session altered.
    
    Total elapsed time 00:00:00.005235
    
    SQL> insert /*+ append parallel(b 4) */ into dbtech.lineitem b 
    select * from lineitem@olink where l_linestatus='F';
    
    2996217 rows inserted.
    
    Total elapsed time 00:07:01.692934
    
    SQL> commit;
    
    Commit completed.
    
    Total elapsed time 00:00:00.000307
    SQL> select count(*) from dbtech.lineitem;
    
    COUNT(*)
    -----------
    6001215
    
    1 row selected.
    # SAM 파일을 특정 기준으로 N개로 파일을 나눈다.
    # 나눈 파일 마다 tbLoader Control 파일을 만들어준다.
    
    # aa 컨트롤 파일
    $ cat lineitem.ctl.aa 
    load data
    infile 'lineitem.tbl.aa' 
    logfile 'lineitem.tbl.aa.log' 
    badfile 'lineitem.tbl.aa.bad' 
    append
    into table lineitem 
    fields terminated by '|' 
    (L_ORDERKEY,
    L_PARTKEY, 
    L_SUPPKEY, 
    L_LINENUMBER, 
    L_QUANTITY, 
    L_EXTENDEDPRICE, 
    L_DISCOUNT, 
    L_TAX,
    L_RETURNFLAG, 
    L_LINESTATUS, 
    L_SHIPDATE, 
    L_COMMITDATE, 
    L_RECEIPTDATE, 
    L_SHIPINSTRUCT, 
    L_SHIPMODE, 
    L_COMMENT)
    
    # ab 컨트롤 파일
    $ cat lineitem.ctl.ab 
    load data
    infile 'lineitem.tbl.ab' 
    logfile 'lineitem.tbl.ab.log' 
    badfile 'lineitem.tbl.ab.bad' 
    append
    into table lineitem 
    fields terminated by '|' 
    (L_ORDERKEY,
    L_PARTKEY, 
    L_SUPPKEY, 
    L_LINENUMBER, 
    L_QUANTITY, 
    L_EXTENDEDPRICE, 
    L_DISCOUNT, 
    L_TAX, 
    L_RETURNFLAG, 
    L_LINESTATUS, 
    L_SHIPDATE, 
    L_COMMITDATE, 
    L_RECEIPTDATE, 
    L_SHIPINSTRUCT, 
    L_SHIPMODE, 
    L_COMMENT)
    $ cat run.sh
    # aa 파일 tbLoader 명령
    nohup tbloader userid=dbtech/dbtech@tibero control=lineitem.ctl.aa 
    direct=y dpl_parallel=y &
    
    # ab 파일 tbLoader 명령
    nohup tbloader userid=dbtech/dbtech@tibero control=lineitem.ctl.ab 
    direct=y dpl_parallel=y &
    -- lineitem.tbl.aa.log:
    
    
    tbLoader 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Data File : lineitem.tbl.aa
    Bad File : lineitem.tbl.aa.bad Discard File : lineitem.tbl.aa.dsc
    
    Table 'LINEITEM' was loaded from the data file.
    
    COLUMN_NAME		POSITION	DATATYPE
    ---------------------  -----------      -----------------
    L_ORDERKEY			1	CHARACTER
    L_PARTKEY			2	CHARACTER
    L_SUPPKEY			3	CHARACTER
    L_LINENUMBER			4	CHARACTER
    L_QUANTITY			5	CHARACTER
    L_EXTENDEDPRICE			6	CHARACTER
    L_DISCOUNT			7	CHARACTER
    L_TAX			        8	CHARACTER
    L_RETURNFLAG			9	CHARACTER
    L_LINESTATUS			10	CHARACTER
    L_SHIPDATE			11	DATE
    L_COMMITDATE			12	DATE
    L_RECEIPTDATE			13	DATE
    L_SHIPINSTRUCT			14	CHARACTER
    L_SHIPMODE			15	CHARACTER
    L_COMMENT			16	CHARACTER
    
    Table LINEITEM :					
    ------------------
          0        Rows were skipped.
    3000608        Rows were requested to load. 
    3000608        Rows were loaded successfully.
          0        Rows were failed to load because of some errors
          0        Rows were discarded.
    
    0 Rows were failed to load because of some errors
    
    Elapsed time was: 00:00:33.670898
    -- lineitem.tbl.ab.log:
    
    tbLoader 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Data File : lineitem.tbl.ab 
    Bad File : lineitem.tbl.ab.bad
    Discard File : lineitem.tbl.ab.dsc
    
    Table 'LINEITEM' was loaded from the data file.
    
    COLUMN_NAME			POSITION	DATATYPE
    -----------------------------  -----------     -----------
    L_ORDERKEY			1		CHARACTER
    L_PARTKEY			2		CHARACTER
    L_SUPPKEY			3		CHARACTER
    L_LINENUMBER			4		CHARACTER
    L_QUANTITY			5		CHARACTER
    L_EXTENDEDPRICE			6		CHARACTER
    L_DISCOUNT			7		CHARACTER
    L_TAX			        8		CHARACTER
    L_RETURNFLAG			9		CHARACTER
    L_LINESTATUS			10		CHARACTER
    L_SHIPDATE			11		DATE
    L_COMMITDATE			12		DATE
    L_RECEIPTDATE			13		DATE
    L_SHIPINSTRUCT			14		CHARACTER
    L_SHIPMODE			15		CHARACTER
    L_COMMENT			16		CHARACTER
    
    Table LINEITEM :					
    ------------------
    
          0 Rows were skipped.
    3000607 Rows were requested to load. 
    3000607 Rows were loaded successfully.
          0 Rows were failed to load because of some errors
          0 Rows were discarded.
    
    0 Rows were failed to load because of some errors
    
    Total Elapsed Time: 00:00:33.795058

    패치

    Unix, Windows 등 환경별 DB 패치 방법을 설명합니다.

    문서 다운로드

    2MB
    Tibero_7_패치 가이드.pdf
    PDF
    Open

    UNIX(SINGLE) 패치

    본 장에서는 Tibero UNIX(SINGLE) 패치 방법을 설명합니다. UNIX(SINGLE) 패치 순서는 다음과 같습니다.

    1. 패치 전 점검사항

    2. UNIX(SINGLE) 패치 과정

    각 과정에 대한 상세한 설명은 해당 절의 내용을 참고합니다.

    본 절에서는 UNIX(SINGLE) 패치 전 점검할 사항에 대해서 설명합니다.

    • sys, syscat 패스워드 확인 패치할 때 두 개의 사용자 계정과 패스워드가 필요합니다. 패치 전 패스워드로 접속을 확인합니다.

    • Object Validation 확인 패치 후 기존 Valid Object들이 Invalid할 경우 조치를 취하기 위해서 패치 전 아래의 쿼리를 수행하여 정보를 저장합니다.

    - Check Count

    – Check Invalid Object List

    • Tablespace의 데이터 파일 위치 파악 데이터 파일 위치가 $TB_HOME 내부 디렉터리에 존재하는지 확인합니다.

    • DB Link 사용 여부 확인 $TB_HOME/client/config/tbdsn.tbr을 확인합니다.

    – Tibero To Oracle DB Link(ps -ef | grep gw4orcl)

    – Tibero To DB2 DB Link(ps -ef | grep gw4db2)

    – Tibero To MS-SQL DB Link(ps -ef | grep tbgw)

    – Tibero To Sybase DB Link(ps -ef | grep tbgw)

    – Tibero To GREENPLUM DB Link(ps -ef | grep tbgw)

    – Tibero To MySQL DB Link(ps -ef | grep tbgw)

    • External Procedure 사용 여부 확인 $TB_HOME 내부에 class 또는 so 파일이 존재하는지 확인 후 복사합니다.

    – C External Procedure

    – JAVA External Procedure

    • ESQL/C, ESQL/COBOL 사용 여부 확인 담당자를 통해서 사용 여부를 확인합니다.

    • Tibero 버전 확인 tbboot -v 명령어를 실행하여 현재 설치된 Tibero 버전을 확인합니다.

    UNIX(SINGLE) 패치 과정의 순서는 다음과 같습니다.

    1. Tibero 서비스 중지 애플리케이션이 DB에 연결되어 있다면 애플리케이션을 다운 후에 Tibero 서비스를 중지합니다.

    1. Tibero 바이너리 교체

      1) 기존 Tibero가 설치된 폴더가 tibero7일 때 기존 Tibero 서버 바이너리를 “tibero7빌드버전 일자”로 바꿔 줍니다.

    다음은 사용 예입니다.

    2) 데이터 파일이 TB_HOME 디렉터리 내부에 존재할 경우 $TB_HOME 내부의 동일경로에 mv또는 copy 명령어를 수행합니다. 만약, 외부에 존재할 경우 백업 여부는 선택적으로 진행합니다.

    3) DB Link를 사용 중일 경우 Gateway에 대하여 바이너리 패치가 필요할 수 있습니다. DB Link용 Gateway를 패치할 때는 기존 바이너Backup 이후에 수행합니다. 다음은 기존 Gateway를 패치한 곳으로 move하고 패치한 신규 바이너리와 적용에 문제가 없는지 체크하는 방법입니다.

    • Tibero to Oracle "$TB_HOME/client/bin/gw4orcl"를 교체하고 ldd gw4orcl을 실행하여 "not found"가 발생하지 않는지 확인합니다.

    • Tibero to MSSQL "$TB_HOME/client/bin/tbJavaGW.zip"을 교체합니다.

    4) External Procedure를 사용 중일 경우

    • C External Procedure so 파일이 $TB_HOME 내부에 존재할 경우 패치한 바이너리로 복사합니다.

    • JAVA External Procedure class 또는 jar 파일이 $TB_HOME 내부에 존재할 경우 패치한 바이너리로 복사합니다. 아래와 같은 파일들의 설정 내용 파악 후 필요한 내용을 복사합니다.

    Backup 받은 디렉터리 기준으로 변경사항을 다음과 같이 O/S 명령어로 비교하여 변경사항이 있을 경우에만 원본 설정 파일을 Overwrite 합니다.

    다음은 변경사항이 있을 경우 원본 설정 파일을 Overwrite 하는 예입니다.

    5) ESQL/C, ESQL/COBOL을 사용할 경우

    • ESQL/C $TB_HOME/client/config/tbpc.cfg 파일의 설정 내용 파악 후 필요한 내용을 복사합니다.

    • ESQL/COBOL $TB_HOME/client/config/tbpcb.cfg 파일의 설정 내용 파악 후 필요한 내용을 복사합니다.

    교체된 신규 바이너리에 tip, tbdsn.tbr, psm_commands 생성을 위해 환경설정을 수행합니다.

    • 환경설정 방법

    • 환경설정 예

    다음은 각 파일의 교체 방법 및 사용 예입니다.

    • 라이센스 파일 다음은 라이센스 파일 교체 방법입니다.

    다음은 사용 예입니다.

    • Tip(=Tibero Init Parameter) 파일 다음은 tip 파일 교체 방법입니다.

    다음은 사용 예입니다.

    • tbdsn.tbr 파일 다음은 tbdsn.tbr 파일 교체 방법입니다.

    다음은 사용 예입니다.

    • cfg 파일 다음은 cfg 파일 교체 방법입니다.

    다음은 사용 예입니다.

    1. Tibero 서비스 시작

    다음과 같이 tbboot 명령어를 사용하여 Tibero 서비스를 시작합니다.

    1. system 패키지 실행 및 확인

    • 실행 sys, syscat 의 패스워드를 입력하여 Tibero 내부에서 사용하는 DD(Data Dictionary)와 system 패키지를 생성합니다.

    sys, syscat의 패스워드 확인 방법은 “1.1 패치 전 점검사항”의 “sys, syscat 패스워드 확인”을 참고합니다.

    • 확인 “$TB_HOME/instance/$TB_SID/log/system_init.log”를 확인했을 때 아래와 같이 에러 코드(”TBR- 17001”,”TBR-70004”)가 나타난다면 system 패키지 실행이 정상적으로 이뤄지지 않은 것입니다.

    1. alter system recompile all; 실행 모든 PSM recompile 동작을 수행하며 PSM compile할 때 BCODE를 생성하여 Data Dictionary에 저장하는 구조입니다. 패치가 되면서 생성되는 BCODE가 변경됐을 가능성 때문에 수행합니다.

    1. revalidate_viewsyn.sql 수행 sys 계정이 아닌 DBA 권한을 가진 계정에서 해당 스크립트를 수행합니다. Tibero에서는 현재 view/synonym의 compile ddl을 지원하지 않으며, 패치 후 해당 object의 validation을 실 시하기 위해 해당 스크립트를 수행합니다.

    • Invalid Object 확인 패치 전 Object Validation 결과와 비교하여 처리합니다. 다음은 dba_objects 테이블에 등록된 Object들의 상태가 Invalid된 항목을 조회하는 방법입니다.

    – PSM

    Procedure, Function Invalid일 경우 다음과 같이 처리한다. (해당 사용자가 수행)

    – INDEX

    FBI(Function Based Index)의 경우 패치할 때 Invalid 가능성이 있으므로 다음과 같이 처리합니다. (해당 사용자 가 수행)

    • 애플리케이션 Driver 패치 JDBC, ODBC, OLE DB 등 Driver가 변경 가능하다면 Tibero 서버 패치 버전에 맞춥니다. JDBC, ODBC, OLE DB는 서버 바이너리에 포함되어 있으며 다음과 같은 경로에 위치해 있습니다. – Tibero 7 버전

    다음은 Tibero 패치 작업이 실패했을 경우 기존 바이너리로 복원하는 과정입니다.

    1. Tibero 서비스 정지

    2. Tibero 과거 버전으로 바이너리 교체

    3. 기존 데이터 파일 경로 확인

    4. Tibero 서비스 시작

    본 장에서는 Tibero Windows(SINGLE) 패치 방법을 설명합니다. Windows(SINGLE) 패치 순서는 다음과 같습니다.

    각 과정에 대한 상세한 설명은 해당 절의 내용을 참고합니다.

    Windows(SINGLE) 패치 전 점검할 사항에 대한 자세한 설명은 UNIX(SINGLE) 패치의 “”을 참고합니다.

    Windows(SINGLE) 패치 과정의 순서는 다음과 같습니다.

    Windows(SINGLE) 패치 후 점검할 사항에 대한 자세한 설명은 UNIX(SINGLE) 패치의 “”을 참고합니다.

    본 장에서는 Tibero UNIX(TAC) 패치 방법을 설명합니다. UNIX(TAC) 패치 순서는 다음과 같습니다.

    각 과정에 대한 상세한 설명은 해당 절의 내용을 참고합니다.

    UNIX(TAC) 패치 전 점검할 사항에 대한 자세한 설명은 UNIX(SINGLE) 패치의 “”을 참고한다.

    본 절에서는 기본적으로 Node 2대에 대한 패치 방법을 설명하며 Node 3대 이상도 패치 방법은 동일합니다. UNIX(TAC) 패치 과정의 순서는 다음과 같습니다.

    1. Tibero 서비스 중지 애플리케이션이 DB에 연결되어 있다면 애플리케이션을 다운 후에 Tibero 서비스를 중지합니다.

    • Node1 다운

    • Node2 다운

    1. Tibero 바이너리 교체 Tibero 7 FS02 build 257078에서 tibero7 FS02 build 257446로 패치하는 과정입니다.

    • Node1 바이너리 교체

    • Node2 바이너리 교체

    1. 환경설정 수행 교체된 신규 바이너리에 tip, tbdsn.tbr, psm_commands 생성을 위해 환경설정을 수행합니다.

    • Node1 환경설정

    • Node2 환경설정

    1. 라이센스, tip, tbdsn.tbr, cfg 파일 교체 기존 파일들을 패치된 신규 바이너리에 복사합니다.

    • 라이센스 파일

    – Node1 라이선스 파일 복사

    – Node2 라이선스 파일 복사

    • Tip(=Tibero Init Parameter) 파일

    – Node1 Tip 파일 복사

    – Node2 Tip 파일 복사

    • tbdsn.tbr 파일

    – Node1 tbdsn.tbr 파일 복사

    – Node2 tbdsn.tbr 파일 복사

    • cfg 파일

    – Node1 cfg 파일 복사

    – Node2 cfg 파일 복사

    1. Tibero 서비스 시작

    – Node1 Tibero 기동

    – Node2 Tibero 기동

    1. system 패키지 실행 및 확인 UNIX(TAC) 패치의 경우 한쪽의 Node에서만 실행 및 확인을 합니다.

    • 실행 sys, syscat의 패스워드를 입력하여 Tibero 내부에서 사용하는 DD(Data Dictionary)와 system 패키지를 생성합니다.

    sys, syscat의 패스워드 확인 방법은 “1.1. 패치 전 점검사항”의 “sys, syscat 패스워드 확인”을 참고합니다.

    • 확인 “$TB_HOME/instance/$TB_SID/log/system_init_log”을 확인했을 때 아래와 같이 에러 코드(”TBR- 17001”, “TBR-70004”)가 나타난다면 system. 패키지 실행이 정상적으로 이뤄지지 않은 것입니다.

    1. alter system recompile all; 실행 모든 PSM recompile 동작을 수행하며 PSM compile할 때 BCODE를 생성하며 Data Dictionary에 저장하는 구조입니다. 패치가 되면서 생성되는 BCODE가 변경됐을 가능성 때문에 수행을 합니다. UNIX(TAC) 패치의 경우 한쪽의 Node 에서만 실행을 합니다.

    1. revalidate_viewnsyn.sql 수행 sys 계정이 아닌 계정에서 해당 스크립트를 수행합니다.

    UNIX(TAC) 패치 후 점검할 사항에 대한 자세한 설명은 UNIX(SINGLE) 패치의 “”을 참고합니다.

    본 장에서는 Tibero Active-Standby 패치 방법을 설명한다. Active-Standby 패치 순서는 다음과 같습니다.

    각 과정에 대한 상세한 설명은 해당 절의 내용을 참고합니다.

    Active-Standby 패치 전에 HA Cluster를 중지하고 패치할 때 Cluster 엔지니어를 필요로 합니다. 패치 전 점검할 사항 에 대한 자세한 설명은 UNIX(SINGLE) 패치의 “”을 참고합니다.

    Active 서버는 “”과 동일하므로 본 절에서는 Standby 서버의 패치 과정만 설명합니다. Standby 서버의 패치 과정의 순서는 다음과 같습니니다.

    1. Tibero Standby 서버 바이너리 교체 1) 기존 Tibero가 설치된 폴더가 tibero7일 때, 기존 Tibero 서버 바이너리를 “tibero7빌드버전일자”로 바꿔줍니다.

    다음은 사용 예입니다.

    2) 데이터 파일이 TB_HOME 디렉터리 내부에 존재할 경우

    $TB_HOME 내부의 동일경로에 mv 또는 copy 명령어를 수행합니다. 만약, 외부에 존재할 경우 백업 여부 는 선택적으로 합니다.

    3) DB Link를 사용 중일 경우

    Gateway에 대하여 바이너리 패치가 필요할 수 있습니다. DB Link용 Gateway를 패치할 때는 기존 바이너리Backup 이후에 수행합니다.

    다음은 기존 Gateway를 패치한 곳으로 move하고 패치한 신규 바이너리와 적용에 문제가 없는지 체크하는 방법입니다.

    • Tibero to Oracle “$TB_HOME/client/bin/gw4orcl”를 교체하고 ldd gw4orcl을 실행하여 “not found”가 발생하지 않는지 확인합니다.

    • Tibero to MSSQL “$TB_HOME/client/bin/tbgateway.zip”을 교체합니다.

    4) External Procedure를 사용 중일 경우

    • C External Procedure so 파일이 $TB_HOME 내부에 존재할 경우 패치한 바이너리로 복사합니다.

    • JAVA External Procedure class 또는 jar 파일이 $TB_HOME 내부에 존재할 경우 패치한 바이너리로 복사합니다. 아래와 같은 파일들의 설정 내용 파악 후 필요한 내용을 복사합니다.

    Backup 받은 디렉터리 기준으로 변경사항을 다음과 같이 OS 명령어로 비교하며 변경사항이 있을 경우에만 원본 설정 파일을 Overwrite 합니다.

    다음은 변경사항이 있을 경우 원본 설정 파일을 Overwrite 하는 예입니다.

    5) ESQL/C, ESQL/COBOL을 사용할 경우

    • ESQL/C $TB_HOME/client/config/tbpc.cfg 파일의 설정 내용 파악 후 필요한 내용을 복사합니다.

    • ESQL/COBOL $TB_HOME/client/config/tbpcb.cfg 파일의 설정 내용 파악 후 필요한 내용을 복사합니다.

    1. 환경설정 수행

    교체된 신규 바이너리에 tip, tbdsn,tbr, psm_commands 생성을 위해 환경설정을 수행합니다.

    다음은 환경설정 수행 예입니다.

    1. 라이센스, tip, tbdsn.tbr, cfg 파일 교체

    다음은 각 파일의 교체 방법 및 사용 예입니다.

    • 라이센스 파일 다음은 라이센스 파일 교체 방법입니다.

    다음은 사용 예입니다.

    • Tip(=Tibero Init Parameter) 파일

    다음은 tip 파일 교체 방법입니다.

    다음은 사용 예입니다.

    • tbdsn.tbr 파일

    다음은 tbdsn.tbr 파일 교체 방법입니다.

    다음은 사용 예입니다.

    • cfg 파일

    다음은 cfg 파일 교체 방법입니다.

    다음은 사용 예입니다.

    Active-Standby 패치 후 점검할 사항에 대한 자세한 설명은 UNIX(SINGLE) 패치의 “”을 참고합니다.

    본 장에서는 Tibero 패치 과정을 요약하여 설명합니다.

    다음은 Single과 TAC의 패치 과정 순서입니다.

    1. 바이너리 준비

    패치 바이너리를 패치 대상 서버에 FTP를 이용하여 옮깁니다.

    1. INVALID Object 확인

    1. Tibero 종료

    TAC의 경우 모든 노드를 tbdown 한 후에 tbcm을 종료합니다.

    1. Tibero 바이너리 백업

    기존 Tibero 7 Backup 이름을 tibero7*<패치일자>*로 바꿔줍니다.

    1. 패치 바이너리 설치

    1. 환경설정 및 복원

    • 설정

    • 복원

    1. Tibero 시작

    TAC의 경우 모든 노드의 tbcm을 기동 후 tbboot합니다.

    1. Dictionary 갱신

    1. Object 재컴파일

    1. INVALID SYNONYM 스크립트 수행

    sys 계정이 아닌 계정에서 해당 스크립트를 수행합니다.

    1. 패치 후 INVALID Object확인

    1. Object 컴파일

    1. Driver 갱신

    필요한 경우 애플리케이션에서 사용하는 JDBC Driver나 ODBC DLL 파일을 신규 Driver로 갱신합니다.

    system.sh 실행

  • alter system recompile all; 실행

  • revalidate_viewnsyn.sql 수행

  • 패치 후 점검

  • 구분

    경로

    JDBC

    $TB_HOME/client/lib/jar/tibero7-jdbc.jar

    ODBC, OLE DB

    $TB_HOME/client/lib/libtbodbc.so

    패치 전 점검사항

    주의

    $TB_HOME 내부 디렉터리에 위치한다면 바이너리를 교체할 때 해당 데이터 파일도 같이 copy 또는move합니다.

    참고

    JAVA의 class 위치는 tip 파일 내의 JAVA_CLASS_PATH로 확인합니다.

    UNIX(SINGLE) 패치 과정

    3. 환경설정 수행

    4. 라이센스, tip, tbdsn.tbr, cfg 파일 교체

    패치 후 점검사항

    패치 복원

    Windows(SINGLE) 패치

    패치 전 점검사항

    Windows(SINGLE) 패치 과정

    패치 후 점검사항

    UNIX(TAC) 패치

    패치 전 점검사항

    UNIX(TAC) 패치 과정

    패치 후 점검사항

    Active-Standby 패치

    패치 전 점검사항

    Active-Standby 패치 과정

    패치 후 점검사항

    Appendix A. 패치 과정 요약

    Single & TAC 패치

    패치 후 점검사항
    패치 전 점검사항
    Windows(SINGLE) 패치 과정
    패치 후 점검사항
    패치 전 점검사항
    패치 후 점검사항
    패치 전 점검사항
    UNIX(TAC) 패치 과정
    패치 후 점검사항
    패치 전 점검사항
    패치 후 점검사항
    패치 전 점검사항
    Active-Standby 패치 과정
    패치 후 점검사항
    패치 전 점검사항
    UNIX(SINGLE) 패치 과정
    패치 전 점검사항
    SQL> conn sys 
    Enter Password:
    Connected to Tibero.
    
    SQL> conn syscat 
    Enter Password: 
    Connected to Tibero.
    SQL> COL owner FORMAT a20 
    SQL> SET PAGES 500
    
    SQL> SELECT owner, object_type, status, count(*) 
    FROM dba_objects
    GROUP BY owner, object_type, status 
    ORDER BY owner, object_type, status;
    SQL> SET LINESIZE 120
    SQL> COL object_name FORMAT A30 
    SQL> COL owner FORMAT a20
    
    SQL> SELECT owner, object_name, object_type, status 
    FROM dba_objects
    WHERE status='INVALID';
    SQL> SET LINESIZE 120
    SQL> COL file_name FORMAT A100
    
    SQL> SELECT file_name FROM dba_data_files;
    ora_link_remote=(
                    (GATEWAY=(LISTENER=(HOST=12.34.56.78)
                                       (PORT=9999))
                             (TARGET=orcl) 
                             (TX_MODE=GLOBAL))
    )
    db2_link_remote=(
                    (GATEWAY=(LISTENER=(HOST=12.34.56.78)
                             (PORT=9999))
                    (TARGET=sample) 
                    (TX_MODE=GLOBAL))
    )
    mssql_link_remote=(
                      (GATEWAY=(LISTENER=(HOST=12.34.56.78)
                                         (PORT=9093)) 
                               (TARGET=12.34.56.87:1433:master) 
                               (TX_MODE=LOCAL))
    )
    ase_link_remote=(
    (GATEWAY=(LISTENER=(HOST=12.34.56.78)
    (PORT=9093)) (TARGET=12.34.56.87:5000:master) (TX_MODE=LOCAL))
    )
    gp_link_remote=(
                    (GATEWAY=(LISTENER=(HOST=12.34.56.78)
                                       (PORT=9093)) 
                             (TARGET=12.34.56.87:5432:mydb) 
                             (TX_MODE=LOCAL))
    )
    mysql_link_remote=(
                      (GATEWAY=(LISTENER=(HOST=12.34.56.78)
                                         (PORT=9093)) 
                               (TARGET=12.34.56.87:3306:mydb) 
                               (TX_MODE=LOCAL))
    )
    SQL> SET LINESIZE 120 
    SQL> COL owner FORMAT a10
    SQL> COL library_name FORMAT a30
    SQL> COL file_spec FORMAT a50 
    SQL> COL status FORMAT a10
    
    SQL> SELECT owner, library_name, file_spec, status 
    FROM DBA_LIBRARIES;
    SQL> SET LINESIZE 120 
    SQL> COL owner FORMAT a10 
    SQL> COL name FORMAT a30
    SQL> COL source FORMAT a50
    
    SQL> SELECT owner, name, source 
    FROM DBA_JAVA_CLASSES;
    [os_user$]tbdown immediate 
    [os_user$]ps -ef | grep tbsvr
    [os_user$]mv tibero7 tibero7*_<version>_<date>* 
    [os_user$]gunzip -v new_tibero_binary.tar.gz 
    [os_user$]tar -xvf new_tibero_binary.tar
    [tbtest@db1 ~]$ tbdown immediate
    
    Tibero instance terminated (IMMEDIATE mode).
    
    [tbtest@db1 ~]$ tbboot -v
    
    Tibero 7 (DB 7.0 FS02) Build 260633
    Linux bistro-build-centos_7 5.15.0-71-generic #78~20.04.1-Ubuntu SMP Wed Apr 19 
    11:26:48 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux version (little-endian)
    ...
    Compiled at Jun 1 2023 15:38:28 build seq 260633 init rev {2022-03-10}
    
    [tbtest@db1 ~]$ date
    2023. 06. 21. (수) 16:52:41 KST
    
    [tbtest@db1 ~]$ mv tibero7 tibero7_260633_20230621
    [tbtest@db1 ~]$ gunzip tibero7-bin-FS02-linux64_3.10-260359-20230518173125.tar.gz 
    [tbtest@db1 ~]$ tar -xvf tibero7-bin-FS02-linux64_3.10-260359-20230518173125.tar 
    tibero7/bin/svr_rename.sh
    tibero7/bin/alterdd.sh 
    tibero7/bin/tb_create_db.sh 
    tibero7/bin/tbiv 
    tibero7/bin/sm_sysmon_disk_state.sh 
    tibero7/bin/tbprof 
    tibero7/bin/tbinfo 
    tibero7/bin/tbboot 
    tibero7/bin/tbctl 
    tibero7/bin/tbcmobs
    ...
    [os_user$]cd ~/tibero7*_<version>_<date>* 
    [os_user$]mv database $TB_HOME
    $TB_HOME/client/epa/java/config/epa.cfg
    $TB_HOME/client/epa/java/config/epalog.properties
    $TB_HOME/client/bin/tbjavaepa
    export BACKUP_TB_HOME=~/tibero7_<version>_<date> 
    diff $TB_HOME/client/epa/java/config/epa.cfg
            $BACKUP_TB_HOME/client/epa/java/config/epa.cfg
    cp -p $BACKUP_TB_HOME/client/epa/java/config/epa.cfg
    $TB_HOME/client/epa/java/config/epa.cfg
    [os_user$]cd $TB_HOME/config 
    [os_user$]sh gen_tip.sh
    [tbtest@db1 ~]$ cd tibero7/config 
    [tbtest@db1 config]$ sh gen_tip.sh 
    Using TB_SID "tibero"
    /home/tbtest/tibero7/config/tibero.tip generated
    /home/tbtest/tibero7/config/psm_commands generated
    /home/tbtest/tibero7/client/config/tbdsn.tbr generated. 
    Running client/config/gen_esql_cfg.sh
    Done.
    [os_user$]cd ~/tibero7*_<version>_<date>* 
    [os_user$]cp -rp license $TB_HOME
    [os_user$]cd ~/tibero7_260633_20230621/config 
    [os_user$]cp -rp license $TB_HOME
    [os_user$]cd ~/tibero7_*<version>_<date>*/config 
    [os_user$]cp -p $TB_SID.tip $TB_HOME/config
    [os_user$]cd ~/tibero7_260633_20230621/config 
    [os_user$]cp -p $TB_SID.tip $TB_HOME/config
    [os_user$]cd ~/tibero7_*<version>_<date>*/client/config 
    [os_user$]cp -p tbdsn.tbr $TB_HOME/client/config
    [os_user$]cd ~/tibero7_260633_20230621/client/config 
    [os_user$]cp -p tbdsn.tbr $TB_HOME/client/config
    [os_user$]cd ~/tibero7_*<version>_<date>*/client/config 
    [os_user$]cp -p *.cfg $TB_HOME/client/config
    [os_user$]cd ~/tibero7_260633_20230621/client/config 
    [os_user$]cp *.cfg $TB_HOME/client/config
    [os_user$]tbboot
    [os_user$]cd $TB_HOME/scripts 
    [os_user$]sh system.sh
    Enter SYS password: tibero
    Enter SYSCAT password: syscat
    Create default system users & roles?(Y/N): N 
    Create system tables related to profile?(Y/N): N 
    Create TPR tables?(Y/N): N
    Register dbms_stats job to Job Scheduler?(Y/N): N
    [os_user$]cd $TB_HOME/instance/$TB_SID/log/ 
    [os_user$]cat system_init.log | **"TBR-17001"** 
    [os_user$]cat system_init.log | **"TBR-70004"**
    [os_user$]$ tbsql sys
    
    tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Enter Password: 
    Connected to Tibero.
    
    SQL> alter system recompile all;
    [os_user$]cd $TB_HOME/scripts 
    [os_user$]tbsql dbtech/dbtech
    
    tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> @revalidate_viewnsyn.sql
    
    PSM completed.
    SQL> SET LINESIZE 120
    SQL> COL object_name FORMAT A30 
    SQL> COL owner FORMAT a20
    
    SQL> SELECT owner, object_name, object_type, status 
    FROM dba_objects
    WHERE status='INVALID';
    SQL> alter function *<function_name>* compile; 
    SQL> alter procedure *<procedure_name>* compile;
    SQL> alter index index_name rebuild;
    [Tibero_Node1]# tbdown immediate 
    [Tibero_Node1]# tbcm -d
    [Tibero_Node2]# tbdown immediate 
    [Tibero_Node2]# tbcm -d
    [Tibero_Node1]tbboot -v
    [Tibero_Node1]# cd ~
    [Tibero_Node1]# mv tibero7 tibero7_257078_20230717
    [Tibero_Node1]# gunzip tibero7-bin-FS02-linux64_3.10-257446-20230113162027.tar.gz 
    [Tibero_Node1]# tar -xvf tibero7-bin-FS02-linux64_3.10-257446-20230113162027.tar
    [Tibero_Node2]# cd ~
    [Tibero_Node2]# mv tibero7 tibero7_257078_20230717
    [Tibero_Node2]# gunzip tibero7-bin-FS02-linux64_3.10-257446-20230113162027.tar.gz 
    [Tibero_Node2]# tar -xvf tibero7-bin-FS02-linux64_3.10-257446-20230113162027.tar
    [Tibero_Node1]# cd $TB_HOME/config 
    [Tibero_Node1]# sh gen_tip.sh
    [Tibero_Node2]# cd $TB_HOME/config 
    [Tibero_Node2]# sh gen_tip.sh
    [Tibero_Node1]# cd ~/tibero7_*<version>_<date>* 
    [Tibero_Node1]# cp -rp license $TB_HOME
    [Tibero_Node2]# cd ~/tibero7_*<version>_<date>* 
    [Tibero_Node2]# cp -rp license $TB_HOME
    [Tibero_Node1]# cd ~/tibero7_*<version>_<date>*/config 
    [Tibero_Node1]# cp -p $TB_SID.tip $TB_HOME/config
    [Tibero_Node2]# cd ~/tibero7_*<version>_<date>*/config 
    [Tibero_Node2]# cp -p $TB_SID.tip $TB_HOME/config
    [Tibero_Node1]# cd ~/tibero7_*<version>_<date>*/client/config 
    [Tibero_Node1]# cp -p tbdsn.tbr $TB_HOME/client/config
    [Tibero_Node2]# cd ~/tibero7_*<version>_<date>*/client/config 
    [Tibero_Node2]# cp -p tbdsn.tbr $TB_HOME/client/config
    [Tibero_Node1]# cd ~/tibero7*_<version>_<date>*/client/config 
    [Tibero_Node1]# cp -p *.cfg $TB_HOME/client/config
    [Tibero_Node2]# cd ~/tibero7*_<version>_<date>*/client/config 
    [Tibero_Node2]# cp -p *.cfg $TB_HOME/client/config
    [Tibero_Node1]# tbcm -b 
    [Tibero_Node1]# tbboot
    [Tibero_Node2]# tbcm -b 
    [Tibero_Node2]# tbboot
    [Tibero_Node1]# cd $TB_HOME/scripts 
    [Tibero_Node1]# sh system.sh
    Enter SYS password: tibero 
    Enter SYSCAT password: syscat
    Create default system users & roles?(Y/N): N 
    Create system tables related to profile?(Y/N): N 
    Create TPR tables?(Y/N): N
    Register dbms_stats job to Job Scheduler?(Y/N): N
    [Tibero_Node1]# cd $TB_HOME/instance/$TB_SID/log/ 
    [Tibero_Node1]# cat system_init.log | grep **"TBR-17001"** 
    [Tibero_Node1]# cat system_init.log | grep **"TBR-70004"**
    [Tibero_Node1]# tbsql sys
    
    tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Enter Password: 
    Connected to Tibero.
    
    SQL> alter system recompile all;
    [Tibero_Node1]# cd $TB_HOME/scripts 
    [Tibero_Node1]# tbsql dbtech/dbtech
    
    tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> @revalidate_viewnsyn.sql
    
    PSM completed.
    [os_user$]mv tibero7 tibero7_*<version>_<date>* 
    [os_user$]gunzip -v new_tibero_binary.tar.gz 
    [os_user$]tar -xvf new_tibero_binary.tar
    [tbtest@db1 ~]$ tbdown immediate
    
    Tibero instance terminated (IMMEDIATE mode).
    
    [tbtest@db1 ~]$ tbboot -v
    
    Tibero 7 (DB 7.0 FS02) Build 260633
    Linux bistro-build-centos_7 5.15.0-71-generic #78~20.04.1-Ubuntu SMP Wed Apr 19 
    11:26:48 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux version (little-endian)
    ...
    Compiled at Jun 1 2023 15:38:28 build seq 260633 init rev {2022-03-10}
    
    [tbtest@db1 ~]$ date
    2023. 06. 21. (수) 16:52:41 KST
    
    [tbtest@db1 ~]$ mv tibero7 tibero7_260633_20230621
    [tbtest@db1 ~]$ gunzip tibero7-bin-FS02-linux64_3.10-260359-20230518173125.tar.gz 
    [tbtest@db1 ~]$ tar -xvf tibero7-bin-FS02-linux64_3.10-260359-20230518173125.tar 
    tibero7/bin/svr_rename.sh
    tibero7/bin/alterdd.sh 
    tibero7/bin/tb_create_db.sh 
    tibero7/bin/tbiv 
    tibero7/bin/sm_sysmon_disk_state.sh 
    tibero7/bin/tbprof 
    tibero7/bin/tbinfo 
    tibero7/bin/tbboot 
    tibero7/bin/tbctl 
    tibero7/bin/tbcmobs
    ...
    [os_user$]cd ~/tibero7_*<version>_<date>* 
    [os_user$]mv database $TB_HOME
    $TB_HOME/client/epa/java/config/epa.cfg
    $TB_HOME/client/epa/java/config/epalog.properties
    $TB_HOME/client/bin/tbjavaepa
    export BACKUP_TB_HOME=~/tibero7_*<version>_<date>* 
    diff $TB_HOME/client/epa/java/config/epa.cfg
    $BACKUP_TB_HOME/client/epa/java/config/epa.cfg
    cp -p $BACKUP_TB_HOME/client/epa/java/config/epa.cfg
    $TB_HOME/client/epa/java/config/epa.cfg
    [os_user$]cd $TB_HOME/config 
    [os_user$]sh gen_tip.sh
    [tbtest@db1 ~]$ cd tibero7/config 
    [tbtest@db1 config]$ sh gen_tip.sh 
    Using TB_SID "tibero"
    /home/tbtest/tibero7/config/tibero.tip generated
    /home/tbtest/tibero7/config/psm_commands generated
    /home/tbtest/tibero7/client/config/tbdsn.tbr generated. 
    Running client/config/gen_esql_cfg.sh
    Done.
    [os_user$]cd ~/tibero7_*<version>_<date>* 
    [os_user$]cp -rp license $TB_HOME
    [os_user$]cd ~/tibero7_260633_20230621/config 
    [os_user$]cp -rp license $TB_HOME
    [os_user$]cd ~/tibero7_*<version>_<date>*/config 
    [os_user$]cp -p $TB_SID.tip $TB_HOME/config
    [os_user$]cd ~/tibero7_260633_20230621/config 
    [os_user$]cp -p $TB_SID.tip $TB_HOME/config
    [os_user$]cd ~/tibero7_*<version>_<date>*/client/config 
    [os_user$]cp -p tbdsn.tbr $TB_HOME/client/config
    [os_user$]cd ~/tibero7_260633_20230621/client/config 
    [os_user$]cp -p tbdsn.tbr $TB_HOME/client/config
    [os_user$]cd ~/tibero7*_<version>_<date>*/client/config 
    [os_user$]cp -p *.cfg $TB_HOME/client/config
    [os_user$]cd ~/tibero7_260633_20230621/client/config 
    [os_user$]cp *.cfg $TB_HOME/client/config
    SQL> SET LINESIZE 120
    SQL> COL object_name FORMAT A30 
    SQL> COL owner FORMAT a20
    
    SQL> SELECT owner, object_name, object_type, status 
    FROM dba_objects
    WHERE status='INVALID';
    $ tbdown immediate
    $ tbcm -d
    $ mv ~/tibero7 ~/tibero7_260633_20230621
    $ gunzip tibero7-bin-FS02-linux64_3.10-260359-20230518173125.tar.gz
    $ tar -xvf tibero7-bin-FS02-linux64_3.10-260359-20230518173125.tar
    $ cd $TB_HOME/config
    $ sh gen_tip.sh
    $ cp ~/tibero7_260633_20230621/config/$TB_SID.tip $TB_HOME/config
    $ cp ~/tibero7_260633_20230621/client/config/tbdsn.tbr $TB_HOME/client/config
    $ cp ~/tibero7_260633_20230621/client/config/*.cfg $TB_HOME/client/config
    $ cp -R ~/tibero7_260633_20230621/license $TB_HOME
    $ tbcm -b
    $ tbboot
    $ cd $TB_HOME/scripts
    $ ./system.sh
    $ tbsql sys
    SQL> alter system recompile all; 
    SQL> quit
    $ tbsql tibero
    SQL> @revalidate_viewnsyn.sql
    SQL> SET LINESIZE 120
    SQL> COL object_name FORMAT A30 
    SQL> COL owner FORMAT a20
    
    SQL> SELECT owner, object_name, object_type, status 
    FROM dba_objects
    WHERE status='INVALID';
    ALTER *<OBJECT_TYPE> <OWNER.OBJECT_NAME>* COMPILE;

    전환

    Oracle to Tibero DB 전환 절차 및 방법을 설명합니다.

    1. 사전 점검

    타사 DB에서Tibero DB로 전환하기 전 점검사항에 대해서 설명합니다.

    사전 점검은 전환하기 전 Oracle의 특성을 파악하고 Tibero에 적용해야 하는 값들을 확인하는 중요한 절차입니다.

    본 절에서 설명하는 SQL문(10g, 11g에서 수행 가능한 쿼리)은 Oracle 버전에 따라서 일부 달라질 수 있음을 유의합니다.

    1) 기본 항목

    Oracle의 sys 또는 system 등의 DBA 권한을 가진 사용자로 접속하여 아래 정보를 확인합니다.

    항목
    설명

    전환 Oracle 버전을 확인합니다.

    Oracle과 Tibero간 대응되는 문자 집합을 사용합니다.

    Oracle의 'sys' 또는 'system' 계정 등의 DBA 권한이 있는 사용자로 접속한 후 조회합니다.

    • 사용자 조회 아래는 전체 사용자 목록입니다.

    • Open된 사용자 조회 아래는 현재 Open 사용자를 조회하는 쿼리입니다.

    • Oracle 기본 사용자 아래와 같은 사용자 이름의 경우 Oracle을 설치할 때 자동으로 생성되는 사용자로 전환할 때 제외합니다. (Oracle 버전에 따라 사용자명이 일부 다를 수 있습니다.)

    User Name
    Description

    전환 대상 사용자에 속하는 Table, Index가 저장된 Tablespace만 확인합니다. 아래는 Tablespace 전체에 대하여 확인하는 예제입니다.

    • 전체 Tablespace 크기와 사용량 확인

    • 전체 합계

    전환 대상 사용자에 대해당하는 정보만 확인합니다.

    • Object 상태별 개수 확인

    • Object 개수 확인

    전환 완료 후 Oracle과 Object 개수를 비교할 때 검증용으로 사용합니다.

    • Constraint 개수 확인

    Oracle의 sys 또는 system 등의 DBA 권한을 가진 사용자로 접속하여 아래의 정보를 확인하고, Tibero 설치 과정 중 CREATE DATABASE를 수행할 경우 아래의 정보를 참고하여 DB를 생성합니다.

    아래는 DB 생성관련 항목에 대한 설명입니다.

    항목
    설명

    문자 집합 정보를 확인합니다.

    • Oracle

    • Tibero

    확인 결과 항목에 대한 설명은 아래와 같습니다.

    항목
    설명

    아래는 Oracle과 Tibero의 문자 집합 대응 정보입니다.

    Oracle
    Tibero

    • National 문자 집합

    Oracle
    Tibero

    초기 파라미터 정보를 확인합니다.

    아래는 Oracle에서 전환할 때 확인해야 할 초기 파라미터입니다.

    파라미터
    설명

    Tibero에서 Redo 로그를 생성할 경우 참고하며 파일 크기를 동일하거나 더 크게 생성해 줍니다.

    아래는 Redo를 확인하는 예입니다.

    Tibero에서 Undo와 Temp를 생성할 경우 참고하며 파일 크기를 동일하거나 더 크게 생성합니다.

    아래는 Undo Tablespace를 확인하는 예입니다.

    아래는 Temp Tablespace 확인 예입니다.

    아래는 Log 모드를 확인하는 예입니다.

    만약, ARCHIVE LOG 모드라면 전환 시간 단축을 위해 전환이 모두 완료된 후에 모드를 변경합니다.

    아래는 추가로 확인해야 할 Object에 대한 설명입니다.

    항목
    설명

    본 절에서는 실제 전환을 수행하는 방법에 대해서 설명합니다.

    아래는 전환을 수행하는 과정입니다.

    각 과정에 대한 상세한 설명은 해당 절의 내용을 참고합니다.

    전환할 때 Object를 생성하는 기본 순서는 아래와 같습니다.

    순 서
    Object
    내용

    Oracle의 생성문(=DDL)을 추출하기 위하여 T-UP DDL export 기능을 사용합니다.

    Tablespace, User, Table 생성문(=DDL)을 추출합니다.

    (1) T-UP > Migrator

    “Migrator” 를 선택합니다.

    (2) Source Database > Type Conversion

    ORACLE과 대응되는 데이터 타입을 선택합니다.

    (3) Schema Object

    • “Independent Objects” Tablespace, User를 선택합니다.

    • “Dependent Objects” Table을 선택합니다.

    • “Schema” Table을 선택합니다.

    (4) Migration Option

    • “Data Transfer”, ”DDL Execution” 비활성화 합니다.

    • “Export DDL Script” 선택, “Filename”과 “Path“ 를 지정합니다.

    • 스키마별로 파일을 분리하고 싶다면, “Create Individual DDL Script Files" 을선택합니다.

    (5) Target Database > Summary

    추출 대상을 확인합니다.

    (6) Data Migration

    “Migrate“ 를 수행합니다.

    (7) Result > “close”

    “Result” 단계는 Execution 정보가 출력되며 DDL Export 정보는 출력되지 않습니다.

    (8) 파일 확인

    DDL문이 정상적으로 출력됬는지 확인합니다.

    Tablespace, User, Table을 제외한 나머지 Object(=DDL)를 추출합니다.

    (1) T-UP > Migrator

    “Migrator” 를 선택합니다.

    (2)Source Database > Type Conversion

    ORACLE과 대응되는 데이터 타입을 선택합니다.Table은 포함되지 않아 관계없습니다.

    (3) Schema Object

    • “Dependent Objects” 추출 오브젝트를 선택합니다.

    • “Schema” Table 선택, 의존성을 위해 테이블을 선택합니다.

    (4) Migration Option

    • “Data Transfer”, ”DDL Execution” 비활성화 합니다.

    • “Export DDL Script” 선택, “Filename”과 “Path“ 를 지정합니다.

    • 스키마 및오브젝트별로 파일을 분리하고 싶다면, “Create Individual DDL Script Files" 을선택합니다.

    (5) Target Database > Sumamry

    추출 대상을 확인합니다.

    (6) Data Migration

    “Migrate“ 를 수행합니다.

    (7) Result > “close”

    “Result” 단계는 Execution 정보가 출력되며 DDL Export 정보는 출력되지 않습니다.

    (8) 파일 확인

    DDL문이 정상적으로 출력됬는지 확인합니다.

    추출한 스크립트를 Tibero에서 실행할 수 있게 정리와 변경을 진행합니다.

    • Tablespace, User, Table DDL 스크립트 보정 Tablespace, User, Table 스크립트 파일명은 export_ddl.sql 입니다.

    • Tablespace DDL - Tibero DB를 생성하였다면 System, Undo, 기본 Temp Tablespace는 이미 존재하므로 생성하지 않습니다. 단, 기본 Temp Tablespace 이외의 Temp Tablespace는 전환해야 합니다. (예 : TEMP1) - Oracle 전용 Tablespace는 제외합니다. (예 : SYSAUX) - 데이터 파일의 경로, 파일명, Size 조정이 필요할 경우 수정합니다. - Tibero에서 미지원되는 사항은 주석처리 합니다.

    아래는 Tablespace 스크립트의 주석처리 항목에 대한 설명입니다.

    항목
    설명

    • User DDL - 사용자별 패스워드를 확인합니다. (Oracle DB 관리자에게 문의합니다.) 사용자별 패스워드는 기본 tibero로 설정됩니다. - 전환 대상 사용자만 적용합니다. Oracle을 설치할 때 자동으로 생성되는 사용자는 전환이 필요하지 않습니다. - Tibero에서 미지원되는 사항은 주석 처리 합니다.

    항목
    설명

    • Table DDL

    - Oracle에서 전환되는 문자 집합으로 인해 Active Value 에러가 발생할 수 있습니다.

    - 컬럼 타입 부분에서 에러가 발생할 경우 “데이터 타입 비교”의 ""을 참고합니다.

    • Tablespace, User, Table을 제외한 나머지 Object DDL 스크립트 보정

    추출 파일명은 export_other_ddl.sql 입니다.

    • 기타 오브젝트 리스트

      Index View

      Constraint

      Sequence Synonym

      Materialized View

      Library

      Function

    (1) Tibero 데이터베이스 서버에 export_ddl.sql 파일을 업로드합니다.

    (2) export_ddl.sql 을 수행합니다.

    데이터 전환 작업 수행 시 다양한 도구를 통해 전환을 수행합니다.

    T-UP

    • 클라이언트 PC에서 T-UP을 통해 전환을 수행합니다.

    • Oracle → T-UP(클라이언트 PC) → Tibero

    Table Migrator

    • Tibero에서 Table Migrator를 통해 전환을 수행합니다.

    • Oracle → Tibero

    DB Link

    • Tibero에서 Oracle DB Link를 통해 전환을 수행합니다.

    • Oracle → Tibero

    (1) Tibero 데이터베이스 서버에 export_other_ddl.sql 파일을 업로드합니다.

    • 사용자가 많거나 전환을 반복적으로 수행할 경우 Shell(또는 Batch) 스크립트를 작성하여 진행할 것을 권장합니다.

    • 전환을 반복적으로 수행할 경우 1차 전환을 할 때 의존성과 예외 상황을 정리해 놓고 2차, 3차 전환을 수행할 때 스크립트에 사전 작업을 수행하여 에러가 발생하지 않게 합니다.

    • Shell 프로그램을 사용하여 Object들이 자동으로 생성되도록 하고 다음과 같은 방법으로 검증합니다.

    (2) export_other_ddl.sql 을 수행합니다.

    • Synoym Synonym에서 참조하는 원본의 Object가 존재하지 않아도 생성할 때 문제가 되지 않습니다. 이후에 원본 Object가 생성되었다면 사용할 때 자동으로 VALID하게 됩니다.

    • View 생성할 때 의존성, Object 권한으로 인해 에러가 발생할 수 있습니다. 처음 생성할 때 컴파일 에러가 발생하더라도 모든 Object를 생성 후 "Object 상태변경"을 참고하여 VALID 수행 작업을 합니다.

    아래는 의존성을 확인하는 예입니다.

    • Sequence 최종 전환 작업을 수행할 때에는 Oracle의 Current Value가 변경되지 않게 애플리케이션을 종료한 후 진행합니다.

    • PSM(=PL/SQL) PSM을 생성할 때 다음과 같은 사항을 고려합니다. - 생성할 때 의존성, Object 권한으로 인해 에러가 발생할 수 있다. 처음 생성할 때 컴파일 에러가 발생하더라 도 모든 Object를 생성 후 "Object 상태 변경"을 참고하여 VALID 수행 작업을 합니다. - 해당 Object에 대한 권한이 없어 "TBR-8053: Not authorized" 에러가 발생할 수 있습니다. 이때, Object의 권한을 부여한 후 재생성하면 됩니다. - PSM 내의 쿼리 부분에서 에러가 발생할 수 있습니다. 자세한 내용은 "애플리케이션 쿼리 수정"을 참고하여 수정 합니다. - Object 타입의 경우 Tibero는 지원되지 않으므로 Package 내의 타입을 선언하여 우회합니다.

    아래는 Object 타입에 대하여 Package 내의 타입으로 우회 생성하는 방법입니다.

    • Oracle

    • Tibero

    • Index 아래는 Index 생성 이후 Oracle과 Tibero의 Index 개수 비교에 대한 설명입니다.

    상황
    설명

    • Constraint 전환 검증 항목의 "Constraint 개수 확인"에서 확인한 항목과 비교합니다.

    • Trigger Oracle에서 Disable된 Trigger를 전환할 때 Syntax 에러가 발생하므로 아래와 같이 처리합니다. - Disable 구문 부분을 주석 처리합니다. - Tibero에서 Disable 처리합니다.

    • Grant 아래는 Tibero의 Grant 미지원 사항에 대한 설명으로, Grant Count 계산할 때 제외시킵니다.

    항목
    설명

    위와 같은 권한이 정상적인 권한과 함께 부여될 경우 모두 부여되지 않으므로 미지원 권한을 찾아서 삭제한 이후에 재수행이 필요합니다.

    • 기타 기타 External Procedure, Job 부분은 Oracle을 참조하여 생성합니다.

    생성할 때 의존성, Object 권한으로 인해 Object 상태가 INVALID할 수 있으므로 아래와 같이 처리합니다.

    (1) Object 확인

    • 상태별 개수 확인

    • INVALID Object 확인

    (2) 재컴파일 수행

    ‘sys’ 계정으로 접속하여 아래와 같이 특정 스키마의 INVALID된 오브젝트 재컴파일을 수행합니다.

    (3) Object별 재컴파일 및 에러 확인

    해당 사용자로 접속하여 Object별로 재컴파일 및 에러 내용을 확인합니다.

    • View 재컴파일

    • PSM(=PL/SQL) 재컴파일

    • PSM(=PL/SQL) 에러 확인

    • Index 재컴파일

    전환이 완료된 후 DB 측에서 확인하는 사항으로 크게 Object 개수와 데이터 검증이 있습니다.

    • Table

    • View

    • Synonym

    • Sequence

    • Package

    • Package Body

    • Function

    • Procedure

    • Index

    • Constraint

    • Grant

    • Trigger

    Oracle DB Link

    • Count 건수 비교

    • Minus 결과 비교

    T-UP Data Transfer Verification

    (1) T-UP > Migrator

    “Migrator” 를 선택합니다.

    (2) Source Database > Type Conversion

    ORACLE과 대응되는 데이터 타입을 선택합니다.

    (3) Schema Object

    • “Dependent Objects” Table을 선택합니다.

    • “Schemas” 이관 대상 Schema 및 Table을 선택합니다.

    (4) Migration Option

    • “Data Transfer” 활성화 합니다.

    • “Verification” 선택합니다.

    (5) Target Database > Summary

    • Source와 Target 대응 Schema 및 Table 확인

    (6) Data Migration

    “Migrate“ 를 수행합니다.

    (7) Result

    • Type: Data의 지정 Table 성공률을 확인합니다.

    • Type: Data 클릭 시 Verification 결과를 확인합니다.


    DB 전환이 완료된 후 애플리케이션 전환을 수행합니다.

    크게 인터페이스 수정 및 애플리케이션 쿼리 수정이 필요할 수 있습니다.

    JDBC

    $TB_HOME/client/lib/jar 폴더에 tibero7-jdbc.jar 드라이버를 애플리케이션의 드라이버 관리 폴더에 복사합니다.

    • Oracle

    • Tibero

    ODBC

    Tibero ODBC를 설치합니다.

    • Oracle

    • Tibero

    애플리케이션 쿼리 수정은 필요한 경우에만 사용하며 다음과 같은 상황에서 필요합니다.

    Syntax Error가 발생할 경우

    .
    상황
    대응방법

    결과가 정렬된 상태로 출력되지 않을 경우

    .
    상황
    대응방법

    PSM(=PL/SQL) 작성 후 컴파일을 수행할 때 Error가 발생하는 경우

    .
    상황
    대응방법

    APPQOSSYS

    Used for storing and managing all data and metadata required by Oracle Quality of Service Management.

    AUDSYS

    The account where the unified audit data trail resides.

    AURORA$ORB$UNAUTHENTICATED

    Used for users who do not authenticate in Aurora/ORB

    AWR_STAGE

    Used to load data into the AWR from a dump file

    CSMIG

    User for Database Character Set Migration Utility

    CTXSYS

    The Oracle Text account.

    DBSFWUSER

    The account used to run the DBMS_SFW_ACL_ADMIN package.

    DBSNMP

    The account used by the Management Agent component of Oracle Enterprise Manager to monitor and manage the database.

    DEMO

    User for Oracle Data Browser Demonstration (last version 9.2)

    DIP

    The account used by the Directory Integration Platform (DIP) to synchronize the changes in Oracle Internet Directory with the applications in the database.

    DMSYS

    Data Mining user

    DSSYS

    Oracle Dynamic Services and Syndication Server

    DVF

    The account owned by Database Vault that contains public functions to retrieve the Database Vault Factor values.

    DVSYS

    There are two roles associated with this account. The Database Vault owner role manages the Database Vault roles and configurations. The Database Vault Account Manager is used to manage database user accounts. Note: Part of Oracle Database Vault user interface text is stored in database tables in the DVSYS schema. By default, only the English language is loaded into these tables. You can use the DVSYS. DBMS_MACADM.ADD_NLS_DATA procedure to add other languages to Oracle Database Vault.

    EXFSYS

    User to hold the dictionary, APIs for the Expression Filter

    FLOWS_FILES

    The account owns the Oracle Application Express uploaded files.

    GGSYS

    The internal account used by Oracle GoldenGate. It should not be unlocked or used for a database login.

    GSMADMIN_INTERNAL

    The internal account that owns the Global Data Services schema. It should not be unlocked or used for a database login.

    GSMCATUSER

    The account used by Global Service Manager to connect to the Global Data Services catalog.

    GSMUSER

    The account used by Global Service Manager to connect to the database.

    HR (Human Resources)

    OE (Order Entry)

    SH (Sales History)

    Training/ demonstration users containing the popular EMPLOYEES and DEPARTMENTS tables

    LBACSYS

    The Oracle Label Security administrator account. Starting with Oracle Database 18c, the LBACSYS user account is created as a schema-only account.

    MDDATA

    The schema used by Oracle Spatial and Graph for storing geocoder and router data.

    MDSYS

    The Oracle Spatial and Graph administrator account.

    ORACLE_OCM

    This account contains the instrumentation for configuration collection used by the Oracle Configuration Manager.

    ORDPLUGINS

    Object Relational Data (ORD) User used by Time Series, etc.

    ORDSYS

    Object Relational Data (ORD) User used by Time Series, etc.

    OUTLN

    The account that supports plan stability. Plan stability enables you to maintain the same execution plans for the same SQL statements. OUTLN acts as a role to centrally manage metadata associated with stored outlines.

    PERFSTAT

    Oracle Statistics Package (STATSPACK) that supersedes UTLBSTAT/UTLESTAT

    REMOTE_SCHEDULER_AGENT

    The account to disable remote jobs on a database. This account is created during the remote scheduler agent configuration. You can disable the capability of a database to run remote jobs by dropping this user.

    SCOTT

    ADAMS

    JONES

    CLARK

    BLAKE

    Training/ demonstration users containing the popular EMP and DEPT tables

    SYS

    The account used to perform database administration tasks.

    SYS$UMF

    The account used to administer Remote Management Framework, including the remote Automatic Workload Repository (AWR).

    SYSBACKUP

    The account used to perform backup and recovery tasks.

    SYSDG

    The account used to administer and monitor Oracle Data Guard.

    SYSKM

    The account used to perform encryption key management.

    SYSRAC

    The account used to administer Oracle Real Application Clusters (RAC).

    SYSTEM

    Another account used to perform database administration tasks.

    TRACESVR

    Oracle Trace server

    TSMSYS

    User for Transparent Session Migration (TSM) a Grid feature

    WMSYS

    The account used to store the metadata information for Oracle Workspace Manager.

    XDB

    The account used for storing Oracle XML DB data and metadata.

    XS$NULL

    The internal account that represents the absence of a database schema user in a session, and indicates an application user session is in use. XS$NULL cannot be authenticated to a database, nor can it own any database schema objects, or possess any database privileges.

    Undo와 Temp 구성

    Undo와 Temp Tablespace 크기를 확인합니다.

    Log 모드

    Tibero 미지원 사항으로 일반 Index로 변경을 고려합니다.

    UTF8, AL32UTF8

    UTF8

    JA16SJIS[TILDE]

    JA16SJIS[TILDE]

    JA16EUC[TILDE]

    JA16EUC[TILDE]

    ZHS16GBK

    GBK

    VN8VN3

    VN8VN3

    SGA_MAX_SIZE

    사용 가능한 SGA 전체 크기를 확인합니다

    SGA_TARGET

    SGA의 목표 크기를 설정합니다

    PGA_AGGREGATE_TARGET

    사용 가능한 PGA 전체 크기를 확인합니다

    MEMORY_TARGET

    사용 가능한 전체 메모리 크기를 설정합니다. (Oracle 11g용)

    Cluster Object

    Tibero 미지원 Object로 일반 Table 형태로 변경을 고려합니다.

    XML Type

    Table 생성문 column부분 type의 sys.xmltype을 xmltype으로 변경이 필요합니다.

    BitMap Index

    Tibero 미지원 사항으로 일반 Index로 변경을 고려합니다.

    전환 검증

    3

    Table

    -

    4

    Synonym

    생성할 때 Source Object가 존재하지 않아도 문제되지 않지만 추후 조회할 때 자동으로 VALID하므로 먼저 만들어주는 것이 좋습니다.

    5

    View

    의존성 때문에 에러가 발생할 수 있습니다.

    6

    Sequence

    -

    7

    Data Migration

    8

    psm(=pl/sql)

    T-UP 또는 Table Migrator 등의 Tool을 사용하여 데이터를 전환합니다.

    9

    Index

    package, procedure, function이 해당하며 의존성 때문에 에러가 발생할 수 있습니다.

    10

    Constraint

    -

    11

    Trigger

    -

    12

    Grant

    -

    13

    기타(C, Java external procedure, Job 등)

    -

    TABLESPACE GROUP

    TABLESPACE GROUP이 지원되지 않으므로 주석 처리 합니다. 하나의 Tablespace에 여러 데이터 파일로 분리하는 것을 검토합니다.

    Procedure Package

    Type

    Trigger

    Object Privilege

    Job

    DBMS_SCHEDULER

    External Procedure

    모든 사용자에 대해서 생성이 완료된 후 Oracle과 개수를 비교하여 누락된 부분이 없는지 확인합니다.
  • 만약, 정상적으로 Object가 생성되지 않았다면 원인을 찾아 해결한 후 문제가 발생한 Object 수동 생성 및 다음 단계로 진행합니다.

  • FLASHBACK

    파라미터 형태로 지원하며 권한으로는 지원하지 않습니다.

    3

    PSM(=PL/SQL) 내부에 같은 이름의 변수를 선언할 경우 Syntax Error가 발생합니다.

    최종 선언된 변수 이름을 사용하고 앞 부분에 선언한 같은 이름의 변수를 삭제합니다.

    버전 정보

    Oracle 9i, 10g, 11g는 전환 사례가 많으므로 그 이외 버전에서 전환할 경우에 대해서는 검토가 필요합니다.

    전환 문자 집합

    Oracle에서 사용 중인 문자 집합에 대응되는 Tibero 문자 집합으로 선택합니다.

    전환 사용자 선택

    Oracle을 설치할 때 자동 생성되는 기본 사용자의 경우는 제외합니다. 전환 사용자에 대해서 고객사 담당자 확인이 필요합니다.

    전환 크기

    전환 시간에 가장 큰 영향을 미치는 요소입니다. 그 외 DISK I/O, NETWORK I/O 등에 따라서 고객사의 전환 시간이 많이 달라질 수 있습니다.

    전환 검증 항목

    전환이 완료된 후에 비교해 보는 정보입니다

    ANONYMOUS

    Enables HTTP access to Oracle XML DB.

    APEX_050100

    The account that owns the Oracle Application Express schema and metadata.

    APEX_PUBLIC_USER

    The minimally privileged account used for Oracle Application Express configuration with Oracle Application Express Listener or Oracle HTTP Server and mod_plsql.

    문자 집합

    Oracle과 대응되는 문자 집합을 선택합니다.

    초기 파라미터

    세션 개수 및 메모리 설정 등을 확인합니다.

    Redo 구성

    Group과 Member의 개수 또는 크기 등을 확인합니다.

    NLS_CHARACTERSET

    DB 문자 집합

    NLS_NCHAR_CHARACTERSET

    National 문자 집합

    US7ASCII

    ASCII

    KO16KSC5601

    EUCKR or MSWIN949

    KO16MSWIN949

    MSWIN949

    UTF8

    UTF8

    AL16UTF16(기본값)

    UTF16(기본값)

    SESSIONS

    세션 수를 설정합니다.

    OPEN_CURSORS

    세션당 열 수 있는 Cursor의 개수입니다.

    UNDO_RETENTION

    Undo 보존 시간을 설정합니다.

    DB Link

    전환 사용자의 DB Link 정보와 데이터가 존재하는 DB의 종류를 조사합니다.

    tnsnames.ora

    DB Link의 경우 사용하는 Host 정보를 확인합니다.

    Job

    전환 사용자 또는 전체를 수행하는 Job이 없는지 확인하고, 전환할 경우 수행되어 데이터 가 변경되지 않는지 확인합니다.

    1

    Tablespace

    -

    2

    User

    -

    BLOCKSIZE 4K

    Tibero는 Tablespace마다 Block Size 지정이 가능하지 않으므로 주석 처리 합니다. 초기화 파라미터에서 DB를 생성할 때 고정되며 보통 8KB를 사용합니다.

    SEGMENT SPACE MANAGEMENT MANUAL

    Tibero는 AUTO 부분만 지원하므로 MANUAL 부분을 AUTO로 변경 합니다.

    FLASHBACK ON

    Tibero는 파라미터를 통해서 전체모드로 FLASHBACK 기능 지원하므로 주석 처리 합니다.

    GRANT UNLIMITED TABLESPACE TO USER_NAME

    Tibero는 기본으로 UNLIMITED이며 해당 문법이 지원되지 않으므로 주석 처리합니다.

    ALTER USER USERNAME QUOTA UNLIMITED ON USERNAME

    사용자별 QUOTA 기능이 지원되지 않으므로 주석 처리합니다.

    Tibero가 더 적을 경우

    Constraint가 생성되면서 자동으로 Index가 생성되는 것도 고려해야 하므로 Constraint 생성 이후에 비교합니다.

    Tibero가 더 많을 경우

    Table내의 LOB Column에 대응하는 Index가 자동 생성된 부분이 아닌지 확인합니다. (Oracle 11g r2에서도 동일하게 자동생성되며 Oracle 과거버전의 경우 생성 안하는 경우도 있습니다.)

    COMMIT REFRESH

    Mview를 생성할 때 생성 구문으로 지원하며 권한으로는 지원하지 않습니다.

    QUERY REWRITE

    Mview를 생성할 때 생성 구문으로 지원하며 권한으로는 지원하지 않습니다.

    DEBUG

    PL/SQL DEBUGGING 권한으로 현재 Tibero는 지원하지 않습니다.

    1

    SQL을 작성할 때 From절에 있는 Table 또는 서브 쿼리절에 Alias를 주지 않고 Join 등을 실 행할 때 중복된 Column이 존재할 경우 Syntax Error가 발생합니다.

    Alias를 주어서 중복되지 않게 처리합니다.

    2

    Union All 같은 쿼리를 사용하여 결과를 보려는 경우 실제 상위 쿼리는 특정 Column을 number type으로 하고, 하위 쿼리는 varchar type으로 하면 Syntax Error가 발생합니다.

    같은 Column절에서는 동일한 Type을 사용합니다.

    1

    Oracle은 order by를 주지 않아도 결과가 정렬된 형태로 나오는 경우가 있는 반면에 Tibero는 정렬된 상태로 출력되지 않을수 있습니다.

    단, 대용량 테이블에서 Index 등을 강제로 태워서 일부 값만 보고자 하는 쿼리 구현의 경우는 Tibero 역시 order by를 사용하지 않아도 정렬되어 출력됩니다.

    정렬된 결과를 꼭 얻어야 한다면 order by를 명시합니다.

    1

    PSM(=PL/SQL)을 작성한 후 컴파일을 수행할 때 내부 SQL의 Object에 대하여 실제 Object,Column 등이 존재하는지 체크해서 유효하지 않다면 Tibero는 Error를 발생합니다.

    반면에 Oracle은 위와 같은 상황에서 컴파일을 성공했더라도 runtime때 Error가 발생하는 차이가 있습니다.

    실제 존재하는 Object를 사용하고 정확한 Column Name을 사용합니다.

    버전 정보

    전환 문자 집합

    전환 사용자(=Schema) 선택

    출처 Database Installation Guide

    전환 크기

    전환 검증 항목

    실제 dba_object에는 삭제된 Object까지 포함($BIN~ 형식)되어 있어 정확한 Count를 위해서는dba_tables, dba_index 같은 정보를 보는 것이 좋습니다.

    INVALID한 Object에 대해서 고객사 DB 담당자에게 정리요청을 하는것이 전환시간을 단축할 수 있습니다.

    2) DB 생성 관련 항목

    문자 집합

    US7ASCII 캐릭터 셋에 한글이 들어있는 경우 목적에 따라 MSWIN949로 할 수도 있습니다. 단, 애플리케이션의 인코딩과 디코딩 부분의 변경이 필요할 수 있습니다.

    KO16KSC5601, KO16MSWIN949, JA16SJIS에서 UTF8, AL32UTF8로 변경할 경우 해당 테이블 컬럼 크기를 1.5~2배 정도 늘린 후에 데이터 전환을 해야 합니다.

    Oracle의 National 캐릭터 셋이 UTF8이고 Tibero가 UTF16이라면 관련 타입의 글자가 깨져서 전환되므로 동일한 설정이 필요합니다.

    초기 파라미터

    메모리 관련 SGA 세부항목 크기는"V$SGA"로 조회하여 확인합니다.

    Redo 로그 구성

    Undo와 Temp 구성

    Log 모드

    3) 추가 Object 확인

    DB Link 확인

    tnsnames.ora 파일 확인

    Job 확인

    Cluster Object 확인

    XML Type 확인

    BitMap Index 확인

    2. 전환 수행

    1) 전환 사전 준비

    4~8번의 경우는 고객사의 Object들의 의존성에 따라 변동성이 있으므로 고객사의 상황에 맞게 변경합니다.

    2) 전환 DDL 스크립트 추출

    스크립트를 추출할 수 있는 다른 Tool을 사용해도 무방합니다.

    데이터베이스 주요 오브젝트 DDL 스크립트 추출

    데이터베이스 기타 오브젝트 DDL 스크립트 추출

    3) 전환 DDL 스크립트 보정

    데이터베이스 주요 오브젝트 DDL 스크립트

    데이터베이스 기타 오브젝트 DDL 스크립트

    기타 오브젝트는 DDL에 포함되지 않아, Oracle을 참조하여 생성합니다.

    4) 전환

    데이터베이스 주요 오브젝트 DDL 스크립트

    컬럼 타입 부분에서 에러가 발생할 경우 “데이터 타입”의 "Oracle"을 참고합니다.

    데이터 전환 수행

    자세한 도구 사용법은 각 도구의 매뉴얼을 참고합니다.

    데이터베이스 기타 오브젝트 DDL 스크립트

    Object 상태 변경

    5) 전환 검증

    Object 개수

    데이터 검증

    3. 애플리케이션 전환

    1) 인터페이스 수정

    2) 애플리케이션 쿼리 수정

    전환 사전 준비
    전환 DDL 스크립트 추출
    전환 DDL 스크립트 보정
    전환
    Oracle
    [그림 9] T-up에서 Migrator 선택
    [그림 10] Type Conversion
    [그림 11] Schema Objection
    [그림 12] Migration Option
    [그림 13] Summary
    [그림 14] Data Migration
    [그림 15] Result
    [그림 16] 파일확인
    [그림 17] T-up에서 Migrator 선택
    [그림 18] Type Conversion
    [그림 19] Schema Objection
    [그림 20] Migration Option
    [그림 21] Summary
    [그림 22] Data Migration
    [그림 23] Result
    [그림 24] 파일확인
    [그림 25] T-up에서 Migrator 선택
    [그림 26] Type Conversion
    [그림 27] Schema Objection
    [그림 28] Migration Option
    [그림 29] Summary
    [그림 30] Data Migration
    [그림 31.1] Result
    [그림 31.2] Result
    select * from v$version;
    $ tbboot -C
     
    Available character set list
     
     Charset name       Equivalent Oracle Charset name
     
     AR8ISO8859P6       AR8ISO8859P6
     AR8MSWIN1256       AR8MSWIN1256 
     ASCII              US7ASCII 
     CL8ISO8859P5       CL8ISO8859P5 
     CL8KOI8R           CL8KOI8R 
     CL8MSWIN1251       CL8MSWIN1251
     EE8ISO8859P2       EE8ISO8859P2
     EL8ISO8859P7       EL8ISO8859P7
     EL8MSWIN1253       EL8MSWIN1253 
     EUCKR              KO16KSC5601
     EUCTW              ZHT32EUC
     GB18030            GB18030
     GBK                ZHS16GBK
     IW8ISO8859P8       IW8ISO8859P8 
     JA16EUC            JA16EUC 
     JA16EUCTILDE       JA16EUCTILDE 
     JA16SJIS
     JA16SJISTILDE
     MSWIN949           KO16MSWIN949
     RU8PC866           RU8PC866
     SJIS               JA16SJIS 
     SJISTILDE          JA16SJISTILDE 
     TH8TISASCII        TH8TISASCII 
     UTF16              AL16UTF16
     UTF8               UTF8
     VN8VN3             VN8VN3 
     WE8ISO8859P1       WE8ISO8859P1 
     WE8ISO8859P15      WE8ISO8859P15 
     WE8ISO8859P9       WE8ISO8859P9
     WE8MSWIN1252       WE8MSWIN1252 
     ZHT16BIG5          ZHT16BIG5 
     ZHT16HKSCS         ZHT16HKSCS 
     ZHT16MSWIN950      ZHT16MSWIN950
     
    Available nls_date_lang set list
     
     
     AMERICAN
     BRAZILIAN PORTUGUESE 
     JAPANESE
     KOREAN 
     RUSSIAN
     SIMPLIFIED CHINESE 
     THAI
     TRADITIONAL CHINESE
     VIETNAMESE
    select username, account_status, default_tablespace, temporary_tablespace 
    from dba_users order by oracle;
    set linesize 120
    set pagesize 100
    select username, default_tablespace, temporary_tablespace
    from dba_users where account_status='OPEN' order by username;
    select x.a tablespace_name
        , sum(x.b)/1024 "tot_size(mb)" 
        , sum(x.c)/1024 "used_size(mb)" 
        , sum(x.c)/sum(x.b)*100 rate
    from (
        select
            b.tablespace_name a
            ,sum(bytes)/1024 b
            ,0 c
        from dba_data_files b 
        group by b.tablespace_name 
        union
        select
            d.tablespace_name,
            0,
            sum(bytes)/1024
        from dba_segments d
        group by d.tablespace_name 
        )x
    group by x.a;
    select sum(x.b)/1024 "tot(mb)", sum(x.c)/1024 "used(mb)" 
    from (
        select sum(bytes)/1024 b, 0 c 
        from dba_data_files b
        union
        select 0, sum(bytes)/1024 
        from dba_segments d
    ) x;
    select owner, object_type, status, count(*) 
    from dba_objects
    where owner in (select username from dba_users where account_status='OPEN' )
    group by owner, object_Type, status 
    order by owner, object_type, status;
    WITH mig_user AS
    (
        SELECT username
        FROM dba_users
        WHERE account_status='OPEN'
        AND username NOT IN('SYS', 'SYSTEM', 'WMSYS','EXFSYS', 'XDB', 'ORDSYS','MDSYS','SYSMAN')
    )
    SELECT
        O.OWNER
        ,NVL(TBL.TABLE_CNT, 0) AS "TABLE_CNT"
        ,O.VIEW_CNT
        ,O.DBLINK_CNT
        ,O.SEQ_CNT
        ,O.PKG_CNT
        ,O.PKGBODY_CNT
        ,O.PROC_CNT
        ,O.FUNC_CNT
        ,O.TYPE_CNT
        ,O.TYPEBODY_CNT
        ,O.LIB_CNT
        ,TRI.TRIGGER_CNT
        ,NVL(SYN.SYN_CNT,0) AS "SYN_CNT"
        ,NVL(PUB_SYN.PUB_SYN_CNT,0) AS "PUB_SYN_CNT" 
        ,NVL(IDX.IDX_CNT, 0) AS "IDX_CNT"
        ,NVL(G.GRANT_CNT, 0) AS "GRANT_CNT" 
        ,NVL(LOB.LOB_CNT, 0) AS "LOB_CNT" 
        ,NVL(JOB.JOB_CNT, 0) AS "JOB_CNT"
    FROM (
        SELECT
            T.OWNER
            ,SUM( DBLINK_CNT ) AS "DBLINK_CNT" 
            ,SUM( VIEW_CNT ) AS "VIEW_CNT"
            ,SUM( SEQ_CNT ) AS "SEQ_CNT" 
            ,SUM( PKG_CNT ) AS "PKG_CNT"
            ,SUM( PKGBODY_CNT ) AS "PKGBODY_CNT" 
            ,SUM( PROC_CNT ) AS "PROC_CNT"
            ,SUM( FUNC_CNT ) AS "FUNC_CNT"
            ,SUM( TYPE_CNT ) AS "TYPE_CNT"
            ,SUM( TYPEBODY_CNT ) AS "TYPEBODY_CNT" 
            ,SUM( LIB_CNT ) AS "LIB_CNT"
        FROM (
                SELECT
                    OWNER 
                    ,CASE WHEN OBJECT_TYPE = 'DATABASE LINK' THEN COUNT(1) ELSE 0 END
    AS "DBLINK_CNT"
                    ,CASE WHEN OBJECT_TYPE = 'VIEW' THEN COUNT(1) ELSE 0 END AS
    "VIEW_CNT"
                    ,CASE WHEN OBJECT_TYPE = 'SEQUENCE' THEN COUNT(1) ELSE 0 END AS
    "SEQ_CNT"
                    ,CASE WHEN OBJECT_TYPE = 'PACKAGE' THEN COUNT(1) ELSE 0 END AS
    "PKG_CNT"
                    ,CASE WHEN OBJECT_TYPE = 'PACKAGE BODY' THEN COUNT(1) ELSE 0 END
    AS "PKGBODY_CNT" 
                    ,CASE WHEN OBJECT_TYPE = 'PROCEDURE' THEN COUNT(1) ELSE 0 END AS
    "PROC_CNT"
                    ,CASE WHEN OBJECT_TYPE = 'FUNCTION' THEN COUNT(1) ELSE 0 END AS
    "FUNC_CNT"
                    ,CASE WHEN OBJECT_TYPE = 'TYPE' THEN COUNT(1) ELSE 0 END AS
    "TYPE_CNT"
                    ,CASE WHEN OBJECT_TYPE = 'TYPE BODY' THEN COUNT(1) ELSE 0 END AS
    "TYPEBODY_CNT" 
                    ,CASE WHEN OBJECT_TYPE = 'LIBRARY' THEN COUNT(1) ELSE 0 END AS
    "LIB_CNT"
                FROM dba_objects
                WHERE owner in (select username from mig_user) 
                GROUP BY owner, OBJECT_TYPE
                )T
            GROUP BY T.OWNER
        )O
    LEFT JOIN (
        SELECT OWNER, COUNT(1) AS TABLE_CNT
        FROM DBA_TABLES
        WHERE owner in (select username from mig_user) 
        GROUP BY OWNER
    ) TBL ON O.OWNER = TBL.OWNER
    LEFT JOIN (
        SELECT OWNER, COUNT(1) AS GRANT_CNT
        FROM DBA_TAB_PRIVS
        WHERE owner in (select username from mig_user) 
        AND TABLE_NAME NOT LIKE 'BIN$%'
        GROUP BY OWNER
    ) G ON O.OWNER = G.OWNER
    LEFT JOIN (
        SELECT OWNER, COUNT(1) AS IDX_CNT
        FROM DBA_INDEXES
        WHERE owner in (select username from mig_user) 
        GROUP BY OWNER
    ) IDX ON O.OWNER = IDX.OWNER
        LEFT JOIN (
        SELECT OWNER, COUNT(1) AS LOB_CNT
        FROM DBA_LOBS
        WHERE owner in (select username from mig_user)
        GROUP BY OWNER
    ) LOB ON O.OWNER = LOB.OWNER
    LEFT JOIN (
        SELECT SCHEMA_USER, COUNT(1) AS JOB_CNT
        FROM DBA_JOBS
        WHERE SCHEMA_USER in (select username from mig_user) 
        GROUP BY SCHEMA_USER
    ) JOB ON O.OWNER = JOB.SCHEMA_USER
    LEFT JOIN (
        SELECT OWNER, COUNT(1) AS TRIGGER_CNT
        FROM DBA_TRIGGERS
        WHERE OWNER in (select username from mig_user)
        AND TRIGGER_NAME NOT LIKE 'BIN$%'
        GROUP BY OWNER
    ) TRI ON O.OWNER = TRI.OWNER
    LEFT JOIN (
        SELECT OWNER, COUNT(1) AS "SYN_CNT"
        FROM DBA_SYNONYMS
        WHERE OWNER in (select username from mig_user)
        AND OWNER != 'PUBLIC'
        GROUP BY OWNER
    ) SYN ON O.OWNER = SYN.OWNER
    LEFT JOIN (
        SELECT TABLE_OWNER as "OWNER", COUNT(1) AS "PUB_SYN_CNT" 
        FROM DBA_SYNONYMS
        WHERE TABLE_OWNER in (select username from mig_user) 
        AND OWNER = 'PUBLIC'
        GROUP BY TABLE_OWNER
    ) PUB_SYN ON O.OWNER = PUB_SYN.OWNER 
    ORDER BY O.OWNER;
    set linesize 150
    col owner format a30
    
    select owner
    ,constraint_type
    ,count( constraint_name ) as "con_cnt"
    from dba_constraints
    where owner in (select username from dba_users where account_status='OPEN' ) 
    group by owner, constraint_type
    order by owner ,constraint_type;
    set linesize 150
    set pagesize 100
    column value$ format a100
    
    select
        name,
        value$
    from
        sys.props$
    where
        name like '%CHARACTERSET' 
    order by
        name;
    select * from _vt_nls_character_set;
    show parameter <파라미터명>
    set linesize 150
    select * from v$logfile;
    
    select group#, bytes/1024/1024 as "size(mb)", members, archived from v$log;
    show parameters undo_tablespace; set linesize 150
    col tablespace_name format a40
    col file_name format a50
    select tablespace_name, file_name, bytes/1024/1024 "size(mb)"
    ,maxbytes/1024/1024 "maxsize(mb)", autoextensible 
    from dba_data_files
    where tablespace_name = 'UNDOTBS1' -- show parameters undo_tablespace;의 결과값 입력
    col file_name format a50
    select tablespace_name, file_name, bytes/1024/1024 "size mb", autoextensible 
    from dba_temp_files;
    select log_mode from v$database;
    set linesize 150
    col owner format a15
    col db_link format a20
    col username format a20
    col host format a50
    select * from dba_db_links;
    cat $ORACLE_HOME/network/admin/tnsnames.ora
    set linesize 200
    select job, schema_user, broken, instance from dba_jobs; 
    set linesize 150
    col interval format a50
    select job, schema_user, next_date, broken, interval from dba_jobs;
    SELECT *
    FROM DBA_OBJECTS
    WHERE OBJECT_TYPE LIKE '%CLUSTER%' 
    AND OWNER NOT IN ('SYS');
    set linesize 200
    SELECT owner, table_name, column_name, data_type 
    FROM DBA_TAB_COLS
    WHERE DATA_TYPE LIKE '%XML%' 
    AND OWNER NOT IN ('SYS');
    SELECT *
    FROM DBA_INDEXES
    WHERE INDEX_TYPE LIKE '%BITMAP%';
    $ tbsql sys/tibero
    
    
    tbSQL
    
    
    Connected to Tibero.
    
    
    SQL> spool export_ddl.log Spooling is started.
    
    SQL> @export_ddl.sql
    -- spool 파일을 통해 오류 확인
    
    SQL> spool off
    Spooling is stopped: export_ddl.log
    $ tbsql sys/tibero
    
    
    tbSQL
    
    
    Connected to Tibero.
    
    
    SQL> spool export_other_ddl.log Spooling is started.
    
    SQL> @export_other_ddl.sql
    -- spool 파일을 통해 오류 확인
    
    SQL> spool off
    Spooling is stopped: export_other_ddl.log
    SELECT OWNER, NAME, REFERENCED_OWNER, REFERENCED_NAME, REFERENCED_TYPE 
    FROM DBA_DEPENDENCIES
    WHERE TYPE='VIEW'
    AND REFERENCED_TYPE NOT IN ('TABLE', 'SYNONYM') 
    AND REFERENCED_NAME NOT IN ('DUAL')
    AND REFERENCED_NAME NOT LIKE 'DBA_%'
    AND OWNER NOT IN ('SYS', 'ORANGE','MDSYS', 'EXFSYS', 'XDB', 'SYSMAN', 'DBSNMP', 'SYSTEM' )
    AND REFERENCED_OWNER NOT IN ('SYS', 'ORDSYS', 'WMSYS', 'MDSYS','EXFSYS', 'XDB',
    'SYSMAN','SYSTEM','OLAPSYS', 'APEX_030200', 'CTXSYS') 
    ORDER BY 1, 2;
    CREATE OR REPLACE TYPE DOCUROLE_ID_OBJ IS OBJECT(DOCUROLE_ID VARCHAR2(6));
    /
    CREATE OR REPLACE TYPE DOCUROLE_ID_TAB IS TABLE OF DOCUROLE_ID_OBJ;
    /
    CREATE OR REPLACE FUNCTION USER_DOCUROLESET(PARAM IN VARCHAR2) 
    RETURN DOCUROLE_ID_TAB
    IS
    L_DOCUROLE_ID_TAB DOCUROLE_ID_TAB := DOCUROLE_ID_TAB(); 
    BEGIN
    L_DOCUROLE_ID_TAB.EXTEND; 
    L_DOCUROLE_ID_TAB(1).DOCUROLE_ID := 'test'; 
    RETURN L_DOCUROLE_ID_TAB;
    END;
    /
    CREATE OR REPLACE PACKAGE "PK_TYPES" AS
    TYPE DOCUROLE_ID_OBJ IS RECORD(DOCUROLE_ID VARCHAR2(6)); 
    TYPE DOCUROLE_ID_TAB IS TABLE OF DOCUROLE_ID_OBJ;
    END;
    /
    CREATE OR REPLACE FUNCTION USER_DOCUROLESET(PARAM IN VARCHAR2) 
    RETURN PK_TYPES.DOCUROLE_ID_TAB
    IS
    L_DOCUROLE_ID_TAB PK_TYPES.DOCUROLE_ID_TAB := PK_TYPES.DOCUROLE_ID_TAB(); 
    N INTEGER := 0;
    BEGIN 
    L_DOCUROLE_ID_TAB.EXTEND;
    L_DOCUROLE_ID_TAB(1).DOCUROLE_ID := 'test'; 
    RETURN L_DOCUROLE_ID_TAB;
    END;
    /
    alter trigger trigger_name disable;
    col owner format a20 
    set pages 500
    select owner, object_type, status, count(*) 
    from dba_objects
    group by owner, object_Type, status
    order by owner, object_type, status;
    set linesize 120
    col object_name format A30 
    col owner format a20
    select owner, object_name, object_type, status 
    from dba_objects
    where status='INVALID';
    $ tbsql sys/tibero
    
    tbSQL
    
    Connected to Tibero.
    
    SQL> exec utl_recomp.recomp_serial(schema=>'MIGRATION_USER');
    
    PSM completed.
    select * from view_name where rownum < 1;
    alter function function_name compile; 
    alter procedure procedure_name compile;
    show errors
    alter index index_name rebuild;
    set linesize 150
    column owner format a30
    
    select
        owner,
        count(table_name) as "table_cnt"
    from
        dba_tables 
    where
        owner not in ('SYS','SYSGIS','SYSCAT','PUBLIC','OUTLN','TIBERO','TIBERO1')
    group by
        owner 
    order by
        owner;
    set linesize 150
    column owner format a30
    
    select
        owner,
        count(view_name) as "view_cnt"
    from
        dba_views 
    where
        owner not in ('SYS','SYSGIS','SYSCAT','PUBLIC','OUTLN','TIBERO','TIBERO1')
    group by
        owner 
    order by
        owner;
    set linesize 150 
    column owner format a30
    
    select
        owner,
        count(1) as "synonym_cnt" 
    from
        dba_synonyms
    where
        owner not in ('SYS','SYSGIS','SYSCAT','PUBLIC','OUTLN','TIBERO','TIBERO1') 
    group by
        owner
    order by owner;
    set linesize 150
    column sequence_owner format a30 
    
    select
        sequence_owner,
        count( sequence_name ) as "sequence_cnt"
    from
        dba_sequences
    where
        sequence_owner not in
    ('SYS','SYSGIS','SYSCAT','PUBLIC','OUTLN','TIBERO','TIBERO1') 
    group by
        sequence_owner
    order by
        sequence_owner;
    set linesize 150
    column owner format a30
    
    select
        owner,
        count( name ) as "package_cnt"
    from
        dba_source 
    where
        type = 'PACKAGE' and
        owner not in ('SYS','SYSGIS','SYSCAT','PUBLIC','OUTLN','TIBERO','TIBERO1')
    group by
        owner 
    order by
        owner;
    set linesize 150
    column owner format a30
    
    
    select
        owner,
        count( name ) as "package_body_cnt"
    from
        dba_source 
    where
        type = 'PACKAGE BODY' and
        owner not in ('SYS','SYSGIS','SYSCAT','PUBLIC','OUTLN','TIBERO','TIBERO1')
    group by
        owner 
    order by
        owner;
    set linesize 150
    column owner format a30
    
    select
        owner,
        count( name ) as "function_cnt"
    from
        dba_source 
    where
        type = 'FUNCTION' and
        owner not in ('SYS','SYSGIS','SYSCAT','PUBLIC','OUTLN','TIBERO','TIBERO1') 
    group by
        owner 
    order by
        owner;
    set linesize 150
    column owner format a30
    
    
    select
        owner,
        count( name ) as "procuedure_cnt"
    from
        dba_source 
    where
        type = 'PROCEDURE' and
        owner not in ('SYS','SYSGIS','SYSCAT','PUBLIC','OUTLN','TIBERO','TIBERO1')
    group by
        owner 
    order by
        owner;
    set linesize 150
    column owner format a30
    
    
    select
        owner,
        count( index_name ) as "index_cnt"
    from
        dba_indexes 
    where
        owner not in ('SYS','SYSGIS','SYSCAT','PUBLIC','OUTLN','TIBERO','TIBERO1')
    group by
        owner 
    order by
        owner;    
    set linesize 150
    column owner format a30
    
    
    select
        owner, 
        constraint_type,
        count( constraint_name ) as "constraint_cnt"
    from
        dba_constraints 
    where
        owner not in ('SYS','SYSGIS','SYSCAT','PUBLIC','OUTLN','TIBERO','TIBERO1')
    group by
        owner, constraint_type 
    order by
        owner ,constraint_type;
    set linesize 150 
    column col format a30
    
    select
        owner,
        count(1) as "grant_cnt"
    from
        dba_tab_privs 
    where
        owner not in ('SYS','SYSGIS','SYSCAT','PUBLIC','OUTLN','TIBERO','TIBERO1')
    group by
        owner 
    order by
        owner;
    set linesize 150
    column owner format a30
    
    
    select
        owner,
        count(trigger_name) as "trigger_cnt"
    from
        dba_triggers
    where
        owner not in ('SYS','SYSGIS','SYSCAT','PUBLIC','OUTLN','TIBERO','TIBERO1')
    group by
        owner 
    order by
        owner;
    select 'tbl1' as table_name, count(*) as oracle_count, count(*) 
    - (select count(*) from tbl1 where rownum = 1) as diff from tbl1@ora;
    select * from tbl1@ora minus 
    select * from tbl1;
    String jdbc_url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL"; 
    String user = "oracle_username";
    String passwd = "oracle_passwd"; 
    Class.forName("oracle.jdbc.driver.OracleDriver");
    String jdbc_url = "jdbc:tibero:thin:@127.0.0.1:8629:tibero"; 
    String user = "tibero_username";
    String passwd = "tibero_passwd";
    Class.forName("com.tmax.tibero.jdbc.TbDriver");
    DRIVER={Microsoft ODBC for Oracle}; 
    server=(DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)) 
    (CONNECT_DATA=(SERVICE_NAME=utf8)));UID=scott;PWD=tiger;
    DRIVER={Tibero 7 ODBC Driver};SERVER=127.0.0.1;PORT=8629
    ;DB=t7;UID=dbtech;PWD=dbtech;

    백업 및 복구

    티베로 Database 백업과 복구( DB Backup & Recovery) 의 기본 개념에 대해서 설명합니다. 논리적인 백업 (Logical Backup), 물리적인 백업 (Physical Backup), Offline 백업 / Cold 백업, Online 백업 / Hot 백업 등 세부 사항에 대해 소개합니다.

    문서 다운로드

    3MB
    Tibero_7_백업&복구 가이드.pdf
    PDF
    Open

    기본 개념

    다음은 백업과 복구의 개념에 대한 설명입니다.

    • 백업(Backup) 백업은 여러 가지 유형의 장애로부터 데이터베이스를 보호하기 위한 과정으로 MTBF(Mean Time Between Failure)를 증가시키고, MTTR(Mean Time To Recover)를 감소시킵니다. 관리자는 시스템에 장애가 발행하는 경우 손실을 최소화하고 복구 가능한 상태로 데이터베이스를 운용해야 한다. 따라서, 최소한 한달에 한 번 데이터베이스 전체 백업을 하거나 하루에 한번씩 Export 백업을 권장합니다. 데이터베이스 관리자는 백업에 대한 정책을 수립하고 꼭 필요한 데이터를 최소한의 양으로 백업해야 합니다. 또한 백업이 정상적으로 수행되었는지 주기적으로 검증하는 것을 권장합니다.

    • 복구(Recovery) 복구는 시스템에 장애가 발생하는 경우 복원 또는 시스템 작동을 유지하기 위한 절차 또는 기법입니다.

    주요 용어

    TSN

    TSN은 데이터베이스의 버전 또는 Commit 버전으로 Data Concurrency Control, Redo Ordering, 복구 등에 사용되며 트랜잭션이 commit될 때 generate됩니다.

    Checkpoint는 주기적으로 사용자의 요청에 따라 메모리에 있는 모든 변경된(dirty) 블록을 디스크에 쓰는 작업을 말하며 복구에 필요한 Log 파일의 양을 줄여줍니다.

    모든 Log Switch가 발생할 때 인스턴스가 NORMAL, POST_TX, IMMEDIATE 옵션으로 종료되면 사용자 요청에 따라 Checkpoint가 수동으로 발생(alter system checkpoint)하며, DBWR가 작동하기 전에 LGWR이 현재 Log 버퍼의 내용을 Online Log 파일에 Write하고 해당 dirty 버퍼에 mark 되면 이 정보를 DBWR이 받아서 모든 marked dirty 버 퍼를 디스크에 기록합니다.

    Checkpoint는 Checkpoint TSN 이전에 발생한 Online Log 파일 내의 모든 변경 사항이 디스크에 저장 되음을 의 미합니다.

    다음은 Log 모드에 대한 설명입니다.

    • NO ARCHIVE LOG (노 아카이브 로그) - 기본적인 Log 모드로 Redo Log 파일은 순환하여 사용되고 Log Switch가 발생하면 이전의 Log 파일을 Overwrite합니다. 이전의 Log가 없기 때문에 트랜잭션 기록 중 최근의 부분만 사용할 수 있습니다. - Redo Log가 Overwrite되면 결국 마지막 전체 백업(offline 백업)을 통한 복구만 가능합니다. - 백업은 반드시 데이터베이스가 정상 종료된 상태에서 해야 하며 이로 인해 서비스의 중지가 발생합니다.

    • ARCHIVE LOG (아카이브 로그) - 이 Log 모드에서 Redo Log 파일은 LOGA(Log Archiver)에 의해 백업이 완료되기 전에는 사용할 수 없고, Archive Log 파일은 미디어 복구(Media Recovery)에 사용될 수 있습니다. - 데이터베이스 기동 중에 백업을 할 수 있습니다.

    본 장에서는 백업의 종류와 각 종류별 백업 방법에 대해 설명합니다.

    • 논리적인 백업 (Logical Backup) 데이터베이스의 논리적인 단위의 백업으로 Export 툴로 백업합니다. 예를 들어 Table, Index, Constraint, Sequence 등이 있습니다.

    • 물리적인 백업 (Physical Backup) 데이터베이스를 구성하는 파일을 운영체제 레벨에서 copy 명령으로 백업합니다. 예를 들어 데이터 파일, 컨트롤 파 일, Archive Log 파일 등이 있습니다.

    백업은 NO ARCHIVE LOG 모드와0 ARCHIVE LOG 모드의 처리 방법이 다릅니다.

    • NO ARCHIVE LOG 모드(Offline Backup / Cold Backup) 데이터베이스를 구성하는 전체 파일에 대해 운영을 멈춘 상태에서 백업을 하는 것으로 데이터베이스를 백업 받은 시점으로의 복구만 가능합니다.

    • ARCHIVE LOG 모드(Online Backup / Hot Backup) 데이터베이스 운영 중에도 백업이 가능하고 컨트롤 파일 생성문, 데이터 파일, Archive Log 파일을 백업합니다. 백업된 Archive Log 파일의 시점에 따라 데이터 파일 백업 시점 이전으로 복구도 가능합니다.

    각 모드별로 Consistent와 Inconsistent 백업을 할 수 있습니다.

    컨트롤 파일은 데이터베이스의 구조를 이진 파일 형태로 저장하며 데이터베이스를 mount할 때 반드시 필요합니다. 만약 해당 파일이 없으면 복구하거나 재생성해야 하므로 데이터베이스를 구성할 때 컨트롤 파일을 2개 이상으로 구 성하고 각 파일은 서로 다른 디스크에 위치시킬 것을 권고합니다.

    다음의 동적 뷰로 컨트롤 파일의 위치 정보와 다중화 여부를 확인합니다.

    백업 방법

    다음은 컨트롤 파일을 백업하는 과정에 대한 설명입니다.

    • 컨트롤 파일 다중화

      1. tbdown 명령어를 사용해서 데이터베이스를 down합니다.

      2. 컨트롤 파일을 다른 위치로 복사합니다.

    Online Backup (온라인 백업)은 Tibero를 운영하는 중에 백업하는 것으로 ALTER DATABASE 명령으로 Tablespace의 데이터 파일 을 백업하며 ARCHIVE LOG 모드에서만 사용 가능합니다.

    백업 방법

    다음은 Online Backup (온라인 백업)하는 과정에 대한 설명입니다.

    1. 데이터베이스에 Online Backup의 시작을 알립니다.

    1. 동적 뷰(v$backup)로 아래와 같이 현재의 백업 모드를 확인합니다.

    1. O/S 명령으로 해당 Tablespace의 데이터 파일을 복사합니다.

    1. Tibero 데이터베이스에 Online Backup 종료를 알립니다.

    Offline Backup (오프라인 백업)은Tibero를 종료한 후 백업하는 방법입니다.

    Tibero를 정상 종료한 후 O/S의 copy 명령을 이용해 데이터 파일, Log 파일, 컨트롤 파일, Tip 파일 등을 백업합니다. MOUNT 또는 OPEN 모드에서 v$datafile, v$logfile 뷰를 통해 백업할 파일 정보를 조회할 수 있으며 ARCHIVE LOG 모드에서는 Archive 파일도 백업합니다.

    백업 방법

    다음은 Offline Backup하는 과정에 대한 설명합니다.

    1. 동적 뷰(v$datafile)로 아래와 같이 백업 대상 파일을 조회합니다.

    1. 동적 뷰(v$logfile)로 아래와 같이 백업 대상 Log 파일을 조회합니다.

    1. 동적 뷰(v$controlfile)로 아래와 같이 백업 대상 컨트롤 파일을 조회합니다.

    1. tbdown 명령어로 Tibero를 종료합니다.

    1. 조회한 백업 대상 파일을 복사합니다.

    본 장에서는 복구 작업에 대한 설명과 각 장애 상황별 해결 방법에 대해 설명합니다.

    복구는 시스템에 장애가 발생하는 경우 복원 또는 시스템 작동을 유지하기 위한 절차 또는 기법입니다. 다음은 부트 과정별 복구 관련 작업입니다.

    • NOMOUNT : 인스턴스 시작 - 데이터베이스 생성 가능 - 컨트롤 파일 재생성 가능

    • MOUNT : 컨트롤 파일 오픈 - 데이터 파일 이름 변경 가능 - Archive 모드 옵션 활성화 또는 비활성화 가능 - 전체 데이터베이스 복구 작업 가능

    • OPEN : 컨트롤 파일에 정의한 모든 파일 오픈

    시스템 이상이나 Shutdown abort 등 비정상적인 데이터베이스 종료 후 Tibero가 기동하는 과정에서 자동으로 수 행되는 복구 작업입니다. Online Redo Log 파일, Online 데이터 파일, Current 컨트롤 파일만을 사용하고, Undo Tablespace를 이용하여 commit되지 않은 데이터에 대해 복구 작업을 진행합니다.

    다음은 파손 복구의 특징입니다.

    • 복구 작업이 자동으로 수행되며 데이터베이스 관리자가 데이터 복구를 위한 로그를 적용하는 등의 수작업을 하지 않고 자동으로 처리됩니다.

    • Online Log(Redo Log)를 사용하며 Archive Log는 사용하지 않습니다.

    • Redo의 Roll-forward와 Rollback을 사용합니다.

    미디어 복구는 Tibero를 구성하는 파일에 물리적인 손상이 발생하였거나 정상 동작을 할 수 없는 경우 복구하는 과 정입니다.

    데이터 파일의 버전이 다른 경우(데이터 파일의 손상으로 백업해 놓은 데이터 파일을 이용하는 경우), 컨트롤 파일 을 복구한 경우, Online Redo Log 파일에 손상이 있는 경우, 사용자의 실수로 데이터가 유실된 경우, Archive Log 파일이 유실된 경우는 미디어 복구를 해야 합니다.

    다음은 미디어 복구의 특징입니다.

    • DBA의 명령에 의해 수동으로 수행합니다. (ALTER DATABASE RECOVER ...)

    • 백업 받은 데이터 파일을 이용해서 복구합니다.

    • Redo Log 파일이나 Archive Log 파일로부터 Redo record를 적용합니다.

    • MOUNT 모드에서만 가능합니다.

    미디어 복구의 종류는 다음과 같습니다.

    미디어 복구는 다음의 동적 뷰를 사용합니다.

    RESETLOGS

    불완전 복구를 하게 되면 반드시 resetlogs로 데이터베이스를 기동해야 합니다.

    resetlogs 이전의 데이터 파일 및 Log 파일과 resetlogs 이후의 파일은 서로 호환되지 않습니다. resetlogs 이전의 백 업 파일이나 Log 파일들을 이용하여 resetlogs 이후로 복구할 수 없습니다. 또한 resetlogs 이후의 파일들을 가지고 resetlogs 이전 상태로 불완전 복구도 불가능합니다.

    다음은 RESETLOGS의 사용 예입니다.

    다음은 복구 환경을 구성하는 방법에 대한 설명입니다.

    1. Tibero 파라미터 설정

    1. 데이터베이스 생성

    1. Tablespace 생성

    1. 사용자 생성

    본 절에서는 컨트롤 파일을 각 상황별로 복구하는 방법에 대해 설명합니다.

    컨트롤 파일이 삭제된 경우

    운영상태에서 컨트롤 파일이 삭제되어 장애가 발생한 경우 백업된 컨트롤 파일의 생성 문장으로 컨트롤 파일을 재 생성합니다.

    • 장애 상황

    • 해결 방법

    이중화 컨트롤 파일 하나가 삭제된 경우

    데이터베이스가 down 상태에서 이중화 컨트롤 파일 하나가 삭제된 경우 삭제된 컨트롤 파일을 재생성하거나 파라 미터 파일의 내용을 수정합니다.

    • 장애 상황

    • 해결 방법

    redo Log 유실에 따른 Tibero의 동작은 다음과 같습니다.

    • boot할 때 redo 파일이 하나 이상 없는 경우 - boot가 실패합니다.

    • 정상적으로 기동 된 상태에서 동작 중 redo log 파일이 삭제되는 경우 - boot 이후 한 번도 사용되지 않은 redo log 파일이 삭제된 경우 (파일 디스크립터 없음) : 그룹 내에 이용 가능한 다른 멤버 파일이 있을 경우는 sys log에 메시지만 남기고 정상 동작합니다. : 그룹 내에 멤버가 모두 삭제된 경우 sys log에 에러 메시지를 남기면서 Tibero가 down됩니다. - boot 이후 사용된 적이 있는 redo log 파일이 삭제된 경우 (파일 디스크립터 있음) : 정상적으로 진행됩니다.

    INACTIVE 모드 로그 그룹의 로그 멤버 하나가 삭제된 경우

    운영상태에서 INACTIVE 모드 로그 그룹의 로그 멤버 하나가 삭제된 경우에는 장애가 발생한 멤버를 삭제한 후 재생성합니다.

    • 장애 상황

    • 해결 방법

    INACTIVE 모드 로그 그룹이 삭제된 경우

    운영상태에서 INACTIVE 모드 로그 그룹이 삭제된 경우 장애가 발생한 로그 그룹을 삭제한 후 재생성합니다.

    • 장애 상황

    • 해결 방법

    CURRENT 모드 로그 그룹 삭제 후 abort로 종료된 경우

    ARCHIVE LOG 모드 운영상태에서 CURRENT 모드 로그 그룹이 삭제되고 abort로 종료된 경우 특정 시점의 TSN을 이용하여 불완전 복구를 해야 합니다.

    마지막 Archive Log 파일의 NEXT_TSN 정보를 이용하여 변경 기반 복구를 진행하며 v$archive_dest_files의 next_tsn 정보를 확인하거나 Archive 파일 덤프를 발생시켜 next_tsn 정보를 확인합니다. 변경 기반 복구 작업을 하는 경우에는 next_tsn - 1 값으로 진행합니다.

    • 장애 상황

    • 해결 방안

    CURRENT 모드 로그 그룹 삭제 후 immediate로 종료된 경우

    ARCHIVE LOG 모드 운영상태에서 CURRENT 모드 로그 그룹이 삭제되고 immediate로 종료된 경우 마지막까지commit된 데이터는 데이터 파일에 저장된 후 정상 종료되므로 취소 기반으로 복구를 진행합니다.

    • 장애 상황

    • 해결 방안

    Temp 파일이 삭제된 경우

    Temp Tablespace의 파일이 삭제된 경우 tbboot을 실행하면 Temp 파일이 자동적으로 생성됩니다.

    • 장애상황

    • 해결 방안

    자동 완전 복구

    ARCHIVE LOG 모드 운영상태에서 데이터 파일이 삭제된 경우 기존 백업된 데이터 파일을 복사한 후 AUTOMATIC 명령어로 복구합니다.

    • 장애 상황

    • 해결 방안

    사용자 완전 복구

    ARCHIVE LOG 모드 운영상태에서 데이터 파일이 삭제된 경우 Archive 파일로 생성된 것은 Archive 파일을 이용하 여 명시적으로 각각 복구 하고, Archive 파일로 생성되지 않은 current 상태인 것은 Redo 파일로 복구합니다.

    • 장애 상황

    • 해결 방안

    백업 데이터 파일이 없을 경우 완전 복구

    ARCHIVE LOG 모드 운영상태에서 백업 데이터 파일이 없을 경우 먼저 데이터 파일을 생성하고 AUTOMATIC 명령어로 완전 복구합니다. 단, 데이터 파일이 생성되는 시점부터 Archive 파일이 존재해야 합니다.

    • 장애 상황

    • 해결 방안

    백업 데이터 파일이 있을 경우 Online 중에 완전 복구

    백업 데이터 파일이 있고 Online 중에 데이터 파일이 삭제된 경우 해당 Tablespace를 Offline시키고 Partial 복구

    (해당 Tablespace)를 합니다. 복구 후에는 Tablespace를 Online시킵니다.

    • 장애 상황

    • 해결 방안

    corrupt block 에러가 발생하는 경우 "alter system set enable_mr_corrupt_recovery=y "를 적용하거나$TB_SID.tip 파일에 파라미터 기재 후 재기동합니다. (Tibero6 FS01 까지)

    • 변경 기반(TSN) 불완전 복구

    • 시간 기반 불완전 복구

    • 취소 기반 불완전 복구

    변경 기반(TSN) 불완전 복구

    ARCHIVE LOG 모드 운영상태에서 데이터 파일이 삭제된 경우 특정시점의 TSN을 이용하여 변경 기반 불완전 복구 를 합니다.

    마지막 Archive Log 파일의 NEXT_TSN 정보를 이용하여 변경 기반 복구를 진행하며 v$archive_dest_files 의 next_tsn 정보나 Archive 파일 덤프를 발생시켜 next_tsn 정보를 확인합니다. 변경 기반 복구 작업을 하는 경우에는 next_tsn - 1 값으로 진행합니다.

    • 장애 상황

    • 해결 방안

    시간 기반 불완전 복구

    ARCHIVE LOG 모드 운영상태에서 데이터 파일이 삭제된 경우 시간을 지정하여 복구합니다.

    • 장애 상황

    • 해결 방안

    취소 기반 불완전 복구

    ARCHIVE LOG 모드 운영상태에서 데이터 파일이 삭제된 경우 Archive 파일을 이용하여 명시적으로 복구합니다.

    • 장애 상황

    • 해결 방안

    본 장에서는 TAC의 복구 방법에 대해서 설명합니다.

    TAC 복구의 경우 Single DB 복구 절차와 유사하지만 아래와 같은 차이점이 있습니다.

    • 미디어 복구는 한 인스턴스만 MOUNT 모드로 부팅한 후 진행합니다.

    • 모든 NODE의 Archive Log 파일이 복구할 NODE의 LOG_ARCHIVE_DEST 파라미터의 지정된 디렉터리에 모두 위치해야 합니다.

    본 절에서는 TAC 취소 기반의 불완전 복구에 대해서 설명합니다. TAC의 완전복구, 시간 기반 불완전 복구, TSN 기반 불완전 복구 절차는 Single DB와 동일하므로 자세한 내용은 “3.3. 복구 방법”을 참고합니다.

    다음은 TAC 취소 기반의 불완전 복구 절차입니다.

    1. 취소 기반 복구를 시작합니다.

    1. 복구할 Log 파일을 등록합니다.

    1. 등록된 Log 파일을 merge하면서 Log 파일 끝에 도달할 때까지 복구를 진행합니다.

    1. 복구를 중지하려면 아래 명령을 실행합니다.

    취소 기반의 불완전 복구

    ARCHIVE LOG 모드 운영상태에서 데이터 파일이 삭제된 경우 Archive 파일로 생성된 것은 Archive 파일을 이용하 여 명시적으로 각각 복구하고, Archive 파일로 생성되지 않은 current 상태인 것은 Redo 파일로 복구합니다.

    • 장애 상황

    1. 테이블 및 데이터 입력(NODE1)

    1. 데이터 입력(NODE2)

    1. 데이터 파일 초기화(NODE1)

    • 해결 방안

    1. 백업된 파일로 데이터 파일 복구(NODE1)

    1. NODE2의 Archive Log 파일을 NODE1으로 전송

    1. 취소 기반 불완전 복구 수행

      1. Log 파일 확인

    b. 취소 기반 복구시작

    c. 복구할 Log 파일 등록 및 복구 진행

    d. 취소 기반 복구 종료

    e. 후처리

    본 장에서는 TAC 온라인 백업본으로 Single 환경 구성과 구성 방법에 대해서 설명합니다.

    다음과 같이 온라인 백업 및 데이터 생성합니다.

    • NODE1

      1. 데이터 파일 및 컨트롤 파일을 백업한다.

    1. 데이터를 생성합니다.

    1. Archive Log 파일을 생성합니다.

    복구할 때 Current Redo가 없는 상태이므로 Archive 파일이 어디까지 있는지에 따라 복구된 내용이 달라질 수 있기 때문에 추가적으로 Archive Log 파일을 생성합니다.

    • NODE2

    1. 데이터를 생성합니다.

    1. Archive Log 파일을 생성합니다.

    복구할 때 Current Redo가 없는 상태이므로 Archive 파일이 어디까지 있는지에 따라 복구된 내용이 달라질 수 있기 때문에 추가적으로 Archive Log 파일을 생성합니다.

    다음은 TAC 온라인 백업본 환경을 구성하는 방법에 대한 설명입니다.

    1. 엔진을 설치한다. 설치에 대한 자세한 내용은 를 참고합니다.

    2. $TB_SID.tip에 Tibero parameter 설정을 변경합니다.

    • dest가 명시된 파라미터 경로 수정

    • TAC 관련 파라미터 제거

    1. 데이터 파일, Archive Log 파일, 컨트롤 파일 생성 구문으로 Single 환경을 구성합니다. a. Single 서버 복사

    b. 컨트롤 파일 재생성

    c. 불완전 복구 수행

    다음은 TSN 기반으로 불완전 복구를 수행한 예입니다.

    d. temp 파일 생성

    백업한 컨트롤 파일 스크립트내의 주석 스크립트 부분을 활용하여 temp 파일을 생성합니다.

    $TB_SID.tip 파일에서 CONTROL_FILES 파라미터를 추가합니다.
  • tbboot 명령어로 데이터베이스를 기동시킵니다.

  • 컨트롤 파일 Trace 생성 O/S의 copy 명령을 통해 별도의 위치에 복사하고 아래 문법을 사용하여 Trace를 생성합니다.

  • NORESETLOGS

    기존의 유효한 Log 파일을 계속 사용한다.

    구분

    설명

    Consistent 백업

    정상적인 Shutdown 후의 백업이다.

    Inconsistent 백업

    정상 종료되지 않은 상태에서의 백업 또는 DB 운영 중의 백업이다. (NO ARCHIVE LOG 모드에서는 사용을 권장하지 않음)

    항목

    설명

    FILENAME

    생성할 Trace 파일 이름을 지정한다. (경로를 미지정 하는 경우 $TB_SID.tip 파일의

    DB_CREATE_FILE_DEST 파라미터에 정의된 디렉터리에 생성됨)

    REUSE

    컨트롤 파일의 생성 문장을 백업할 때 이미 존재하는 파일을 재사용하려면 REUSE 옵션을 사용한다.

    RESETLOGS

    기존의 Log 파일은 무시하고 Log를 초기화한다.

    구분

    설명

    완전 복구

    Archive Log파일과 Online Log파일을 모두 사용해서 가장 최근 Log까지 모두 반영한다.

    불완전 복구

    Log 파일 일부만 적용 하거나 특정 시점으로 복구가 가능하다.

    • Point-in-Time 복구

    • Redo record의 일부만 적용

    불완전 복구를 하게 되면 반드시 resetlogs로 데이터베이스를 기동해야 한다.

    Checkpoint

    Log 모드

    DB Backup

    개요

    백업 방법

    컨트롤 파일 백업 (Control File Backup)

    참고 컨트롤 파일을 백업 할 때 컨트롤 파일 다중화가 필수 사항은 아니지만 컨트롤 파일 Trace 생성 전에 진행하는 것을 권장합니다.

    Online Backup (온라인 백업)

    주의 Online Backup 중에는 데이터베이스의 변경 사항에 대한 Log의 양이 늘어나기 때문에 가능하면 신속하게 작업하고 종료합니다.

    Offline Backup (오프라인 백업)

    복구(Single)

    개요

    파손 복구(Crash Recovery)

    미디어 복구(Media Recovery)

    참고: resetlogs로 시작한 경우 반드시 새로운 백업을 받기를 권장합니다.

    복구 환경 구성

    복구 방법

    컨트롤 파일 복구 (ControlFile recovery)

    참고 만약 운영상태에서 컨트롤 파일이 다른 파일로 덮어 씌워진 경우도 위의 방법으로 해결할 수 있습니다.

    Online Log 파일 복구

    Temp Tablespace 복구

    데이터 파일 장애 완전 복구

    데이터 파일 장애 불완전 복구

    참고 취소 기반 복구의 경우 DPL/DPI, nologging 데이터를 포함하면 log block corruption 발생 가능성이 있으므로 해당 작업 후에는 반드시 Full 백업 수행을 권장합니다.

    복구(TAC)

    개요

    복구 방법

    Appendix A. TAC 온라인 백업본 Single 구성

    환경 구성

    구성 방법

    "Tibero 설치 안내서"
    v$controlfile
    SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '<FILENAME>' REUSE NORESETLOGS;
    SQL> ALTER TABLESPACE SYSTEM BEGIN BACKUP;
    SQL> select * from v$backup;
        FILE#     STATUS	     CHANGE# TIME
    ---------     ---------      ------------
           0      ACTIVE	     21091
           1      NOT ACTIVE     0
           2      NOT ACTIVE     0
           3      NOT ACTIVE     0
    SQL> !cp /home/tibero/tbdata/system001.dtf /home/tibero/tbdata_bak/system001.dtf
    SQL> ALTER TABLESPACE SYSTEM END BACKUP;
    SQL> select name from v$datafile; 
    NAME
    --------------------------------------------
    /home/tibero/tbdata/system001.dtf
    /home/tibero/tbdata/undo001.dtf
    /home/tibero/tbdata/usr001.dtf
    /home/tibero/tbdata/apm_ts.dtf
    
    SQL> select group#, member from v$logfile; 
    GROUP#  MEMBER
    ------  ----------------------------------
        0	/home/tibero/tbdata/redo01.redo
        1	/home/tibero/tbdata/redo11.redo
        2	/home/tibero/tbdata/redo21.redo
    SQL> select name from v$controlfile; 
    NAME
    -------------------------------------
    /home/tibero/tbdata/c1.ctl
    /home/tibero/tbdata/c2.ctl
    tbdown
    $ cp /home/tibero/tbdata/*.dtf /home/tibero/tbdata_bak/
    $ cp /home/tibero/tbdata/*.redo /home/tibero/tbdata_bak/
    $ cp /home/tibero/tbdata/*.ctl /home/tibero/tbdata_bak/
    또는
    $ cp /home/tibero/tbdata/*.* /home/tibero/tbdata_bak/
    V$RECOVER_FILE 
    V$RECOVERY_FILE_STATUS 
    V$LOGFILE V$CONTROLFILE 
    V$LOG
    $ tbboot -t resetlogs
    DB_NAME=tibero 
    LISTENER_PORT=8629
    CONTROL_FILES="/home/tibero/tbdata/c1.ctl", "/home/tibero/tbdata/c2.ctl"
    DB_CREATE_FILE_DEST="/home/tibero/tbdata" 
    LOG_ARCHIVE_DEST="/home/tibero/tbarch" 
    #CERTIFICATE_FILE="/home/tibero/tibero7/config/svr_wallet/tibero.crt" 
    #PRIVKEY_FILE="/home/tibero/tibero7/config/svr_wallet/tibero.key" 
    #WALLET_FILE="/home/tibero/tibero7/config/svr_wallet/WALLET"
    
    MAX_SESSION_COUNT=100
    
    
    TOTAL_SHM_SIZE=1024M
    CREATE DATABASE "tibero"
    USER SYS IDENTIFIED BY TIBERO 
    MAXDATAFILES 4096
    CHARACTER SET MSWIN949
    LOGFILE GROUP 0 ('redo01.redo', 'redo02.redo') SIZE 50M, 
            GROUP 1 ('redo11.redo', 'redo12.redo') SIZE 50M, 
            GROUP 2 ('redo21.redo', 'redo22.redo') SIZE 50M
    MAXLOGFILES 100
    MAXLOGMEMBERS 8 ARCHIVELOG 
    DATAFILE 'system001.dtf' SIZE 256M
            AUTOEXTEND ON NEXT 16M MAXSIZE 3072M
            DEFAULT TABLESPACE USR 
    DATAFILE 'usr001.dtf' SIZE 128M
            AUTOEXTEND ON NEXT 16M MAXSIZE 3072M 
            DEFAULT TEMPORARY TABLESPACE TEMP
    TEMPFILE 'temp001.dtf' SIZE 512M
            AUTOEXTEND ON NEXT 16M MAXSIZE 10240M EXTENT MANAGEMENT 
            LOCAL AUTOALLOCATE UNDO TABLESPACE UNDO
    DATAFILE 'undo001.dtf' SIZE 512M 
            AUTOEXTEND ON NEXT 16M MAXSIZE 10240M 
            EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
    DROP TABLESPACE "MY_FILE001" INCLUDING CONTENTS AND DATAFILES; 
    CREATE TABLESPACE "MY_FILE001" DATAFILE 'my_file001.dtf' SIZE 10M 
    AUTOEXTEND ON NEXT 1M MAXSIZE 3G
    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
    DROP USER TIBERO CASCADE;
    CREATE USER tibero IDENTIFIED BY tmax 
    DEFAULT TABLESPACE MY_FILE001;
    
    GRANT CONNECT, RESOURCE, DBA TO tibero;
    $ tbboot
    $ tbsql sys/tibero
    
    
    SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS
    '/home/tibero/tbdata/ctl_backup.sql' REUSE NORESETLOGS;
    
    
    $ rm -f /home/tibero/tbdata/c1.ctl
    $ tbdown
    
    Tibero instance terminated (NORMAL mode).
    
    $ tbboot
    change core dump dir to /home/tibero/tibero7/bin/prof 
    listener port = 8629
    ********************************************************
    *	Warning: Control file open failed
    *	/home/tibero/tbdata/SYSTEM/c1.ctl
    ********************************************************
    
    
    ********************************************************
    *Critical Warning : Raise svmode failed. The reason is
    *TBR-24003 : Unable to read control file.
    *Current server mode is NOMOUNT.
    ********************************************************
    
    Tibero 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Tibero instance started suspended at NOMOUNT mode.
    
    $ tbsql sys/tibero
    
    tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> @ctl_backup.sql 
    Control File created.
    
    SQL> exit 
    Disconnected.
    $ tbdown
    
    Tibero instance terminated (NORMAL mode).
    
    $ tbboot
    change core dump dir to /home/tibero/tibero7/bin/prof 
    Listener port = 8629
    
    ******************************************************** 
    Critical Warning : Raise svmode failed. The reason is 
    TBR-1024 : Database needs media recovery:
    media recovery required(/home/tibero/tbdata/system001.dtf). 
    Current server mode is MOUNT.
    ********************************************************
    
    Tibero 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved. 
    Tibero instance started suspended at MOUNT mode.
    
    $ tbsql sys/tibero tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> select * from v$recover_file;
    
        FILE#     ONLINE	 ERROR	                    CHANGE#     TIME
    ---------     -------    ------------------------   --------    --------
            0     ONLINE     media recovery required    18144       2023/07/15
            1     ONLINE	 media recovery	required    18144	2023/07/15
            2     ONLINE	 media recovery	required    18144	2023/07/15
            3     ONLINE	 media recovery	required    18144	2023/07/15
            4     ONLINE	 media recovery	required    18144	2023/07/15
    
    rows selected.
    
    SQL> alter database recover automatic database; 
    Database altered.
    
    SQL> select * from v$recover_file;
    0 row selected.
    
    SQL> exit Disconnected.
    $ tbdown
    
    Tibero instance terminated (NORMAL mode).
    
    $ tbboot
    change core dump dir to /home/tibero/tibero7/bin/prof
    
    Listener port = 8629
    
    Tibero 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved. 
    Tibero instance started up (NORMAL mode)
    
    $ tbsql sys/tibero tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    --백업한 컨트롤 파일 스크립트내의 주석 스크립트 부분을 활용하여 Temp 파일 생성
    SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/home/tibero/tbdata/temp001.dtf' 
    SIZE 1G REUSE AUTOEXTEND OFF;
    Tablespace 'TEMP' altered. 
    SQL> exit
    
    Disconnected.
    $ rm -f /home/tibero/tbdata/c1.ctl
    $ tbdown
    $ tbboot
    Change core dump dir to /home/test/tibero7/bin/prof. 
    Listener port = 8629
    
    ********************************************************
    *	Warning: Control file open failed
    *	/home/tibero/tbdata/SYSTEM/c1.ctl
    ********************************************************
    
    Tibero 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved. 
    Tibero instance started up (NORMAL mode).
    
    $ tail -f sys.log
    [2023-07-15T16:03:06.098870] [CLC-28] [I] control file write failed: no fd for 
    '/home/tibero/tbdata/SYSTEM/c1.ctl'
    [2023-07-15T16:03:08.099663] [CLC-28] [I] control file read failed : 
    '/home/tibero/tbdata/SYSTEM/c1.ctl' (blkno=1) (no fd)
    [2023-07-15T16:03:08.100278] [CLC-28] [I] control file write failed: no fd for
    '/home/tibero/tbdata/SYSTEM/c1.ctl'
    [2023-07-15T16:03:10.101093] [CLC-28] [I] control file read failed : 
    '/home/tibero/tbdata/SYSTEM/c1.ctl' (blkno=1) (no fd)
    [2023-07-15T16:03:10.101527] [CLC-28] [I] control file write failed: no fd for
    '/home/tibero/tbdata/SYSTEM/c1.ctl'
    [2023-07-15T16:03:12.101537] [CLC-28] [I] control file read failed : 
    '/home/tibero/tbdata/SYSTEM/c1.ctl' (blkno=1) (no fd)
    [2023-07-15T16:03:12.102669] [CLC-28] [I] control file write failed: no fd for 
    '/home/tibero/tbdata/SYSTEM/c1.ctl'
    [2023-07-15T16:03:14.103789] [CLC-28] [I] control file read failed : 
    '/home/tibero/tbdata/SYSTEM/c1.ctl' (blkno=1) (no fd)
    [2023-07-15T16:03:14.105566] [CLC-28] [I] control file write failed: no fd for 
    '/home/tibero/tbdata/SYSTEM/c1.ctl'
    [2023-07-15T16:03:16.107421] [CLC-28] [I] control file read failed :
    '/home/tibero/tbdata/SYSTEM/c1.ctl' (blkno=1) (no fd)
    [2023-07-15T16:03:16.107935] [CLC-28] [I] control file write failed: no fd for 
    '/home/tibero/tbdata/SYSTEM/c1.ctl'
    
    
    $ tbdown
    $ cp /home/tibero/tbdata/c2.ctl /home/tibero/tbdata/c1.ctl
    $ tbboot
    SQL> set line 200
    SQL> col group# for 999 
    SQL> col member for a50 
    SQL> col SEQ# for 999 
    SQL> col MB for 999
    SQL> select a.group#, a.member, b.bytes/1024/1024 "MB", b.archived "ARC",
    b.sequence# "SEQ#", b.status
    
    from v$logfile a, v$log b 
    where a.group#=b.group# 
    order by 1;	
    
    GROUP#     MEMBER	                MB	ARC	        SEQ#	STATUS
    0	/home/tibero/tbdata/redo02.redo	50	YES		3	INACTIVE
    1	/home/tibero/tbdata/redo11.redo	50	NO		4	CURRENT
    1	/home/tibero/tbdata/redo12.redo	50	NO		4	CURRENT
    2	/home/tibero/tbdata/redo21.redo	50	YES		2	INACTIVE
    2	/home/tibero/tbdata/redo22.redo	50	YES		2	INACTIVE
    
    6 rows selected.
    SQL> !rm -f /home/tibero/tbdata/redo01.redo 
    SQL> !ls /home/tibero/tbdata/redo01.redo
    ls: /home/tibero/tbdata/redo01.redo: No such file or directory 
    SQL> alter system switch logfile;
    
    System altered.
    
    SQL> /
    
    System altered.
    
    SQL> /
    
    System altered.
    
    SQL> /
    
    System altered.
    
    SQL> /
    
    System altered.
    
    SQL> set line 200
    SQL> col group# for 999 
    SQL> col member for a50 
    SQL> col SEQ# for 999 
    SQL> col MB for 999
    SQL> select a.group#, a.member, b.bytes/1024/1024 "MB", b.archived "ARC", 
    b.sequence# "SEQ#", b.status
    from v$logfile a, v$log b
    where a.group#=b.group# 
    order by 1;
    
    GROUP#     MEMBER	                    MB         ARC     SEQ#     STATUS
    ------   ---------------------            ----       -----    -----     --------
        0	 /home/tibero/tbdata/redo01.redo    50		NO	9	CURRENT
        0	 /home/tibero/tbdata/redo02.redo    50		NO	9	CURRENT
        1	 /home/tibero/tbdata/redo11.redo    50		YES	7	INACTIVE
        1	 /home/tibero/tbdata/redo12.redo    50		YES	7	INACTIVE
        2	 /home/tibero/tbdata/redo21.redo    50		YES	8	INACTIVE
        2	 /home/tibero/tbdata/redo22.redo    50		YES	8	INACTIVE
    
    
    6 rows selected.
    
    SQL> !
    
    $vi /home/tibero/tibero7/instance/tibero/log/slog/sys.log
    [2023-07-15T17:34:46.359823] [DDL-91] [I] Executing DDL: alter system switch logfile 
    [2023-07-15T17:34:46.360003] [CLL-26] [I] switch log file 2 -> 0 ...
    [2023-07-15T17:34:46.364365] [RLS-26] [I] lf hdrblk write: fno(2) cf_seq(143) seq(36) 
    nab(1) low(0000.0000c5ed) next(0000.0000c5f2) st(33)
    [2023-07-15T17:34:46.365318] [RLS-26] [I] lf hdrblk write: fno(2) cf_seq(143) seq(36) 
    nab(1) low(0000.0000c5ed) next(0000.0000c5f2) st(33)
    [2023-07-15T17:34:46.365433] [CFD-26] [I] open (stat) failed (errno=2, No such file or
    directory) (flag=010002) (filename=/home/tibero/tbdata/redo01.redo)
    [2023-07-15T17:34:46.365445] [CLL-26] [I] WARNING: LOG MEMBER missing during log switch,
    filename: /home/tibero/tbdata/redo01.redo
    [2023-07-15T17:34:46.365566] [CFD-26] [I] open (stat) failed (errno=2, No such file or 
    directory) (flag=010002) (filename=/home/tibero/tbdata/redo01.redo)
    [2023-07-15T17:34:46.366158] [RLS-26] [I] Failed to read 1 log blocks in logfile group #0
    (member=1, blkno=0)
    [2023-07-15T17:34:46.366206] [CLL-26] [I] One of the log member(lf id = 0, lm id = 1) is 
    invalid, all must be valid
    [2023-07-15T17:34:46.366820] [RLS-26] [I] lf hdrblk write: fno(0) cf_seq(143) seq(37) 
    nab(4294967295) low(0000.0000c5f2) next(ffff.ffffffff) st(129)
    [2023-07-15T17:34:46.366850] [RLS-26] [I] lf hdrblk write: fno(0) cf_seq(143) seq(37) 
    nab(4294967295) low(0000.0000c5f2) next(ffff.ffffffff) st(129)
    [2023-07-15T17:34:46.369945] [CLL-26] [I] LOGFILE SWITCHED. LF#2(seqno=36, blocks=0
    next=0000.0000c5f2)
    
    $ tbsql sys/tibero
    
    tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> alter system switch logfile;
    
    System altered.
    
    SQL> alter database drop logfile member '/home/tibero/tbdata/redo01.redo';
    
    Database altered.
    
    SQL> alter database add logfile member '/home/tibero/tbdata/redo01.redo' to group 0;
    
    Database altered.
    
    SQL> alter system switch logfile; 
    System altered.
    
    SQL> /
    System altered.
    
    SQL> /
    System altered.
    
    SQL> !
    $vi /home/tibero/tibero7/instance/tibero/log/slog/sys.log
    
    [2023-07-15T10:29:16.500746] [DDL-91] [I] Executing DDL: alter database add logfile 
    member '/home/tibero/tbdata/redo01.redo' to group 0
    
    [2023-07-15T10:29:16.687006] [DDL-91] [I] Alter database type 1 succeeded.
    
    [2023-07-15T10:29:16.687169] [DDL-91] [I] DDL execution succeeded
    
    [2023-07-15T10:29:35.029699] [DDL-91] [I] Executing DDL: alter system switch logfile
    
    [2023-07-15T10:29:35.029934] [CLL-26] [I] switch log file 1 -> 2 …
    
    [2023-07-15T10:29:35.032529] [RLS-26] [I] lf hdrblk write: fno(1) cf_seq(155) seq(38) 
    nab(23) low(0000.0000c853) next(0000.0000c8ad) st(33)
    
    [2023-07-15T10:29:35.033078] [RLS-26] [I] lf hdrblk write: fno(1) cf_seq(155) seq(38) 
    nab(23) low(0000.0000c853) next(0000.0000c8ad) st(33)
    
    [2023-07-15T10:29:35.034520] [RLS-26] [I] lf hdrblk write: fno(2) cf_seq(155) seq(39) 
    nab(4294967295) low(0000.0000c8ad) next(ffff.ffffffff) st(129)
    
    [2023-07-15T10:29:35.034964] [RLS-26] [I] lf hdrblk write: fno(2) cf_seq(155) seq(39) 
    nab(4294967295) low(0000.0000c8ad) next(ffff.ffffffff) st(129)
    
    [2023-07-15T10:29:35.038120] [CLL-26] [I] LOGFILE SWITCHED. LF#1(seqno=38, blocks=22
    next=0000.0000c8ad)
    
    [2023-07-15T10:29:35.038217] [DDL-91] [I] DDL execution succeeded
    
    [2023-07-15T10:29:35.038881] [CLA-27] [I] LOG GROUP 1 (lsn=38) archive start.
    (/home/tibero/tbdata/arch/log-t0-r0-s38.arc)
    
    
    [2023-07-15T10:29:35.040019] [CLA-27] [I] LOG GROUP 1 (lsn=38) ARCHIVED.
    (/home/tibero/tbdata/arch/log-t0-r0-s38.arc)
    $ tbsql sys/tibero
    
    tbSQL 7
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> set line 200
    SQL> col group# for 999 
    SQL> col member for a50 
    SQL> col SEQ# for 999
    SQL> col MB for 999
    SQL> select a.group#, a.member, b.bytes/1024/1024 "MB", b.archived "ARC", 
    b.sequence# "SEQ#", b.status
    from v$logfile a, v$log b 
    where a.group#=b.group# 
    order by 1;
    
    GROUP#     MEMBER	                    MB     ARC     SEQ#     STATUS
    ------    ---------------------------       ----   ----    -----    --------
        0	  /home/tibero/tbdata/redo01.redo    50	    YES      4	     INACTIVE
        0	  /home/tibero/tbdata/redo02.redo    50	    YES	     4	     INACTIVE
        1	  /home/tibero/tbdata/redo11.redo    50	    NO       5	     CURRENT
        1	  /home/tibero/tbdata/redo12.redo    50	    NO	     5	     CURRENT
        2	  /home/tibero/tbdata/redo21.redo    50	    YES	     3	     INACTIVE
        2	  /home/tibero/tbdata/redo22.redo    50	    YES	     3	     INACTIVE
    
    
    6 rows selected.
    
    SQL> !rm -f /home/tibero/tbdata/redo01.redo 
    SQL> !rm -f /home/tibero/tbdata/redo02.redo 
    SQL> !ls /home/tibero/tbdata/redo01.redo
    ls: /home/tibero/tbdata/redo01.redo: No such file or directory 
    SQL> !ls /home/tibero/tbdata/redo02.redo
    ls: /home/tibero/tbdata/redo02.redo: No such file or directory
    
    SQL> alter system switch logfile;
    
    System altered.
    
    SQL> /
    
    System altered.
    
    SQL> /
    
    System altered.
    
    SQL> exit 
    Disconnected.
    $ tbsql sys/tibero
    
    tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> alter database drop logfile group 0;
    Database altered.
    
    SQL> alter database add logfile group 0 ('/home/tibero/tbdata/redo01.redo', 
    '/home/tibero/tbdata/redo02.redo') size 50M;
    Database altered.
    
    SQL> set line 200
    SQL> col group# for 999 
    SQL> col member for a50 
    SQL> col SEQ# for 999 
    SQL> col MB for 999
    SQL> select a.group#, a.member, b.bytes/1024/1024 "MB", b.archived "ARC",
    b.sequence# "SEQ#", b.status
    
    from v$logfile a, v$log b 
    where a.group#=b.group# 
    order by 1;	
    
    GROUP#   MEMBER	                            MB	 ARC	SEQ#	STATUS
    -------  --------------------------------  ----  ----   ------  --------
        0	 /home/tibero/tbdata/redo01.redo    50	 YES	-1	UNUSED
        0	 /home/tibero/tbdata/redo02.redo    50	 YES	-1	UNUSED
        1	 /home/tibero/tbdata/redo11.redo    50	 NO	 5	CURRENT
        1	 /home/tibero/tbdata/redo12.redo    50	 NO	 5	CURRENT
        2	 /home/tibero/tbdata/redo21.redo    50	 YES	 3	INACTIVE
        2	 /home/tibero/tbdata/redo22.redo    50	 YES	 3	INACTIVE
        
    6 rows selected.
    $ tbsql sys/tibero tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> set line 200
    SQL> col group# for 999 
    SQL> col member for a50 
    SQL> col SEQ# for 999 
    SQL> col MB for 999
    SQL> select a.group#, a.member, b.bytes/1024/1024 "MB", b.archived "ARC", 
    b.sequence# "SEQ#", b.status
    from v$logfile a, v$log b
    where a.group#=b.group# 
    order by 1;
    
    GROUP#   MEMBER	                            MB	 ARC	SEQ#	STATUS
    -------  --------------------------------  ----  ----   ------  --------
        0	 /home/tibero/tbdata/redo01.redo    50	 NO	7	CURRENT
        0	 /home/tibero/tbdata/redo02.redo    50	 NO	7	CURRENT
        1	 /home/tibero/tbdata/redo11.redo    50	 YES	5	CURRENT
        1	 /home/tibero/tbdata/redo12.redo    50	 YES	5	CURRENT
        2	 /home/tibero/tbdata/redo21.redo    50	 YES	6	INACTIVE
        2	 /home/tibero/tbdata/redo22.redo    50	 YES	6	INACTIVE
    
    6 rows selected.
    
    SQL> CREATE TABLE T1 (C1 VARCHAR(5));
    Table 'T1' created.
    
    SQL> INSERT INTO T1 (C1) VALUES ('00011');
    1 row inserted.
    
    SQL> COMMIT;
    Commit completed.
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    SQL> INSERT INTO T1 (C1) VALUES ('00012');
    1 row inserted.
    
    SQL> COMMIT;
    Commit completed.
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    SQL> INSERT INTO T1 (C1) VALUES ('00013');
    1 row inserted.
    
    SQL> COMMIT;
    Commit completed.
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    SQL> INSERT INTO T1 (C1) VALUES ('00014');
    1 row inserted.
    
    SQL> COMMIT;
    Commit completed.
    
    SQL> set line 200
    SQL> col group# for 999 
    SQL> col member for a50 
    SQL> col SEQ# for 999 
    SQL> col MB for 999
    SQL> select a.group#, a.member, b.bytes/1024/1024 "MB", b.archived "ARC", 
    b.sequence# "SEQ#", b.status
    from v$logfile a, v$log b
    where a.group#=b.group# 
    order by 1;
    
    GROUP#   MEMBER	                            MB	 ARC	SEQ#	STATUS
    -------  --------------------------------  ----  ----   ------  --------
        0	 /home/tibero/tbdata/redo01.redo    50	 NO	10	CURRENT
        0	 /home/tibero/tbdata/redo02.redo    50	 NO	10	CURRENT
        1	 /home/tibero/tbdata/redo11.redo    50	 YES	8	INACTIVE
        1	 /home/tibero/tbdata/redo12.redo    50	 YES	8	INACTIVE
        2	 /home/tibero/tbdata/redo21.redo    50	 YES	9	INACTIVE
        2	 /home/tibero/tbdata/redo22.redo    50	 YES	9	INACTIVE
    
    6 rows selected.
    
    SQL> !rm -f /home/tibero/tbdata/redo01.redo 
    SQL> !rm -f /home/tibero/tbdata/redo02.redo 
    SQL> !ls /home/tibero/tbdata/redo01.redo
    /home/tibero/tbdata/redo01.redo not found 
    SQL> !ls /home/tibero/tbdata/redo02.redo
    /home/tibero/tbdata/redo02.redo not found
    
    SQL> exit 
    Disconnected.
    
    $ tbdown abort
    
    Tibero instance terminated (ABORT mode).
    $ cp /home/tibero/tbdata_bak/*.dtf /home/tibero/tbdata
    
    $ tbboot mount
    change core dump dir to /home/tibero/tibero7/bin/prof
    
    listener port = 8629 
    Tibero 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved. 
    Tibero instance started up (MOUNT mode).
    
    $ tbsql sys/tibero
    
    tbSQL 7
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> set line 200 SQL> set line 200
    SQL> col group# for 999
    SQL> col member for a50 
    SQL> col SEQ# for 999 
    SQL> col MB for 999
    SQL> select a.group#, a.member, b.bytes/1024/1024 "MB", b.archived "ARC", 
    b.sequence# "SEQ#", b.status
    from v$logfile a, v$log b 
    where a.group#=b.group# 
    order by 1;
    
    GROUP#   MEMBER	                            MB	 ARC	SEQ#	STATUS
    -------  --------------------------------  ----  ----   ------  --------
        0	 /home/tibero/tbdata/redo01.redo    50	 NO	10	CURRENT
        0	 /home/tibero/tbdata/redo02.redo    50	 NO	10	CURRENT
        1	 /home/tibero/tbdata/redo11.redo    50	 YES	8	INACTIVE
        1	 /home/tibero/tbdata/redo12.redo    50	 YES	8	INACTIVE
        2	 /home/tibero/tbdata/redo21.redo    50	 YES	9	INACTIVE
        2	 /home/tibero/tbdata/redo22.redo    50	 YES	9	INACTIVE
    
    6 rows selected.
    
    --next_change# - 1 값 조회
    SQL>	set	line 200
    SQL>	col	name for a40
    SQL>	col	SEQ# for 999
    SQL>	col	TSN for 999999999
    SQL> select name, sequence# seq#, next_change#-1	tsn	
    from v$archive_dest_files order by 2;		
    
    NAME	                                        SEQ#		 TSN
    --------------------------------------------   ------      -----------
    /home/tibero/tbdata/arch/log-t0-r0-s7.arc	7		45589
    /home/tibero/tbdata/arch/log-t0-r0-s8.arc	8		45597
    /home/tibero/tbdata/arch/log-t0-r0-s9.arc	9		45606
    
    3 rows selected.		
    
    --TSN 정보가 없을 경우 Log 파일 덤프를 발생시킨다.
    SQL> alter system dump logfile '/home/tibero/tbdata/arch/log-t0-r0-s9.arc';
    
    System altered.
    
    SQL> exit 
    Disconnected.
    
    $ cd $TB_HOME/instance/$TB_SID/dump/tracedump
    $ ls -rlt
    
    total 24
    -rw-r--r-- 1 tibero dba 2688 Jul 15 19:08 tb_dump_47120982_37_2.trc
    
    --next_tsn 값을 10진수로 변경 : 0000.0000b227 (hex) => 45607 (dec)
    --next_tsn - 1 = 45606
    
    $ grep next tb_dump_47120982_37_2.trc
    
    low=0000.0000b21e 2023-07-10 18:59:28 next=0000.0000b227 2023-07-15 18:59:43
    ...(이하생략)
    
    $ tbsql sys/tibero
    
    tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> alter database recover automatic database until change 45606;
    
    Database altered.
    
    SQL> exit 
    Disconnected.
    
    $ tbdown
    
    Tibero instance terminated (NORMAL mode).
    
    $ tbboot -t resetlogs
    change core dump dir to /home/tibero/tibero7/bin/prof
    
    listener port = 8629
    
    Tibero 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved. 
    Tibero instance started up (NORMAL RESETLOGS mode).
    
    $ tbsql sys/tibero
    
    tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> select * from t1;
    
    C1
    --------
    00011
    00012
    00013
    
    3 rows selected.
    $ tbsql sys/tibero tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> CREATE TABLE T1 (C1 VARCHAR(5));
    Table 'T1' created.
    
    SQL> INSERT INTO T1 (C1) VALUES ('00011');
    1 row inserted.
    
    SQL> COMMIT;
    Commit completed.
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    SQL> INSERT INTO T1 (C1) VALUES ('00012');
    1 row inserted.
    
    SQL> COMMIT;
    Commit completed.
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    SQL> INSERT INTO T1 (C1) VALUES ('00013');
    1 row inserted.
    
    SQL> COMMIT;
    Commit completed.
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    SQL> INSERT INTO T1 (C1) VALUES ('00014');
    1 row inserted.
    
    QL> COMMIT;
    Commit completed.
    
    SQL> set line 200
    SQL> col group# for 999 
    SQL> col member for a50 
    SQL> col SEQ# for 999 
    SQL> col MB for 999
    SQL> select a.group#, a.member, b.bytes/1024/1024 "MB", b.archived "ARC", 
    b.sequence# "SEQ#", b.status
    from v$logfile a, v$log b
    where a.group#=b.group# 
    order by 1;
    
    GROUP#   MEMBER	                            MB	 ARC	SEQ#	STATUS
    -------  --------------------------------  ----  ----   ------  --------
        0	 /home/tibero/tbdata/redo01.redo    50	 NO	7	CURRENT
        0	 /home/tibero/tbdata/redo02.redo    50	 NO	7	CURRENT
        1	 /home/tibero/tbdata/redo11.redo    50	 NO	5	INACTIVE
        1	 /home/tibero/tbdata/redo12.redo    50	 NO	5	INACTIVE
        2	 /home/tibero/tbdata/redo21.redo    50	 NO	6	INACTIVE
        2	 /home/tibero/tbdata/redo22.redo    50	 NO	6	INACTIVE
    
    6 rows selected.
    
    SQL> !rm -f /home/tibero/tbdata/redo01.redo 
    SQL> !rm -f /home/tibero/tbdata/redo02.redo 
    SQL> !ls /home/tibero/tbdata/redo01.redo
    /home/tibero/tbdata/redo01.redo not found
    SQL> !ls /home/tibero/tbdata/redo02.redo
    /home/tibero/tbdata/redo02.redo not found
    
    SQL> exit 
    Disconnected.
    
    $ tbdown immediate
    
    Tibero instance terminated (IMMEDIATE mode).
    $ tbboot
    
    change core dump dir to /home/tibero/tibero7/bin/prof 
    listener port = 8629
    
    ********************************************************
    *Critical Warning : Raise svmode failed. The reason is
    *TBR-1042 : Unable to read log member file in group 0, member 1
    (/home/tibero/tbdata/redo01.redo), block 0.
    * Current server mode is MOUNT.
    ********************************************************
    
    Tibero 7
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved. 
    Tibero instance started suspended at MOUNT mode.
    
    $ tbsql sys/tibero
    
    tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> ALTER DATABASE RECOVER DATABASE UNTIL CANCEL;
    Database altered.
    
    SQL> exit 
    Disconnected.
    
    $ tbdown
    
    Tibero instance terminated (NORMAL mode).
    
    $ tbboot resetlogs
    change core dump dir to /home/tibero/tibero7/bin/prof
    
    listener port = 8629
    
    Tibero 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved. 
    Tibero instance started up (NORMAL RESETLOGS mode).
    
    $ tbsql sys/tibero 
    tbSQL 7
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero
    
    SQL> !ls /home/tibero/tbdata/redo01.redo
    /home/tibero/tbdata/redo01.redo
    SQL> !ls /home/tibero/tbdata/redo02.redo
    /home/tibero/tbdata/redo02.redo
    
    /home/tibero/tbdata/redo02.redo
    
    SQL> set line 200
    SQL> col group# for 999 
    SQL> col member for a50
    SQL> col SEQ# for 999 
    SQL> col MB for 999
    SQL> select a.group#, a.member, b.bytes/1024/1024 "MB", b.archived "ARC",
    b.sequence# "SEQ#", b.status
    from v$logfile a, v$log b
    where a.group#=b.group#
    order by 1;
    
    GROUP#   MEMBER	                            MB	 ARC	SEQ#	STATUS
    -------  --------------------------------  ----  ----   ------  --------
        0	 /home/tibero/tbdata/redo01.redo    50	 NO	1	CURRENT
        0	 /home/tibero/tbdata/redo02.redo    50	 NO	1	CURRENT
        1	 /home/tibero/tbdata/redo11.redo    50	 NO	-1	UNUSED
        1	 /home/tibero/tbdata/redo12.redo    50	 NO	-1	UNUSED
        2	 /home/tibero/tbdata/redo21.redo    50	 NO	-1	UNUSED
        2	 /home/tibero/tbdata/redo22.redo    50	 NO	-1	UNUSED
    
    6 rows selected.
    
    SQL> select * from t1;
    
    C1
    -------
    00011
    00012
    00013
    00014
    
    4 rows selected
    $ tbboot
    $ tbsql sys/tibero
    $ rm –rf /home/tibero/tbdata/temp001.dtf
    $ tbdown
    $ ls -al /home/tibero/tbdata/temp001.dtf
    ls: /home/tibero/tbdata/temp001.dtf: No such file or directory
    
    $ tbboot
    $ ls -al /home/tibero/tbdata/temp001.dtf
    -rw------- 1 tibero dba 536870912 Jun 15 17:25 /home/tibero/tbdata/temp001.dtf
    $ tbdown
    $ cp –R /home/tibero/tbdata /home/tibero/tbdata_bak
    $ tbboot
    
    
    $ tbsql tibero/tmax
    
    
    SQL> CREATE TABLE T1 (C1 VARCHAR(5)) TABLESPACE MY_FILE001;
    Table 'T1' created.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00011');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00012');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00013');
    1 row inserted.
    
    
    SQL> COMMIT;
    Commit completed.
    
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    
    SQL> /
    System altered.
    
    
    SQL> exit
    
    
    $ tbdown
    $ rm –f /home/tibero/tbdata/my_file001.dtf
    $ cp /home/tibero/tbdata_bak/*.dtf /home/tibero/tbdata
    
    
    $ tbboot mount
    
    
    $ tbsql sys/tibero tbSQL 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Connected to Tibero.
    
    
    
    SQL> ALTER DATABASE RECOVER AUTOMATIC;
    Database altered.
    
    
    SQL> exit Disconnected.
    
    $ tbdown
    
    
    Tibero instance terminated (NORMAL mode).
    
    
    $ tbboot
    
    
    listener port = 8629
    
    
    change core dump dir to /home/tibero_td/tibero7/bin/prof
    
    
    Tibero 7
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Tibero instance started up (NORMAL mode).
    
    
    $ tbsql tibero/tmax tbSQL 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved. Connected to Tibero.
    
    SQL> select * from t1;
    
    
    C1
    ------
    00011
    00012
    00013
    
    
    3 rows selected.
    
    $ tbdown
    
    
    $ cp –R /home/tibero/tbdata /home/tibero/tbdata_bak
    
    
    $ tbboot
    
    
    $ tbsql tibero/tmax
    
    
    SQL> CREATE TABLE T1 (C1 VARCHAR(5)) TABLESPACE MY_FILE001;
    Table 'T1' created.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00011');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00012');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00013');
    1 row inserted.
    
    
    SQL> COMMIT;
    Commit completed.
    
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    
    SQL> /
    System altered.
    
    
    SQL> /
    System altered.
    
    
    SQL> exit
    
    
    $ tbdown
    $ rm –f /home/tibero/tbdata/my_file001.dtf
    
    $ cp /home/tibero/tbdata_bak/*.dtf /home/tibero/tbdata
    
    
    $ tbboot mount
    
    
    $ tbsql sys/tibero
    tbSQL 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Connected to Tibero.
    
    
    SQL> ALTER DATABASE RECOVER;
    Database altered.
    
    
    SQL> ALTER DATABASE RECOVER LOGFILE '/home/tibero/tbarch/log-t0-r0-s1.arc'; 
    Database altered.
    
    SQL> ALTER DATABASE RECOVER LOGFILE '/home/tibero/tbarch/log-t0-r0-s2.arc'; 
    Database altered.
    
    SQL> ALTER DATABASE RECOVER LOGFILE '/home/tibero/tbarch/log-t0-r0-s3.arc'; 
    Database altered.
    
    SQL> select * from v$log;
    THREAD#	GROUP# SEQUENCE#  BYTES	   MEMBERS ARCHIVED  STATUS   FIRST_CHANGE#  FIRST_TIME
    ------  ------ ---------  -------- ------- --------- ------   -------------  -----------	
    0	0	4	  52428800  2	   NO	     CURRENT  14521          2023/07/15						
    0	1	2	  52428800  2	   YES	     CURRENT  14516          2023/07/15						
    0	2	3	  52428800  2	   YES	     CURRENT  14518	     2023/07/15						
    
    3 rows selected.
    
    
    SQL> select * from v$logfile;
    
    
    GROUP#	STATUS_TYPE	MEMBER
    ------  ------------    ---------------------------------
    0	ONLINE		/home/tibero/tbdata/redo01.redo
    0	ONLINE		/home/tibero/tbdata/redo02.redo
    1	ONLINE		/home/tibero/tbdata/redo11.redo
    1	ONLINE		/home/tibero/tbdata/redo12.redo
    2	ONLINE		/home/tibero/tbdata/redo21.redo
    2	ONLINE		/home/tibero/tbdata/redo22.redo
    
    6 rows selected.			
    
    
    SQL> ALTER DATABASE RECOVER LOGFILE '/home/tibero/tbdata/redo01.redo'; 
    Database altered.
    
    SQL> exit Disconnected.
    
    $ tbdown
    Tibero instance terminated (NORMAL mode).
    
    
    $ tbboot
    
    
    listener port = 8629
    change core dump dir to /home/tibero/tibero7/bin/prof
    
    
    Tibero 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Tibero instance started up (NORMAL mode).
    
    
    $ tbsql tibero/tmax
    
    
    tbSQL 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Connected to Tibero.
    
    
    SQL> select * from t1;
    
    
    C1
    -------
    00011
    00012
    00013
    
    
    3 rows selected.
    
    $ tbdown
    $ cp –R /home/tibero/tbdata /home/tibero/tbdata_bak
    $ tbboot
    
    
    $ tbsql tibero/tmax
    
    
    SQL> CREATE TABLE T1 (C1 VARCHAR(5)) TABLESPACE MY_FILE001;
    Table 'T1' created.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00011');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00012');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00013');
    1 row inserted.
    
    
    SQL> COMMIT;
    Commit completed.
    
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    
    SQL> /
    System altered.
    
    
    SQL> /
    System altered.
    
    
    SQL> exit
    
    
    $ tbdown
    $ rm –f /home/tibero/tbdata/my_file001.dtf
    
    $ tbboot mount
    
    
    $ tbsql sys/tibero
    
    
    SQL> ALTER DATABASE CREATE DATAFILE '/home/tibero/tbdata/my_file001.dtf'; 
    Database altered.
    
    SQL> ALTER DATABASE RECOVER AUTOMATIC;
    Database altered.
    
    
    SQL> exit
    
    
    $ tbdown
    
    
    $ tbboot
    
    
    $ tbsql tibero/tmax
    
    
    SQL> SELECT * FROM T1;
    
    
    C1
    -------
    00011
    00012
    00013
    
    
    3 rows selected.
    
    $ tbdown
    $ cp –R /home/tibero/tbdata /home/tibero/tbdata_bak
    $ tbboot
    
    
    $ tbsql tibero/tmax
    
    
    SQL> CREATE TABLE T1 (C1 VARCHAR(5)) TABLESPACE MY_FILE001;
    Table 'T1' created.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00011');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00012');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00013');
    1 row inserted.
    
    
    SQL> COMMIT;
    Commit completed.
    
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    
    SQL> /
    System altered.
    
    
    SQL> /
    System altered.
    
    
    SQL> exit Disconnected.
    
    
    $ rm –f /home/tibero/tbdata/my_file001.dtf
    
    $ tbsql sys/tibero tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved. 
    Connected to Tibero.
    
    SQL> alter tablespace MY_FILE001 offline immediate; 
    Tablespace 'MY_FILE001' altered.
    
    SQL> exit Disconnected.
    
    $ cp /home/tibero/tbdata_bak/my_file001.dtf /home/tibero/tbdata
    
    $ tbsql sys/tibero
    
    tbSQL 7
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> alter database recover automatic tablespace MY_FILE001; 
    Database altered.
    
    SQL> alter tablespace MY_FILE001 online; 
    Tablespace 'MY_FILE001' altered.
    
    SQL> conn tibero/tmax Connected to Tibero.
    
    SQL> select * from t1;
    
    C1
    ------
    00011
    00012
    00013
    
    3 rows selected.
    
    alter database recover automatic database until change 15666 allow <BLOCK수> corruption;
    alter database recover automatic database until time '2023/06/13 15:58:50' allow <BLOCK수
    > corruption;
    alter database recover until cancel allow <BLOCK수> corruption;
    $ tbdown
    $ cp –R /home/tibero/tbdata /home/tibero/tbdata_bak
    $ tbboot
    $ tbsql sys/tibero
    
    SQL> SELECT *	FROM V$LOG;
    
    SQL> select *	from v$log;
    
    
    THREAD#	GROUP# SEQUENCE#  BYTES	    MEMBERS  ARCHIVED STATUS    FIRST_CHANGE#  FIRST_TIME
    ------  ------ ---------  --------  -------  -------- --------  -------------- ------------
    0	0	1	  52428800  2	     YES      INACTIVE  0								
    0	1	2	  52428800  2	     NO	      CURRENT   15543	       2023/07/15						
    0	2      -1	  52428800  2	     NO	      UNUSED    0	
    
    										
    3 rows selected.
    
    
    SQL> CREATE TABLE T1 (C1 VARCHAR(5));
    Table 'T1' created.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00011');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00012');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00013');
    1 row inserted.
    
    
    SQL> COMMIT;
    Commit completed.
    
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00021');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00022');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00023');
    1 row inserted.
    
    
    SQL> COMMIT;
    Commit completed.
    
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00031');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00032');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00033');
    1 row inserted.
    
    
    SQL> COMMIT;
    Commit completed.
    
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00041');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00042');
    1 row inserted.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00043');
    1 row inserted.
    
    
    SQL> COMMIT;
    Commit completed.
    
    
    SQL> exit Disconnected.
    
    $ tbdown
    
    
    Tibero instance terminated (NORMAL mode).
    $ rm /home/tibero/tbdata/*.dtf
    
    
    $ tbboot
    
    
    listener port = 8629
    change core dump dir to /home/tibero/tibero7/bin/prof
    
    
    ********************************************************
    *Critical Warning : Raise svmode failed. The reason is
    *TBR-1024 : Database needs media recovery:
    open failed(/home/tibero/tbdata/system001.dtf).
    *Current server mode is MOUNT.
    ********************************************************
    
    
    Tibero 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    Tibero instance started up (MOUNT mode).
    
    $ tbdown
    
    
    Tibero instance terminated (NORMAL mode).
    
    
    $ cp /home/tibero/tbdata_bak/*.dtf /home/tibero/tbdata
    
    
    $ tbboot mount
    
    
    Listener port=8629
    change core dump dir to /home/tibero/tibero7/bin/prof
    
    
    Tibero 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved. 
    Tibero instance started up (MOUNT mode).
    
    $ tbsql sys/tibero
    
    
    tbSQL 7
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Connected to Tibero.
    
    
    SQL> SELECT * FROM V$LOG;
    
    SQL> select * from v$log;
    
    THREAD#	GROUP# SEQUENCE#  BYTES	    MEMBERS  ARCHIVED STATUS    FIRST_CHANGE#  FIRST_TIME
    ------  ------ ---------  --------  -------  -------- --------  -------------- ------------
    	
    0	0	4	  52428800  2	     YES      INACTIVE  15652	       2023/07/15						
    0	1	5	  52428800  2	     NO	      CURRENT   15667	       2023/07/15						
    0	2	3	  52428800  2	     YES      INACTIVE  15619	       2023/07/15						
    
    3 rows selected.
    
    
    --next_change# - 1 값 조회
    SQL> set line 200 
    SQL> col name for a40 
    SQL> col SEQ# for 999
    SQL> col TSN for 999999999
    SQL> select name, sequence# seq#, next_change#-1 tsn 
    from v$archive_dest_files order by 2;
    
    NAME						SEQ#		TSN
    ---------------------------------------         ----------      -------------
    /home/tibero/tbarch/log-t0-r0-s1.arc		1		15542
    /home/tibero/tbarch/log-t0-r0-s2.arc		2		15618
    /home/tibero/tbarch/log-t0-r0-s3.arc		3		15651
    /home/tibero/tbarch/log-t0-r0-s4.arc		4		15666
    
    4 rows selected.
    
    --TSN 정보가 없을 경우 Log 파일 덤프를 발생시킨다.
    SQL> alter system dump logfile '/home/tibero/tbarch/log-t0-r0-s4.arc'; 
    System altered.
    
    SQL> exit 
    Disconnected.
    
    $ cd $TB_HOME/instance/$TB_SID/dump/tracedump
    $ ls -rlt 
    total 1
    -rw-r--r-- 1 tibero dba 12420 Jun 15 22:37 tb_dump_13457_3_0.trc
    
    
    --next_tsn 값을 10진수로 변경 : 0000.0000b227 (hex) => 15667 (dec)
    --next_tsn - 1 = 15666
    $ cat tb_dump_21951_18_2.trc | grep next
    
    
    low=0000.00003d24 2023-06-14 09:21:26 next=0000.00003d33 2023-06-14 09:21:59
    
    
    $ tbsql sys/tibero
    
    
    tbSQL 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved. 
    Connected to Tibero.
    
    SQL> alter database recover automatic database until change 15666; 
    Database altered.
    
    SQL> exit 
    Disconnected.
    
    $ tbdown
    
    
    Tibero instance terminated (NORMAL mode).
    
    
    $ tbboot -t resetlogs
    
    
    listener port = 8629
    change core dump dir to /home/tibero/tibero7/bin/prof
    
    
    Tibero 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Tibero instance started up (NORMAL RESETLOGS mode).
    
    
    $ tbsql tibero/tmax
    
    
    tbSQL 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Connected to Tibero.
    
    
    
    SQL> select * from t1;
    
    
    C1
    ------
    00021
    00022
    00023
    00031
    00032
    00033
    00011
    00012
    00013
    
    
    9 rows selected.
    
    $ tbdown
    
    $ cp –R /home/tibero/tbdata /home/tibero/tbdata_bak
    
    $ tbboot
    
    $ tbsql sys/tibero
    
    tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> CREATE TABLE T1 (C1 VARCHAR(5));
    Table 'T1' created.
    
    SQL> INSERT INTO T1 (C1) VALUES ('00011');
    1 row inserted.
    
    SQL> COMMIT;
    Commit completed.
    
    SQL> select * from t1; 
    C1
    -----
    00011
    
    1 row selected.
    
    SQL> !date
    Thu Jun 15 15:58:50 KST 2023
    
    SQL> INSERT INTO T1 (C1) VALUES ( '00021');
    1 row inserted.
    
    SQL> COMMIT;
    Commit completed.
    
    SQL> select * from t1;
    
    
    C1
    ------
    00011
    00021
    
    2 rows selected.
    
    
    SQL> exit Disconnected.
    
    $ tbdown
    
    
    Tibero instance terminated (NORMAL mode).
    
    
    $ rm /home/tibero/tbdata/*.dtf
    
    
    $ tbboot
    
    
    listener port = 8629
    
    
    change core dump dir to /home/tibero/tibero7/bin/prof
    
    
    ********************************************************
    *	Critical Warning : Raise svmode failed. The reason is
    *	TBR-1024 : Database needs media recovery:
    
    
    open failed(/home/tibero/tbdata/system001.dtf).
    
    
    *	Current server mode is MOUNT.
    ********************************************************
    
    
    Tibero 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Tibero instance started suspended at MOUNT mode.
    
    $ tbdown
    Tibero instance terminated (NORMAL mode).
    
    $ cp /home/tibero/tbdata_bak/*.dtf /home/tibero/tbdata
    
    $ tbboot mount
    
    listener port = 8629
    change core dump dir to /home/tibero/tibero7/bin/prof
    
    Tibero 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Tibero instance started up (MOUNT mode).
    
    $ export TB_NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS'
    
    $ tbsql sys/tibero
    
    
    tbSQL 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Connected to Tibero.
    
    
    SQL> alter database recover automatic database until time '2023/06/13 15:58:50'; 
    Database altered.
    
    SQL> exit Disconnected.
    $ tbdown
    
    
    Tibero instance terminated (NORMAL mode).
    
    
    $ tbboot resetlogs
    
    
    listener port = 8629
    
    
    change core dump dir to /home/tibero/tibero7/bin/prof Tibero 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Tibero instance started up (NORMAL RESETLOGS mode).
    
    
    $ tbsql tibero/tmax
    
    
    tbSQL 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Connected to Tibero.
    
    
    SQL> select * from t1;
    
    
    C1
    ------
    00011
    
    1 row selected.
    $ tbdown
    $ cp –R /home/tibero/tbdata /home/tibero/tbdata_bak
    
    
    $ tbboot
    
    
    listener port = 8629
    
    
    change core dump dir to /home/tibero/tibero7/bin/prof Tibero 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Tibero instance started up (NORMAL mode).
    
    
    $ tbsql sys/tibero tbSQL 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Connected to Tibero.
    
    
    SQL> CREATE TABLE T1 (C1 VARCHAR(5)) TABLESPACE MY_FILE001;
    Table 'T1' created.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00011');
    1 row inserted.
    
    
    SQL> COMMIT;
    Commit completed.
    
    
    SQL> select * from t1;
    
    
    C1
    
    00011
    
    
    1 row selected.
    
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    
    SQL> col name format a40;
    SQL> select name, sequence# from v$archived_log order by sequence#;
    
    
    NAME	                                SEQUENCE#
    ------------------------------------    -----------
    home/tibero/tbarch/log-t0-r0-s1.arc	1
    
    
    1 row selected.
    
    
    SQL> exit 
    Disconnected.
    
    $ tbdown
    Tibero instance terminated (NORMAL mode).
    
    
    $ rm /home/tibero/tbdata/*.dtf
    
    
    $ tbboot
    
    
    listener port = 8629
    change core dump dir to /home/tibero/tibero7/bin/prof
    
    
    ******************************************************** 
    Critical Warning : Raise svmode failed. The reason is 
    TBR-1024 : Database needs media recovery:
    open failed(/home/tibero/tbdata/system001.dtf). 
    Current server mode is MOUNT.
    ********************************************************
    
    
    Tibero 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved. 
    Tibero instance started up (MOUNT mode).
    
    $ tbdown
    
    Tibero instance terminated (NORMAL mode).
    
    $ cp /home/tibero/tbdata_bak/*.dtf /home/tibero/tbdata
    $ tbboot mount
    
    listener port = 8629
    change core dump dir to /home/tibero/tibero7/bin/prof
    
    Tibero 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Tibero instance started up (MOUNT mode).
    
    $ tbsql sys/tibero
    
    tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved..
    
    Connected to Tibero.
    
    SQL> ALTER DATABASE RECOVER DATABASE UNTIL CANCEL;
    Database altered.
    
    SQL> ALTER DATABASE RECOVER LOGFILE '/home/tibero/tbarch/log-t0-r0-s1.arc'; 
    Database altered.
    
    SQL> ALTER DATABASE RECOVER CANCEL;
    Database altered.
    
    SQL> exit 
    Disconnected.
    
    $ tbdown
    
    Tibero instance terminated (NORMAL mode).
    
    $ tbboot -t resetlogs
    
    listener port = 8629
    change core dump dir to /home/tibero/tibero7/bin/prof
    
    Tibero 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved..
    
    Tibero instance started up (NORMAL RESETLOGS mode).
    
    $ tbsql sys/tibero
    
    tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero. SQL> select * from t1;
    
    C1
    ------
    00011
    
    1 row selected.
    
    alter database recover database until cancel;
    alter database recover logfile '<logfile name>';
    alter database recover continue;
    alter database recover cancel;
    $ tbsql sys/tibero
    
    tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> select * from v$log;
    
    THREAD#	GROUP#  SEQUENCE#  BYTES     MEMBERS  ARCHIVED STATUS    FIRST_CHANGE#  FIRST_TIME
    ------  ------  ---------  --------  -------  -------- --------  -------------- ------------
    0	0	7	   52428800  1	      NO       CURRENT	 39873          2023/07/15						
    0	1	5	   52428800  1	      YES      INACTIVE  39862          2023/07/15						
    0	2	6	   52428800  1	      YES      INACTIVE	 39870          2023/07/15						
    1	3	7	   52428800  1	      NO       CURRENT	 39880          2023/07/15						
    1	4	5	   52428800  1	      YES      INACTIVE	 39875          2023/07/15						
    1	5	6	   52428800  1	      YES      INACTIVE	 39878          2023/07/15						
    
    6 rows selected.
    
    SQL> CREATE TABLE T1 (C1 VARCHAR(5));
    Table 'T1' created.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00011');
    1 row inserted.
    
    
    SQL> COMMIT;
    Commit completed.
    
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00012');
    1 row inserted.
    
    
    SQL> COMMIT;
    Commit completed.
    
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    
    SQL> exit
    Disconnected.
    
    
    $ tbdown
    
    
    Tibero instance terminated (NORMAL mode).
    
    $ tbsql sys/tibero
    
    tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> INSERT INTO T1 (C1) VALUES ('00013');
    1 row inserted.
    
    SQL> COMMIT;
    Commit completed.
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    SQL> exit 
    Disconnected.
    
    $ tbdown
    
    Tibero instance terminated (NORMAL mode)
    
    $ dd if=/dev/zero of=/dev/rdata4g081 bs=8192k 
    514+0 records in
    512+0 records out
    
    
    $ dd if=/dev/zero of=/dev/rdata4g082 bs=8192k 
    514+0 records in
    512+0 records out
    
    
    $ dd if=/dev/zero of=/dev/rdata4g083 bs=8192k 
    514+0 records in
    512+0 records out
    
    
    $ dd if=/dev/zero of=/dev/rdata4g084 bs=8192k 
    514+0 records in
    512+0 records out
    
    
    $ dd if=/dev/zero of=/dev/rdata4g085 bs=8192k 
    514+0 records in
    512+0 records out
    
    
    $ dd if=/dev/zero of=/dev/rdata4g086 bs=8192k 
    514+0 records in
    512+0 records out
    
    
    $ tbboot
    change core dump dir to /home/tibero/tibero7/bin/prof 
    listener port = 8629
    
    ******************************************************** 
    Critical Warning : Raise svmode failed. The reason is
    TBR-1024:Database needs media recovery:wrong database file(/dev/rdata4g081). 
    Current server mode is MOUNT.
    ********************************************************
    
    
    Tibero 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved. 
    Tibero instance started suspended at MOUNT mode.
    
    $ dd if=/data1/tstac1/bak/system001.dtf of=/dev/rdata4g081 bs=8192k 
    512+0 records in
    512+0 records out
    
    
    $ dd if=/data1/tstac1/bak/usr001.dtf of=/dev/rdata4g082 bs=8192k 
    512+0 records in
    512+0 records out
    
    
    $ dd if=/data1/tstac1/bak/temp001.dtf of=/dev/rdata4g083 bs=8192k 
    512+0 records in
    512+0 records out
    
    
    $ dd if=/data1/tstac1/bak/undo001.dtf of=/dev/rdata4g084 bs=8192k 
    512+0 records in
    512+0 records out
    
    
    $ dd if=/data1/tstac1/bak/undo002.dtf of=/dev/rdata4g086 bs=8192k 
    512+0 records in
    512+0 records out
    
    
    $ dd if=/data1/tstac1/bak/apm_ts.dtf of=/dev/rdata4g085 bs=8192k 
    512+0 records in
    512+0 records out
    
    ftp> ls -rlt
    200 PORT command successful.
    150 Opening data connection for /bin/ls. total 416
    
    
    -rw------- 1 tstac2	tsteam 211456 Jun 22 12:33 log-t1-r0-s7.arc
    
    
    226 Transfer complete. 
    ftp> bi
    200 Type set to I. 
    ftp> ha
    Hash mark printing on (1024 bytes/hash mark).
    ftp> mget *.arc
    mget log-t1-r0-s7.arc? y
    200 PORT command successful.
    150 Opening data connection for log-t1-r0-s7.arc (211456 bytes). 
    ################################################################
    226 Transfer complete.
    211456 bytes received in 0.003092 seconds (6.679e+04 Kbytes/s) 
    local: log-t1-r0-s7.arc remote: log-t1-r0-s7.arc
    
    $ tbboot
    change core dump dir to /home/tibero/tibero7/bin/prof listener port = 8629
    
    ********************************************************
    *Critical Warning : Raise svmode failed. The reason is
    *TBR-1024 : Database needs media recovery: file restored(/dev/rdata4g081).
    *Current server mode is MOUNT.
    ********************************************************
    
    
    Tibero 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Tibero instance started suspended at MOUNT mode.
    
    
    $ tbsql sys/tibero
    
    
    tbSQL 7
    
    
    Tibero Corporation Copyright © 2020-. All rights reserved.
    
    
    Connected to Tibero.
    
    
    SQL> select * from v$log;
    
    THREAD#	GROUP#  SEQUENCE#  BYTES     MEMBERS  ARCHIVED STATUS    FIRST_CHANGE#  FIRST_TIME
    ------  ------  ---------  --------  -------  -------- --------  -------------- ------------
    0	0	7	   52428800  1	      YES      CURRENT	 39873          2023/07/15						
    0	1	8	   52428800  1	      YES      INACTIVE	 41124          2023/07/15						
    0	2	9	   52428800  1	      NO       INACTIVE	 41133          2023/07/15						
    1	3	7	   52428800  1	      YES      CURRENT	 39980          2023/07/15						
    1	4	8	   52428800  1	      NO       INACTIVE	 41149          2023/07/15						
    1	5	6	   52428800  1	      UES      INACTIVE	 39878          2023/07/15						
    
    6 rows selected.
    
    SQL> select * from v$archive_dest_files;
    
    NAME                                        THREAD# SEQUENCE# FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# RESETLOGS_CHANGE# RESETLOGS_TIME
    -----------------------------------------   ------- --------- ------------- ---------- ------------ ----------------- ---------------
    /home/tibero/tbdata/arch/log-t0-r0-s7.arc   0	    7	      39873         2023/07/15 41124	    0
    /home/tibero/tbdata/arch/log-t0-r0-s8.arc   0	    8	      41124         2023/07/15 41133	    0
    /home/tibero/tbdata/arch/log-t0-r0-s7.arc   1	    7	      39980         2023/07/15 41149	    0
    
    3 rows selected.
    
    SQL> select * from v$logfile;
    
    
    GROUP#   STATUS_TYPE	MEMBER 
    -------  ------------   ---------------------------
    0	 ONLINE		/dev/rdata1g123
    1	 ONLINE		/dev/rdata1g124
    2	 ONLINE		/dev/rdata1g125
    3	 ONLINE		/dev/rdata1g126
    4	 ONLINE		/dev/rdata1g127
    5	 ONLINE		/dev/rdata1g128
    
    6 rows selected.
    
    SQL> ALTER DATABASE RECOVER DATABASE UNTIL CANCEL;
    Database altered.
    SQL> ALTER DATABASE RECOVER LOGFILE '/data1/tstac1/tbdata/arch/log-t0-r0-s7.arc';
    Database altered.
    
    SQL> ALTER DATABASE RECOVER LOGFILE '/data1/tstac1/tbdata/arch/log-t1-r0-s7.arc'; 
    Database altered.
    
    SQL> ALTER DATABASE RECOVER CONTINUE;
    Database altered.
    
    
    SQL> ALTER DATABASE RECOVER LOGFILE '/data1/tstac1/tbdata/arch/log-t0-r0-s8.arc'; D
    atabase altered.
    
    SQL> ALTER DATABASE RECOVER CONTINUE;
    Database altered.
    
    
    SQL> ALTER DATABASE RECOVER LOGFILE '/dev/rdata1g125';
    Database altered.
    
    
    SQL> ALTER DATABASE RECOVER CONTINUE;
    Database altered.
    
    SQL> ALTER DATABASE RECOVER CANCEL;
    Database altered.
    SQL> exit 
    Disconnected.
    
    $ tbdown
    
    
    Tibero instance terminated (NORMAL mode).
    
    
    $ tbboot -t resetlogs
    
    
    change core dump dir to /home/tibero/tibero7/bin/prof
    
    
    listener port = 8629
    
    
    Tibero 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Tibero instance started up (NORMAL RESETLOGS mode).
    
    
    $ tbsql sys/tibero
    
    
    tbSQL 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    Connected to Tibero.
    
    
    SQL> select * from t1;
    
    
    C1
    -------
    00011
    00012
    00013
    
    
    3 rows selected.
    
    $ tbsql sys/tibero
    
    
    tbSQL 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Connected to Tibero.
    
    
    SQL> set line 200
    SQL> col group# for 999 SQL> col member for a50 SQL> col SEQ# for 999 SQL> col MB for 999
    SQL> select a.group#, a.member, b.bytes/1024/1024 "MB", b.archived "ARC",
    b.sequence# "SEQ#", b.status from v$logfile a, v$log b where a.group#=b.group# order by 1;
    
    
    
    GROUP#	MEMBER	          MB	ARC	SEQ#	STATUS
    ------  ---------------   ----  ----    -----   ---------
    0	/dev/rdata1g123	  50	NO	 1	CURRENT
    1	/dev/rdata1g124	  50	NO      -1	UNUSED
    2	/dev/rdata1g125	  50	NO	-1	UNUSED
    3	/dev/rdata1g126	  50	NO	 1	CURRENT
    4	/dev/rdata1g127	  50	NO	-1	UNUSED
    5	/dev/rdata1g128	  50	NO	-1	UNUSED
    
    6 rows selected.
    
    
    SQL> alter database begin backup;
    
    
    Database altered.
    
    
    SQL> !dd if=/dev/rdata4g081 of=/data1/tstac1/bak/system001.dtf bs=8192k 
    512+0 records in
    512+0 records out
    
    SQL> !dd if=/dev/rdata4g082 of=/data1/tstac1/bak/usr001.dtf bs=8192k 512+0 records in
    512+0 records out
    
    
    SQL> !dd if=/dev/rdata4g084 of=/data1/tstac1/bak/undo001.dtf bs=8192k 
    512+0 records in
    512+0 records out
    
    
    SQL> !dd if=/dev/rdata4g086 of=/data1/tstac1/bak/undo002.dtf bs=8192k 
    512+0 records in
    512+0 records out
    
    
    SQL> !dd if=/dev/rdata4g085 of=/data1/tstac1/bak/apm_ts.dtf bs=8192k 
    512+0 records in
    512+0 records out
    
    
    SQL> alter database end backup; 
    Database altered.
    
    SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS
    '/home/tibero/bak/c1.sql' REUSE RESETLOGS;
    
    
    Database altered.
    
    SQL> CREATE TABLE T1 (C1 VARCHAR(5));
    Table 'T1' created.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00011');
    1 row inserted.
    
    
    SQL> COMMIT;
    Commit completed.
    
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00012');
    1 row inserted.
    
    
    SQL> COMMIT;
    Commit completed.
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    
    SQL> /
    System altered.
    
    
    SQL> /
    System altered.
    $ tbsql sys/tibero
    
    
    tbSQL 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Connected to Tibero.
    
    
    SQL> INSERT INTO T1 (C1) VALUES ('00013');
    1 row inserted.
    
    
    SQL> COMMIT;
    Commit completed.
    
    SQL> ALTER SYSTEM SWITCH LOGFILE;
    System altered.
    
    
    SQL> /
    System altered.
    
    
    SQL> /
    System altered.
    CONTROL_FILES="/home/tibero/tbdata/tac1/c1.ctl" 
    DB_CREATE_FILE_DEST="/home/tibero/tbdata" 
    LOG_ARCHIVE_DEST="/home/tibero/tbdata/arch"
    #CLUSTER_DATABASE=Y #THREAD=0 
    #UNDO_TABLESPACE=UNDO0 
    #CM_CLUSTER_MODE=ACTIVE_SHARED 
    #CM_PORT=58631 
    #LOCAL_CLUSTER_ADDR=10.10.1.1 
    #LOCAL_CLUSTER_PORT=58632
    #CM_FILE_NAME=/dev/rdata1g122
    --Online으로 백업받은 데이터 파일을 Single 서버로 복사
    $ cp /data1/tstac1/bak/*.dtf /home/tibero/tbdata
    
    
    --백업받은 컨트롤 파일을 Single 서버로 복사
    $ cp /data1/tstac1/bak/c1.sql /home/tibero/tbdata
    
    
    --NODE1, NODE2의 Archive 파일을 Single 서버로 복사
    $ cp /data1/tstac1/tbdata/arch/*.arc /home/tibero/tbdata/arch
    
    
    ...(ftp 접속절차는 생략) 
    ftp> bi
    200 Type set to I. 
    ftp> ha
    Hash mark printing on (1024 bytes/hash mark). 
    ftp> prompt off
    Interactive mode off.
    ftp> mget *.arc
    200 PORT command successful.
    150 Opening data connection for log-t1-r0-s1.arc (77312 bytes). 
    ############################################################################
    226 Transfer complete.
    77312 bytes received in 0.001275 seconds (5.922e+04 Kbytes/s) 
    local: log-t1-r0-s1.arc remote: log-t1-r0-s1.arc
    200 PORT command successful.
    150 Opening data connection for log-t1-r0-s2.arc (1024 bytes). 
    ##
    226 Transfer complete.
    1024 bytes received in 5.8e-05 seconds (1.724e+04 Kbytes/s) 
    local: log-t1-r0-s2.arc remote: log-t1-r0-s2.arc
    200 PORT command successful.
    150 Opening data connection for log-t1-r0-s3.arc (512 bytes). 
    #
    226 Transfer complete.
    512 bytes received in 4.9e-05 seconds (1.02e+04 Kbytes/s)
    local: log-t1-r0-s3.arc remote: log-t1-r0-s3.arc
    200 PORT command successful.
    150 Opening data connection for log-t1-r0-s4.arc (512 bytes). 
    #
    226 Transfer complete.
    512 bytes received in 5.2e-05 seconds (9615 Kbytes/s) 
    local: log-t1-r0-s4.arc remote: log-t1-r0-s4.arc
    ftp> bye
    221 Goodbye.
    
    
    $ ls -rlt /home/tibero/tbdata/arch 
    total 43112
    -rw-------	1	tibero	dba	512 Jul 15 11:53 log-t0-r0-s5.arc
    -rw-------	1	tibero	dba	512 Jul 15 11:53 log-t0-r0-s4.arc
    -rw-------	1	tibero	dba	2560 Jul 15 11:53 log-t0-r0-s3.arc
    -rw-------	1	tibero	dba	1536 Jul 15 11:53 log-t0-r0-s2.arc
    -rw-------	1	tibero	dba	21959680 Jul 15 11:53 log-t0-r0-s1.arc
    -rw-r--r--	1	tibero	dba	512 Jul 15 11:54 log-t1-r0-s4.arc
    -rw-r--r--	1	tibero	dba	512 Jul 15 11:54 log-t1-r0-s3.arc
    -rw-r--r--	1	tibero	dba	1024 Jul 15 11:54 log-t1-r0-s2.arc
    -rw-r--r--	1	tibero	dba	77312 Jul 15 11:54 log-t1-r0-s1.arc
    
    $ tbboot nomount
    
    
    listener port = 8629
    
    
    change core dump dir to /home/tibero/tibero7/bin/prof
    
    
    Tibero 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Tibero instance started up (NOMOUNT mode).
    
    
    $ tbsql sys/tibero
    
    
    tbSQL 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Connected to Tibero.
    
    
    --백업받은 컨트롤 파일 스크립트에서 Redo 파일, 데이터 파일 경로
    --수정 후 컨트롤 파일 재생성
    SQL> !vi /home/tibero/tbdata/c1.sql
    
    
    CREATE CONTROLFILE REUSE DATABASE "tibero" LOGFILE
    GROUP 0 '/home/tibero/tbdata/redo01.redo' SIZE 50M, 
    GROUP 1 '/home/tibero/tbdata/redo02.redo' SIZE 50M,
    GROUP 2 '/home/tibero/tbdata/redo03.redo' SIZE 50M 
    RESETLOGS
    DATAFILE
    '/home/tibero/tbdata/system001.dtf', 
    '/home/tibero/tbdata/undo001.dtf', 
    '/home/tibero/tbdata/usr001.dtf', 
    '/home/tibero/tbdata/undo002.dtf', 
    '/home/tibero/tbdata/apm_ts.dtf' 
    ARCHIVELOG
    MAXLOGFILES 100
    MAXLOGMEMBERS 8
    MAXDATAFILES 1024 
    CHARACTER SET MSWIN949
    NATIONAL CHARACTER SET UTF16
    ;
    --ALTER DATABASE MOUNT
    ---- Adding Logfiles is required in MOUNT mode.
    --ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 3 '/dev/rdata1g126' SIZE 50M reuse;
    --ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 4 '/dev/rdata1g127' SIZE 50M reuse;
    --ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 5 '/dev/rdata1g128' SIZE 50M reuse;
    --ALTER DATABASE ENABLE PRIVATE THREAD 1;
    ---- Recovery is required in MOUNT mode.
    --ALTER DATABASE RECOVER AUTOMATIC;
    
    
    --ALTER DATABASE OPEN RESETLOGS;
    
    
    ---- Adding Tempfiles is required in OPEN mode.
    -- ALTER TABLESPACE TEMP ADD TEMPFILE '/data1/tstac1/bak/temp001.dtf'
    -- SIZE 512M REUSE AUTOEXTEND OFF ;
    
    
    SQL> @/home/tibero/tbdata/c1.sql
    
    
    Control File created.
    
    
    File finished.
    
    
    SQL> exit 
    Disconnected.
    
    $ tbdown
    
    
    Tibero instance terminated (NORMAL mode).
    
    $ tbboot mount
    
    listener port = 8629
    change core dump dir to /home/tibero/tibero7/bin/prof Tibero 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Tibero instance started up (MOUNT mode).
    
    $ tbsql sys/tibero tbSQL 7
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    Connected to Tibero.
    
    SQL> select * from v$archive_dest_files;
    
    NAME                                       THREAD#  SEQUENCE#  FIRST_CHANGE#  FIRST_TIME  NEXT_CHANGE#  RESETLOGS_CHANGE# RESETLOGS_TIME
    -----------------------------------------  -------  ---------  -------------  ----------  ------------  ----------------- --------------
    /home/tibero/tbdata/arch/log-t0-r0-s1.arc  0	    1	       0	      2023/07/15  14135	        0
    /home/tibero/tbdata/arch/log-t0-r0-s2.arc  0	    2	       14135	      2023/07/15  14140	        0
    /home/tibero/tbdata/arch/log-t0-r0-s3.arc  0	    3	       14140	      2023/07/15  14604	        0
    /home/tibero/tbdata/arch/log-t0-r0-s4.arc  0	    4	       14604	      2023/07/15  14606	        0
    /home/tibero/tbdata/arch/log-t0-r0-s5.arc  0	    5	       14606	      2023/07/15  14609	        0
    /home/tibero/tbdata/arch/log-t1-r0-s1.arc  1	    1	       0	      2023/07/15  14585	        0
    /home/tibero/tbdata/arch/log-t1-r0-s2.arc  1	    2	       14585	      2023/07/15  14617	        0
    /home/tibero/tbdata/arch/log-t1-r0-s3.arc  1	    3	       14617	      2023/07/15  14620	        0
    /home/tibero/tbdata/arch/log-t1-r0-s4.arc  1	    4	       14620	      2023/07/15  14622	        0
    
    9 rows selected.
    
    
    --복구할 때 사용 된 TSN 번호는 각 노드의 마지막 Archive Log 파일에서
    --TSN - 1 값 중 작은 값(예 : min(NODE1, NODE2) = min(14609-1, 14622-1) = 14608)
    SQL> alter database recover automatic database until change 14608; 
    Database altered.
    
    SQL> exit 
    Disconnected.
    
    $ tbdown
    
    
    Tibero instance terminated (NORMAL mode).
    
    
    $ tbboot -t resetlogs
    listener port = 8629
    
    
    change core dump dir to /home/tibero/tibero7/bin/prof Tibero 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Tibero instance started up (NORMAL RESETLOGS mode).
    
    
    $ tbsql sys/tibero
    
    
    tbSQL 7
    
    
    TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
    
    
    Connected to Tibero.
    
    SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/home/tibero/tbdata/temp001.dtf' 
    SIZE 512M REUSE AUTOEXTEND OFF ;
    Tablespace 'TEMP' altered.
    
    
    SQL> select * from t1; 
    C1
    ------
    00011
    00012
    00013
    
    
    3 rows selected.