데이터베이스 연구실.log

텍스트 정렬과 비교

sort의 필드, 숫자, 여러 기준 정렬과 저장, uniq의 중복, 횟수 집계, diff의 기본, 문맥, 나란히 비교, DBA 로그 예

sortuniqdiffsort -Tdiff -udiff -y

#핵심 요약

sort는 기본이 문자(사전) 순이라 숫자는 -n, 사람이 읽는 크기 단위는 -h를 붙여야 크기 순이 됨

uniq는 바로 이웃한 같은 줄만 합치므로 항상 sort 뒤에 씀
sort | uniq -c | sort -nr이 "가장 자주 난 오류부터" 보는 기본 형태임

diff는 설정 파일 변경 전후를 확인하는 도구이며, 기본, -u(문맥), -y(나란히) 세 형식을 상황에 맞게 고름

#개념과 동작 원리

옵션 의미
sort -t ',' 필드 구분자 지정(기본은 공백)
sort -k 2,2 2번 필드만 정렬 키로 씀, -k 2는 2번부터 줄 끝까지
sort -k 3,3n, -k 4,4nr 해당 키를 숫자로, 숫자 역순으로
sort -k 1,1 -k 4,4nr 첫 기준이 같을 때 두 번째 기준으로
sort -u 정렬하면서 같은 줄을 한 번만 남김
sort -o 파일 결과를 파일에 저장, 입력과 같은 파일이어도 안전함
sort -h 12K, 2.0M, 1.0G 같은 단위를 크기 순으로
sort -T 디렉터리 큰 파일 정렬 때 임시 파일을 둘 위치
uniq -c, -d, -u 횟수 붙이기, 두 번 이상 나온 값만, 한 번만 나온 값만
diff, diff -u, diff -y 바뀐 줄만, 앞뒤 문맥과 함께, 양쪽 나란히

#필수 명령어 또는 SQL

#문자 순과 숫자 순, 필드 정렬

Linux Bash (실습 디렉터리)조회만 함
sort backup_size_mb.txt
sort -n backup_size_mb.txt
sort -t ',' -k 2,2 tablespace_status.csv
sort -t ',' -k 3,3n tablespace_status.csv

결과 해석:

backup_size_mb.txt(800, 1250, 95, 4000, 150, 20)를 그냥 sort하면 1250, 150, 20, 4000, 800, 95처럼 첫 글자부터 문자로 비교함
용량 순으로 보려면 -n이 필요함

tablespace_status.csv의 필드는 DB 이름, 테이블스페이스 이름, 사용률, 남은 공간(GB), 상태 순임
실습 기록: -k 2,2는 DATA, SYSAUX, SYSTEM, TEMP, UNDO, USERS 순, -k 3,3n은 사용률 61(SYSTEM)부터 95(TESTDB TEMP)까지 오름차순

#여러 기준 정렬과 맨 위 한 줄

Linux Bash (실습 디렉터리)조회만 함
sort -t ',' -k 1,1 -k 4,4nr session_snapshot.csv
sort -t ',' -k 1,1 -k 4,4nr session_snapshot.csv | head -1
sort -t ',' -k 1,1 -k 4,4n tablespace_multi.csv

결과 해석:

session_snapshot.csv의 필드는 상태, 계정, SID, 마지막 호출 뒤 경과 초(LAST_CALL_ET)임
실습 기록: ACTIVE 안에서 5000, 1200, 80초 순, 이어서 BLOCKED, INACTIVE 순으로 나오고 head -1은 ACTIVE,SYS,103,5000

tablespace_multi.csv는 DB 이름 오름차순, 같은 DB 안에서는 남은 공간이 적은 테이블스페이스부터 보는 예이며 수업 자료의 기대 결과는 DEVDB TEMP(1.2)가 맨 위임

#정렬 결과 저장

Linux Bash (실습 디렉터리)객체 또는 설정을 변경함
sort -k 2,2nr sga_pool_usage.txt > sga_pool_sorted.txt
sort -k 2,2nr -o sga_pool_usage.txt sga_pool_usage.txt
sort -k 2,2nr rman_backup_duration.txt > rman_backup_sorted.txt
sort -k 2,2nr -o rman_backup_duration.txt rman_backup_duration.txt

