오라클의 filesystemio_options는 asynch, directio, setall 이 가능하다.

보통 기본값은 OS에 따라 다르나 none 혹은 null이거나 asynch 이다.

왠만한 파일시스템은 asynch를 기본적으로 지원하고 directio도 거의 지원한다.

asynch는 최근 OS에서 거의 문제가 되지 않으나 Directio는 백업과 관련한 문제가 생길 수 있다.

 

Directio를 적용하는 방법이 두가지 있는데

1. filesystem을 mount하는 단계에서 적용한다 즉 OS Level에서 적용하는 방법이다.

2. application Level에서 적용하는 방법이다. 오라클의 경우 filesystemio_options 파라미터를 directio 혹은 setall로 적용한다.

 

2번 방법을 사용해 Application에서 direct I/O 혹은 Concurrent I/O(direct I/O의 enhanced 기술이라고 보면 된다) mode로 오픈한 파일은 OS에 따라 꼭 같은 mode로 접근해야지만 접근이 가능하게 된다.

 

AIX5.3의 경우가 그랬다. cp가 불가능한 전혀 처음 보는 특이한 현상을 보였다.

이를 해결하는 방법은 결국 filesystem 마운트 단계에서 cio/dio 옵션으로 마운트 하는 것이다.

이후에는 오라클의 filesystemio_options에서 directio나 setall를 설정하지 않아도 자동으로 directio 혹은 concurrent io가 작동하게 된다.

 

오라클 버전에 따라, OS버전, OS종류에 따라 direct/concurrent io를 사용하더라도 복사나 접근이 가능/불가능 여부가 틀리니 핫백업이 안될 경우를 대비해 꼭 확인하도록 하자.

현재는 AIX 5.3 + Oracle 10gR2에서 발생하는걸 확인했다.

 

※filesystem에 따라 direct io가 기본적으로 적용되는 경우도 있다.

Posted by neo-orcl
,

희안하고 재미있는 현상이었다.

RAC 설치 후 클라이언트에서 토드 같은 툴을 통해 접속시 하나 접속할때는 괜찮은데 다른 접속을 추가하면

ORA-12545가 나타난다.

tnsnames.ora 설정의 내용을 간략히 보면 아래와 같다 형식은 틀리지만 내용중 중요한 부분만 파악해두자.

1.1.1.5와 1.1.1.6은 각 rac1-vip, rac2-vip의 ip이다.

 

ora=

(load_balance=off)

(faolover=on)

(protocol=tcp)(address=1.1.1.5)(port=1521)

(service=ora)

(protocol=tcp)(address=1.1.1.6)(port=1521)

(service=ora)

 

그런데 DB가 설치된 서버에서 직접 같은 tnsnames.ora로 해보면 아주 잘 된다.

서버는 리스너 크로스 등록을 해둬서 서버측 로드밸런스를 구현한 상태이다.

listener.ora 설정은 대략 아래와 같다.

rac1

listener=

(protocol=tcp)(address=rac1-vip)(port=1521)

(protocol=tcp)(address=1.1.1.1)(port=1521)

 

rac2

listener=

(protocol=tcp)(address=rac2-vip)(port=1521)

(protocol=tcp)(address=1.1.1.2)(port=1521)

 

당연히 서버의 /etc/hosts 파일에 rac1-vip와 rac2-vip 내용은 등록되어있다.

그럼 뭐가 문제일까?

 

클라이언트측 로드밸런싱과 달리 서버측 로드밸런싱은 클라이언트에서도 리스너의 주소를 resolution 할 수 있어야 하는 점이 포인트였다.

호스트 측에서 /etc/hosts 혹은 /windows/system32/drivers/hosts 파일에

1.1.1.5 rac1-vip

1.1.1.6 rac2-vip

설정 후 정상화되었다.

Posted by neo-orcl
,

In 2 node RAC enviroment, if node evicted by network issue

you can found misscount messages on ocssd.log in evicted node

but if node evicted by server issue(hang, etc)

you can't found misscount messges on occsd.log in evicted node

