데이터베이스 연구실.log

파일 검색과 내용 조회

find의 이름, 종류, 깊이, 크기, 시간, 소유자 조건과 -exec, xargs, cat -A, grep, wc로 DBA 파일과 로그를 찾고 세는 예

findcatgrepwcxargsdos2unixawk

#핵심 요약

find는 시작 경로와 이름, 종류, 깊이, 크기, 시간, 소유자 조건을 조합해 대상을 찾음
find /처럼 넓게 잡지 말고 $ORACLE_HOME, $ORACLE_BASE/diag처럼 좁은 경로부터 찾음

정리 작업은 대상 목록을 먼저 출력하고, 확인한 뒤 같은 조건에 -exec로 이동, 삭제를 붙임

cat -A는 탭, 줄 끝 같은 보이지 않는 문자를, grep은 패턴이 든 행을, wc는 줄, 바이트, 글자 수를 보여 줌

#개념과 동작 원리

도구와 옵션 검색 조건과 출력
find -name, -iname 이름(대소문자 구분/무시), 와일드카드는 따옴표로 감쌈
find -type f, -type d 일반 파일, 디렉터리
find -maxdepth, -mindepth 검색 깊이 상한과 하한
find -size +500M, -empty 크기 기준, 빈 파일
find -mtime, -mmin, -newer 일, 분 단위 수정 시각, 기준 파일보다 새것
find ! -user oracle, -perm 777 소유자 아님, 권한 일치
find -exec ... {} \;, -print0 | xargs -0 찾은 결과마다 명령 실행, 공백 든 이름을 안전하게 넘김
cat -A, cat -n 줄 끝 $, 캐리지 리턴 ^M, 탭 ^I 표시, 줄 번호
grep -i, -v, -n, -l, -R, -E, -A, -B 대소문자 무시, 제외, 줄 번호, 파일명만, 하위까지, 확장 정규식, 뒤, 앞 문맥
wc -l, -c, -m, -L 줄 수, 바이트 수, 글자 수, 가장 긴 줄의 표시 폭

#필수 명령어 또는 SQL

#위치 찾기와 검색 범위

Linux Bash (oracle)조회만 함
find /u01/app/oracle -name "alert_orcl.log" -print
find $ORACLE_HOME -name "tnsnames.ora" -print
find $ORACLE_HOME -name "sqlnet.ora" -print
find $ORACLE_BASE/diag -name "alert*.log"
find /u01/app/oracle/admin/orcl/dpdump -iname "*.dmp"

결과 해석:

실습 기록: alert_orcl.log는 diag/rdbms/orcl/orcl/trace 아래와 $ORACLE_HOME/rdbms/log 아래 두 곳에서 나옴
tnsnames.ora는 network/admin과 network/admin/samples의 두 곳, sqlnet.ora는 samples 아래 한 곳만 나옴

find / -name ...은 시스템 전체를 뒤져 오래 걸리고, 일반 계정으로는 /root, /proc 등에서 Permission denied가 대량으로 나옴

와일드카드를 따옴표 없이 쓰면 셸이 현재 디렉터리에서 먼저 펼쳐 find가 엉뚱한 이름을 받음

Windows 공유 폴더를 거친 덤프 파일은 expdat.dmp와 EXPDAT.DMP처럼 대소문자가 섞이므로 -iname으로 찾음

#종류, 깊이, 크기, 시간, 소유자 조건

Linux Bash (oracle)조회만 함
find /u01/app/oracle/diag/rdbms/orcl -type d -name trace
find /u01/app/oracle/diag/rdbms/orcl -type f -name "*.trc*"
find $ORACLE_HOME -maxdepth 1 -name "*.ora"
find $ORACLE_HOME -mindepth 2 -name "*.ora"
find /u01/app/oracle -type f -size +500M -print
find /u01/app/oracle -type f -empty -print
find /u01/app/oracle/diag/rdbms/orcl -type f -mmin -120 -print
find /u01/app/oracle/diag/rdbms/orcl -type f -mtime -2 -print
find /u01/app/oracle/fast_recovery_area/ORCL/archivelog -name "*.arc" -mtime +7
find $ORACLE_BASE/diag -name "*.trc" -mtime +14
find /u01/app/oracle -type f ! -user oracle -print
find /home/oracle/scripts -type f -perm 777 -print