결과 해석:

sort 파일 > 같은파일은 셸이 출력 파일을 먼저 비우므로 내용이 사라짐
같은 이름으로 저장할 때는 -o를 씀

실습 기록: SGA 풀 크기는 buffer_cache 2048, shared_pool 512, large_pool 128, java_pool 64, streams_pool 32 순
RMAN 소요 시간은 FULL_DB_BACKUP 145분, INCR_LEVEL1 38분, ARCHIVELOG 12분, CONTROLFILE 3분, SPFILE 1분 순

#크기 단위 정렬과 큰 파일 정렬

Linux Bash (sort_test)객체 또는 설정을 변경함
fallocate -l 10K alert_small.log
fallocate -l 2M alert_mid.log
fallocate -l 1G alert_big.log
du -h *.log | sort -h
Linux Bash (oracle 홈)객체 또는 설정을 변경함
seq 100000 | shuf > big_file.log
df -h /tmp
mkdir -p /u01/tmp
sort -T /u01/tmp -n big_file.log > big_file_sorted.log
sort -T /u01/tmp -nr big_file.log > big_file_reversed.log
rmdir /u01/tmp

결과 해석:

du -h의 12K, 2.0M, 1.0G는 -n으로는 숫자 부분만 비교해 순서가 틀리고 -h로 정렬해야 맞음

sort는 메모리에 다 못 올리는 큰 입력을 임시 파일로 나눠 정렬하며 기본 위치는 /tmp임
실습 기록: /tmp가 있는 루트 파일 시스템이 94%라 /u01/tmp를 -T로 지정함

fallocate는 실제로 디스크 공간을 잡으므로 1G 파일은 확인 뒤 지움

#중복 제거와 횟수 집계

Linux Bash (실습 디렉터리)조회만 함
sort err_codes.txt | uniq
sort err_codes.txt | uniq -c
sort err_codes.txt | uniq -c | sort -nr
awk '{print $3}' alert_orcl.log | sort | uniq -c
sort tbs_alert.txt | uniq -d
sort backup_fail.txt | uniq -u
awk '{print $3}' arch_log.txt | sort | uniq -d

결과 해석:

실습 기록: err_codes.txt 24줄은 ORA-04031 6회, ORA-00600 5회, ORA-01555, ORA-12154 4회, ORA-00060 3회, ORA-01652 2회로 집계됨

수업 자료의 중복 제거 문제는 코드만 한 번씩 나오는 결과를 기대하므로 uniq이며, 답에 적힌 uniq -c는 횟수까지 붙임

횟수가 같은 줄(ORA-01555와 ORA-12154)의 순서는 sort -nr만으로는 정해지지 않아 실행마다 기대 출력과 다를 수 있음
순서를 고정하려면 sort -k1,1nr -k2,2처럼 두 번째 기준을 줌

uniq -d는 두 번 이상 경고에 걸린 테이블스페이스(SYSAUX, SYSTEM, UNDOTBS1, USERS), uniq -u는 한 번만 난 백업 실패 사유(ORA-01578)를 골라냄

아카이브 로그 이력의 세 번째 필드(시퀀스)에서 uniq -d로 중복 백업된 시퀀스 20552를 찾음
같은 시퀀스가 두 번 백업됐다면 스토리지 낭비나 스크립트 오류를 의심함

#로그에서 오류 코드만 뽑아 세기

Linux Bash (alert 로그 디렉터리)조회만 함
grep -oE 'ORA-[0-9]{5}' alert* | sort | uniq -c | sort -nr
grep -oE 'ORA-[0-9]{5}' alert_prod.log | sort | uniq -c | sort -nr
grep -oE '(ORA|TNS)-[0-9]{5}' oracle_error.log | sort -u
awk '{print $3}' oracle_error.log | grep -v 'TNS-' | sort -u

결과 해석:

grep -o는 줄 전체가 아니라 패턴에 맞은 부분만 출력해, 경로 뒤, 문장 중간, 맨 앞 어디에 있든 오류 코드만 뽑음

실습 기록: 실제 alert 로그에서 ORA-27037, ORA-00313, ORA-00312가 각 12회, ORA-25530, ORA-02097, ORA-00060이 각 1회
alert_prod.log 연습 파일은 ORA-00600, ORA-04031 3회, ORA-01555 2회, ORA-12154 1회

