문서유형ㅣ기술정보
분야ㅣ패치/업그레이드
적용제품버전ㅣTibero7.2.4
문서번호ㅣTPATI002
개요
본 문서는 리눅스 환경에서 Tibero Patch를 수행하기 위한 절차 및 유의사항을 정리한 가이드입니다.
패치 작업은 운영 중 다음과 같은 문제로 인해 시스템 안전성 확보가 필요한 경우에만 해당되며, 반드시 콜센터 및 영업대표를 통해 기술지원 요청 후, 엔지니어를 통해 지원 받을 것을 권장합니다.
참고
심각한 내부 오류 성능 이슈 기능 부재 또는 기능 개선
방법
패치 절차
패치 작업 절차는 아래와 같으며 큰 절차 동일하나, Tibero 구성 방식 (SINGLE/TAC/HA)에 따라 약간의 차이가 있을 수 있습니다.
참고
패치 전 사전 점검 패치 작업 수행, 검증 및 모니터링 패치 적용 후, 문제 발생 시 긴급 복원 ( ※ 패치 절차의 역순으로 진행 )
패치 전 사전 점검
본 절에서는 패치 전 사전 점검 사항에 대해서 설명합니다.
SYS, SYSCAT (DBA 권한이 있는 계정) 계정의 패스워드 확인
보안 문제로 인해 DBA 권한을 가진 기본 계정 (SYSCAT, TIBERO)이 잠겨있을 경우, DBA 또는 담당자에게 요청하여, 계정 잠금 해제를 요청합니다.
# USER Ulock
SQL> col username for a20
SQL> select username, account_status from dba_users where username in ('SYSCAT','TIBERO');
SQL> ALTER USER SYSCAT ACCOUNT UNLOCK;
SQL> ALTER USER TIBERO ACCOUNT UNLOCK;
패치 전 Object Invalid 확인
패치 과정에서 패치 태크스가 수행되는데, 이 과정에서 기존 Valid인 Object들이 Invalid로 변경될 수 있습 니다. 따라서 패치 전, Object 검증을 통해 패치 전,후 오브젝트를 비교하여 Valid로 변경하기 위함입니다.
# Object Status 확인
SQL> col owner for a20
SQL> col object_name for a40
SQL> set linesize 200
SQL> set pagesize 10000
SQL> select owner, object_name, object_type, status
from dba_objects
where status='INVALID'
order by 1,3,2,4;
데이터 파일 위치 확인
주의
데이터 파일이 $TB_HOME 경로 내부에 위치한다면, 아래 쿼리를 조회하여 패치할 바이너리로 교체 후에도 동일한 경로로 move 합니다. 단, DB를 정상적으로 Down 후 옮겨야 합니다.
SQL> select file_name from dba_data_iles;
DB Link 사용 여부 확인
ex) Tibero to Oracle DB Link인 경우 (ps -ef | grep gw4orcl)
ora_link_remote=(
(GATEWAY=(LISTENER=(HOST=12.34.56.78)
(PORT=9999))
(TARGET=orcl)
(TX_MODE=GLOBAL))
)
ex) Tibero to MS-SQL DB Link인 경우 (ps -ef | grep tbgw)
mssql_link_remote=(
(GATEWAY=(LISTENER=(HOST=12.34.56.78)
(PORT=9093))
(TARGET=12.34.56.87:1433:master)
(TX_MODE=LOCAL))
)
ex) Tibero To MySQL DB Link인 경우 (ps -ef | grep tbgw)
mysql_link_remote=(
(GATEWAY=(LISTENER=(HOST=12.34.56.78)
(PORT=9093))
(TARGET=12.34.56.87:3306:mydb)
(TX_MODE=LOCAL))
)
ex) Tibero To DB2 DB Link인 경우 (ps -ef | grep gw4db2)
db2_link_remote=(
(GATEWAY=(LISTENER=(HOST=12.34.56.78)
(PORT=9999))
(TARGET=sample)
(TX_MODE=GLOBAL))
)
External Procedure 사용 여부 확인
ex) C External Procedure 확인
SQL> col owner for a10
SQL> col library_name for a30
SQL> col file_spec for a50
SQL> select * from dba_libraries;
OWNER LIBRARY_NAME FILE_SPEC STATUS
---------- ------------------------------ -------------------------------------------------- -------
SYS EXTPROC /home/tibero7/tibero_engine/libextproc.so VALID
1 row selected.
ex) Java External Procedure 확인
tip 파일 내, JAVA_CLASS_PATH=/home/tibero/tibero7/instance/tibero/java 확인 가능
SQL> col owner for a10
SQL> col name for a30
SQL> col source for a50
SQL> select owner, name, source from dba_java_classes;
OWNER NAME SOURCE
---------- ------------------------------ -------------
SYS SimpleMath JavaExtproc
1 row selected.
패치 작업 수행, 검증 및 모니터링
패치 작업 수행 절차
SINGLE
1. 바이너리 교체 전, 패치 태스크 수행
- 간혹 바이너리 교체 전 수행이 필요한 패치 태스크들이 존재합니다. 존재할 경우에만 기동 종료 전 수행하며 존재하지 않을 경우, 생략 가능합니다.
2. AP (서비스) 중지
- 고객사 수행 건으로 중지 후, V$SESSION 또는 GV$SESSION을 통해 Running 중인 세션이 없는지 재확인합니다.
3. Tibero 기동 종료
# 기동 종료 전, 데이터 변경 사항 모두를 메모리에서 디스크로 확실히 내리기 위함입니다.
SQL> alter system switch logfile ;
SQL> alter system checkpoint ;
SQL> tbdown immediate;
# DB Link 게이트웨이 종료
ps -ef | grep gw4orcl
kill -9 [PID]
# Tibero Process 종료 재확인
ps -ef | grep tbsvr
# DB Link Gateway 종료 재확인
ps -ef | grep gw4orcl
# etc (epa, jepa 등) Process 종료 재확인
ps -ef | grep java4. Tibero 바이너리 교체
# 바이너리 교체 전, tibero7_날짜 형식으로 백업
mv ${TB_HOME} ${TB_HOME%/*}/tibero7_$(date +%Y%m%d)
cd ${TB_HOME%/*}
# 바이너리 압축 해제 및 교체
gzip -dc [바이너리 파일].tar.gz.filepart | tar -xvf -5. ASIS 서버의 DB 환경설정 (tip, tbdsn.tbr, cfg, 라이선스 등)과 DB Link 관련 Gateway를 TOBE 서버로 COPY
# DB 기동 시 필수 환경설정 파일로 반드시 옮겨야 합니다.
cd $TB_HOME/config
sh gen_tip.sh
cp ${TB_HOME%/*}/tibero7_$(date +%Y%m%d)/config/*.tip $TB_HOME/config/
cp ${TB_HOME%/*}/tibero7_$(date +%Y%m%d)/client/config/tbdsn.tbr $TB_HOME/client/config/
cp ${TB_HOME%/*}/tibero7_$(date +%Y%m%d)/license/*.xml $TB_HOME/license/
# 확인 후, 선택 사항
ex) Jepa
cp ${TB_HOME%/*}/tibero7_$(date +%Y%m%d)/client/epa/java/config/epa.cfg ${TB_HOME}/client/epa/java/config
ex) DB Link Gateway (Tibero to Oracle)
mv ${TBGW_HOME}/gw4orcl ${TBGW_HOME}/gw4orcl_$(date +%Y%m%d)
cp ${TB_HOME%/*}/tibero7/client/bin/gw4orcl ${TBGW_HOME}/gw4orcl
ex) DB Link Gateway (Tibero to etc)
mv ${TB_HOME%/*}/tibero7/client/bin/tbJavaGW/tbJavaGW ${TB_HOME%/*}/tibero7/client/bin/tbJavaGW/tbJavaGW_$(date +%Y%m%d)
cp ${TB_HOME%/*}/tibero7/client/bin/tbJavaGW.zip ${TBGW_HOME}/tibero7/client/bin/tbJavaGW.zip6. Tibero 기동
tbboot
# 기동 확인
ps -ef | grep tbsvr7. 패치 태스크 수행
주의
아래는 패치 태스크 중 일부 예시로, Task list는 사전에 엔지니어에게 확인받아 수행해야하며, 절대 운영중인 DB에 적용하지 않도록 합니다.
[t7_1]tibero7@tibero_raw:/home/tibero7/> tbsql sys
tbSQL 7
TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
Enter Password:
Connected to Tibero.
ex) SQL> @$TB_HOME/scripts/tpr_stop.sql8. Invalid로 빠진 오브젝트 Valid로 변경 및 오브젝트 상태 재확인
SQL> begin
for obj in (select object_type, owner, object_name from dba_objects where STATUS = 'INVALID') loop
BEGIN
if obj.object_type = 'VIEW' then
execute immediate 'alter view "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type = 'PROCEDURE' then
execute immediate 'alter procedure "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type = 'FUNCTION' then
execute immediate 'alter function "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type = 'PACKAGE' or obj.object_type = 'PACKAGE BODY' then
execute immediate 'alter package "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type = 'TRIGGER' then
execute immediate 'alter trigger "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type = 'TYPE' or obj.object_type = 'TYPE BODY' then
execute immediate 'alter type "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type='SYNONYM' then
if obj.owner='PUBLIC' then
execute immediate 'alter public synonym "' || obj.object_name || '" compile';
else
execute immediate 'alter synonym "' || obj.owner || '"."' || obj.object_name || '" compile';
end if;
end if;
exception
when others then
null;
end;
end loop;
end;
/
# Compile 완료 후, Object Status 재확인
SQL> col owner for a20
SQL> col object_name for a40
SQL> set linesize 200
SQL> set pagesize 10000
SQL> select owner, object_name, object_type, status
from dba_objects
where status='INVALID'
order by 1,3,2,4;
9. AP (서비스) 기동
- 고객사 수행 건으로 서비스 기동 후 패치
2-Node TAC (Active-Active)
주의
TAC 구성인 경우, 여러 개의 Node가 존재할 수 있으나, 결론적으로 DB는 1개로, 7번) 패치 태스크 수행 전, 나머지 Node들은 기동 종료하고 하나의 Node만 기동하여 패치 태스크를 수행합니다, 단 모든 Node들에 대해서 바이너리 교체 및 환경설정 파일들을 동일하게 교체가 필요합니다.
ex) 2Node-TAC 구성인 경우, 태스크 수행 전 Node2는 Down하고 Node1만 기동하여 수행합니다.
간혹 리소스 중, TAS Service 또는 DB Service 중 Auto-Restart 기능이 켜져 있는 경우, 해당 서비스를 deact로 변경 후에 DB 기동 종료합니다.
ex) [t7_1]tibero7@tibero_raw:/home/tibero7> cmrctl show
Resource List of Node cm1
===========================================================
CLUSTER TYPE NAME STATUS DETAIL
---------- -------- -------------- ------------- ----------------------------------------------------t7_cls service t7 UP Database, Active Cluster (auto-restart: ON)
[t7_1]tibero7@tibero_raw:/home/tibero7> cmrctl deact service --name t7
Auto-boot mode is deactivated (t7)===========================================================
CLUSTER TYPE NAME STATUS DETAIL
---------- -------- -------------- ------------- ----------------------------------------------------t7_cls service t7 UP Database, Active Cluster (auto-restart: OFF)
3. 각 노드 Tibero 기동 종료 (모든 Node 수행)
# 기동 종료 전, 데이터 변경 사항 모두를 메모리에서 디스크로 확실히 내리기 위함으로 각 노드별로 수행합니다.
SQL> alter system switch logfile ;
SQL> alter system checkpoint ;
SQL> tbdown immediate;
# DB Link 게이트웨이 종료
ps -ef | grep gw4orcl
kill -9 [PID]
# Tibero Process 종료 재확인
ps -ef | grep tbsvr
# DB Link Gateway 종료 재확인
ps -ef | grep gw4orcl
# etc (epa, jepa 등) Process 종료 재확인
ps -ef | grep java4. Tibero 바이너리 교체 (모든 Node 수행)
# 바이너리 교체 전, tibero7_날짜 형식으로 백업
mv ${TB_HOME} ${TB_HOME%/*}/tibero7_$(date +%Y%m%d)
cd ${TB_HOME%/*}
# 바이너리 압축 해제 및 교체
gzip -dc [바이너리 파일].tar.gz.filepart | tar -xvf -5. 각 노드 ASIS 서버의 DB 환경설정 (tip, tbdsn.tbr, cfg, 라이선스 등)과 DB Link 관련 Gateway를 TOBE 서버로 COPY (모든 Node 수행)
# DB 기동 시 필수 환경설정 파일로 반드시 옮겨야 합니다.
cd $TB_HOME/config
sh gen_tip.sh
cp ${TB_HOME%/*}/tibero7_$(date +%Y%m%d)/config/*.tip $TB_HOME/config/
cp ${TB_HOME%/*}/tibero7_$(date +%Y%m%d)/client/config/tbdsn.tbr $TB_HOME/client/config/
cp ${TB_HOME%/*}/tibero7_$(date +%Y%m%d)/license/*.xml $TB_HOME/license/
# 확인 후, 선택 사항
ex) Jepa
cp ${TB_HOME%/*}/tibero7_$(date +%Y%m%d)/client/epa/java/config/epa.cfg ${TB_HOME}/client/epa/java/config
ex) DB Link Gateway (Tibero to Oracle)
mv ${TBGW_HOME}/gw4orcl ${TBGW_HOME}/gw4orcl_$(date +%Y%m%d)
cp ${TB_HOME%/*}/tibero7/client/bin/gw4orcl ${TBGW_HOME}/gw4orcl
ex) DB Link Gateway (Tibero to etc)
mv ${TB_HOME%/*}/tibero7/client/bin/tbJavaGW/tbJavaGW ${TB_HOME%/*}/tibero7/client/bin/tbJavaGW/tbJavaGW_$(date +%Y%m%d)
cp ${TB_HOME%/*}/tibero7/client/bin/tbJavaGW.zip ${TBGW_HOME}/tibero7/client/bin/tbJavaGW.zip6. 티베로 기동 (Node1만 기동)
tbboot
# 기동 확인
ps -ef | grep tbsvr7. 패치 태스크 수행
주의
아래는 패치 태스크 중 일부 예시로, Task list는 사전에 엔지니어에게 확인받아 수행해야하며, 절대 운영중인 DB에 적용하지 않도록 합니다.
[t7_1]tibero7@tibero_raw:/home/tibero7/> tbsql sys
tbSQL 7
TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
Enter Password:
Connected to Tibero.
ex) SQL> @$TB_HOME/scripts/tpr_stop.sql8. Invalid로 빠진 오브젝트 Valid로 변경 및 오브젝트 상태 재확인
SQL> begin
for obj in (select object_type, owner, object_name from dba_objects where STATUS = 'INVALID') loop
BEGIN
if obj.object_type = 'VIEW' then
execute immediate 'alter view "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type = 'PROCEDURE' then
execute immediate 'alter procedure "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type = 'FUNCTION' then
execute immediate 'alter function "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type = 'PACKAGE' or obj.object_type = 'PACKAGE BODY' then
execute immediate 'alter package "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type = 'TRIGGER' then
execute immediate 'alter trigger "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type = 'TYPE' or obj.object_type = 'TYPE BODY' then
execute immediate 'alter type "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type='SYNONYM' then
if obj.owner='PUBLIC' then
execute immediate 'alter public synonym "' || obj.object_name || '" compile';
else
execute immediate 'alter synonym "' || obj.owner || '"."' || obj.object_name || '" compile';
end if;
end if;
exception
when others then
null;
end;
end loop;
end;
/
# Compile 완료 후, Object Status 재확인
SQL> col owner for a20
SQL> col object_name for a40
SQL> set linesize 200
SQL> set pagesize 10000
SQL> select owner, object_name, object_type, status
from dba_objects
where status='INVALID'
order by 1,3,2,4;
HA 구성 (Active-StandBy)
- HA 구성은 아래와 같이 누눌수 있으며, case1)에 대해서만 패치 수행 절차를 설명합니다.
주의
패치 전 반드시 Cluster 엔지니어에게 요청하여, Failover 기능을 중지 시켜야 하며, 패치 완료 후 Failover 기능을 기동하여 테스트를 수행합니다.
- case1) Data 영역만을 공유하는 경우
ㄴ StandBy로 Failover 시, Data 영역만 (de)attach 되기 때문에 StandBy 노드도 Tibero Engine이 존재하여 해당 노드도 모든 과정 수행 필요 O
- case2) Engine, Data 영역 둘 다 공유하는 경우
ㄴ StandBy로 Failover 시, Engine, Data 영역 모두가 (de)attach 되기 때문에, StandBy 노드는 모든 과정 수행 필요 X
3. 각 노드 Tibero 기동 종료 (Active Node 수행)
# 기동 종료 전, 데이터 변경 사항 모두를 메모리에서 디스크로 확실히 내리기 위함입니다.
SQL> alter system switch logfile ;
SQL> alter system checkpoint ;
SQL> tbdown immediate;
# DB Link 게이트웨이 종료
ps -ef | grep gw4orcl
kill -9 [PID]
# Tibero Process 종료 재확인
ps -ef | grep tbsvr
# DB Link Gateway 종료 재확인
ps -ef | grep gw4orcl
# etc (epa, jepa 등) Process 종료 재확인
ps -ef | grep java4. Tibero 바이너리 교체 (Active-StandBy Node 둘 다 수행)
# 바이너리 교체 전, tibero7_날짜 형식으로 백업
mv ${TB_HOME} ${TB_HOME%/*}/tibero7_$(date +%Y%m%d)
cd ${TB_HOME%/*}
# 바이너리 압축 해제 및 교체
gzip -dc [바이너리 파일].tar.gz.filepart | tar -xvf -5. 각 노드 ASIS 서버의 DB 환경설정 파일 교체 (Active-StandBy Node 둘 다 수행)
# DB 기동 시 필수 환경설정 파일로 반드시 옮겨야 합니다.
cd $TB_HOME/config
sh gen_tip.sh
cp ${TB_HOME%/*}/tibero7_$(date +%Y%m%d)/config/*.tip $TB_HOME/config/
cp ${TB_HOME%/*}/tibero7_$(date +%Y%m%d)/client/config/tbdsn.tbr $TB_HOME/client/config/
cp ${TB_HOME%/*}/tibero7_$(date +%Y%m%d)/license/*.xml $TB_HOME/license/
# StandBy 노드에도 동일하게 적용해야 Failover 됐을 때, epa, link 등 동일하게 사용 가능
ex) Jepa
cp ${TB_HOME%/*}/tibero7_$(date +%Y%m%d)/client/epa/java/config/epa.cfg ${TB_HOME}/client/epa/java/config
ex) DB Link Gateway (Tibero to Oracle)
mv ${TBGW_HOME}/gw4orcl ${TBGW_HOME}/gw4orcl_$(date +%Y%m%d)
cp ${TB_HOME%/*}/tibero7/client/bin/gw4orcl ${TBGW_HOME}/gw4orcl
ex) DB Link Gateway (Tibero to etc)
mv ${TB_HOME%/*}/tibero7/client/bin/tbJavaGW/tbJavaGW ${TB_HOME%/*}/tibero7/client/bin/tbJavaGW/tbJavaGW_$(date +%Y%m%d)
cp ${TB_HOME%/*}/tibero7/client/bin/tbJavaGW.zip ${TBGW_HOME}/tibero7/client/bin/tbJavaGW.zip6. Tibero 기동 (Active Node 수행)
tbboot
# 기동 확인
ps -ef | grep tbsvr7. 패치 태스크 수행
주의
아래는 패치 태스크 중 일부 예시로, Task list는 사전에 엔지니어에게 확인받아 수행해야하며, 절대 운영중인 DB에 적용하지 않도록 합니다.
[t7_1]tibero7@tibero_raw:/home/tibero7/> tbsql sys
tbSQL 7
TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
Enter Password:
Connected to Tibero.
ex) SQL> @$TB_HOME/scripts/tpr_stop.sql8. Invalid로 빠진 오브젝트 Valid로 변경
SQL> begin
for obj in (select object_type, owner, object_name from dba_objects where STATUS = 'INVALID') loop
BEGIN
if obj.object_type = 'VIEW' then
execute immediate 'alter view "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type = 'PROCEDURE' then
execute immediate 'alter procedure "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type = 'FUNCTION' then
execute immediate 'alter function "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type = 'PACKAGE' or obj.object_type = 'PACKAGE BODY' then
execute immediate 'alter package "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type = 'TRIGGER' then
execute immediate 'alter trigger "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type = 'TYPE' or obj.object_type = 'TYPE BODY' then
execute immediate 'alter type "' || obj.owner || '"."' || obj.object_name || '" compile';
elsif obj.object_type='SYNONYM' then
if obj.owner='PUBLIC' then
execute immediate 'alter public synonym "' || obj.object_name || '" compile';
else
execute immediate 'alter synonym "' || obj.owner || '"."' || obj.object_name || '" compile';
end if;
end if;
exception
when others then
null;
end;
end loop;
end;
/
# Compile 완료 후, Object Status 재확인
SQL> col owner for a20
SQL> col object_name for a40
SQL> set linesize 200
SQL> set pagesize 10000
SQL> select owner, object_name, object_type, status
from dba_objects
where status='INVALID'
order by 1,3,2,4;
패치 작업 완료 후, DB에 문제 발생 시 복원
참고
패치 절차의 역순으로 진행합니다.
패치 작업 실패 또는 완료 이후 DB에 문제가 발생한 경우, 과거 패치 이전의 바이너리로 원복을 진행해야 할 수 있습니다. 이때 원복 작업은 반드시 엔지니어를 통해 증상을 확인한 후 수행하시기 바랍니다.
패치 원복 작업 수행 절차