결과 해석:

정리 대상을 고를 때 -type f를 붙여야 trace 같은 디렉터리가 삭제 대상에 섞이지 않음

/u01 사용량 경보 때는 큰 파일(-size +500M)부터, 배치가 중간에 멈췄는지는 빈 파일(-empty)로 봄

장애 시각 전후로 바뀐 파일은 -mmin -120(최근 120분), -mtime -2(최근 2일)로 좁힘
실습 기록: 둘 다 같은 orcl_vktm_*.trc 한 개만 나옴

실습 기록: 소유자가 oracle이 아닌 파일로 externaljob.ora, oradism, jssu, extjob이 나옴
이 파일들은 설치 때 root 소유로 설정되는 파일이라 소유자를 oracle로 바꾸지 않음

아카이브 로그 정리 대상을 뽑는 단계에서는 삭제 옵션을 붙이지 않음
아카이브 로그는 OS에서 지우지 않고 RMAN으로 지워야 제어 파일 기록과 맞음

#찾은 결과에 명령 실행 (-exec, xargs)

Linux Bash (find_lab)객체 또는 설정을 변경함
find /home/oracle/find_lab/logs -name "*.log" -mtime +30 -print
find /home/oracle/find_lab/logs -name "*.log" -mtime +30 -exec mv {} /home/oracle/find_lab/archive_old/ \;
Linux Bash (oracle)조회만 함
find /home/oracle/scripts -type f -name "*.sql" -print0 | xargs -0 wc -l
find /home/oracle/scripts -type f -name "*.sql" -print0 | xargs -0 grep -li "drop"

결과 해석:

실습 준비는 touch -d "45 days ago" ...로 일부러 오래된 시각을 줌
목록을 먼저 출력해 확인한 뒤 같은 조건에 -exec mv를 붙여 삭제 대신 격리 디렉터리로 옮김

{}는 찾은 파일 이름 자리이고 \;는 -exec 명령의 끝 표시임

-print0과 xargs -0은 이름을 널 문자로 구분해 daily backup.sql처럼 공백이 든 이름도 한 파일로 넘김

실습 기록: .sql 다섯 개의 줄 수 합계 17, DROP이 든 파일로 cleanup_old_data.sql과 index rebuild plan.sql이 나옴
readme.txt는 .sql이 아니어서 걸리지 않음

#보이지 않는 문자와 줄 끝 변환

Linux Bash (oracle 홈)조회만 함
cat -A emp.csv
root 셸객체 또는 설정을 변경함
yum install -y dos2unix
Linux Bash (oracle 홈)객체 또는 설정을 변경함
dos2unix emp.csv
cat -A emp.csv

결과 해석:

실습 기록: Windows에서 만든 emp.csv는 줄 끝이 ^M$로 보이고, dos2unix 뒤에는 $만 남음

^M(캐리지 리턴)이 남아 있으면 grep '10$'처럼 줄 끝을 기준으로 하는 검색이 맞지 않음

실습 서버(Oracle Linux 7.9)에는 dnf가 없어 dnf: 명령을 찾을 수 없습니다가 나와 yum으로 설치함

#행 검색과 필드 출력

Linux Bash (oracle 홈)조회만 함
grep -i 'salesman' emp.csv | awk -F ',' '{print $2,$6,$3}'
grep ',ANALYST,' emp.csv | awk -F ',' '{print $2,$6,$3}'
grep '10$' emp.csv
grep -v '10$' emp.csv
awk -F ',' '$8!=10 {print}' emp.csv
awk -F ',' '$6>=3000 {print $2,$6}' emp.csv
grep -v ',SALESMAN,' emp.csv > notsalesman.csv
Linux Bash ($ORACLE_HOME/network/admin)조회만 함
grep -Rni '1521' .

결과 해석:

awk -F ','는 쉼표로 필드를 나누며 $2는 이름, $3은 직업, $6은 급여, $8은 부서번호임

'10$'은 줄 끝이 10인 행이라 부서번호가 마지막 필드일 때만 부서 10을 뜻함
정확한 필드 비교는 awk의 $8==10이 안전함