awk '{print $3}'로 세 번째 단어를 뽑으면 ORA-01017:처럼 콜론까지 붙고, 메시지 위치가 다른 줄에서는 다른 단어가 나옴
위치가 일정하지 않은 로그는 grep -oE가 정확함

#접속 IP 순위와 성공한 백업 DB 목록

Linux Bash (실습 디렉터리)조회만 함
grep -oE 'HOST=[0-9.]+' listener.log | sort | uniq -c | sort -nr
grep 'completed successfully' rman_backup.log | grep -oE 'database [A-Z]+' | sort -u

결과 해석:

리스너 로그의 (ADDRESS=...(HOST=<IP>)...)에서 HOST= 뒤 주소만 뽑아 접속 횟수 순으로 세는 과제이며, 수업 자료의 기대 결과는 한 클라이언트 3회, 다른 둘이 2회, 1회임

RMAN 로그에서 성공 줄만 고른 뒤 DB 이름을 중복 없이 뽑으면 database ORCL, database TESTDB가 남고 실패한 DEVDB는 나오지 않음
수업 자료에는 기대 결과만 있어 위 두 명령은 같은 결과를 내는 한 가지 방법임

#이름만 중복 제거해야 하는 경우

Linux Bash (실습 디렉터리)조회만 함
awk '{$1=""; $NF=""; print}' wait_trace.log | sort -u

결과 해석:

wait_trace.log는 시각, 대기 이벤트 이름, 대기 시간(ms) 순인데 이벤트 이름에 공백이 들어 있음

수업 자료의 답 awk '{print $2,$3,$4,$5,$6}' | sort -u는 마지막 필드인 대기 시간까지 출력해 db file sequential read 12, ... 6처럼 같은 이벤트가 여러 줄로 남음
이벤트 종류만 보려면 위처럼 첫 필드(시각)와 마지막 필드(시간)를 비우고 정렬함

#파일 변경 전후 비교

Linux Bash (실습 디렉터리)조회만 함
diff init_orcl.ora.bak init_orcl.ora
diff tnsnames.ora.bak tnsnames.ora
diff -u rman_backup.sh.bak rman_backup.sh
diff -y --width=70 before.sql after.sql

결과 해석:

기본 형식 3c3은 왼쪽 3번 줄이 오른쪽 3번 줄로 바뀜(change), <는 왼쪽(이전), >는 오른쪽(이후) 내용임
실습 기록: sga_target=2G가 sga_target=4G로 바뀐 한 줄만 나옴

5,12d4는 왼쪽 5~12번 줄이 지워져(delete) 오른쪽 4번 줄 뒤에 해당한다는 뜻이며, tnsnames 정리로 OLDDB1, OLDDB2 항목 8줄이 사라진 것을 보여 줌

diff -u는 ---, +++ 머리와 @@ -2,7 +2,7 @@ 구간 표시 뒤에 바뀐 줄을 -, +로, 앞뒤 문맥을 공백으로 보여 줘 검토용으로 읽기 쉬움

diff -y는 양쪽을 나란히 놓고 >(오른쪽에만 있음, 추가), <(왼쪽에만 있음, 삭제), |(같은 위치에서 다름, 수정)를 가운데에 찍음
--width=70처럼 폭을 좁히면 긴 줄은 잘려 보임

CTE 순서만 바꾸고 들여쓰기를 탭으로 바꾼 두 SQL은 의미가 거의 같아도 거의 모든 줄이 |로 나옴
공백 차이를 무시하려면 -w, 빈 줄 차이를 무시하려면 -B를 붙임

diff는 파일 텍스트를 비교할 뿐 SQL의 실행 결과가 같은지는 알려 주지 않음

#사용 조건과 주의사항

uniq는 정렬하지 않은 입력에서 떨어져 있는 같은 줄을 합치지 못함

큰 파일 정렬은 임시 공간을 쓰므로 df -h로 여유를 보고 -T로 여유 있는 파일 시스템을 지정함

sed -i로 설정 파일을 고치기 전에는 .bak으로 복사하고, 고친 뒤 diff로 바뀐 줄이 의도한 것뿐인지 확인함

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

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

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