(test 'kill -SIGSTOP <ocssd.bin's pid>')

 

if you know this difference you can trac evict issue more easily

 

 

Posted by neo-orcl
,

꽤 트랜잭션이 컸던 사이트에서 나타난 현상인데 오라클 디비와 연관된 어플 서버가 다운되어 SMON이 롤백을 하는데 6시간이 걸려도 롤백이 되지 않는 현상이 있었다.

롤백이 아직 되지 않았기 때문에 특정 테이블들이 row lock 상태여서 update가 되지 않아 업무를 진행할 수 없다는게 제일 큰 여파였다.

 

그런데 답답하게도 v$lock이나 v$fast_start_recovery 뷰에 참고할만한 정보가 없다는 특징도 있다.

세션이 예기치 못하게 끊겼을 경우 SMON은 OS의 프로세스를 정리하면서 언두 엔트리를 참고해 롤백하게 되는데

v$session에서는 이미 세션이 끊겼기에 정보가 없으나 OS의 process는 보이는 상황이라고 추정된다.

 

RAC 2node 환경이었는데 결국엔 DB를 shutdown abort하고 재시작한 후 lock이 풀렸음을 확인했다.

 

어쨋든 Cleanup이라는 과정을 SMON이나 PMON이 진행하는데 기본값으로 60초에 한번씩 _rollback_cleanup_entreis 라는 파라미터의 값만큼 언두 엔트리를 클린업하게 된다.

기본값이 20이기때문에 만약 1000개의 언두 엔트리를 정리해야 한다면 50분이 걸릴것이다.

문제였던 사이트는 6시간이 지나도 롤백이 완료가 되지 않았으므로 7200개 이상의 언두 엔트리가 롤백되고 있었음을 추측할 수 있다.

 

해결을 위해 _rollback_cleanup_entries 값을 2000정도로 증가시킬 예정이다. 재시작이 필요한 작업. 참고로 다른 사이트중에서 이 값을 10000으로 설정해 사용중인 곳도 있다.

Posted by neo-orcl
,

srvctl start instance -d db -i instance
명령으로 인스턴스를 시작하려 할 때
아래처럼 에러가 나오는 경우가 있다.

 

PRKP-1001 : Error starting instance rac2 on node rac2
CRS-0215: Could not start resource 'ora.rac.rac1.inst'.

 

이 경우 db의 얼럿로그를 보거나 ocssd나 crsd나 crs의 얼럿로그를 봐야 한다.
그런데 이렇게 시작하려고 하면 db의 얼럿로그에 딱히 남는 로그가 없다.

 

제일 문제는 인스턴트가 왜 시작이 안되냐 이지만 왜 안되는지에 대한 정보를 로그에 남지 않을 경우가 있다.

 

이 때 먼저

which srvctl 명령으로 srvctl 이 어디서 실행되는 것인지 확인하고
vi로 OHOME과 CHOME이 제대로 설정되어있는지 확인한다.

 

또한 $ORACLE_HOME/bin/racgwrap 파일도 확인해 ORACLE_HOME과 CRS_HOME이 제대로 설정되어있는지 확인한다.

그리고 마지막으로

 

sqlplus / as sysdba 등의 방식으로 db에 접근해 직접 인스턴스를 시작시켜본다.

참고로 필자는 sqlplus로 인스턴스 시작시켜보니 log_archive_dest_2 가 NFS로 잡혀있는데 이것이 마운트되어있지 않아
시작을 못하고 있었다.

Posted by neo-orcl
,

HP-UX에서 발생하는 문제
아래 로그를 포함하는 트레이스 파일이 계속 생긴다. 심할 정도로
Ioctl ASYNC_CONFIG error, errno = 1

1. 만약 /dev/async 가 존재하고 설정이 맞게 되었다면 오라클은 ioctl을 통해 SGA 메모리의 async i/o를 사용하기 위해 메모리를 lock하게 된다(HP only)
2. 오라클은 /dev/async HP-UX 드라이버가 읽기/쓰기를 위해 제대로 설정되어있을 경우 /dev/async 를 open하게 된다.

위 둘이 제대로 설정되어 있다면 DISK_ASYNCH_IO 파라미터 값이 TRUE이건 말건 상관없이 적용되게 된다.

문제는 오라클이 init 셋팅에 관계없이(disk_asynch_io=false, filesystemio_options=none) async I/O를 사용하게 되는 점이다.
이 경우 filesystemio_options=none이 동작하지 않게 된다.

9.2~10.1의 경우 asynch_io를 비활성화하기 위해 아래처럼 설정한다.

chown bin:bin /dev/async
chmod 660 /dev/async

주의: 이 설정시 기존 어플리케이션에 영향을 줄 수 있기에 asynch_io를 비활성화하기 전에 db를 셧다운하는걸 권장한다.

트레이스 파일 에러가 생기는 것을 막기 위한 방법은 아래 처럼 dba 그룹에 MLOCK 권한을 주는 것이다.

# /usr/sbin/setprivgrp dba MLOCK
# vi /etc/privgroup
-- This should contain dba MLOCK RTSCHED RTPRIO
# cat /etc/privgroup
dba MLOCK RTSCHED RTPRIO

10.2 이후로는 파라미터 변경으로 asynch_io를 비활성화 하여 해결할 수 있다.
disk_asynch_io=FALSE
filesystemio_options=none

Posted by neo-orcl
,

보통 oracle 유저로 /etc/hosts 파일을 읽을 수는 있어야 오라클이 정상 동작한다.

/etc/hosts 파일에 대한 other 권한의 read를 없앨 경우 10g와 11g 동작이 틀리다.

10g의 경우:

1. sqlplus 접속 자체가 엄청나게 느려진다.
2. startup시 얼럿로그에 ORA-00130 나타난다.
3. 시작 자체는 된다.
4. 얼럿로그에 주기적으로 아래 메시지가 출력된다.
    Errors in file /oracle/admin/testdb/bdump/testdb_ora_4307.trc:
    ORA-07445: exception encountered: core dump [kslgetl()+120] [SIGSEGV] [Address not mapped to object] [0x000000210] [] []
    ORA-00108: failed to set up dispatcher to accept connection asynchronously
    Fri Apr 19 10:35:45 KST 2013
found dead dispatcher 'D000', pid = (18, 3)
5. 리스너 시작이 안된다.
    [oracle@centos5 ~]$ lsnrctl start

LSNRCTL for Linux: Version 10.2.0.5.0 - Production on 19-APR-2013 10:35:17
Copyright (c) 1991, 2010, Oracle.  All rights reserved.
Starting /oracle/product/10.2.0/db1/bin/tnslsnr: please wait...
  TNSLSNR for Linux: Version 10.2.0.5.0 - Production
    System parameter file is /oracle/product/10.2.0/db1/network/admin/listener.ora
    Log messages written to /oracle/product/10.2.0/db1/network/log/listener.log
    Error listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=centos5.6x64)(PORT=1521)))
    TNS-12545: Connect failed because target host or object does not exist
     TNS-12560: TNS:protocol adapter error
      TNS-00515: Connect failed because target host or object does not exist

