#########################################################################################################
##### 오패치 개요
#########################################################################################################
.interim patch나 'one-off' patch를 적용하는 툴
.특정 버젼에만 적용 가능
.예를 들어 8.1.7.3 버젼의 임시패치를 8.1.7.4에 적용 불가능
.임시패치는 대부분 차기 패치셋에 포함됨
.그런데 임시패치는 패치가 적용된 후에 발생할 수 있는 부작용을 테스트하는 리그레션(regression)테스트는 하지 않는 것들이 있다.
.이런 no regression test된 임시패치는 적용하기보다 패치셋 적용하는 것이 좋다.
.임시패치시 이전에 설치한 모든 임시패치와의 충돌 여부를 확인한다. 이것때문에 임시패치를 적용하려면 최신버젼을 유지해야 한다.
.만약 충돌한다면 병합하는 과정이 필요하다.
.임시패치시에는 꼭 readme를 읽어본다.
.9.0.1 까지는 임시패치 적용시 쉘 스크립트를 이용해 패치를 적용했었다.
.9.2 버젼부터 Opatch라는 패치 관리 유틸이 등장했다.
.Opatch는 oracle db 9.2에 포함되어있지 않다. 9iR2 버젼이라면 메타링크에서 다운로드
.메타링크에서 patches -> simple search -> 2617419 입력 -> 2617419 universal installer: patch opatch aru placeholder.(10.1.0.2)
.opatch 실행 요구사항
-perl: 최소 5.0.0.5_03 이상 설치되어야함. 5.6 버전 이상 권장됨. 오라클 설치시 typical 옵션으로 설치하거나 custom 서ㄹ치시 web server 선택하면 $ORACLE_HOME/Apache/perl에 설치된다.
-두개의 inventory가 정상적으로 유지되어야 함.
-1st inventory: 오라클은 두개의 인벤토리를 가지고 있다. 하나는 oraInst.loc 파일에 적힌 센트럴 인벤토리다. 보통 $ORACLE_BASE/oraInventory의 이름으로 있다. 이 인벤토리는 설치된 오라클 제품정보 보관한다.
-2nd inventory: 로컬 인벤토리로 $ORACLE_HOME/inventory에 위치한다.
이 인벤토리에는 특정 ORACLE_HOME에 설치된 컴포넌트를 저장한다.
-Opatch: 2617419 패치넘버로 버젼이 계속 업데이트 되므로 항상 최신 버젼 유지하도록 함.
-Path: RAC에서 임시패치 적용시에는 $ORACLE_HOME/lib와 $ORACLE_HOME/svrm/lib 디렉토리가 라이브러리 path에 포함되어야 한다.
solaris의 경우 LD_LIBRARY_PATH, HP-UX의 경우 SHLIB_PATH, AIX는 LIB_PATH
#########################################################################################################
###### 주의사항
#########################################################################################################
.임시 패치 적용 전 반드시 센트럴 인벤토리와 로컬 인벤토리를 백업해 예기치 못한 인벤토리 충돌시 복구가 가능하도록 한다.
#########################################################################################################
##### Opatch의 사용
#########################################################################################################
-임시패치 적용
-적용한 임시 패치의 제거
-설치한 컴포넌트와 패치(패치셋 포함)에 대한 정보 조회
-설치하지 않은 임시 패치에 대한 정보 조회
-Usage: opatch [-h] [-r[eport]] [command] [command argument] global argument
-h: 특정 명령에 대한 설명. 예) opatch -h lsinventor
-r: 실제 패치 적용 안하고 처리과정 화면만 출력
#########################################################################################################
##### Opatch 적용
#########################################################################################################
-패치적용은 Apply 명령을 사용. 기본적인 명령은 아래와 같다.
$ opatch apply [ -delay] [-force]
[ -invPtrLoc]
[ -jdk] [-jre] [-local]
[-minimize_downtime] [-no_bug_superset]
[-no_inventory] [-oh]
[-retry] [-silent] [-verbose]
[-Patch_location]
- force: 이전에 설치한 임시패치와의 충돌 발생시 무시하고 설치한다. 이 경우 기존의 객체파일을 새로운 객체 파일로 대체하므로 주의한다.
- invPtrLoc: oraInst.loc 파일의 위치를 수동으로 지정시 사용
- jdk: 디폴트 jdk 이외에 jdk 경로 지정
- jre: 디폴트 jre 이외에 jdk 경로 지정
- local: RAC용 옵션으로 패치적용을 다른 노드에 전파하지 않고 로컬 노드에만 적용한다. 인벤토리도 로컬 노드에서만 업뎃이드 한다. 이 경우 다른 노드에서도 개별적으로 로컬 옵션을 사용해 즉시 패치를 적용해야 한다. 일부 노드에서만 패치를 적용해 운영하는것은 허용되지 않는다?
- minimize_downtim: 임시패치 적용중 RAC의 다운타임을 최소화하기 위해 사용할 수 있다.
- no_bug_superset: 설치하려는 패치가 이미 설치한 패치의 슈퍼셋인 경우 에러를 발생시킨다.
- no_inventory: 패치적용중에 인벤토리를 읽거나 업뎃하는 과정을 생략한다. 인벤토리 변조등으로 정상적으로 인벤토리를 읽거나 업뎃할 수 없을 때만 사용한다. 사용하게 되면 미지원 상태가 되므로 주의해야 한다. local 옵션과 같이 사용 불가능하다.
- oh: $ORACLE_HOME 대신에 사용한 ORACLE_HOME을 지정한다.
- silent: 사용자 인터랙션을 모두 디폴드로 적용하여 패치 진행한다.
- verbose: 기본적으로 나타나는 정보보다 더 자세한 내용을 화면과 로그 파일에 출력한다.
- Patch_location: 설치하려는 임시패치의 모든 경로를 표시한다.
- 특별한 경우가 아니면 opatch apply 명령으로도 사용 가능하다.
- 특별한 경우는 어떻게 사용하는지 예) opatch apply -invPtrLoc $ORACLE_HOME/oraInst.loc -silent
#########################################################################################################
##### Opatch 제거
#########################################################################################################
-패치 제거는 rollback 명령어 사용.
$ opatch rollback -id [-invPtrLoc]
[-jdk] [-jre] [-local]
[-oh] [-ph]
[-silent] [-verbose]
- id: 제거하려는 임시 패치번호
- ph: 패치 스테이지의 위치, 즉 패치를 제거할 때도 패치 파일이 필요하다.
간단한 패치 제거 사용 예
$ opatch -id 380927 -ph /opt/oracle/920/380927
#########################################################################################################
##### 설치되지 않은 오패치 정보 조회
#########################################################################################################
-패치정보 조회는 query를 이용
$ opatch query [-all] [-get_base_bug] [-get_component]
[-get_date] [-get_os] [-get_system_change]
[-is_rolling] [-is_shutdown]
- all: 모든 정보를 알려준다.
- get_base_bug: 해당 패치에 의해 수정된 베이스 버그를 알려준다.
- get_component: 패치 적용시 요구되는 컴포넌트 알려준다.
- get_date: 패치가 생성된 날짜
- get_os: 패치 파일이 지원하는 운영체제
- get_system_change: 해당 패치 적용한 후 시스템에 변경되는 사항 알려줌. 현재 지원 안됨
- is_rolling: 롤링패치 가능한가
- is_shutdown: 패치 적용시 인스턴스 다운 필요한지 알려준다. 현재 지원 안됨. 나중에는 지원된단 얘긴지 이전엔 지원됐는데 이제 지원 안된다는 얘긴지?
#########################################################################################################
##### 설치된 오패치 정보 조회
#########################################################################################################
-설치된 패치리스트 조회는 lsinventory 사용
$ opatch lsinventory [-all] [-detail]
[-invPtrLoc]
[-jre] [-oh]
- all: ORACLE_BASE 밑에 설치된 모든 ORACLE_HOME 정보를 표시한다.
- detail: 설치된 패치 내에 포함된 라이브러리 파일까지 표시해주므로 패치 적용시 충돌되는 객체 파일을 확인 가능하다.
#########################################################################################################
##### 오패치 버젼 조회
#########################################################################################################
-opatch 버젼 확인
[oracle@centos5 OPatch]$ ./opatch version
Invoking OPatch 11.1.0.6.6
OPatch Version: 11.1.0.6.6
OPatch succeeded.
#########################################################################################################
##### RAC에서의 Opatch 사용
#########################################################################################################
-기본적으로 임시 패치 적용시 인스턴스를 다운 후 적용해야 하므로, 패치 적용시는 서비스를 할 수 없게 된다.
-RAC에서는 몇가지 옵션을 사용하면 다운타임을 최소화할 수 있다.
-RAC에서 패치가 적용되는 방법들
- 사용자가 패치 적용 방법을 minimize_downtime로 설정
- 패치가 롤링 패치를 지원 한다면 rolling
- 아니면 All-node
-만약 엔진을 공유 스토리지에 설치했다면 minimize_downtime과 rolling 불가능하다
- all-node : 일반적인 DB에 패치 적용하는 것처럼 모든 인스턴스를 다운한 후에 한 노드씩 순차적으로 진행한다. $ORACLE_HOME을 여러 노드에서 공유하는 경우는 이 방식으로 패치 적용할 수 밖에 없다.
- minimize_downtime: RAC 운영시 다운타임을 최소화하기위해 사용. 2노드 RAC의 경우 패치 절차는 아래와 같다.
1. 먼저 로컬 노드 인스턴스를 셧다운한다.
$ opatch aplly -minimize_downtime 명령으로 패치 실행한다.
2. Is this node ready for updating? 질문에 yes로 답해 로컬 노드 패치 적용된다.
3. 패치 적용 완료 후 다음에 적용할 노드명을 물어본다.
4. 해당 노드명을 입력하면 이 노드의 인스턴스를 셧다운하도록 요청하게 된다.
5. 요청받은 노드의 인스턴스는 'shutdown immediate'로 셧다운된 후 셧다운이 완료되면 이미 패치가 적용된 노드의 인스턴스가 셧다운한다.
6. 두번째 노드에 패치가 적용된다.
7. 인벤토리 정보가 업뎃된다.
8. 패치가 완료되면 두번째 인스턴스도 셧다운한다.
(좀 순서가 이상한데.. 확인 필요)
minimize_downtime 옵션을 사용해도 모든 인스턴스가 다운되는 단계가 있다. 5번 단계에서만 해당된다.
- rolling patch
롤링패치는 다운타임이 전혀 없다. 적용 절차는 다음과 같다.
0. opath query -is_rolling 으로 먼저 롤링 패치 지원하는지 확인한다.
1. 인스턴스1을 셧다운한다. 이 단계에서 인스턴스 2는 서비스중이다.
2. 노드1에서 opatch apply 명령으로 패치 적용한다.
3. 노드1에서 패치가 적용되었으면 인스턴스1을 시동할 수 있다는 메시지를 받는다.
4. 노드1의 인스턴스를 수동으로 시동한다.
5. 필요시 노드1 접속하여 post script 실행한다.
6. 다음에 적용할 노드를 (3node 이상일 경우)입력하라고 하거나 자동으로 다음 노드에 대해 셧다운 진행하라는 메시지가 나온다.
7. 인스턴스2를 셧다운한다.
8. 3번 세션에서 이어서 계속 노드2에 패치를 적용한다.
9. 패치 적용 후 인스턴스 2를 시동한다. post script 실행한다.
#########################################################################################################
##### 트러블슈팅
#########################################################################################################
-임시 패치가 적용되었는지 어떻게 확인 가능한가?
- 일반적으로는 opatch lsinventory를 사용하여 확인한다.
- $ORACLE_HOME/.patch_storage 디렉토리 밑에 해당 패치 번호를 이름으로 디렉토리 생성된다. 이 디렉토리 밑에 패치 적용 로그와 패치 적용 이전의 라이브러리 파일(롤백용), 롤백시 적용할 스크립트가 있다.
- Windows에서 opatch 실패
C:\oracle\ora92\OPatch> opatch lsinventory
"You have to invoke the patch tool manually."
"The syntax is:"
" perl /opatch.pl"
"If everything is installed correctly you should be able to run"
" perl /opatch.pl"
" and see the basic help message."
C:\oracle\ora92\OPatch> perl opatch.pl lsinventory
<<중략>> Required Jar File under Oracle Universal Installer = jlib\OraInstaller.jar
'""C:\Program'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램 또는 배치 파일이 아닙니다
<<생략>>
- 해결: Opatch 사용시 권장버젼은 5.6이상인데 windows에서 perl 5.6 이상을 사용하여 opatch 실행하면 위와 같은 에러 메시지 발생한다.
$ORACLE_HOME/Apatch/perl을 사용하도록 한다.
- 컴포넌트/버전 불일치
This Oracle Home does not have components/versions required by the patch.
ERROR: OPatch faild during pre-reqs check.
- 해결: 임시패치가 요구하는 컴포넌트 미설치 혹은 지원하는 버젼 비일치. 패치파일 요구사항을 opatch query 명령으로 조회한다.
- 라이브러리 path없음
java.lang.UnsatisfiedLinkError
Exception in thread "main"java.lang.UnsatisfiedLinkError:
no oraInstaller in java.library.path
- 해결: 이 경우 대부분 liboraInstaller.so가 라이브러리 경로에 포함되지 않았기 때문이다.
$ORACLE_HOME/oui/bin 디렉토리를 path에 추가한다.
- oraInst.loc 파일 위치 비일치
java.lang.NullPointerException
Exception in thread "main"java.lang.NullPointerException at xxx.main...
- 해결: 오라클 엔진설치시 RunInstaller를 -invPtLoc 옵션 사용해 실행한 경우일 수 있다. Opatch 실행시도 동일한 -invPtrLoc를 사용해 orainst.loc의 위치를 명시한다.
#########################################################################################################
###### 출처
#########################################################################################################
제공: DBguide.net
출처명: 한국 오라클