기술 정보
home
채널 소개
home

Fd 과사용으로 인한 DB DOWN

문서 유형
장애 해결
분야
튜닝
키워드
DB DOWN
적용 제품 버전
6FS06
오류 코드
1003

현상

Fd 과사용으로 인해 ERROR_CACHE_FILE_OPEN_FAILED(-1003) 에러 발생하며, DB DOWN 현상이 발생하였습니다.

원인

원인 도출과정은 아래와 같습니다.

1. oslog (/var/log/messages) 에서 fd 관련 에러 확인

/etc/sysctl.conf 파일의 file-max limit 설정값 만큼 fd가 생성되고, 그 이상의 파일 생성 불가 상황에서 아래와 같은 로그 발생합니다.
Nov 20 12:10:22 hdsodb1p systemd[54513]: Reached target Exit the Session. Nov 20 12:10:31 hdsodb1p kernel: VFS: file-max limit 6815744 reached Nov 20 12:10:38 hdsodb1p kernel: VFS: file-max limit 6815744 reached
SQL
복사
아래와 같이 /etc/sysctl.conf 설정합니다.
`` kernel.shmmni = 4096 fs.file-max = 6815744 net.ipv4.ip_local_port_range = 1024 65000 vm.nr_hugepages=102400 ``
SQL
복사

2. slog에서 sid 및 ilog확인

(tbsvr.out.25579 ) 497번 LGWR thread에서 THROW가 발생했고, 현재 ec에 대해서는 assert를 맞아 의도적으로 DB를 중지 시키게 됩니다.
[497] 2023/11/20 12:17:37.509 Internal Error with condition '!"error"' (tc.c:343) (pid=27574, sessid=497, tid=497, os_thr_id=27608) ... [497] callstack dump from tbsvr_DBWR for [LGWR, 497, 27608/27574] [497] SEE DUMP tbsvr.callstack.27574 (lwpid 27608) BY PSTACK
SQL
복사
이후 DB Down이 확인됩니다.

3. ilog 확인하여 정확한 근거 파악 (session 497의 ilog)

Ilog는 binary 파일로 tbiv를 통해서만 확인이 가능하며, 이때 ilog_fmtmap.bin 파일이 필요합니다.
Ilog는 Thread 별로 생성되며 기본 파일명은 $TB_SID-스레드ID.ilog입니다.
11/09 05:26:51.7 0-0497 tc_lgwr.:1643 requested switch 109 -> 110 (next=0001.8ce9dc30 11/09 05:26:51.7 0-0497 tc_fdpoo:1152 open (stat) failed (errno=23, Too many open files in system) (flag=010002) (filename=/dev/vx/rdsk/hdsodb_sysdg01/ctlOHDSODB_01) 11/09 05:26:51.7 0-0497 cf.c:181 control file open failed : '/dev/vx/rdsk/hdsodb_redodg02/ctlOHDSODB_01' (Input/output error) ... 11/09 05:26:51.7 0-0497 tc.c:337 TBR-24003 : Unable to read control file. 11/09 05:26:51.7 0-0497 tc.c:340 LGWR: shutdown instance due to error 24003 11/09 05:26:51.7 0-0497 tbsvr_tr:229 Internal Error with condition '!"error"' (tc.c:343)
SQL
복사
로그 스위치 요청(requested switch 109 → 110) 이후, LGWR에서 fd 부족으로 인해 control file 오픈에 실패하였습니다.
이로 인해 redo log 쓰기 작업이 모두 실패했고, 데이터 정합성 유지를 위해 의도적으로 DB가 중지되었습니다.

해결

/etc/security/limits.conf 파일 수정

Nofile 값을 수정합니다. Nofile 값은 1개의 process에서 사용 할 수 있는 fd 개수입니다.
계산식 : (WTHR_PER_PROC * ((total data files in 유) + 15)) + (tbsvr process count + 5) + 100 또는 크게 3,000,000

/etc/sysctl.conf 파일 수정

fs.file-max 값을 수정합니다. fs.file-max 값은 서버 전체에서 사용 할 수 있는 fd 개수입니다.
계산식 : (nofile 파라미터) x (WTHR_PROC_CNT + PEP_PROC_CNT) 또는 67108864
현재 fd 사용 개수 확인 방법 ( 리눅스 : cat /proc/sys/fs/file-nr )
참고
ILOG 생성 방식
ILOG는 스레드(Thread)별로 생성되며, 기본 파일명은 $TB_SID-스레드ID.ilog 형식입니다.
파일의 크기가 일정 수준에 도달하면, 기존 파일은 $TB_SID-스레드ID_날짜_일련번호.ilog 형식으로 이름이 변경되고, 새 ILOG 파일이 생성됩니다.
ILOG 확인 방식
예시: 17번, 33번 스레드에 대해 2025/04/16 23:00:00 ~ 04/17 00:00:00 사이의 로그를 확인하는 경우
→ 해당 구간의 로그가 17번, 33번 스레드에서 생성된 것임을 먼저 확인합니다.
ILOG  확인명령어
tbiv -o 1.txt -r 20250416230000 20250417000000 tbsid-17.ilg, tbsid-33.ilg
SQL
복사
ILOG 파라미터
NAME
설명
ILOG_BACKUP_SIZE_LIMIT
backup된 ilog의 총사이즈 제한
ILOG_DEST
ilog 생성 경로
ILOG_FILE_BACKUP_ON_BOOT
기동시 ilog backup을 만들고 기존 파일을 백업할지 여부
ILOG_FILE_SIZE
ilog 하나당 사이즈 제한. 해당 사이즈 이상 쌓이면 이름 변경 후 다른 파일 생성
ILOG_KEEP_BACKUP_ASIDE
ilog backup 사이즈를 별도로 관리할지 여부.  Y 설정 시 ILOG_TOTAL_SIZE_LIMIT와 별개로 관리된다
ILOG_MAP
ilog 설정시 명령어 대신 파일에 리스트 지정 후 사용할 수 있는 map 파일 경로
ILOG_TOTAL_SIZE_LIMIT
ilog 파일 + ilog backup 합계 총 사이즈
USE_ILOG
ilog 사용 여부
ILOG 확인 방법
tbiv 실행으로 bin 파일인 ilog를 읽을 수 있는 형태로 변경하여 확인합니다.