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...
Linux 환경에서 티베로 DBMS 클라이언트 설치 관련하여 사전 준비사항, 고려사항, DB 설치방법에 대해서 설명합니다.
본 문서는 총 2개의 장으로 구성됩니다.
Tibero 클라이언트 설치 전 준비사항과 주의사항 및 설치 후 고려사항에 대해서 설명합니다.
🔎
UNIX 환경에서Tibero 클라이언트를 수동 모드로 설치하는 방법을 설명합니다.
🔎
Linux 환경에서 Tibero DB 설치 방법 (Tibero DBMS Install on Linux)을 안내합니다.
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

계정 및 권한, 파일환경 점검 등 Tibero DBMS 운용과 관리에 대한 보안 위험분석 및 영향도, 그리고 해결방안을 제시합니다.
티베로 데이터베이스 환경 파일 점검에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.
Tibero를 사용하여 DBMS에 접근할 경우 명령어 행의 계정 및 패스워드를 붙여서 사용하면 쉘 히스토리 (.history 또는 .sh_history) 파일에 사용한 계정과 패스워드의 기록이 남습니다.
계정 및 패스워드가 유출될 가능성이 있습니다.
Tibero 명령을 사용할 경우 명령어 행에 계정과 패스워드를 Line Mode가 아닌 Interactive Mode로 실행합니다. 쉘 히스토리(.history 또는 .sh_history) 파일에 대한 보호를 위하여 접근 권한 설정을 600으로 설정합니다.
$ tbsql <username>/<password>로 접속하지 않습니다.
UTL_FILE_DIR은 UTL_FILE을 통해 호스트의 파일 시스템 접근 허용 디렉터리를 제한합니다.
만약 UTL_FILE_DIR의 설정값이 '*'로 설정된 경우 전체 파일 시스템에 접근이 가능하므로 '*'로 설정할 경우에는 매 우 제한적으로 사용해야 합니다.
호스트의 전체 파일 시스템에 접근이 가능합니다.
'*' 설정값을 제거합니다.
UTL_SMTP 패키지를 Public 그룹에서 사용할 수 있도록 권한을 부여하면 허가받지 않은 메일의 전송이 발생 할 수 있습니다.
시스템 내부의 파일을 외부로 전송할 수 있습니다.
Public 그룹과 같은 사용자에게 권한을 부여하지 않고 특정 사용자에게 부여하여 해당 사용자에게만 메일이 전송될 수 있게 합니다.
Tibero DBMS를 초기에 설치할 경우 디폴트로 포함되는 Sample DB(TEST DB)를 제거하여 DBMS 운영정보 관련 공격이 침투할 때 환경 정보를 제거합니다.
데이터베이스의 운영 환경정보 노출 가능성이 있습니다.
Sample DB를 제거합니다.
Tibero의 중요 파일 중에 하나인 initialization 파일의 변경으로 시스템 장애가 발생합니다.
DB 기동 및 운영에 위협적인 영향을 줄 수 있습니다.
$ chmod 640 $TB_HOME/config/$TB_SID.tip 파일의 접근 권한을 설정합니다. (권장값 : 600 또는 640)
Tibero의 중요 파일인 Control 파일, Redo 로그 파일, 데이터 파일의 삭제 및 변경으로 시스템 장애가 발생합니다.
DB 운영 정지 및 데이터의 유실 위험이 있습니다.
Control 파일, Redo 로그 파일, 데이터 파일의 접근 권한을 설정합니다. (권장값 : 600 또는 640)
접근 권한을 640으로 설정한 경우
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
$ chmod 640 [Control 파일|Redo 로그 파일|데이터 파일]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
DB 권한 관리에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.
개발 시스템과 운영 시스템을 하드웨어적으로 분리하여 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 옵션 없이 권한을 다시 부여합니다.
데이터베이스 계정 관리에 대한 위험 분석, 위험 영향, 해결 방안을 설명합니다.
개발 시스템과 운영 시스템을 하드웨어적으로 분리하여 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 변경
티베로 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 이하로 설정합니다.
티베로 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가 별도로 존재하지 않습니다.
인스턴스 시작 후 첫 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> 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>;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>;LSNR_INVITED_IP_FILE="/home/tibero/tibero7/invited.list"# WAS_JEUS
192.168.22.20
192.168.44.10
### END OF FILE ####AUDIT Setting
AUDIT_TRAIL=OS
AUDIT_SYS_OPERATIONS=Y
AUDIT_FILE_DEST=/tibero/tbdata/audit/백업 관리를 통해 장애 및 외부 침입에 대해서 대비해야 합니다.
데이터베이스의 장애가 발생할 경우 복구가 불가능합니다.
백업 정책을 수립하여 주기적인 백업 또는 각기 다른 미디어에 복사본을 보유하고 시스템 유지 보수, Upgrade, Migration 등의 서비스 운휴 및 수정 작업의 경우는 가장 가까운 시간까지의 백업본을 보유합니다.
침해 사고가 발생할 경우 계정별 수행 Query와 시스템 및 응용 애플리케이션에 대한 로그를 관리합니다.
침해 사고 또는 장애 발생의 경우 원인 파악이 어렵습니다.
데이터베이스에서 발생하는 각종 로그는 원격지 관리 시스템을 통해 일정 기간(3개월 이상) 저장 관리하여 특이사항이 발생할 경우 원활한 분석이 가능하도록 지원해야 합니다.
UTL_FILE, UTL_SMTP 등 여러 PL/SQL 패키지는 시스템과 데이터베이스에 영향을 미치는 취약점을 가지고 있 으므로 해당 패키지의 사용 권한이 Public에 부여되는 것을 제한해야 합니다.
파일 시스템의 접근 또는 내부 파일의 외부 유출이 가능합니다.
아래와 같은 패키지의 실행 권한을 사용하지 않는 경우 Public role에서 ‘실행 권한’을 제거합니다.
UTL_HTTP, UTL_FILE, DBMS_RANDOM, DBMS_LOB, DBMS_SQL, DBMS_JOB,
DBMS_OBFUSCATION_TOOLKITSQL> REVOKE EXECUTE ON <패키지명> FROM PUBLIC;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로 확인합니다.
티베로 DBMS 사용 가이드를 주제별로 안내합니다. 설치부터 전환, 관리, 개발, 보안 관련 정보를 확인하세요.
타 DB, 대용량 DB 등을 Tibero DBMS 전환 이관 방법에 대해 안내합니다.
Windows 환경 내 티베로 DB 설치 방법을 안내합니다.
Linux와 Windows 환경 내 티베로 DBMS 클라이언트 설치 관련하여 사전 준비사항, 고려사항, 설치 방법에 대해 설명합니다.
본 문서는 총 2개의 장으로 구성됩니다.
Tibero 클라이언트 설치 전 준비사항과 주의사항 및 설치 후 고려사항에 대해서 설명합니다.
Tibero 클라이언트를 수동 모드로 설치하는 방법을 설명합니다.
Linux, Windows 등 다양한 환경에서 Tibero DB 설치 방법을 안내합니다.
(SQL, tbPSM, Text and tbESQL)
Windows 환경 내 티베로 DBMS 클라이언트 설치 관련하여 사전 준비사항, 고려사항, 설치 방법에 대해 설명합니다.
본 문서는 총 2개의 장으로 구성됩니다.
Tibero 클라이언트 설치 전 준비사항과 주의사항 및 설치 후 고려사항에 대해서 설명합니다.
🔎
Windows 환경에서 Tibero 클라이언트를 수동 모드로 설치하는 방법을 설명합니다.
🔎
Tibero DB Redo 로그 파일 크기 산정 방법에 대해 설명합니다.
Redo 로그 파일은 최소 2개 그룹을 권장하며, Archivelog 모드인 경우 최소 3개 그룹을 권장합니다. 이는 Redo 로그가 순환할 때 rewrite 방지를 위한 hangup 현상을 막기 위함이며 최소 2개의 멤버를 권장합니다. 성능을 위해 각각 다른 물리 디스크에 배치하도록 합니다.
Redo 로그 파일의 크기를 사전에 정확하게 추측하기가 어렵기 때문에 수행하는 업무의 일부를 수행한 후 Redo 로그 양을 측정하고 전체 업무를 수행했을 때의 Redo 로그 파일의 크기를 예측하는 것을 권장합니다.
아래는 Redo 로그 파일 크기를 산정할 때 고려할 사항입니다.
트랜잭션 처리 중 Log Switch가 발생하는 경우 트랜잭션 성능 저하가 발생합니다.
OLTP 중심의 시스템에서 트랜잭션 처리의 피크 타임에 Log Switch가 빈번하게 일어나지 않도록 Redo로그 크기의 조정이 필요합니다.
Redo 로그 파일의 크기가 크면 Log Switch 발생 가능성이 낮은 반면 Recovery 시간은 길어집니다.
위 고려 사항을 참고해서 다음의 모드 중에 하나를 선택합니다.
LOGGING / NOLOGGING 모드
테이블/인덱스에 대한 모든 변경사항은 기본적으로 Redo 로그로 기록되지만 NOLOGGING 테이블/ 인덱스에 대해 Direct-Path(DP) 방식으로 데이터를 추가하는 경우 Redo 로그를 기록하지 않습니다. DP에 대한 Redo 로그가 남지 않는 경우에 Media Recovery가 수행될 때 DP로 추가한 테이블 데이터 가 복구되지 않기 때문에 DP로 데이터를 추가한 후에는 백업을 받도록 권장합니다.
아래는 LOGGING 모드에서 하나의 DML당 로그 발생량 및 확인 방법입니다.
로그의 발생량을 DML 한 건으로 측정하기가 쉽지 않기 때문에 여러 건의 DML을 수행한 후 전체 로그 발생량을 측정해서 건수로 나누는 방법을 권장합니다.
로그 발생량은 v$sysstat 테이블의 'name' 컬럼이 'Redo log size'인 항목으로 확인 가능하며 alter system clear stat 명령으로 v$sysstat 테이블의 내용을 clear할 수 있습니다.
ARCHIVELOG / NOARCHIVELOG 모드 Redo 로그 파일은 Cache Recovery될 때 더 이상 필요없는 경우에 재사용됩니다. (일반적으로 3개의 Redo 로그 파일들을 생성해서 순차적으로 돌면서 재사용하는 구조입니다.)
Redo 로그에는 사용자 데이터에 가해지는 변경사항이 저장되며 DML의 종류에 따라 아래와 같은 내용이 저장됩니다.
추가로 아래와 같은 내용을 포함합니다.
트랜잭션 처리(begin/commit)를 위한 Redo 로그
Segment의 공간 관리(extent add, block format, index split)에 대한 Redo 로그
Undo 블록에 대한 변경사항
블록 내 각 ROW에서 수행했던 트랜잭션의 commit 여부를 확인하고 변경하는 Redo 로그
Redo 로그 파일에 쓰여지는 데이터량은 SQL 및 갱신 데이터량에 의해 크게 바뀌기 때문에 운영 전 사전에 정확한 추측이 불가능합니다.
시스템의 크기에 따라서 다음과 같이 사전 설정 후 실제 운영 중 REDO 발생량을 보고 조정해야 합니다.
DB 전환 전 고려사항에 대해서 설명합니다.
table_migrator.zip 바이너리 압축 파일을 해제하면 다음과 같은 파일이 생성됩니다.
Tibero DBMS 설치 및 운영하기 전 효율적 시스템 사용을 위한 DB 물리 설계 방법을 제시합니다.
Redo Log Files, Undo 및 Temp 테이블 스페이스 그리고 메모리 영역의 크기 산정을 위해서는 먼저 Tibero의 특성에 대한 이해가 필요하며 관련 정보는 Tibero 관리자 안내서를 참고합니다.
또한, Table 및 Index 크기를 산정하기 위해 필요한 정보와 산정 방식은 Tibero의 Data Block Architecture 특성을 고려합니다.
본 문서는 총 8개의 장으로 구성됩니다.
상황별 DBMS 성능 개선 방법에 대해 설명합니다.
Tibero 클라이언트는 데이터가 지정한 크기만큼 바인딩되기 전까지 서버로 업로드되지 않으므로 대용량 의 데이터를 업로드할 때 효율적으로 사용할 수 있습니다.
tbLoader에서 제공하는 아래의 옵션을 사용하여 이관합니다.
Windows 환경 내 Tibero 클라이언트 설치 관련하여 사전 준비 사항 및 주의 사항, 고려 사항에 대해서 설명합니다.
Tibero를 설치하기 위해서는 각 플랫폼별로 약간의 차이가 있지만 최소 2GB 이상의 하드디스크 여유 공간이 필요합니다. 이는 Tibero 설치 후 데이터베이스를 생성할 때 최소로 필요한 하드디스크 공간을 의미하기도 합니다.
Tibero 클라이언트 인스톨러를 이용해 설치하기 위해서는 JDK 1.5.17 이상이 반드시 설치되어 있어야 합니다.
[그림 1] JDK 설치 확인
Tmax group의 TechNet에서 회원가입 후 설치파일을 다운로드합니다.
Tibero를 설치한 후 타 제품과 연동을 위해 JDBC를 제공합니다.
JDBC 연동을 할 경우 Tibero DB 서버의 해당 경로에서 드라이버 파일을 받아 연동합니다.
아래는 Tibero 버전 별 드라이버 파일명에 대한 설명입니다.
Tibero 7
tibero7-jdbc.jar

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 이상
internal-jdbc-16.jar
Tibero JDBC 드라이버
migrator.bat
Windows 계열 실행 파일
migrator.sh
POSIX 계열 실행 파일
migrator.properties.eg
Table Migrator 컨트롤파일
msllogger-14.jar
로그 관련 인터페이스 클래스
antlr-4.3-complete.jar
문자열 파싱 관련 인터페이스 클래스
postgresql-42.2.27.jre6.jar
PostgreSQL JDBC 드라이버
UNIX 계열인 경우 migrator.sh, Windows 계열인 경우는 migrator.bat 파일을 수정합니다.
classpath 설정에 Source DB의 JDBC 드라이버가 설정되어 있는지 확인하고 없을 경우 추가합니다.
아래는 Table Migrator를 실행하는 2가지 예로 UNIX 계열인 경우 migrator.sh, Windows 계열인 경우는migrator.bat 명령어를 입력합니다.
파라미터의 값을 컨트롤 파일에 설정한 후 실행합니다.
migrator_cli.jar
Table Migrator 클래스
toolcom.jar
Tibero 유틸리티 공통 라이브러리
배열에 사용될 최대 바이트 수를 지정하는 파라미터 (기본값 : 64KB)
Direct Path Load 방식으로 데이터를 로드할 때 테이블에 존재하는 인덱스의 생성 방법을 MULTI INSERT 방식과 FAST BUILD 방식 중에 하나 선택할 수 있습니다.
아래는 인덱스 생성 방법에 대한 설명입니다.
MULTI INSERT INDEXES
인덱스를 여러 개의 레코드 단위로 최적화 하여 한 번에 생성
FAST BUILD INDEXES
기존의 인덱스를 무시하고 데이터 파일의 데이터를 모두 로드하여 다시 생성
인덱스 생성 방법을 지정하는 컨트롤 파일의 세부 내용은 아래와 같습니다.
rows
사용자가 대용량 데이터를 업로드할 때 Commit을 수행할 레코드 개수를 지정하는 파라미터 (단, tbLoader는 성능을 고려하여 지정한 레코드의 개수를 정확히 맞춰 서버로 데이터를 보내지는 않음)
bindsize
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 전체)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.properties# MULTI INSERT INDEXES 적용
$cat control.ctl
LOAD DATA
...
MULTI INSERT INDEXES
...
(...)
# FAS BUILD INDEXES 적용
$cat control.ctl
LOAD DATA
...
FAST BUILD INDEXES
...
(...)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 클라이언트를 삭제합니다.
티베로 DB Shared Memory 크기 산정 방법에 대해 설명합니다.
Tibero Shared Memory는 부팅할 때 고정된 용도로 사용되는 Fixed 영역과 운영 중에 자동으로 할당되어 사용되는 Shard Pool 영역으로 구분할 수 있습니다.
Fixed Memory DB가 부팅할 때 파라미터 값을 바탕으로 크기가 고정되는 영역입니다.
Buffer Cache(Database Buffer)
Log Buffer
Tibero DB SQL Execution Work Area 크기 산정 방법에 대해 설명합니다.
다른 워킹 프로세스 및 워킹 스레드와 공유되지 않은 독립적인 메모리 공간으로 세부 영역은 다음과 같습니다.
세션 정보 영역 로그온 및 세션 관련 정보
커서 정보 영역 (SQL영역) SQL 문 처리할 때 필요한 메모리 공간
SQL Work Area (SQL 작업 영역) Sort, hash-Join, Bitmap 생성 및 Merge(병합) 작업할 때 사용되는 메모리 영역


