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...
티맥스티베로 기술문서를 한 곳에서 확인하세요! Tibero DBMS 관련 다양한 기술 가이드와 참고 자료를 검색하여 활용하실 수 있습니다.
티베로 시작하기
클라우드 최적화 Tibero DBMS 소개부터 처음 사용 시 필요한 정보들을 안내합니다.
주제별
티베로 DBMS 사용 가이드를 주제별로 안내합니다. 설치부터 전환, 관리, 개발, 보안 관련 정보를 확인하세요.


티베로 DBMS 사용 가이드를 주제별로 안내합니다. 설치부터 전환, 관리, 개발, 보안 관련 정보를 확인하세요.
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
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을 확인한다.
DBA_TEMP_FREE_SPACE
(SQL, tbPSM, Text and tbESQL)
Tibero DBMS는 고성능, 고가용성 및 확장성의 문제를 해결하는 엔터프라이즈 데이터베이스관리시스템 입니다.
현재 기업의 비즈니스는 폭발적인 데이터의 증가와 다양한 환경 및 플랫폼의 등장으로 빠르게 확장되고 있습니다. 새로운 비즈니스 환경이 도래함에 따라 보다 더 효율적이고 유연한 데이터 서비스와 정보의 처리, 데이터 관리 기능이 필요하게 되었습니다.
기존 DB의 단점을 보완하기 위해 Tibero 는 독자적인 Tibero Thread Architecture를 채택, 구현했습니다.
한정된 서버 프로세스의 CPU 및 메모리 등의 시스템 리소스를 효율적으로 사용하면서 뛰어난 성능과 안정성 및 확장성을 보장하고 편리한 개발 환경과 관리 기능을 제공합니다.
RDBMS 환경에서 요구되는 주요 기능인 분산 데이터베이스 링크(Distributed Database Link), 데이터 이중화(Data Replication), 데이터베이스 클러스터(Data Cluster), 병렬 질의 처리 (Parallel Query Processing) 등의 기능을 갖추고 있습니다.
티베로 DB전환 방법의 다양한 유형을 설명합니다.
아래는 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번 거쳐서 데이터가 이동합니다.
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이 필요합니다. 해당 고객사에서 각 전환 방법의 테스트 및 시간 측정을 통해 최소한의 전환 시간을 확보해야 합니다.
조건절 또는 파티션 테이블 사용이 가능합니다.
tbLoader
Source DB에서 SAM 파일 생성이 가능할 경우 사용합니다.
수동 이관
전환 난이도가 어려워 다른 전환 방법을 적용하기가 힘든 경우와 동일한 전환을 특정 기간에 걸쳐 반복적으로 수행해야 할 경우 사용합니다. (자동화 스크립트를 이용하면 2차 이상의 반복적인 수행일 경우에 간편합니다.)
T-UP
GUI 기반으로 간편하게 전환을 할 경우(전체, 사용자 모드)와 수동 이관할 때 데이터 이관 용도로 사용합니다.
Table Migrator
DB Link 구성이 어렵고 대용량 테이블 데이터를 이관할 때 사용합니다.
DB Link





Table Migrator 사용이 어렵고 대용량 테이블 데이터를 이관할 때 사용합니다.
대용량 데이터 이관 방법 및 고려사항, 예제와 데이터베이스 성능 개선에 대해 안내합니다.
이기종 데이터베이스를 이관할 때 대용량 테이블이 있다면 이관 방법을 통해 수행 시간을 단축할 수 있습니다. 고객사의 환경(네트워크, Disk I/O, 데이터 속성)을 고려하여 적절한 방법을 선택합니다.
아래는 이관 방법들의 특징에 대한 설명입니다.
T-UP
GUI 기반의 클라이언트 (네트워크 오버헤드가 커서 대용량 데이터를 이관할 경우 미권장)
DPL을 지원
아래는 각 데이터 이관 방법들이 지원하는 방식에 대한 설명입니다.
아래는 대용량 데이터를 이관할 때 고려해야 할 사항입니다.
충분한 네트워크 대역을 확보합니다.
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개의 장으로 구성됩니다.
대용량 데이터 이관 방법의 예제를 설명합니다.
🔎
각 상황에 따른 성능 개선 방법에 대해 설명합니다.
🔎
LONG 컬럼이 포함된 255개 이상의 Column을 가진 테이블은 DPL을 미지원합니다.
LOB 계열의 컬럼이 있는 경우 DPL만 지원합니다.
INDEX가 생성되어 있는 경우 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
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
클라우드 최적화 DBMS Tibero에 대한 소개부터 처음 사용 시 필요한 정보들을 안내합니다.
Windows 환경 내 티베로 DBMS 클라이언트 설치 관련하여 사전 준비사항, 고려사항, 설치 방법에 대해 설명합니다.
본 문서는 총 2개의 장으로 구성됩니다.
Tibero 클라이언트 설치 전 준비사항과 주의사항 및 설치 후 고려사항에 대해서 설명합니다.
🔎
Windows 환경에서 Tibero 클라이언트를 수동 모드로 설치하는 방법을 설명합니다.
🔎
티베로 DB전환 전 고려사항에 대해서 설명합니다.
다음은 DB 전환 수행 절차 입니다. 전환을 위해서는 DB 전환팀과 AP 전환 및 테스트팀이 필요합니다.
다른 DB에서 Tibero DB로 전환할 때 상황에 따라 난이도가 구분되며 난이도에 따라 전환 방법이 달라질 수 있습니다.
아래는 각 난이도에 대한 상황의 설명입니다.
전환 검증 시간을 줄이기 위하여 전환을 시작하기 전 고객사의 DB 담당자는 Source DB의 INVALID한 Object를 정리하는 것이 좋습니다.
T-UP의 Analysis 기능을 이용해 전환 전 호환성 검증을 진행합니다.
티베로 DBMS 업그레이드 방법을 안내합니다.
논리적 백업 및 복구(exp 및 imp)를 이용해 Tibero 6에서 Tibero 7로 업그레이드 방법을 안내합니다.
[Tibero6 to Tibero7 전환 구성도]
Tibero 유틸리티 exp 및 imp 사용을 위한 JDK 1.7 이상 설치
exp 및 imp 덤프 파일을 생성, 복사할 충분한 디스크 공간
Tibero의 SYS 계정 또는 DBA 계정
본 문서는 총 4개의 장으로 구성됩니다.
Source DB인 Tibero6의 업그레이드 진행을 위한 작업 절차를 설명합니다.
🔎
Target DB인 Tibero 7의 작업 절차를 설명합니다.
Target DB의 Object 및 Constraint 개수와 비교하여 Object Count 및 Constraint를확인합니다.
JDBC, ODBC, DB Link 등 활용한 I/F Driver 변경을 안내합니다.
쉬움
몇 개의 Schema(=사용자)로 구성되어 있습니다.
Object들 사이에 의존성이 복잡하게 구성되어 있지 않습니다.
실제 사용하는 Object들로 구성되어 있으며 모두 VALID 상태 입니다.
어려움
다수의 Schema(=사용자)로 구성되어 있으며 Object들 사이에 의존성이 복잡하게 구성되어 있습니다.
Object들이 사용되지 않는 것들이 많으며 INVALID 상태입니다.
Source DB에서 에러가 발생하면 Tibero에서도 에러가 발생합니다.





Tibero Database Undo 테이블스페이스 크기 산정 방법에 대해 설명합니다.
데이터의 갱신이 많은 시스템인 경우 Undo 테이블스페이스(Undo Tablespace)의 I/O가 많이 발생하므로 Undo 테이블 스페이스를 여러 개의 데이터 파일로 작성하여 데이터 파일을 분산시킵니다.
설계 및 관리 용이(rollback,segment)
UNDO Data의 overwrite 방지
영역확장 용이
플래시백 쿼리 이용 가능
다음은 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 수를 기준으로 실제 크기와 산정한 크기가 맞는지 검증할 수 있습니다.
최소 크기
예상 크기
실제 크기
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초당 UNDO block 소모량
운영 중 최대 부하 당시의 APM 리포트에서 Undo Statistics의 Undo blocks값을 APM 구간(초)로 나눈 값이 다
UNDO_RETENTION
TIP 설정 값이다. (기본값: 900초)
여유값
KB 값이다. Long 트랜잭션이 비정기적으로 들어올 경우 (INDEX rebuild등도 포함)를 대비하여 충분한 크기를 잡 아 두는 것이 좋다.
항목
설명
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 DBMS로 전환하는 Table Migrator 유틸리티에 대해 안내합니다.
기존 데이터베이스를 Tibero로 전환하는 Table Migrator 유틸리티에 대해 안내합니다.
Table Migrator 유틸리티의 특징 입니다.
Command 기반이며, 내부적으로 JAVA의 JDBC 드라이버를 이용하여 DBMS에 접속합니다.
별도 컴퓨터(클라이언트)가 필요하지 않으며 Source 또는 Target 서버에서 수행 가능합니다.
전체, 사용자별 이관은 불가능하며 Table 단위로 데이터 이관만 가능합니다. (스키마 객체 및 Table에 정의된 각종 제약조건은 전환되지 않음)
옵션을 사용하여 다양한 방법으로 전환이 가능합니다. (SELECT 옵션, DPL, P-DPL 지원)
아래는 Table Migrator 유틸리티 실행 전 준비사항 입니다.
JRE 1.6 이상 설치
Table Migrator 설치 전 아래의 파일이 준비여부 확인
- table_migrator.zip : Table Migrator 바이너리
- Source DB의 JDBC 드라이버
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 권한을 부여받지 못할 경우 이관 작업을 위한 사용자별 최소한의 권한 예시는 아래와 같습니다.
long, longraw 컬럼을 지원하지 않습니다.
index가 존재하는 Table일 경우 DPL 옵션을 사용하지 못합니다.
본 문서는 총 3개의 장으로 구성됩니다.
Table Migrator 유틸리티 실행 방법을 안내합니다.
🔎
파라미터 지정 과정을 예시와 함께 설명합니다.
🔎
타사 DB에서 Tibero DB로 전환에 대한 예시입니다.
🔎
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 버전에 맞는 드라이버 사용)
Oracle
ojdbc6.jar (Source DB 버전에 맞는 드라이버 사용)
MSSQL
sqljdbc4.jar (Source DB 버전에 맞는 드라이버 사용)
DB2
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
db2jcc.jar (Source DB 버전에 맞는 드라이버 사용)