직업이 "정확히" ANALYST인 행은 앞뒤 쉼표까지 넣어 ',ANALYST,'로 찾아야 다른 필드의 부분 일치를 피함

grep -Rni는 하위 디렉터리까지, 대소문자 무시로, 파일명과 줄 번호를 붙여 출력함
실습 기록: listener.ora, tnsnames.ora, 백업 파일, samples 아래 예시까지 1521이 든 줄이 모두 나옴

#alert, listener 로그 검색

Linux Bash (alert 로그 디렉터리)조회만 함
grep -iB 1 'starting oracle instance' alert*
grep -iB 1 'shutting down instance' alert*
grep -c 'ORA-' alert_<SID>.log
grep -ic 'shutting down instance' alert_<SID>.log
Linux Bash (실습 로그)조회만 함
grep -E 'ORA-|TNS-|WARNING' error_sample.log
grep -E 'TNS-[0-9]{5}' error_sample.log
grep -E 'ORA-|TNS-|WARNING' error_sample.log | grep -v 'ORA-01017'
grep -nE 'ORA-|TNS-' alert_sample.log
grep -A 1 'TNS-' listener_sample.log

결과 해석:

alert 로그는 시각 줄 다음에 메시지 줄이 오므로 -B 1로 바로 앞 시각을 함께 봄
실습 기록: 7월 2일부터 13일까지 16번의 기동과 6번의 종료 시각이 나옴

-c는 일치한 줄 수를 세므로 한 줄에 오류가 여러 번 있어도 1로 셈

-E의 |는 여러 패턴 중 하나, {5}는 바로 앞 문자 집합이 다섯 번 반복됨을 뜻함
수업 자료의 "TNS- 뒤 숫자 다섯 자리" 문제 답은 ORA-[0-9]{5}로 적혀 있어 문제와 맞지 않음

실습 데이터에는 소문자 ora-03113과 네 자리 ORA-600이 섞여 있어, 대소문자 무시(-i)와 자릿수 조건에 따라 결과가 달라짐

-A 1은 오류 다음 줄(client connection failed, connection terminated)을 함께 보여 주고 묶음 사이에 --를 찍음

#줄 수, 바이트, 글자 수

Linux Bash (oracle)조회만 함
ls *.trc | wc -l
cat /etc/group | wc -l
wc -l /etc/oratab
grep -v '^#' /etc/oratab | grep -v '^$' | wc -l
find . -maxdepth 1 -name '*.csv'
find . -name '*.csv' | wc -l
ps -ef | grep lgwr | grep -v grep | wc -l
wc -L store.csv
awk -F ',' '{print NR": "length($3)}' store.csv

결과 해석:

실습 기록: trace 디렉터리의 .trc 535개, /etc/group 80줄, wc -l /etc/oratab 3줄, 실행 중인 LGWR 프로세스 1개

/etc/oratab은 주석과 빈 줄이 있는 파일이라 wc -l이 인스턴스 수와 같지 않을 수 있어, 주석, 빈 줄을 뺀 뒤 셈

ps -ef | grep 결과에는 grep 자신도 나오므로 grep -v grep으로 뺌

한글은 UTF-8에서 한 글자가 3바이트라 wc -c(바이트)와 wc -m(글자)이 다름
wc -L과 awk length()로 가장 긴 주소를 확인해 테이블 컬럼 길이를 정하는 실습임

같은 이유로 VARCHAR2(10 BYTE) 컬럼에는 한글 여섯 글자(18바이트)가 들어가지 않고 VARCHAR2(10 CHAR)에는 들어감
실습은 가장 긴 주소 42자 × 3바이트로 store_address VARCHAR2(130)을 잡음

#사용 조건과 주의사항

find ... -exec rm이나 -delete는 목록을 먼저 출력해 확인한 뒤에만 붙임

Oracle 아카이브 로그, 백업 조각, trace는 OS에서 바로 지우지 말고 RMAN, adrci로 정리함

실습 CSV와 로그에 든 비밀번호 메모, 고객 이름, 연락처 같은 예시 데이터는 운영 서버에 그대로 두지 않음

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기