Listener failed to start. See the error message(s) above...

11g의 경우:

1. sqlplus 접속 자체가 엄청나게 느려진다.
2. startup시 ORA-00119가 나타나며 실패한다.
3. 아래는 11g 테스트 결과

[root@centos5 etc]# ls -l hosts
-rw-r--r-- 2 root root 208  9??29  2012 hosts
[root@centos5 etc]# chmod 640 hosts
[root@centos5 etc]# su - oracle
[oracle@centos5 ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Fri Apr 19 10:16:40 2013
Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning option

sys@ORCL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@ORCL> startup
ORA-00119: invalid specification for system parameter LOCAL_LISTENER
ORA-00130: invalid listener address '(ADDRESS=(PROTOCOL=TCP)(HOST=centos5.6x64)(PORT=1521))'

Posted by neo-orcl
,

윈도우에서 별다른 이벤트 로그가 안남을 수 있다.

Mon Apr 08 06:48:35 2013
Errors in file .\orcl_arc1_1340.trc:
ORA-00202: control file: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL'
ORA-27091: unable to queue I/O
ORA-27070: async read/write failed
OSD-04006: ReadFile() 실패, 파일에서 읽을 수 없음
O/S-Error: (OS 1450) 시스템 리소스가 부족하기 때문에 요청한 서비스를 완성할 수 없습니다.

-반복하다가 아래 나오며 종료됨-

Mon Apr 08 06:48:36 2013
Master background archival failure: 204

OS 로그 이상 없음
##########################################################################################
OS: Windows2003
oracle: 10.2.0.3 s/e

원인: 순간적인디스크 파일 접근 불가
해결: 리부팅후 정상복구됨. 추후 발생시 대비 서버의 array controller? disk controller 펌웨어 업그레이드

Posted by neo-orcl
,

사이트에서 발생했던 현상.
오라클 버젼은 9.2.0.1

SQL> r
  1  select spid, program, trunc(pga_used_mem/1024/1024) USED,
  2  trunc(pga_alloc_mem/1024/1024) ALLOC , trunc(pga_max_mem/1024/1024) MAX
  3  from v$process
  4* order by pga_alloc_mem asc

SPID         PROGRAM                                         USED       ALLOC         MAX
------------ ---------------------------------------- ----------- ----------- -----------
             PSEUDO                                           .00         .00         .00
-------------------중략-----------------------------------------------------------------
847          oracle@xxxx.kr (QMN0)                  256.00      256.00      256.00

49 rows selected.

SQL> alter system set aq_tm_processes=0;
System altered.

SQL> alter system set aq_tm_processes=1;
System altered.

SQL> r
  1  select spid, program, trunc(pga_used_mem/1024/1024) USED,
  2  trunc(pga_alloc_mem/1024/1024) ALLOC , trunc(pga_max_mem/1024/1024) MAX
  3  from v$process
  4* order by pga_alloc_mem asc

SPID         PROGRAM                                         USED       ALLOC         MAX
------------ ---------------------------------------- ----------- ----------- -----------
             PSEUDO                                           .00         .00         .00
-------------------------------------중략-----------------------------------------------
20461        oracle@xxxx.kr (QMN0)                     .00         .00         .00

 

버그였다.. 패치하던지 저 과정을 프로시저로 만들어서 잡으로 돌리던지 하자

관련 메타링크 정보
Queue Monitor process Memory Consumption increases due to a Leak [ID 233101.1]

Posted by neo-orcl
,

테스트환경에서 우연찮게 발견한 현상이다.

OS: centos 5.6
oracle ver: 10.2.0.5

창을 두개 뜨우고 하나는 rman target / 로 접속했다.
다른 하나는 sqlplus 에서 shutdown immediate 를 실행했다.
아무리 시간이 지나도 shutdown이 되지 않는다.
얼럿로그에 다음과 같은 내용이 있다.

Shutting down instance (immediate)
Fri Mar 15 16:02:59 KST 2013
Shutting down instance: further logons disabled
Fri Mar 15 16:02:59 KST 2013
Stopping background process QMNC
Fri Mar 15 16:02:59 KST 2013
Stopping background process CJQ0
Fri Mar 15 16:03:01 KST 2013
Stopping background process MMNL
Fri Mar 15 16:03:02 KST 2013
Stopping background process MMON
License high water mark = 4
Fri Mar 15 16:03:03 KST 2013
Process OS id : 28767 alive after kill
Errors in file /oracle/admin/testdb/udump/testdb_ora_28754.trc
Fri Mar 15 16:03:06 KST 2013
Waiting for Job queue slaves to complete
Fri Mar 15 16:03:06 KST 2013
Job queue slave processes stopped
All dispatchers and shared servers shutdown

28767 OS process ID로 검색해보았다.
[oracle@centos5 testdb]$ ps -ef | grep 28767
oracle   28844 27374  0 16:04 pts/3    00:00:00 grep 28767
안나온다. rman target / 로 접속한걸 확인해봤다.
[oracle@centos5 testdb]$ ps -ef | grep rman
oracle   28789 27154  0 16:02 pts/2    00:00:00 rman target /
oracle   28861 27374  0 16:05 pts/3    00:00:00 grep rman

나온다. 하지만 PID가 틀리다.
트레이스파일 확인해보니
*** 2013-03-15 16:08:54.984
Process diagnostic dump for oracle@centos5.6x64 (TNS V1-V3), OS id=28796,
pid: 23, proc_ser: 2, sid: 144, sess_ser: 14
-------------------------------------------------------------------------------
loadavg : 0.98 0.76 0.40
Memory (Avail / Total) = 89.61M / 1504.47M
Swap (Avail / Total) = 2306.11M /  2306.20M
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
0 Z oracle   28796 28789  0  78   0 -     0 exit   16:02 ?        00:00:00 [oracle] <defunct>
 
계속 이 프로세스를 죽이려고 시도하고 있다.

해결방법: 결국 아래 두개 모두 같은 결과긴 하다.
1. rman 세션을 exit로 정상 종료한다.
2. ppid인 28789를 죽인다.

Posted by neo-orcl
,