타 DB, 대용량 DB 등을 Tibero DBMS 전환 이관 방법에 대해 안내합니다.
VARCHAR
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)
TINYINT NUMBER
NUMBER
SMALLINT NUMBER
NUMBER
Tibero DBMS 설치 및 운영하기 전 효율적 시스템 사용을 위한 DB 물리 설계 방법을 제시합니다.
Redo Log Files, Undo 및 Temp 테이블 스페이스 그리고 메모리 영역의 크기 산정을 위해서는 먼저 Tibero의 특성에 대한 이해가 필요하며 관련 정보는 Tibero 관리자 안내서를 참고합니다.
또한, Table 및 Index 크기를 산정하기 위해 필요한 정보와 산정 방식은 Tibero의 Data Block Architecture 특성을 고려합니다.
본 문서는 총 8개의 장으로 구성됩니다.
BLOB
UNIQUEIDENTIFIER
VARCHAR
SQL_VARIANT LONG
RAW
BIGINT
NUMBER
NTEXT
CLOB
INT NUMBER
NUMBER
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
Linux, Windows 등 다양한 환경에서 Tibero DB 설치 방법을 안내합니다.
Linux 환경에서 Tibero DB 설치 방법 (Tibero DBMS Install on Linux)을 안내합니다.
JDBC 4.0 SPEC를 준수합니다. (JDK 1.6이상)
JDBC 파일 : $TB_HOME/client/lib/jar/tibero6-jdbc.jar
JDBC 4.0 SPEC을 준수합니다. (JDK 1.7 이상)
JDBC 파일 : $TB_HOME/client/lib/jar/tibero7-jdbc.jar
Tibero 7 ODBC를 설치하여 기존 드라이버를 변경합니다.
OLE DB의 경우 지원이 중단되어, 아래와 같은 방법으로 우회가 필요합니다.
ADO 환경(VB)에서는 MADASQL(Microsoft에서 제공하는 제너럴 OLE DB Driver)로 우회합니다.
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에 적용한 후 관련 라이브러리를 가져옵니다.
계정 및 권한, 파일환경 점검 등 Tibero DBMS 운용과 관리에 대한 보안 위험분석 및 영향도, 그리고 해결방안을 제시합니다.
업그레이드 Target DB인 Tibero 7 업그레이드 작업 절차를 설명합니다.
작업은 다음과 같은 순서로 진행합니다.
설치
IMPORT 수행
후 처리
Tibero 7를 설치하는 순서는 아래와 같습니다.
Linux 환경에서 티베로 DBMS 클라이언트 설치 관련하여 사전 준비사항, 고려사항, DB 설치방법에 대해서 설명합니다.
본 문서는 총 2개의 장으로 구성됩니다.
Tibero 클라이언트 설치 전 준비사항과 주의사항 및 설치 후 고려사항에 대해서 설명합니다.
🔎
UNIX 환경에서Tibero 클라이언트를 수동 모드로 설치하는 방법을 설명합니다.
🔎
Windows 환경 내 티베로 DB 설치 방법을 안내합니다.
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기본 절차에 대한 자세한 내용은 "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의 사용 방법 입니다.
username
Import 할 DB 계정으로 sys 계정 또는 dba 계정 중에서 하나를 선택
password
Import 할 DB 계정의 비밀번호
port
다음은 Source DB 서버에서 Tibero 7 버전의 tbimport 사용 예시 입니다.
미지원 목록에 대한 생성구문을 Source DB 스크립트 형태로 실행합니다.
기존 Tibero 6이 Archive 모드였거나 Archive 운영이 필요할 경우 적용합니다.
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.shtbimport username={sys | dba계정} password=<password> port=<port_no> sid=<SID>
file=<file name> log=<log-file name> full=y script=y ignore=ytbimport username=sys password=pwd port=8629 sid=tb7
file=tibero6_all.dat log=tibero7_imp.log full=y ignore=yDECLARE
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 immediatetbboot -t mounttbsql sys/tibero
SQL> alter database archivelog;tbdown immediate
tbboottbsql 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
-------------- -
ARCHIVELOGTablespace를 미리 생성하지 않은 상태에서 Import를 수행하면 Source DB 정보 그대로 데이터파일을 생성하게 되고, 이 경우 의도하지 않은 경로에 데이터 파일을 생성하거나 데이터파일 생성 실패 및 불필요한 스토리지 사용의 문제를 일으킬 수 있습니다.
USER를 미리 생성하지 않은 경우 Tibero 6 에서 수행한 Export를 Tibero 7에서 Import 수행 시, 두 버전의 default 암호화 방식이 변경되어 유저 생성이 실패합니다.
독립적인 가상화 환경을 생성하는 도커 플랫폼의 이미지를 활용함으로써 더욱 편리하고 안정적으로 Tibero를 설치하는 방법을 안내합니다.
아래 두 가지 방법 중 적합한 방식으로 도커 이미지를 사용합니다.
아래 경로에서 Tibero 공식 도커 이미지를 다운로드 합니다.
Tibero 공식 도커 이미지 다운로드
Import 할 DB의 포트 번호
sid
Import 할 DB의 이름
file
Tibero6에서 import 한 데이터 파일
log
생성될 로그 파일의 이름
ignore
이미 존재하는 스키마 객체로 인한 생성 에러 무시 여부를 결정
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 공식 도커 허브
주의
Tibero 바이너리 압축파일명은 반드시 "tibero.tar.gz" 로 지정 합니다.
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.shTibero 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 발생량을 보고 조정해야 합니다.
티베로 DBMS 보안 설정에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.
데이터 Dictionary는 물리적 및 논리적 구조, 객체 정의 및 공간 할당, 사용자, 룰, 권한, 감사 등 데이터베이스의 핵심에 해당하는 정보를 담고 있으므로 사용자 및 외부로부터 보호해야 합니다.
보호되지 않을 경우 누구나 DROP ANY TABLE 명령어로 데이터 Dictionary의 내용을 삭제할 수 있습니다.
데이터 Dictionary 정보의 삭제가 가능합니다.
Tibero는 해당 기능이 없으므로 해당사항이 없습니다.
Listener logging 기능이 활성화 되어있지 않으면 공격자에 의한 악의적인 Listener command 사용 또는Listener 패스워드를 알아내기 위한 Brute Force 공격의 파악이 불가능합니다.
침해 사고 또는 장애 발생의 경우 원인 파악이 어렵습니다.
$TB_HOME/instance/$TB_SID/log/lsnr/trace_list.log 파일을 디폴트로 남깁니다.
Listener는 클라이언트로부터 접속 요구를 감시하는 프로세스로 클라이언트는 Listener를 통해 데이터베이스 에 접속합니다. Listener 설정 파일은 Listener가 기동할 때 읽혀져 클라이언트의 접근을 가능하게 하며 악의적인 사용자에 의해 사용될 경우 원격으로 Listener의 구성 설정을 변경할 수 있습니다.
버퍼 오버플로우, 정보 유출, 악의적인 목적으로 파일을 변조할 수 있습니다.
Tibero는 Oracle과 아키텍처 차이로 Listener가 별도로 존재하지 않습니다.
백업 관리를 통해 장애 및 외부 침입에 대해서 대비해야 합니다.
데이터베이스의 장애가 발생할 경우 복구가 불가능합니다.
백업 정책을 수립하여 주기적인 백업 또는 각기 다른 미디어에 복사본을 보유하고 시스템 유지 보수, Upgrade, Migration 등의 서비스 운휴 및 수정 작업의 경우는 가장 가까운 시간까지의 백업본을 보유합니다.
침해 사고가 발생할 경우 계정별 수행 Query와 시스템 및 응용 애플리케이션에 대한 로그를 관리합니다.
침해 사고 또는 장애 발생의 경우 원인 파악이 어렵습니다.
데이터베이스에서 발생하는 각종 로그는 원격지 관리 시스템을 통해 일정 기간(3개월 이상) 저장 관리하여 특이사항이 발생할 경우 원활한 분석이 가능하도록 지원해야 합니다.
UTL_FILE, UTL_SMTP 등 여러 PL/SQL 패키지는 시스템과 데이터베이스에 영향을 미치는 취약점을 가지고 있 으므로 해당 패키지의 사용 권한이 Public에 부여되는 것을 제한해야 합니다.
파일 시스템의 접근 또는 내부 파일의 외부 유출이 가능합니다.
아래와 같은 패키지의 실행 권한을 사용하지 않는 경우 Public role에서 ‘실행 권한’을 제거합니다.
DB 전환 전 고려사항에 대해서 설명합니다.
table_migrator.zip 바이너리 압축 파일을 해제하면 다음과 같은 파일이 생성됩니다.
migrator_cli.jar
Table Migrator 클래스
toolcom.jar
UNIX 계열인 경우 migrator.sh, Windows 계열인 경우는 migrator.bat 파일을 수정합니다.
classpath 설정에 Source DB의 JDBC 드라이버가 설정되어 있는지 확인하고 없을 경우 추가합니다.
아래는 Table Migrator를 실행하는 2가지 예로 UNIX 계열인 경우 migrator.sh, Windows 계열인 경우는migrator.bat 명령어를 입력합니다.
파라미터의 값을 컨트롤 파일에 설정한 후 실행합니다.
티맥스티베로 기술문서에 일반적으로 공통 적용되는 저작권 안내사항 입니다.
경기도 성남시 분당구 정자일로 45 티맥스타워
Tel : +82-1544-8629
E-Mail :
이 소프트웨어(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
Linux와 Windows 환경 내 티베로 DBMS 클라이언트 설치 관련하여 사전 준비사항, 고려사항, 설치 방법에 대해 설명합니다.
본 문서는 총 2개의 장으로 구성됩니다.
Tibero 클라이언트 설치 전 준비사항과 주의사항 및 설치 후 고려사항에 대해서 설명합니다.
Tibero 클라이언트를 수동 모드로 설치하는 방법을 설명합니다.
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~100MB
중규모 시스템
100MB~1GB
대규모 시스템
4MB
1GB 이상
Tibero 유틸리티 공통 라이브러리
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 드라이버
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 전체)UTL_HTTP, UTL_FILE, DBMS_RANDOM, DBMS_LOB, DBMS_SQL, DBMS_JOB,
DBMS_OBFUSCATION_TOOLKITSQL> REVOKE EXECUTE ON <패키지명> FROM PUBLIC;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=dbtechsh migrator.sh PROPERTY_FILE=migrator.propertiesDB 권한 관리에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.
개발 시스템과 운영 시스템을 하드웨어적으로 분리하여 Link가 설정되지 않아야 하며, 운영 시스템의 데이터를 개발 시스템으로 이전할 때 중요 데이터의 삭제 같은 통제와 검증 절차를 거쳐야 합니다.
운영 시스템의 중요 데이터가 개발 시스템으로 누출될 가능성이 있습니다.
개발 시스템과 운영 시스템의 분리를 회사의 정책으로 정의하고 개발자와 운영자를 원칙적으로 분리합니다. 만약 분리할 수 없다면 개발자가 운영 시스템에 접근할 경우 통제 절차를 거치도록 해야 합니다.
DBA가 SYS 패스워드를 입력하지 않고 접근하면 그룹을 가진 멤버들이 SYS 권한으로 로그인이 가능하므로 SYS 암호를 반드시 입력해야 합니다.
인증 없이 SYS 권한 획득이 가능합니다.
Tibero에는 Oracle의 sqlplus /as sysdba와 같은 접속 방법이 없으므로 해당사항이 없다.
Listener를 구동 또는 중지하는 작업은 DBA와 같은 특권자에게만 부여하며 Listener에 대한 접근 통제를 위해Listener 접근 패스워드를 설정해야 합니다.
비인가자의 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 옵션 없이 권한을 다시 부여합니다.
티베로 데이터베이스 환경 파일 점검에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.
Tibero를 사용하여 DBMS에 접근할 경우 명령어 행의 계정 및 패스워드를 붙여서 사용하면 쉘 히스토리 (.history 또는 .sh_history) 파일에 사용한 계정과 패스워드의 기록이 남습니다.
계정 및 패스워드가 유출될 가능성이 있습니다.
Tibero 명령을 사용할 경우 명령어 행에 계정과 패스워드를 Line Mode가 아닌 Interactive Mode로 실행합니다. 쉘 히스토리(.history 또는 .sh_history) 파일에 대한 보호를 위하여 접근 권한 설정을 600으로 설정합니다.
UTL_FILE_DIR은 UTL_FILE을 통해 호스트의 파일 시스템 접근 허용 디렉터리를 제한합니다.
만약 UTL_FILE_DIR의 설정값이 '*'로 설정된 경우 전체 파일 시스템에 접근이 가능하므로 '*'로 설정할 경우에는 매 우 제한적으로 사용해야 합니다.
호스트의 전체 파일 시스템에 접근이 가능합니다.
'*' 설정값을 제거합니다.
UTL_SMTP 패키지를 Public 그룹에서 사용할 수 있도록 권한을 부여하면 허가받지 않은 메일의 전송이 발생 할 수 있습니다.
시스템 내부의 파일을 외부로 전송할 수 있습니다.
Public 그룹과 같은 사용자에게 권한을 부여하지 않고 특정 사용자에게 부여하여 해당 사용자에게만 메일이 전송될 수 있게 합니다.
데이터베이스의 운영 환경정보 노출 가능성이 있습니다.
Sample DB를 제거합니다.
Tibero의 중요 파일 중에 하나인 initialization 파일의 변경으로 시스템 장애가 발생합니다.
DB 기동 및 운영에 위협적인 영향을 줄 수 있습니다.
$ chmod 640 $TB_HOME/config/$TB_SID.tip 파일의 접근 권한을 설정합니다. (권장값 : 600 또는 640)
Tibero의 중요 파일인 Control 파일, Redo 로그 파일, 데이터 파일의 삭제 및 변경으로 시스템 장애가 발생합니다.
DB 운영 정지 및 데이터의 유실 위험이 있습니다.
Control 파일, Redo 로그 파일, 데이터 파일의 접근 권한을 설정합니다. (권장값 : 600 또는 640)
접근 권한을 640으로 설정한 경우
$ tbsql <username>/<password>로 접속하지 않습니다.
SQL> REVOKE <권한> ON <object> FROM PUBLICSQL> 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>;$ chmod 640 [Control 파일|Redo 로그 파일|데이터 파일]Tibero DB SQL Execution Work Area 크기 산정 방법에 대해 설명합니다.
다른 워킹 프로세스 및 워킹 스레드와 공유되지 않은 독립적인 메모리 공간으로 세부 영역은 다음과 같습니다.
세션 정보 영역 로그온 및 세션 관련 정보
커서 정보 영역 (SQL영역) SQL 문 처리할 때 필요한 메모리 공간
SQL Work Area (SQL 작업 영역) Sort, hash-Join, Bitmap 생성 및 Merge(병합) 작업할 때 사용되는 메모리 영역
아래는 관련 파라미터에 관한 설명입니다.
대용량의 데이터를 Full Table Scan으로 읽어들여 정렬, 조인 및 분석을 수행하는 쿼리가 대부분이고 Parallel Execution을 이용하는 환경입니다. 읽어들이는 데이터의 크기가 물리적인 메모리 크기에 담을 수 없을 정도의 크기인 경우가 많기 때문에 효율적인 Buffer Cache 이용을 기대할 수가 없는 상황이므로 공유 메모리 영역에서 Buffer Cache의 크기를 줄이고 독립적으로 사용 가능한 SQL Execution Work Area 메모리 크기에 따라 성능이 크게 좌우되는 정렬, 조인 및 분석 작업을 위해 대부분의 물리 메모리 를 SQL Work Area에 할당하는 것이 효율적입니다.
다음은 SQL Execution Work Area 크기 산정하는 방법입니다.
Windows 환경 내 Tibero 클라이언트 설치 관련하여 사전 준비 사항 및 주의 사항, 고려 사항에 대해서 설명합니다.
Tibero를 설치하기 위해서는 각 플랫폼별로 약간의 차이가 있지만 최소 2GB 이상의 하드디스크 여유 공간이 필요합니다. 이는 Tibero 설치 후 데이터베이스를 생성할 때 최소로 필요한 하드디스크 공간을 의미하기도 합니다.
Tibero 클라이언트 인스톨러를 이용해 설치하기 위해서는 JDK 1.5.17 이상이 반드시 설치되어 있어야 합니다.
[그림 1] JDK 설치 확인
Tmax group의 TechNet에서 회원가입 후 설치파일을 다운로드합니다.
🔎
Tibero를 설치한 후 타 제품과 연동을 위해 JDBC를 제공합니다.
JDBC 연동을 할 경우 Tibero DB 서버의 해당 경로에서 드라이버 파일을 받아 연동합니다.
아래는 Tibero 버전 별 드라이버 파일명에 대한 설명입니다.
티베로 DB Shared Memory 크기 산정 방법에 대해 설명합니다.
Tibero Shared Memory는 부팅할 때 고정된 용도로 사용되는 Fixed 영역과 운영 중에 자동으로 할당되어 사용되는 Shard Pool 영역으로 구분할 수 있습니다.
Fixed Memory DB가 부팅할 때 파라미터 값을 바탕으로 크기가 고정되는 영역입니다.
Buffer Cache(Database Buffer)
Log Buffer
UNIX 환경 내 Tibero Database Client 수동 모드 설치 방법을 안내합니다.
설치 파일(tar.gz)과 라이선스 파일(license.xml)을 준비합니다.
클라이언트 계정을 생성합니다.
Tibero 7
tibero7-jdbc.jar