그 외 항목 : 전역 변수를 위한 공간, 워킹 스레드 정보와 세션 정보를 관리하는 영역
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 공간보다 커야 합니다.
$ 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.vbsSQL> 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아래는 관련 파라미터에 관한 설명입니다.
구분
설명
총 SQL Execution Work Area
산정방법
MEMORY_TARGET - TOTAL_SHM_SIZE
MEMORY_TARGET
총 메모리 사용량이다.
TOTAL_SHM_SIZE
대용량의 데이터를 Full Table Scan으로 읽어들여 정렬, 조인 및 분석을 수행하는 쿼리가 대부분이고 Parallel Execution을 이용하는 환경입니다. 읽어들이는 데이터의 크기가 물리적인 메모리 크기에 담을 수 없을 정도의 크기인 경우가 많기 때문에 효율적인 Buffer Cache 이용을 기대할 수가 없는 상황이므로 공유 메모리 영역에서 Buffer Cache의 크기를 줄이고 독립적으로 사용 가능한 SQL Execution Work Area 메모리 크기에 따라 성능이 크게 좌우되는 정렬, 조인 및 분석 작업을 위해 대부분의 물리 메모리 를 SQL Work Area에 할당하는 것이 효율적입니다.
다음은 SQL Execution Work Area 크기 산정하는 방법입니다.
항목
설명
일반적인 온라인 업무 환경 (OLTP)
SQL Execution Work Area (SQL 실행 작업 영역) : 20%
TOTAL_SHM_SIZE : MEMORY_TARGET 값의 80% (OS 및 다른 서비스 사용 영역 제외) EX_MEMORY_OPERATION_LIMIT : 5000
_OP_MEM_MAX_SIZE (Tibero 7 기준 (IPARAM(MEMORY_TARGET) - IPARAM(TOTAL_SHM_SIZE)) * 0.05
_OP_MEM_MAX_SIZE (Tibero7 기준)
데이터 분석 업무 환경
(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
총 SQL Execution
Work Area
기존 데이터베이스를 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로 전환에 대한 예시입니다.
🔎
UNIX 환경 내 Tibero Database Client 수동 모드 설치 방법을 안내합니다.
설치 파일(tar.gz)과 라이선스 파일(license.xml)을 준비합니다.
클라이언트 계정을 생성합니다.
$ useradd -d /home/tibero7_client -g dba tibero7_client
$ passwd tibero7_client바이너리 압축을 해제합니다.
profile을 설정합니다. 클라이언트 서버의 profile에 해당 내용을 환경에 맞게 수정한 후 추가합니다.
gen_tip.sh를 실행합니다.
네트워크 파일 (tbdsn)을 설정합니다. tbdsn.tbr 파일은 서버의 접속 경로를 설정하는 파일로 $TB_HOME/client/config에 위치합니다. 아래와 같이 tbdsn.tbr 파일을 수동으로 설정합니다.
Tibero Client를 이용해서 Tibero Server로 접속합니다.
대용량 데이터 이관 방법 및 고려사항, 예제와 데이터베이스 성능 개선에 대해 안내합니다.
이기종 데이터베이스를 이관할 때 대용량 테이블이 있다면 이관 방법을 통해 수행 시간을 단축할 수 있습니다. 고객사의 환경(네트워크, Disk I/O, 데이터 속성)을 고려하여 적절한 방법을 선택합니다.
아래는 이관 방법들의 특징에 대한 설명입니다.
_OP_MEM_MAX_SIZE(Tibero 7 기준) (IPARAM(MEMORY_TARGET) - IPARAM(TOTAL_SHM_SIZE)) * 0.3
총 공유 메모리 사용량이다.
_OP_MEM_MAX_SIZE
하나의 operation(정렬, 조인, 분석)에서 사용할 최대 메모리 사용량이다. (Tibero 7 기준)
_OP_MEM_PX_MAX_SIZE
하나의 operation(정렬, 조인, 분석)이 parallel로 수행될 때 slave들이 사용 할 수 있는 총 최대 메모리 사용량이다. (Tibero 7 기준)
EX_MEMORY_OPERA TION_LIMIT
하나의 operation에서 사용할 최대 메모리 사용량을 계산한다. (단위: MB) parallel 쿼리에서 slave들도 위의 최대 메모리 사용량을 쓰려고 하기 때문에 과다 메모리를 사용하려고 하고 memory tunner에 의해 나중에 수행되는 slave 의 경우 메모리 사용에 불이익을 받게 될 수도 있다.
최대 MEMORY_TARGET - TOTAL_SHM_SIZE만큼 사용이 가능하다.
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 버전에 맞는 드라이버 사용)
$ 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
TIBEROTable 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
아래는 대용량 데이터를 이관할 때 고려해야 할 사항입니다.
충분한 네트워크 대역을 확보합니다.
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을 지원합니다.
LONG 컬럼이 포함된 255개 이상의 Column을 가진 테이블은 DPL을 미지원합니다.
LOB 계열의 컬럼이 있는 경우 DPL만 지원합니다.
INDEX가 생성되어 있는 경우 DPL만 지원합니다.
본 문서는 총 2개의 장으로 구성됩니다.
대용량 데이터 이관 방법의 예제를 설명합니다.
각 상황에 따른 성능 개선 방법에 대해 설명합니다.
T-UP
GUI 기반의 클라이언트 (네트워크 오버헤드가 커서 대용량 데이터를 이관할 경우 미권장)
DPL을 지원
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
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티베로 DB 데이터 타입별 크기 산정 방법에 대해 설명합니다.
아래 표는 테이블과 인덱스 크기 시트의 계산식에서 적용되는 데이터 타입별 실제 소비 사이즈이며 저장 되는 크기는 산정 길이 +1로 합니다. 예를 들면 데이터의 산정 길이는 8bytes이며 실제 저장 데이터는 8+1=9bytes입니다.
문자형
타입
고정/ 가변
숫자형
날짜형
간격형
대용량 객체형
내재형
NULL일 때
크기가 0일 때
크기가 4000보다 작을 때
크기가 96KB 보다 작을 때
그 이상일 때
위 계산에서 LOB 데이터를 별도 segment로 저장하기 위한 overhead는 계산하지 않습니다.
long의 경우 데이터의 길이가 길어지면 chained row piece로 나뉘어서 저장되는데, row piece를 연결시키기 위한 추가 overhead는 고려하지 않습니다.
길이 산정 예
설명
CHAR
고정/ 가변
CHAR(10) = 10bytes
CHAR(10 BYTE), CHAR(10 CHAR) 문자열의 길이는 byte와 문자를 기준으로 지정한다.
CHAR(10)의 형태로 선언하면, byte로 문자 열의 길이가 지정된다.
CHAR로 길이를 선언하면 문자가 몇 byte로 표현되는지에 따라 그 길이가 달라진다.
VARCHAR
가변
VARCHAR 가변 VARCHAR(10) =
(10*0,7)= 7bytes
지정된 데이터 길이의 0.7로 가정
NCHAR
고정
NCHAR(10) = 30bytes(UTF8),
20bytes(UTF16 )
UTF8 : size의 최대 3배
UTF16 : size의 최대 2배
NVARCHAR
가변
NVARCHAR(10) = (10*0.7)*3 =
21bytes(UTF8), 14bytes(UTF16)
UTF8 : size의 최대 3배
UTF16 : size의 최대 2배
RAW
가변
실제로 저장되는 데이터의 길이
LONG
가변
실제로 저장되는 데이터의 길이
LONG RAW
가변
실제로 저장되는 데이터의 길이
타입
고정/ 가변
길이 산정 예
설명
NUMBER
가변
NUMBER(7)
=roundup(7/2) = 4bytes
roundup(size/2) size가 38 자리수보다 크면 38 로 정 의하고 38 자리수 미만의 음수는 1byte를 더한다.
타입
고정/가변
길이 산정 예
DATE
고정
8bytes
TIME
고정
타입
고정/가변
길이 산정 예
INTERVAL YEAR TO MONTH
고정
5bytes
INTERVAL DAY TO SECOND
고정
타입
고정/가변
길이 산정 예
설명
CLOB
가변
실제로 저장되는 데이터의 길이 ("" 참조)
타입
고정/가변
길이 산정 예
설명
ROWID
고정
10bytes
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
가변
NUMBER와 같다.
FLOAT
가변
NUMBER와 같다.
8bytes
TIMESTAMP
가변
12bytes
TIMESTAMP WITH TIME ZONE
고정 1
7bytes
TIMESTAMP WITH LOCAL TIME ZONE
고정
12bytes
12bytes
BLOB
가변
실제로 저장되는 데이터의 길이 ("" 참조)
XMLTYPE
가변
CLOB과 같다.
Tibero DB 테이블 크기 산정 방법에 대해 설명합니다.
테이블 크기를 산정하기 위해서는 컬럼의 데이터 타입별 실제 소비 크기와 저장되는 길이를 산정해야 합니다. 이 정보는 테이블 크기를 산정하기 위한 항목별 크기 산정 방법에 사용됩니다.
아래는 컬럼 정의 및 계산 방식의 예입니다. 크기 산정 테이블은 5개의 컬럼으로 구성되었다고 가정합니다.
이름
데이터타입
데이터길이
비고
""의 데이터 타입별 사이즈 표를 참고하여 위 테이블을 구성하는 각 컬럼의 데이터 타입별 실제 소비사이즈를 산정하면 아래와 같습니다.
테이블 크기를 산정하기 위해 필요한 항목은 아래와 같습니다.
크기 예는 각 항목별로 기본으로 정해진 크기, 파라미터로 설정할 수 있는 크기와 운영할 시스템에서 사전 조사된 수치를 나타냅니다.
250bytes 이하 및 초과 컬럼 개수는 Row의 데이터 길이 테이블을 참고합니다. 초기 예상 건수, 월중 예상 추가 건수, 데이터 보관 월 수는 운영할 시스템의 사용자 환경의 정보입니다.
본 절에서는 Tibero에서 테이블 크기를 산정하는 방법에 대해서 설명합니다.
block당 사용 가능한 데이터 공간 크기입니다.
독립적인 가상화 환경을 생성하는 도커 플랫폼의 이미지를 활용함으로써 더욱 편리하고 안정적으로 Tibero를 설치하는 방법을 안내합니다.
아래 두 가지 방법 중 적합한 방식으로 도커 이미지를 사용합니다.
아래 경로에서 Tibero 공식 도커 이미지를 다운로드 합니다.
Tibero 공식 도커 이미지 다운로드
데이터베이스 파라미터 지정 과정을 예시와 함께 설명합니다.
파라미터를 지정하는 컨트롤 파일은 기본으로 migrator.properties 파일로 지정됩니다.
(migrator.properties 파일에 설정)
각 파라미터의 설명은 아래와 같습니다.
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
개월
사용자 환경
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)
48
48
ITL공간
48
48
24 * 2 (24 * INITRANS)
PCTFREE
10
10
Data Space per Block
7,286
(8192-48-48)*(100-10)/100
2,636
2,636
Row Size per Block
2
7,286 / 2,636
20,000
20,000
데이터 보관 월 수
120
120+1
<데이터 보관 월 수> + 1
Total Row Size
2,520,000
100,000 +20,000 *(120+1)
2,520,000
2,520,000
Row Size per Block
2
2
Total Table Size
10,321,920,000 (9.613037GB)
8,192 * 2,520,000 / 2
c1
CHAR(10)
10
c2
DATE
8
c3
NUMBER(7,2)
4
roundup(7/2)
c4
CHAR(500)
500
c5
VARCHAR(3000)
2,100
3,000 * 0,7
Row의 데이터 길이
2,622
c1 + c2+ c3 + c4 + c5
구분
설명
CHAR
문자열의 길이는 byte와 문자를 기준으로 지정한다. CHAR(10) = 10, CHAR(500) = 500
DATE
고정 8bytes 이다.
NUMBER
항목
크기 예
단위
설명
Row Directory
2
bytes
row 하나당 bytes
Row Directory
2
2
항목
사전 정보 크기
실제 저장 크기
비고
Block Size
8192
8192
항목
사전 정보 크기
실제 저장 크기
비고
Data Space per Block
7,286
7,286
항목
사전 정보 크기
실제 저장 크기
비고
초기 예상 건수
100,000
100,000
항목
사전 정보 크기
실제 저장 크기
비고
Block Size
8,192
8,192
크기를 2로 나누어 반올림한 값이다. NUMBER(7,2) = roundup(7/2) = 4
Row Header
Block Header
Row Space
월중 예상 추가 건수
Total Row Size
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" 로 지정 합니다.
한 Row 저장에 필요한 공간 = Row Directory + Row Header + Row의 데이터 길이
+ (1 * <250bytes 이하 컬럼개수>) + (3 * <250bytes 초과 컬럼개수>)한 블록의 데이터 공간 = (Block Size - Block Header - ITL공간) * (100 - PCTFREE) / 100/ Row Space ( 한 블록의 데이터 공간 / 한 Row의 저장에 필요한 공간 )총 데이터 Row 개수 = <초기 예상 건수> + <월중 예상 추가 건수> * (<데이터 보관 월 수> + 1)필요한 총 데이터 공간 = Block Size * Total Row Size / Row Size per Block (Block Size
* 총 데이터 Row 개수 / 한 블록에 들어갈 수 있는 Row 개수)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.shSOURCE_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
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=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 실행 경로)
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를 곱해서 계산하는 것이 현실적일 수 있습니다.
대용량 데이터 이관 방법의 예제를 설명합니다.
데이터 이관은 다양한 방법을 이용하여 수행할 수 있고 이로 인해 수행 속도를 최적화 시킬 수 있습니다.
아래는 예제에서 사용하는 테이블 정보입니다.
Table Migrator 방법으로 대용량 데이터를 이관하는 순서입니다.
migrator.properties 파일에 속성값을 설정합니다.
데이터타입
데이터길이
비고
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
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 수행
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;$ 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=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
$ 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티베로 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 파일을 계속 사용한다.
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 수를 기준으로 실제 크기와 산정한 크기가 맞는지 검증할 수 있습니다.
최소 크기
예상 크기
실제 크기
(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)) + 여유값항목
설명
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 block 소모량
운영 중 최대 부하 당시의 APM 리포트에서 Undo Statistics의 Undo blocks값을 APM 구간(초)로 나눈 값이 다
UNDO_RETENTION
TIP 설정 값이다. (기본값: 900초)
여유값
KB 값이다. Long 트랜잭션이 비정기적으로 들어올 경우 (INDEX rebuild등도 포함)를 대비하여 충분한 크기를 잡 아 두는 것이 좋다.