_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 의 경우 메모리 사용에 불이익을 받게 될 수도 있다.
구분
설명
총 SQL Execution Work Area
산정방법
MEMORY_TARGET - TOTAL_SHM_SIZE
MEMORY_TARGET
총 메모리 사용량이다.
TOTAL_SHM_SIZE
항목
설명
일반적인 온라인 업무 환경 (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
_OP_MEM_MAX_SIZE (Tibero7 기준) (IPARAM(MEMORY_TARGET) - IPARAM(TOTAL_SHM_SIZE)) * 0.3
데이터 분석 업무 환경
(OLAP)
SQL Execution Work Area (SQL 실행 작업 영역) : 80% (가용 메모리 한계 내에서 최적의 작업 영역을 지정하여 디스크 I/O를 줄이고 SQL의 수행 속도를 높일 수 있도록 조절하기 위해서)
TOTAL_SHM_SIZE : MEMORY_TARGET 값의 20%
EX_MEMORY_OPERATION_LIMIT : 20000 (Tibero 7 기준 Deprecated)
_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
총 SQL Execution
Work Area
총 공유 메모리 사용량이다.
최대 MEMORY_TARGET - TOTAL_SHM_SIZE만큼 사용이 가능하다.
그 외 항목 : 전역 변수를 위한 공간, 워킹 스레드 정보와 세션 정보를 관리하는 영역
Shared Pool Memory 운영 중에 동적으로 할당되어 사용되는 영역입니다.
DD Cache
PP Cache(Library Cache)
그 외 항목
아래는Shared Memory 크기를 산정할 때 고려해야 할 사항입니다.
Shared Memory 크기를 운영 중에 동적으로 늘릴 수 없습니다.
Buffer Cache와 Shared Pool 사용 패턴을 분석하여 전체 Shared Memory 크기를 알맞게 정해야 합니다.
Buffer Cache
주요 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 각 영역의 크기는 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 공간보다 커야 합니다.
profile을 설정합니다. 클라이언트 서버의 profile에 해당 내용을 환경에 맞게 수정한 후 추가합니다.
gen_tip.sh를 실행합니다.
네트워크 파일 (tbdsn)을 설정합니다. tbdsn.tbr 파일은 서버의 접속 경로를 설정하는 파일로 $TB_HOME/client/config에 위치합니다. 아래와 같이 tbdsn.tbr 파일을 수동으로 설정합니다.
Tibero Client를 이용해서 Tibero Server로 접속합니다.
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 1258291200SQL> show param db_cache_size
NAME TOTAL USED
------------------------------------- -------------------- ---------------
DB_CACHE_SIZE UINT64 838860800SQL> show param log_buffer
NAME TOTAL USED
------------------------------------- -------------------- ---------------
FLASHBACK_LOG_BUFFER UINT32 0
LOG_BUFFER UINT32 10485760TOTAL_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$ 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데이터베이스 계정 관리에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.
개발 시스템과 운영 시스템을 하드웨어적으로 분리하여 Link가 설정되지 않아야 하며, 운영 시스템의 데이터를 개발 시스템으로 이전할 때 중요 데이터의 삭제 같은 통제와 검증 절차를 거쳐야 합니다.
운영 시스템의 중요 데이터가 개발 시스템으로 누출될 가능성이 있습니다.
개발 시스템과 운영 시스템의 분리를 회사의 정책으로 정의하고 개발자와 운영자를 원칙적으로 분리합니다. 만약 분리할 수 없다면 개발자가 운영 시스템에 접근할 경우 통제 절차를 거치도록 해야 합니다.
인가되지 않은 사용자가 DBA 권한으로 DBMS를 오용 및 남용할 수 있습니다.
DBA 권한을 사용하여 시스템 장애 및 데이터베이스를 변조할 가능성이 있습니다.
DBA 권한이 있는 계정의 사용자와 필요성을 확인합니다. 만약 불필요하게 DBA 권한이 허용된 계정이 있다면 계정을 없애거나 DBA 권한을 제거하고 데이터 누출 및 유실을 막기 위해 보안 정책을 수립합니다.
다음은 DBA 권한 제거 방법입니다.
SQL> REVOKE DBA FROM <username>;잘 알려진 디폴트 계정과 디폴트 패스워드를 이용하여 데이터베이스에 접근할 수 있습니다.
데이터베이스 접근 또는 상위 권한을 획득하여 데이터를 열람, 수정, 삭제할 수 있습니다.
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 변경
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>;Tibero6의 업그레이드 진행을 위한 Source DB 업그레이드 사전 작업 절차를 설명합니다.
작업 절차는 다음과 같은 순서로 진행합니다.
체크리스트 및 체크 방법
Export 수행
Tibero 6에서 Tibero 7로 업그레이드 하기 위해 다음의 항목들을 확인합니다.
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의 사용 방법 입니다.
아래는 Source DB 서버에서 Tibero 6 버전의 tbexport 사용 예시 입니다.
티베로 DB 보안 감사 설정에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.
일반 계정으로 데이터베이스의 관리 및 통계 등의 Meta 데이터를 가지고 있는 System Catalog에 접근하여 데이터베이스의 정보를 획득할 수 있습니다.
데이터베이스의 System Catalog 정보 유출 가능성이 있습니다.
데이터베이스의 Meta 데이터를 가지고 있는 System Catalog는 소수의 데이터베이스 관리자만 사용할 수 있도록 설정합니다.
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 항목의 등록 예제 입니다.
LSNR_INVITED_IP="192.168.20.0/24;192.168.10.101"위와 같이 등록하면 $TB_HOME/instance/$TB_SID/log/lsnr/trace_list.log 파일에 다음과 같이 등록됩니다.
*** 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 항목의 등록 예제 입니다.
위와 같이 등록한 후 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 이하로 설정합니다.
sid
Export 할 DB의 이름.
file
생성될 파일 이름
log
생성될 로그 파일의 이름
username
Export 할 DB 계정으로 sys 계정 또는 dba 계정 중에서 하나를 선택
password
Export 할 DB 계정의 비밀번호
port
Export 할 DB의 포트 번호
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 UTF16SQL> 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 NOSQL> 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 YESSQL> 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 YESSQL> 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 60SQL> 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 NSQL> 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/12SQL> 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 YESSQL> SET LINESIZE 120
SQL> COL name FOR a20
SQL> COL path FOR a60
SQL> SELECT * FROM dba_directories;
NAME PATH
-------------------- ----------------------
SAM /data2/tb6/DIR_SAMSQL> 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 1SQL> 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 1SQL> SELECTcount(*) FROM v$session;
COUNT(*)
---------- -
2BEGIN
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=ytbexport username=sys password=pwd port=8629 sid=tibero6
file=tibero6_all.dat log=tibero6_exp.log full=y script=yLSNR_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/타 DB에서 Tibero DB로 전환하는 방법에 대해 안내합니다.
본 문서는 총 4개의 장으로 구성됩니다.
전환 전 확인해야 할 사항에 대해서 설명합니다.
DB를 전환할 때 사용하는 방법들에 대해서 설명합니다.
타사 DB에서 Tibero DB로 전환하는 절차 및 방법을 설명합니다.
🔎 전환 바로가기
Tibero와 다른 DBMS의 컬럼 데이터 타입을 비교하여 설명한 참고자료 입니다.
🔎
Linux 환경 내 Tibero DB Client 설치 관련하여 사전 준비사항과 주의사항, 설치 후 고려사항에 대해 설명합니다.
Tibero를 설치하기 위해서는 각 플랫폼별로 약간의 차이가 있지만 최소 2GB 이상의 하드디스크 여유 공간이 필요합니다. 이는 Tibero 설치 후 데이터베이스를 생성할 때 최소로 필요한 하드디스크 공간을 의미하기도 합니다.
Tibero 클라이언트 인스톨러를 이용해 설치하기 위해서는 JDK 1.5.17 이상이 반드시 설치되어 있어야 합니다.
[그림 1] JDK 설치 확인
Tmax group의 TechNet에서 회원가입 후 설치파일을 다운로드합니다.
🔎
Tibero를 설치한 후 타 제품과 연동을 위해 JDBC를 제공합니다.
JDBC 연동을 할 경우 Tibero DB 서버의 해당 경로에서 드라이버 파일을 받아 연동합니다.
아래는 서버의 운영체제별 드라이버 파일 위치에 대한 설명입니다.
아래는 Tibero 버전 별 드라이버 파일명에 대한 설명입니다.
UNIX, Linux 계열
Technet의 tar.gz 파일을 다운받아 사용합니다.
UNIX 계열
$TB_HOME/client/lib/jar
Tibero 7
tibero7-jdbc.jar

구조
Language
TAC/ TAS
용어
설치
전체
패치
업그레이드
이관
Tools
유틸리티
백업/복구
인터페이스/연동
Driver
Web server
클라우드
성능
Storage
통계
분석
로그/덤프
모니터링/점검
TPR
빅데이터
보안
장애해결
용어
설치
전체
패치
이관
Tools
유틸리티
인터페이스/연동
Driver
Web server
클라우드
분석
로그/덤프
모니터링/점검
TPR
빅데이터
성능
Storage
트랜잭션
튜닝
App
Language
C
COBOL
SQL
API
Interface
장애해결
보안
일반
기본관리
데이터베이스 파라미터 지정 과정을 예시와 함께 설명합니다.
파라미터를 지정하는 컨트롤 파일은 기본으로 migrator.properties 파일로 지정됩니다.
(migrator.properties 파일에 설정)
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_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
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_TYPE
Target DB의 타입을 설정하는 파라미터 – DEFAULT : Target DB가 Tibero일 때 설정
TARGET_DRIVER
Target DB에 접속할 때 사용하는 JDBC Driver 클래스를 설정하는 파라미터 (기본값 : com.m.internal.jdbc.MInternalDriver)
TARGET_URL
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
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
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
Target DB의 JDBC 연결 URL을 설정하는 파라미터 (기본값 : jdbc:internal:thin:@localhost:8629:tibero)
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 이름)
데이터를 추출하는 Thread의 수를 설정하는 파라미터
EXTRACT_PARALLEL_RANGE_BY_ROWID 옵션을 사용하는 경우 테이블의 extent 수에 따라 적절한 값으로 설정 (기본값 : 1)
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)
TARGET_TABLE의 INDEX를 자동으로 DISABLE 하도록 설정하는 파라미터 - Y - N (기본값)
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(기본값)
모니터링할 stat을 설정하는 파라미터
여러개의 stat을 설정할 경우 ;로 구분해주며 해당 옵션은 SOURCE_TYPE=ORACLE인 경우에만 설정 가능 (기본값 : 미사용) - 예 : MONITORING_SESS_STAT=CPU used by this session;parse time cpu;parse count (hard)
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 실행 경로)
티베로 DB 데이터 타입별 크기 산정 방법에 대해 설명합니다.
아래 표는 테이블과 인덱스 크기 시트의 계산식에서 적용되는 데이터 타입별 실제 소비 사이즈이며 저장 되는 크기는 산정 길이 +1로 합니다. 예를 들면 데이터의 산정 길이는 8bytes이며 실제 저장 데이터는 8+1=9bytes입니다.
문자형
타입
고정/ 가변
숫자형
날짜형
간격형
대용량 객체형
내재형
NULL일 때
크기가 0일 때
크기가 4000보다 작을 때
크기가 96KB 보다 작을 때
그 이상일 때
위 계산에서 LOB 데이터를 별도 segment로 저장하기 위한 overhead는 계산하지 않습니다.
long의 경우 데이터의 길이가 길어지면 chained row piece로 나뉘어서 저장되는데, row piece를 연결시키기 위한 추가 overhead는 고려하지 않습니다.
Table Migrator 유틸리티로 Oracle(Source DB)에서 Tibero(Target DB)로 DBMS 전환을 수행하는 예제입니다.
Oracle에 테스트 Table, 데이터, 접속할 계정을 생성합니다.
Oracle에 테스트 Table, 데이터, 접속할 계정을 생성합니다.
--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가변
NUMBER와 같다.
FLOAT
가변
NUMBER와 같다.
TIMESTAMP
가변
12bytes
TIMESTAMP WITH TIME ZONE
고정 1
7bytes
TIMESTAMP WITH LOCAL TIME ZONE
고정
12bytes
가변
실제로 저장되는 데이터의 길이 ("" 참조)
XMLTYPE
가변
CLOB과 같다.
길이 산정 예
설명
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
가변
실제로 저장되는 데이터의 길이 ("LOB Type 저장에 필요한 overhead" 참조)
타입
고정/가변
길이 산정 예
설명
ROWID
고정
10bytes
0byte16bytes(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)INTEGER
8bytes
12bytes
BLOB
Tibero DB 테이블 크기 산정 방법에 대해 설명합니다.
테이블 크기를 산정하기 위해서는 컬럼의 데이터 타입별 실제 소비 크기와 저장되는 길이를 산정해야 합니다. 이 정보는 테이블 크기를 산정하기 위한 항목별 크기 산정 방법에 사용됩니다.
아래는 컬럼 정의 및 계산 방식의 예입니다. 크기 산정 테이블은 5개의 컬럼으로 구성되었다고 가정합니다.
이름
데이터타입
데이터길이
비고
""의 데이터 타입별 사이즈 표를 참고하여 위 테이블을 구성하는 각 컬럼의 데이터 타입별 실제 소비사이즈를 산정하면 아래와 같습니다.
테이블 크기를 산정하기 위해 필요한 항목은 아래와 같습니다.
크기 예는 각 항목별로 기본으로 정해진 크기, 파라미터로 설정할 수 있는 크기와 운영할 시스템에서 사전 조사된 수치를 나타냅니다.
250bytes 이하 및 초과 컬럼 개수는 Row의 데이터 길이 테이블을 참고합니다. 초기 예상 건수, 월중 예상 추가 건수, 데이터 보관 월 수는 운영할 시스템의 사용자 환경의 정보입니다.
본 절에서는 Tibero에서 테이블 크기를 산정하는 방법에 대해서 설명합니다.
block당 사용 가능한 데이터 공간 크기입니다.
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
항목
크기 예
단위
설명
Row Directory
2
bytes
row 하나당 bytes
한 Row 저장에 필요한 공간 = Row Directory + Row Header + Row의 데이터 길이
+ (1 * <250bytes 이하 컬럼개수>) + (3 * <250bytes 초과 컬럼개수>)Row Directory
2
2
한 블록의 데이터 공간 = (Block Size - Block Header - ITL공간) * (100 - PCTFREE) / 100항목
사전 정보 크기
실제 저장 크기
비고
Block Size
8192
8192
/ Row Space ( 한 블록의 데이터 공간 / 한 Row의 저장에 필요한 공간 )항목
사전 정보 크기
실제 저장 크기
비고
Data Space per Block
7,286
7,286
총 데이터 Row 개수 = <초기 예상 건수> + <월중 예상 추가 건수> * (<데이터 보관 월 수> + 1)항목
사전 정보 크기
실제 저장 크기
비고
초기 예상 건수
100,000
100,000
필요한 총 데이터 공간 = Block Size * Total Row Size / Row Size per Block (Block Size
* 총 데이터 Row 개수 / 한 블록에 들어갈 수 있는 Row 개수)항목
사전 정보 크기
실제 저장 크기
비고
Block Size
8,192
8,192
크기를 2로 나누어 반올림한 값이다. NUMBER(7,2) = roundup(7/2) = 4
VARCHAR
지정된 길이의 70%로 가정한다. VARCHAR(3000) = 3,000 * 0,7 = 2,100
Row Header
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
개월
사용자 환경
Row Header
3
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)
Block Header
48
48
ITL공간
48
48
24 * 2 (24 * INITRANS)
PCTFREE
10
10
Data Space per Block
7,286
(8192-48-48)*(100-10)/100
Row Space
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)
Total Row Size
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
대용량 데이터 이관 방법의 예제를 설명합니다.
데이터 이관은 다양한 방법을 이용하여 수행할 수 있고 이로 인해 수행 속도를 최적화 시킬 수 있습니다.
아래는 예제에서 사용하는 테이블 정보입니다.
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 방법으로 대용량 데이터를 이관하는 순서입니다.
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=Background Process를 이용하여 병렬 프로세싱으로 migrator를 수행합니다.
수행 결과와 로그 파일을 확인합니다.
DB Link로 insert ... select ... 구문을 수행할 때 parallel 힌트를 사용하면 select는 serial하게 동작하고, insert일 때만 parallel로 동작합니다. 따라서 DB Link 원본 데이터가 존재하는 서버의 사양이 좋을 경우 parallel 힌트를 사용하여 view를 생성하고 해당 view를 Tibero에서 select하는 방식으로 이관하면 성능 향상을 기대할 수 있습니다.
아래는 DB Link 방법으로 대용량 데이터를 이관하는 순서입니다.
전체 건수를 균등하게 나눌 수 있는 조건을 검토합니다.
만족하는 조건이 있는 경우 SQL문을 나눈 후에 병렬 세션(터미널 또는 다른 컴퓨터)으로 수행하며 Temp와 Undo Tablespace 사용량의 모니터링이 필요합니다.
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 방법으로 대용량 데이터를 이관하는 순서입니다.
Unload(spool 또는 unload 유틸을 이용하여 데이터 unload) 및 SAM 파일을 전송합니다.
Load할 SAM 파일을 n등분 하여 n개의 SAM 파일을 준비합니다.
각 SAM 파일을 읽는 n개의 컨트롤 파일을 작성하고, 작성할 때 append 옵션을 사용합니다.
아래는 2개의 컨트롤 파일을 작성하는 방법입니다.
Background Process를 이용하여 병렬 프로세싱으로 tbloader를 실행하고, tbloder 명령어에 'direct=y dpl_parallel=y' 옵션을 사용합니다.
아래는 2개의 SAM 파일 및 컨트롤 파일을 가지고 tbLoader를 수행하는 예입니다.
세션 1 수행
세션 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 selectedSQL> 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.000307SQL> 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.000307SQL> 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상황별 DBMS 성능 개선 방법에 대해 설명합니다.
Tibero 클라이언트는 데이터가 지정한 크기만큼 바인딩되기 전까지 서버로 업로드되지 않으므로 대용량 의 데이터를 업로드할 때 효율적으로 사용할 수 있습니다.
tbLoader에서 제공하는 아래의 옵션을 사용하여 이관합니다.
rows
사용자가 대용량 데이터를 업로드할 때 Commit을 수행할 레코드 개수를 지정하는 파라미터 (단, tbLoader는 성능을 고려하여 지정한 레코드의 개수를 정확히 맞춰 서버로 데이터를 보내지는 않음)
Direct Path Load 방식으로 데이터를 로드할 때 테이블에 존재하는 인덱스의 생성 방법을 MULTI INSERT 방식과 FAST BUILD 방식 중에 하나 선택할 수 있습니다.
아래는 인덱스 생성 방법에 대한 설명입니다.
인덱스 생성 방법을 지정하는 컨트롤 파일의 세부 내용은 아래와 같습니다.
bindsize
배열에 사용될 최대 바이트 수를 지정하는 파라미터 (기본값 : 64KB)
MULTI INSERT INDEXES
인덱스를 여러 개의 레코드 단위로 최적화 하여 한 번에 생성
FAST BUILD INDEXES
기존의 인덱스를 무시하고 데이터 파일의 데이터를 모두 로드하여 다시 생성
# MULTI INSERT INDEXES 적용
$cat control.ctl
LOAD DATA
...
MULTI INSERT INDEXES
...
(...)
# FAS BUILD INDEXES 적용
$cat control.ctl
LOAD DATA
...
FAST BUILD INDEXES
...
(...)Unix, Windows 등 환경별 DB 패치 방법을 설명합니다.
본 장에서는 Tibero UNIX(SINGLE) 패치 방법을 설명합니다. 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) 패치 과정의 순서는 다음과 같습니다.
Tibero 서비스 중지 애플리케이션이 DB에 연결되어 있다면 애플리케이션을 다운 후에 Tibero 서비스를 중지합니다.
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 파일 교체 방법입니다.
다음은 사용 예입니다.
Tibero 서비스 시작
다음과 같이 tbboot 명령어를 사용하여 Tibero 서비스를 시작합니다.
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 패키지 실행이 정상적으로 이뤄지지 않은 것입니다.
alter system recompile all; 실행 모든 PSM recompile 동작을 수행하며 PSM compile할 때 BCODE를 생성하여 Data Dictionary에 저장하는 구조입니다. 패치가 되면서 생성되는 BCODE가 변경됐을 가능성 때문에 수행합니다.
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 패치 작업이 실패했을 경우 기존 바이너리로 복원하는 과정입니다.
Tibero 서비스 정지
Tibero 과거 버전으로 바이너리 교체
기존 데이터 파일 경로 확인
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) 패치 과정의 순서는 다음과 같습니다.
Tibero 서비스 중지 애플리케이션이 DB에 연결되어 있다면 애플리케이션을 다운 후에 Tibero 서비스를 중지합니다.
Node1 다운
Node2 다운
Tibero 바이너리 교체 Tibero 7 FS02 build 257078에서 tibero7 FS02 build 257446로 패치하는 과정입니다.
Node1 바이너리 교체
Node2 바이너리 교체
환경설정 수행 교체된 신규 바이너리에 tip, tbdsn.tbr, psm_commands 생성을 위해 환경설정을 수행합니다.
Node1 환경설정
Node2 환경설정
라이센스, 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 파일 복사
Tibero 서비스 시작
– Node1 Tibero 기동
– Node2 Tibero 기동
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. 패키지 실행이 정상적으로 이뤄지지 않은 것입니다.
alter system recompile all; 실행 모든 PSM recompile 동작을 수행하며 PSM compile할 때 BCODE를 생성하며 Data Dictionary에 저장하는 구조입니다. 패치가 되면서 생성되는 BCODE가 변경됐을 가능성 때문에 수행을 합니다. UNIX(TAC) 패치의 경우 한쪽의 Node 에서만 실행을 합니다.
revalidate_viewnsyn.sql 수행 sys 계정이 아닌 계정에서 해당 스크립트를 수행합니다.
UNIX(TAC) 패치 후 점검할 사항에 대한 자세한 설명은 UNIX(SINGLE) 패치의 “”을 참고합니다.
본 장에서는 Tibero Active-Standby 패치 방법을 설명한다. Active-Standby 패치 순서는 다음과 같습니다.
각 과정에 대한 상세한 설명은 해당 절의 내용을 참고합니다.
Active-Standby 패치 전에 HA Cluster를 중지하고 패치할 때 Cluster 엔지니어를 필요로 합니다. 패치 전 점검할 사항 에 대한 자세한 설명은 UNIX(SINGLE) 패치의 “”을 참고합니다.
Active 서버는 “”과 동일하므로 본 절에서는 Standby 서버의 패치 과정만 설명합니다. Standby 서버의 패치 과정의 순서는 다음과 같습니니다.
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 파일의 설정 내용 파악 후 필요한 내용을 복사합니다.
환경설정 수행
교체된 신규 바이너리에 tip, tbdsn,tbr, psm_commands 생성을 위해 환경설정을 수행합니다.
다음은 환경설정 수행 예입니다.
라이센스, tip, tbdsn.tbr, cfg 파일 교체
다음은 각 파일의 교체 방법 및 사용 예입니다.
라이센스 파일 다음은 라이센스 파일 교체 방법입니다.
다음은 사용 예입니다.
Tip(=Tibero Init Parameter) 파일
다음은 tip 파일 교체 방법입니다.
다음은 사용 예입니다.
tbdsn.tbr 파일
다음은 tbdsn.tbr 파일 교체 방법입니다.
다음은 사용 예입니다.
cfg 파일
다음은 cfg 파일 교체 방법입니다.
다음은 사용 예입니다.
Active-Standby 패치 후 점검할 사항에 대한 자세한 설명은 UNIX(SINGLE) 패치의 “”을 참고합니다.
본 장에서는 Tibero 패치 과정을 요약하여 설명합니다.
다음은 Single과 TAC의 패치 과정 순서입니다.
바이너리 준비
패치 바이너리를 패치 대상 서버에 FTP를 이용하여 옮깁니다.
INVALID Object 확인
Tibero 종료
TAC의 경우 모든 노드를 tbdown 한 후에 tbcm을 종료합니다.
Tibero 바이너리 백업
기존 Tibero 7 Backup 이름을 tibero7*<패치일자>*로 바꿔줍니다.
패치 바이너리 설치
환경설정 및 복원
설정
복원
Tibero 시작
TAC의 경우 모든 노드의 tbcm을 기동 후 tbboot합니다.
Dictionary 갱신
Object 재컴파일
INVALID SYNONYM 스크립트 수행
sys 계정이 아닌 계정에서 해당 스크립트를 수행합니다.
패치 후 INVALID Object확인
Object 컴파일
Driver 갱신
필요한 경우 애플리케이션에서 사용하는 JDBC Driver나 ODBC DLL 파일을 신규 Driver로 갱신합니다.
alter system recompile all; 실행
revalidate_viewnsyn.sql 수행
패치 후 점검
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/tbjavaepaexport BACKUP_TB_HOME=~/tibero7_<version>_<date>
diff $TB_HOME/client/epa/java/config/epa.cfg
$BACKUP_TB_HOME/client/epa/java/config/epa.cfgcp -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;구분
경로
JDBC
$TB_HOME/client/lib/jar/tibero7-jdbc.jar
ODBC, OLE DB
$TB_HOME/client/lib/libtbodbc.so
[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/tbjavaepaexport BACKUP_TB_HOME=~/tibero7_*<version>_<date>*
diff $TB_HOME/client/epa/java/config/epa.cfg
$BACKUP_TB_HOME/client/epa/java/config/epa.cfgcp -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/configSQL> 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.sqlSQL> 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;$TB_HOME 내부 디렉터리에 위치한다면 바이너리를 교체할 때 해당 데이터 파일도 같이 copy 또는move합니다.
JAVA의 class 위치는 tip 파일 내의 JAVA_CLASS_PATH로 확인합니다.
Tibero DB 인덱스 크기 산정 방법에 대해 설명합니다.
Tibero에서 인덱스 크기 산정에 필요한 사전 정보로 Key Column 총 길이, Base RowID 산정 기준 그리고 항목별 크기 산정 정보가 필요합니다.
아래는 Key Column 총 길이, Base RowID 산정 기준 그리고 항목별 크기 산정의 예입니다.
인덱스 크기를 산정하기 위해서는 컬럼의 데이터 타입별 실제 소비 크기와 저장되는 길이을 산정해야하며 이 정보는 인덱스 크기를 산정하기 위한 항목별 크기 산정방법에 사용됩니다. 인덱스 크기를 산정할 때 컬럼에 지정된 데이터 타입별 저장되는 크기 산정이 필요합니다.
아래는 컬럼 정의 및 계산 방식의 예입니다. 크기 산정 테이블은 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를 해 줍니다.
인덱스의 경우 Create Index로 데이터를 처음 적재하는 경우 PCTFREE로 지정된 비율을 제외하고 블록을 최 대한 사용하여 데이터를 저장합니다.
인덱스 생성 이후 신규로 인덱스 키 데이터가 추가되는 경우 해당 인덱스 키가 추가되어야 하는 블록에 여유 공 간이 없을 때 SPLIT이 발생하게 됩니다.
SPLIT이 발생하게 되면 새로운 블록이 할당되고 기존 블록에 있던 인덱스 키 데이터를 통상 5:5 비율로 분할하 여 나누어 가지기 때문에 두 개의 블록에 빈 공간이 50% 생깁니다.
따라서, 인덱스에 데이터 추가가 계속된다고 하면 특정 시점 이후에 Index Split이 얼마나 발생했는지는 정확하게 예측하기는 어렵습니다. 다만, 처음 SPLIT이 발생된 이후, 다음 번 SPLIT이 발생되기까지 빈 공간이 0% ~ 50% 범위에서 유지되기 때문에 평균적으로 절반 정도의 블록이 SPLIT이 되어 있다라고 가정하는 것이 가장 근사하게 추정하는 방법일 것입니다.
Index Size시트의 크기 산정 방식에서 최종 계산 결과(Total Table Size for Index Spli)에 2를 곱한 것은 모 든 블록이 SPLIT되어 있을 때 최대 사용공간을 가정하여 산출한것이며 만약 평균 개념으로 추정한다면 1.5를 곱해서 계산하는 것이 현실적일 수 있습니다.
데이터타입
데이터길이
비고
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 + Index Header + Base RowID
+ Key Column 총 길이 + (1 * <250bytes 이하 컬럼개수>) + (3 * <250bytes 초과 컬럼개수>)항목
사전 정보 크기
실제 저장 크기
비고
Row Directory
2
2
(Block Size - Block Header - ITL 공간) * (100 - PCTFREE) / 100항목
사전 정보 크기
실제 저장 크기
비고
Block Size
8192
8192
/Data Space per Block / Index Entry Space (한 블록의 데이터 공간
/ 한 Index Entry의 저장에 필요한 공간)항목
사전 정보 크기
실제 저장 크기
비고
Data Space per Block
7,128
7,128
초기 예상 건수 + 월중 예상 추가 건수 * (데이터 보관 월 수 + 1)항목
사전 정보 크기
실제 저장 크기
비고
초기 예상 건수
100,000
100,000
1 / Entry Size per Block (1 / 한 블록에 들어가는 Entry 개수)항목
사전 정보 크기
실제 저장 크기
비고
Entry Size per Block
229.9355
229.9355
Block Size *( Total Row Size / Entry Size per Block + Total Row Size
/ Entry Size per Block ^ 2 )항목
사전 정보 크기
실제 저장 크기
비고
Block Size
8,192
8,192
Index Split이 일어난 경우 데이터 공간 = Total Index Size * 2 (필요한 총 데이터 공간 * 2 )항목
사전 정보 크기
실제 저장 크기
비고
Total Index Size
90,161,152
90,161,152
Unique Index
6
Global, Local 선별
B
Unique Index
0
Unique, Not Unique 선별
Not Unique Index
1
Unique, Not Unique 선별
Base RowID 총 길이
8
A + B의 합계
Index Header
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
Index Header
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)
Block Header
224
224
ITL공간
48
48
24 * 2 (24 * INITRANS)
PCTFREE
10
10
Data Space per Block
7,128
(8192-224-48)*(100-10)/100
Index Entry Space
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)
Index Branch Ratio
0.004349046
1 / 229.9355
Total Row Size
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))
Total Index Size for Index Split
180,322,304
90,161,152 *2
Oracle to Tibero DB 전환 절차 및 방법을 설명합니다.
타사 DB에서Tibero DB로 전환하기 전 점검사항에 대해서 설명합니다.
사전 점검은 전환하기 전 Oracle의 특성을 파악하고 Tibero에 적용해야 하는 값들을 확인하는 중요한 절차입니다.
Oracle의 sys 또는 system 등의 DBA 권한을 가진 사용자로 접속하여 아래 정보를 확인합니다.
버전 정보
전환 Oracle 버전을 확인합니다.
Oracle과 Tibero간 대응되는 문자 집합을 사용합니다.
Oracle의 'sys' 또는 'system' 계정 등의 DBA 권한이 있는 사용자로 접속한 후 조회합니다.
사용자 조회 아래는 전체 사용자 목록입니다.
Open된 사용자 조회 아래는 현재 Open 사용자를 조회하는 쿼리입니다.
Oracle 기본 사용자 아래와 같은 사용자 이름의 경우 Oracle을 설치할 때 자동으로 생성되는 사용자로 전환할 때 제외합니다. (Oracle 버전에 따라 사용자명이 일부 다를 수 있습니다.)
전환 대상 사용자에 속하는 Table, Index가 저장된 Tablespace만 확인합니다. 아래는 Tablespace 전체에 대하여 확인하는 예제입니다.
전체 Tablespace 크기와 사용량 확인
전체 합계
전환 대상 사용자에 대해당하는 정보만 확인합니다.
Object 상태별 개수 확인
Object 개수 확인
전환 완료 후 Oracle과 Object 개수를 비교할 때 검증용으로 사용합니다.
Constraint 개수 확인
Oracle의 sys 또는 system 등의 DBA 권한을 가진 사용자로 접속하여 아래의 정보를 확인하고, Tibero 설치 과정 중 CREATE DATABASE를 수행할 경우 아래의 정보를 참고하여 DB를 생성합니다.
아래는 DB 생성관련 항목에 대한 설명입니다.
문자 집합 정보를 확인합니다.
Oracle
Tibero
확인 결과 항목에 대한 설명은 아래와 같습니다.
아래는 Oracle과 Tibero의 문자 집합 대응 정보입니다.
National 문자 집합
초기 파라미터 정보를 확인합니다.
아래는 Oracle에서 전환할 때 확인해야 할 초기 파라미터입니다.
Tibero에서 Redo 로그를 생성할 경우 참고하며 파일 크기를 동일하거나 더 크게 생성해 줍니다.
아래는 Redo를 확인하는 예입니다.
Tibero에서 Undo와 Temp를 생성할 경우 참고하며 파일 크기를 동일하거나 더 크게 생성합니다.
아래는 Undo Tablespace를 확인하는 예입니다.
아래는 Temp Tablespace 확인 예입니다.
아래는 Log 모드를 확인하는 예입니다.
만약, ARCHIVE LOG 모드라면 전환 시간 단축을 위해 전환이 모두 완료된 후에 모드를 변경합니다.
아래는 추가로 확인해야 할 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
Procedure Package
Type
Trigger
(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들이 자동으로 생성되도록 하고 다음과 같은 방법으로 검증합니다.
모든 사용자에 대해서 생성이 완료된 후 Oracle과 개수를 비교하여 누락된 부분이 없는지 확인합니다.
(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가 발생하는 경우
Job
DBMS_SCHEDULER
External Procedure
만약, 정상적으로 Object가 생성되지 않았다면 원인을 찾아 해결한 후 문제가 발생한 Object 수동 생성 및 다음 단계로 진행합니다.
Oracle 9i, 10g, 11g는 전환 사례가 많으므로 그 이외 버전에서 전환할 경우에 대해서는 검토가 필요합니다.
전환 문자 집합
Oracle에서 사용 중인 문자 집합에 대응되는 Tibero 문자 집합으로 선택합니다.
전환 사용자 선택
Oracle을 설치할 때 자동 생성되는 기본 사용자의 경우는 제외합니다. 전환 사용자에 대해서 고객사 담당자 확인이 필요합니다.
전환 크기
전환 시간에 가장 큰 영향을 미치는 요소입니다. 그 외 DISK I/O, NETWORK I/O 등에 따라서 고객사의 전환 시간이 많이 달라질 수 있습니다.
전환 검증 항목
전환이 완료된 후에 비교해 보는 정보입니다
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
VIETNAMESEselect 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;ANONYMOUS
Enables HTTP access to Oracle XML DB.
APEX_050100
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;문자 집합
Oracle과 대응되는 문자 집합을 선택합니다.
초기 파라미터
세션 개수 및 메모리 설정 등을 확인합니다.
Redo 구성
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;NLS_CHARACTERSET
DB 문자 집합
NLS_NCHAR_CHARACTERSET
National 문자 집합
US7ASCII
ASCII
KO16KSC5601
EUCKR or MSWIN949
KO16MSWIN949
UTF8
UTF8
AL16UTF16(기본값)
UTF16(기본값)
show parameter <파라미터명>SESSIONS
세션 수를 설정합니다.
OPEN_CURSORS
세션당 열 수 있는 Cursor의 개수입니다.
UNDO_RETENTION
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;DB Link
전환 사용자의 DB Link 정보와 데이터가 존재하는 DB의 종류를 조사합니다.
tnsnames.ora
DB Link의 경우 사용하는 Host 정보를 확인합니다.
Job
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.oraset 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%';1
Tablespace
-
2
User
BLOCKSIZE 4K
Tibero는 Tablespace마다 Block Size 지정이 가능하지 않으므로 주석 처리 합니다. 초기화 파라미터에서 DB를 생성할 때 고정되며 보통 8KB를 사용합니다.
SEGMENT SPACE MANAGEMENT MANUAL
Tibero는 AUTO 부분만 지원하므로 MANUAL 부분을 AUTO로 변경 합니다.
FLASHBACK ON
GRANT UNLIMITED TABLESPACE TO USER_NAME
Tibero는 기본으로 UNLIMITED이며 해당 문법이 지원되지 않으므로 주석 처리합니다.
ALTER USER USERNAME QUOTA UNLIMITED ON USERNAME
사용자별 QUOTA 기능이 지원되지 않으므로 주석 처리합니다.
$ 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.logSELECT 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;
/Tibero가 더 적을 경우
Constraint가 생성되면서 자동으로 Index가 생성되는 것도 고려해야 하므로 Constraint 생성 이후에 비교합니다.
Tibero가 더 많을 경우
Table내의 LOB Column에 대응하는 Index가 자동 생성된 부분이 아닌지 확인합니다. (Oracle 11g r2에서도 동일하게 자동생성되며 Oracle 과거버전의 경우 생성 안하는 경우도 있습니다.)
alter trigger trigger_name disable;COMMIT REFRESH
Mview를 생성할 때 생성 구문으로 지원하며 권한으로는 지원하지 않습니다.
QUERY REWRITE
Mview를 생성할 때 생성 구문으로 지원하며 권한으로는 지원하지 않습니다.
DEBUG
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 errorsalter 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;1
SQL을 작성할 때 From절에 있는 Table 또는 서브 쿼리절에 Alias를 주지 않고 Join 등을 실 행할 때 중복된 Column이 존재할 경우 Syntax Error가 발생합니다.
Alias를 주어서 중복되지 않게 처리합니다.
2
Union All 같은 쿼리를 사용하여 결과를 보려는 경우 실제 상위 쿼리는 특정 Column을 number type으로 하고, 하위 쿼리는 varchar type으로 하면 Syntax Error가 발생합니다.
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을 사용합니다.
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.
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.
Group과 Member의 개수 또는 크기 등을 확인합니다.
Undo와 Temp 구성
Undo와 Temp Tablespace 크기를 확인합니다.
Log 모드
Tibero 미지원 사항으로 일반 Index로 변경을 고려합니다.
MSWIN949
UTF8, AL32UTF8
UTF8
JA16SJIS[TILDE]
JA16SJIS[TILDE]
JA16EUC[TILDE]
JA16EUC[TILDE]
ZHS16GBK
GBK
VN8VN3
VN8VN3
Undo 보존 시간을 설정합니다.
SGA_MAX_SIZE
사용 가능한 SGA 전체 크기를 확인합니다
SGA_TARGET
SGA의 목표 크기를 설정합니다
PGA_AGGREGATE_TARGET
사용 가능한 PGA 전체 크기를 확인합니다
MEMORY_TARGET
사용 가능한 전체 메모리 크기를 설정합니다. (Oracle 11g용)
전환 사용자 또는 전체를 수행하는 Job이 없는지 확인하고, 전환할 경우 수행되어 데이터 가 변경되지 않는지 확인합니다.
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 등)
-
Tibero는 파라미터를 통해서 전체모드로 FLASHBACK 기능 지원하므로 주석 처리 합니다.
TABLESPACE GROUP
TABLESPACE GROUP이 지원되지 않으므로 주석 처리 합니다. 하나의 Tablespace에 여러 데이터 파일로 분리하는 것을 검토합니다.
PL/SQL DEBUGGING 권한으로 현재 Tibero는 지원하지 않습니다.
FLASHBACK
파라미터 형태로 지원하며 권한으로는 지원하지 않습니다.
같은 Column절에서는 동일한 Type을 사용합니다.
3
PSM(=PL/SQL) 내부에 같은 이름의 변수를 선언할 경우 Syntax Error가 발생합니다.
최종 선언된 변수 이름을 사용하고 앞 부분에 선언한 같은 이름의 변수를 삭제합니다.
























Windows 환경 내 Tibero DB 클라이언트 수동 모드 설치 및 제거방법을 설명합니다.
설치 파일을 준비합니다. Tibero 클라이언트를 설치할 폴더를 생성하고 압축을 해제하면 폴더들이 생성됩니다.
환경변수를 설정합니다.
(1) Windows에서 [시스템 환경 변수 편집] -> [고급] -> [환경변수]를 선택한 후 [시스템 변수]를 설정합니다.
[그림 2] 시스템 변수 설정
(2) [환경변수]에서 [시스템 변수] -> [새로 만들기]를 선택 한 후 TB_HOME, TB_SID를 설정합니다.
[그림 3] TB_HOME, TB_SID 설정
(3) C:\Tibero 디렉터리에서 압축된 바이너리 실행 파일(tar.gz)을 해제합니다. 그 후에 %TB_HOME%의 license라는 하위 디렉터리에 발급받은 라이선스 파일(license.xml)을 복사합니다.
(4) tbinstall.vbs 실행 후 레지스트리 등록을 확인합니다.
[그림 4] 설치완료 확인창
레지스트리 확인(regedit)에서 HKEY_LOCAL_MACHINE\SOFTWARE\TmaxTibero\Tibero\tibero 경로에 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로 접속합니다.
tbuninstall.vbs를 실행하여 레지스트리에서 제거합니다.
[그림 6] 제거완료 확인창
물리 파일을 삭제합니다. %TB_HOME%으로 설정된 경로의 디렉터리를 삭제하여 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

티베로 Database 백업과 복구( DB Backup & Recovery) 의 기본 개념에 대해서 설명합니다. 논리적인 백업 (Logical Backup), 물리적인 백업 (Physical Backup), Offline 백업 / Cold 백업, Online 백업 / Hot 백업 등 세부 사항에 대해 소개합니다.
다음은 백업과 복구의 개념에 대한 설명입니다.
백업(Backup) 백업은 여러 가지 유형의 장애로부터 데이터베이스를 보호하기 위한 과정으로 MTBF(Mean Time Between Failure)를 증가시키고, MTTR(Mean Time To Recover)를 감소시킵니다. 관리자는 시스템에 장애가 발행하는 경우 손실을 최소화하고 복구 가능한 상태로 데이터베이스를 운용해야 한다. 따라서, 최소한 한달에 한 번 데이터베이스 전체 백업을 하거나 하루에 한번씩 Export 백업을 권장합니다. 데이터베이스 관리자는 백업에 대한 정책을 수립하고 꼭 필요한 데이터를 최소한의 양으로 백업해야 합니다. 또한 백업이 정상적으로 수행되었는지 주기적으로 검증하는 것을 권장합니다.
복구(Recovery) 복구는 시스템에 장애가 발생하는 경우 복원 또는 시스템 작동을 유지하기 위한 절차 또는 기법입니다.
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개 이상으로 구 성하고 각 파일은 서로 다른 디스크에 위치시킬 것을 권고합니다.
다음의 동적 뷰로 컨트롤 파일의 위치 정보와 다중화 여부를 확인합니다.
백업 방법
다음은 컨트롤 파일을 백업하는 과정에 대한 설명입니다.
컨트롤 파일 다중화
tbdown 명령어를 사용해서 데이터베이스를 down합니다.
컨트롤 파일을 다른 위치로 복사합니다.
$TB_SID.tip 파일에서 CONTROL_FILES 파라미터를 추가합니다.
Online Backup (온라인 백업)은 Tibero를 운영하는 중에 백업하는 것으로 ALTER DATABASE 명령으로 Tablespace의 데이터 파일 을 백업하며 ARCHIVE LOG 모드에서만 사용 가능합니다.
백업 방법
다음은 Online Backup (온라인 백업)하는 과정에 대한 설명입니다.
데이터베이스에 Online Backup의 시작을 알립니다.
동적 뷰(v$backup)로 아래와 같이 현재의 백업 모드를 확인합니다.
O/S 명령으로 해당 Tablespace의 데이터 파일을 복사합니다.
Tibero 데이터베이스에 Online Backup 종료를 알립니다.
Offline Backup (오프라인 백업)은Tibero를 종료한 후 백업하는 방법입니다.
Tibero를 정상 종료한 후 O/S의 copy 명령을 이용해 데이터 파일, Log 파일, 컨트롤 파일, Tip 파일 등을 백업합니다. MOUNT 또는 OPEN 모드에서 v$datafile, v$logfile 뷰를 통해 백업할 파일 정보를 조회할 수 있으며 ARCHIVE LOG 모드에서는 Archive 파일도 백업합니다.
백업 방법
다음은 Offline Backup하는 과정에 대한 설명합니다.
동적 뷰(v$datafile)로 아래와 같이 백업 대상 파일을 조회합니다.
동적 뷰(v$logfile)로 아래와 같이 백업 대상 Log 파일을 조회합니다.
동적 뷰(v$controlfile)로 아래와 같이 백업 대상 컨트롤 파일을 조회합니다.
tbdown 명령어로 Tibero를 종료합니다.
조회한 백업 대상 파일을 복사합니다.
본 장에서는 복구 작업에 대한 설명과 각 장애 상황별 해결 방법에 대해 설명합니다.
복구는 시스템에 장애가 발생하는 경우 복원 또는 시스템 작동을 유지하기 위한 절차 또는 기법입니다. 다음은 부트 과정별 복구 관련 작업입니다.
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의 사용 예입니다.
다음은 복구 환경을 구성하는 방법에 대한 설명입니다.
Tibero 파라미터 설정
데이터베이스 생성
Tablespace 생성
사용자 생성
본 절에서는 컨트롤 파일을 각 상황별로 복구하는 방법에 대해 설명합니다.
컨트롤 파일이 삭제된 경우
운영상태에서 컨트롤 파일이 삭제되어 장애가 발생한 경우 백업된 컨트롤 파일의 생성 문장으로 컨트롤 파일을 재 생성합니다.
장애 상황
해결 방법
이중화 컨트롤 파일 하나가 삭제된 경우
데이터베이스가 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 취소 기반의 불완전 복구 절차입니다.
취소 기반 복구를 시작합니다.
복구할 Log 파일을 등록합니다.
등록된 Log 파일을 merge하면서 Log 파일 끝에 도달할 때까지 복구를 진행합니다.
복구를 중지하려면 아래 명령을 실행합니다.
취소 기반의 불완전 복구
ARCHIVE LOG 모드 운영상태에서 데이터 파일이 삭제된 경우 Archive 파일로 생성된 것은 Archive 파일을 이용하 여 명시적으로 각각 복구하고, Archive 파일로 생성되지 않은 current 상태인 것은 Redo 파일로 복구합니다.
장애 상황
테이블 및 데이터 입력(NODE1)
데이터 입력(NODE2)
데이터 파일 초기화(NODE1)
해결 방안
백업된 파일로 데이터 파일 복구(NODE1)
NODE2의 Archive Log 파일을 NODE1으로 전송
취소 기반 불완전 복구 수행
Log 파일 확인
b. 취소 기반 복구시작
c. 복구할 Log 파일 등록 및 복구 진행
d. 취소 기반 복구 종료
e. 후처리
본 장에서는 TAC 온라인 백업본으로 Single 환경 구성과 구성 방법에 대해서 설명합니다.
다음과 같이 온라인 백업 및 데이터 생성합니다.
NODE1
데이터 파일 및 컨트롤 파일을 백업한다.
데이터를 생성합니다.
Archive Log 파일을 생성합니다.
복구할 때 Current Redo가 없는 상태이므로 Archive 파일이 어디까지 있는지에 따라 복구된 내용이 달라질 수 있기 때문에 추가적으로 Archive Log 파일을 생성합니다.
NODE2
데이터를 생성합니다.
Archive Log 파일을 생성합니다.
복구할 때 Current Redo가 없는 상태이므로 Archive 파일이 어디까지 있는지에 따라 복구된 내용이 달라질 수 있기 때문에 추가적으로 Archive Log 파일을 생성합니다.
다음은 TAC 온라인 백업본 환경을 구성하는 방법에 대한 설명입니다.
엔진을 설치한다. 설치에 대한 자세한 내용은 를 참고합니다.
$TB_SID.tip에 Tibero parameter 설정을 변경합니다.
dest가 명시된 파라미터 경로 수정
TAC 관련 파라미터 제거
데이터 파일, Archive Log 파일, 컨트롤 파일 생성 구문으로 Single 환경을 구성합니다. a. Single 서버 복사
b. 컨트롤 파일 재생성
c. 불완전 복구 수행
다음은 TSN 기반으로 불완전 복구를 수행한 예입니다.
d. temp 파일 생성
백업한 컨트롤 파일 스크립트내의 주석 스크립트 부분을 활용하여 temp 파일을 생성합니다.
tbboot 명령어로 데이터베이스를 기동시킵니다.
컨트롤 파일 Trace 생성 O/S의 copy 명령을 통해 별도의 위치에 복사하고 아래 문법을 사용하여 Trace를 생성합니다.
구분
설명
Consistent 백업
정상적인 Shutdown 후의 백업이다.
Inconsistent 백업
정상 종료되지 않은 상태에서의 백업 또는 DB 운영 중의 백업이다. (NO ARCHIVE LOG 모드에서는 사용을 권장하지 않음)
v$controlfileSQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '<FILENAME>' REUSE NORESETLOGS;항목
설명
FILENAME
생성할 Trace 파일 이름을 지정한다. (경로를 미지정 하는 경우 $TB_SID.tip 파일의
DB_CREATE_FILE_DEST 파라미터에 정의된 디렉터리에 생성됨)
REUSE
컨트롤 파일의 생성 문장을 백업할 때 이미 존재하는 파일을 재사용하려면 REUSE 옵션을 사용한다.
RESETLOGS
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 0SQL> !cp /home/tibero/tbdata/system001.dtf /home/tibero/tbdata_bak/system001.dtfSQL> 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.redoSQL> select name from v$controlfile;
NAME
-------------------------------------
/home/tibero/tbdata/c1.ctl
/home/tibero/tbdata/c2.ctltbdown$ 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/구분
설명
완전 복구
Archive Log파일과 Online Log파일을 모두 사용해서 가장 최근 Log까지 모두 반영한다.
불완전 복구
Log 파일 일부만 적용 하거나 특정 시점으로 복구가 가능하다.
Point-in-Time 복구
Redo record의 일부만 적용
불완전 복구를 하게 되면 반드시 resetlogs로 데이터베이스를 기동해야 한다.
V$RECOVER_FILE
V$RECOVERY_FILE_STATUS
V$LOGFILE V$CONTROLFILE
V$LOG$ tbboot -t resetlogsDB_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=1024MCREATE 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
$ tbbootSQL> 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.
주의 Online Backup 중에는 데이터베이스의 변경 사항에 대한 Log의 양이 늘어나기 때문에 가능하면 신속하게 작업하고 종료합니다.
기존의 Log 파일은 무시하고 Log를 초기화한다.
NORESETLOGS
기존의 유효한 Log 파일을 계속 사용한다.