데이터베이스 연구실.log

텍스트 치환과 편집

sed의 화면 치환, 파일 수정, 백업, 줄과 패턴 지정, 구분자, 규칙 파일, vi의 이동, 검색, 치환, 블록 편집, DBA 설정 파일 예

sedsed -ivi치환dos2unixMAXDATAFILES

#핵심 요약

sed 's/기존/새것/g' 파일은 화면에만 바꾼 결과를 보이고 파일은 그대로 둠
파일을 실제로 고치려면 -i, 고치기 전 백업까지 남기려면 -i.bak을 씀

바꿀 줄은 줄 번호(1s/...)나 패턴(/STANDBY/s/...)으로 좁히며, 줄 번호는 파일이 바뀌면 달라지므로 운영 설정에는 패턴 기준이 안전함

vi는 명령 모드에서 :set nu, :33, /찾기, n, :%s/기존/새것/g로 줄 번호, 이동, 검색, 치환을 함

#개념과 동작 원리

구문 의미
sed 's/A/B/', s/A/B/g 줄마다 첫 번째 A만, 줄 안의 모든 A를 B로
sed -i, -i.bak 파일 직접 수정, 수정 전 내용을 .bak을 붙인 파일로 보존
sed '1s/2/5/' 1번 줄에서만 치환
sed '/STANDBY/s/1521/1522/' STANDBY가 든 줄에서만 치환
sed 's#A#B#g' 구분자를 #으로 바꿔 경로의 /를 이스케이프하지 않음
sed -e '규칙1' -e '규칙2' 여러 규칙을 한 번에 적용
sed -f 규칙파일 규칙을 파일로 분리해 여러 파일에 같은 규칙 적용
sed '/패턴/d', '/^$/d', 's/\r$//' 패턴 줄 삭제, 빈 줄 삭제, 줄 끝 캐리지 리턴 제거
vi :set nu, :33, G 줄 번호 표시, 33번 줄로, 마지막 줄로
vi /패턴, ?패턴, n, N 아래로, 위로 검색, 같은 방향 다음, 반대 방향 다음
vi :set ic, :set hlsearch 대소문자 무시 검색, 검색어 강조
vi :%s/A/B/g, :%s/A/B/gc, :8,14s/A/B/g 전체 치환, 하나씩 확인하며 치환, 8~14번 줄만 치환

#주요 용어와 구성 요소

구문 의미
Normal 모드 이동, 삭제, 검색 등의 키를 명령으로 해석하는 기본 모드임
Insert 모드 문자를 입력하는 모드이며 i로 진입하고 Esc로 Normal 모드에 돌아옴
명령줄 모드 :로 시작해 저장, 종료, 범위 명령을 입력함

#필수 명령어 또는 SQL

항목 실행 조건
작업 대상 각 절의 연습 파일과 설정 파일, 마지막 절의 컨트롤 파일 trace
필요 권한 셸 파일 읽기, 교체 디렉터리 쓰기 권한, 마지막 DB 조회, trace는 SYSDBA
바꿀 입력값 각 파일 경로, 치환 패턴, 새 값, 줄 범위, 규칙 파일명
결과 해석 빈 과제의 실제 정답, 추가 실행 출력은 확인 불가

#화면에서 먼저 확인하기

Linux Bash (oracle 홈)조회만 함
sed 's/orclold/orclnew/g' ~/dbwork/network/tnsnames.ora
grep orclold ~/dbwork/network/tnsnames.ora

결과 해석:

실습 기록: 화면에는 (SERVICE_NAME = orclnew)(SID = orclnew)로 한 줄 안의 두 곳이 모두 바뀌어 나오고, grep으로 보면 파일에는 여전히 orclold가 남아 있음

g를 빼면 그 줄의 첫 번째 orclold만 바뀜

대문자 ORCLOLD(별칭 이름)는 대소문자가 달라 바뀌지 않음

#파일 직접 수정과 백업

Linux Bash (oracle 홈)객체 또는 설정을 변경함
cp ~/listener_lab/listener_env.conf ~/listener_lab/listener_env.work
sed -i 's/OFF/SUPPORT/g' ~/listener_lab/listener_env.work
cat ~/listener_lab/listener_env.work ~/listener_lab/listener_env.conf
Linux Bash ($ORACLE_HOME/network/admin)객체 또는 설정을 변경함
sed -i._backup 's/1523/1577/g' listener.ora
ls listener.ora*

결과 해석:

리스너 로그, 트레이스 레벨을 OFF에서 SUPPORT로 올리는 예이며, 운영 파일은 두고 복사본에서만 -i로 고침

-i._backup은 수정 전 내용을 listener.ora._backup으로 남김
같은 접미사로 두 번 고치면 첫 백업이 덮어써지므로 접미사를 바꾸거나 날짜를 붙임

실습은 포트를 1577로 바꾼 뒤 다시 sed -i 's/1577/1523/g'로 되돌림
listener.ora의 다른 줄에 같은 숫자가 있으면 함께 바뀌므로 바꾼 뒤 diff listener.ora._backup listener.ora로 확인함

#특정 줄, 특정 패턴에만 치환

Linux Bash (asm_lab, inv_lab)객체 또는 설정을 변경함
sed '1s/2/5/' ~/asm_lab/rebalance.conf
sed -i.bak '/STANDBY/s/1521/1522/' listener_inventory.conf
cat listener_inventory.conf

결과 해석:

rebalance.conf는 세 줄 모두 값이 2라 s/2/5/g면 DATA, FRA, REDO가 다 바뀜
DATA 디스크 그룹의 리밸런스 파워만 올리려면 첫 줄만 지정하는 과제이며, 위 명령은 답이 없는 과제에 맞춘 한 가지 형태임

1s/2/5/의 2는 그 줄의 첫 번째 2이므로 DATA_REBALANCE_POWER=2처럼 이름에 숫자가 없을 때만 맞음
1s/=2$/=5/처럼 값 자리를 정확히 가리키면 더 안전함

실습 기록: STANDBY가 든 두 줄만 PORT=1522로 바뀌고 PRIMARY 두 줄은 PORT=1521 그대로임
줄 번호 대신 패턴을 쓰면 인벤토리 파일에 줄이 추가돼도 같은 줄만 바뀜

#줄 삭제, 구분자 바꾸기, 여러 규칙

Linux Bash (adr_lab, envcfg_lab)객체 또는 설정을 변경함
sed '/Completed checkpoint/d; /advanced to log sequence/d' adr_alert_combined.log
sed -i.bak -e 's#19.0.0#21.0.0#g' -e 's/1521/1522/g' oracle_env.conf
cat oracle_env.conf

결과 해석:

정기 메시지(체크포인트 완료, 로그 시퀀스 전환)를 화면에서만 빼고 ORA- 오류 줄만 남기는 예이며 파일은 그대로임
실습 기록: ORCL1의 ORA-00600, ORA-01555, ORCLDEV의 ORA-01555 세 줄이 남음

경로처럼 /가 많은 값은 s#...#...#처럼 다른 구분자를 씀

수업 자료의 답은 21.0.0.3으로 바꿔 문제의 목표(21.0.0)와 다름
19.0.0의 점은 아무 문자 하나와 맞으므로 정확히 하려면 19\.0\.0으로 씀

#규칙 파일로 여러 파일에 같은 변경

파일 (sed_lab/change.sed)객체 또는 설정을 변경함
s/1521/1522/g
s/<OLD_HOST>/<NEW_HOST>/g
Linux Bash (sed_lab)객체 또는 설정을 변경함
sed -i -f change.sed conf/tnsnames.conf
sed -i -f change.sed data/init.ora
sed -i -f change.sed logs/alert.log
cat conf/tnsnames.conf data/init.ora logs/alert.log

결과 해석:

실습 기록: 세 파일 모두 HOST = <NEW_HOST>, PORT = 1522, local_listener=<NEW_HOST>:1522처럼 바뀜

수업 자료의 문제는 규칙 파일을 changed.sed, 명령은 change.sed로 적어 이름이 다름

서버 이전처럼 여러 파일에 같은 변경을 할 때 규칙을 파일로 두면 같은 규칙을 반복 적용하고 기록으로 남길 수 있음

#Windows 줄 끝과 빈 줄 정리

Linux Bash (scriptclean_lab)객체 또는 설정을 변경함
cat -A rman_backup_win.sh
sed 's/\r$//; /^$/d' rman_backup_win.sh
cp -p rman_backup_win.sh rman_backup_win.sh.orig
sed -i 's/\r$//; /^$/d' rman_backup_win.sh
cat -A rman_backup_win.sh

결과 해석:

Windows에서 만든 스크립트는 줄 끝이 ^M$로 보이며, 그대로 실행하면 값 끝에 캐리지 리턴이 붙어 경로가 맞지 않음

sed -i.bak을 두 번 실행하면 두 번째 실행이 첫 .bak을 덮어씀
화면 확인 → 받은 파일 복사 → 한 번에 두 규칙 적용 순서로 처리함

실습 기록: 정리 뒤 cat -A에 RMAN_BACKUP_DIR=...$, TARGET=...$, RMAN_LOG=...$ 세 줄만 남음

#vi에서 이동, 검색

vi (명령 모드)조회만 함
vi +/Dead alert_<SID>.log
:set nu
:33
/ORA-
n
N
:set ic
:set hlsearch

결과 해석:

vi +/패턴 파일은 파일을 열자마자 패턴이 처음 나오는 줄로 감
실습은 alert 로그에서 deadlock 메시지로 바로 가는 데 씀

:set nu로 줄 번호를 켠 뒤 /ORA-로 찾고 n으로 다음, N으로 이전 결과로 감

TNS:Connect timeout, tns:connect Timeout, TIMEOUT이 섞인 파일은 :set ic 뒤에 /timeout으로 찾아야 세 줄 모두 걸림
한 번만 무시하려면 /timeout\c처럼 패턴 끝에 \c를 붙임

키 조작 과제의 정답과 실제 출력은 기재 없음

#vi에서 치환과 블록 편집

vi (명령 모드, vi_adv의 tnsnames.ora·oracle_backup.sql)객체 또는 설정을 변경함
:%s/1521/1522/g
:%s/dbsvr0/coupang0/gc
:8,14s/backup/full_backup/g
:8,19s/^/#/
:8,19s/^#//
:8,19w oracle_fullbackup2.sql
:r common.env
:g/-- STANDBY LOGFILE/d
:wq

결과 해석:

:%s의 %는 파일 전체, gc는 바꿀 때마다 y/n을 물음

:8,14s는 8~14번 줄(요일별 로그 경로)만 바꿈

8~19번 줄 주석 처리는 비주얼 블록(Ctrl+v로 줄 선택 → I → # → Esc)으로도 하고, 같은 범위를 :8,19s/^/#/로도 함

:8,19w 새파일은 그 범위만 새 파일로 저장하고, :r 파일은 다른 파일 내용을 현재 커서 아래에 끼워 넣음

여러 파일의 같은 문자열(예: emp1.csv~`emp100.csv의 KING)은 vi로 하나씩 열기보다 sed -i 's/KING/HONG/g' emp*.csv가 간단함<br>vim에서는 :args emp*.csv뒤:argdo %s/KING/HONG/g | update`로 같은 일을 함

#컨트롤 파일 재생성 스크립트 편집

SQL*Plus (SYSDBA)객체 또는 설정을 변경함
SELECT type, records_total, records_used
  FROM v$controlfile_record_section
 WHERE type = 'DATAFILE';
ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/home/oracle/cre_controlfile_<날짜>.sql';
SHOW PARAMETER db_files

결과 해석:

실습 기록: 데이터 파일 레코드가 RECORDS_TOTAL 100이라 데이터 파일을 100개까지만 만들 수 있었고, 생성 스크립트의 MAXDATAFILES를 고쳐 재생성한 뒤 1000으로 늘어남

vi로 하는 일은 trace 스크립트에서 필요한 CREATE CONTROLFILE 부분만 남기고 MAXDATAFILES 값을 고치는 것이며, :g/-- STANDBY LOGFILE/d처럼 필요 없는 주석 줄을 지움

db_files 초기화 파라미터(실습은 200)도 함께 늘려야 실제로 그만큼 데이터 파일을 만들 수 있으며, scope=spfile로 바꾼 뒤 재기동함

컨트롤 파일 재생성은 DB를 내리고 하는 위험한 작업이라 절차와 주의는 RAC의 ASM과 파일 구성의 컨트롤 파일 재생성 절을 따름

#구문과 옵션 설명

구문 의미
h, j, k, l Normal 모드의 왼쪽, 아래, 위, 오른쪽 이동임
x, dd, u, Ctrl+R 문자 삭제, 한 줄 삭제, 되돌리기, 다시 실행임
:w, :wq, :q! 저장, 저장 후 종료, 수정 내용을 버리고 종료하는 동작임
sed -n 기본 자동 출력을 끄며 명시적으로 출력할 규칙이 필요함
sed -i접미사 임시 파일을 사용해 입력 파일을 교체하며 접미사가 있으면 백업을 남김

#사용 조건과 주의사항

sed -i는 되돌리기가 없으므로 운영 파일은 먼저 cp -p로 백업하거나 -i.bak을 쓰고, 바꾼 뒤 diff로 확인함

숫자나 짧은 문자열의 전체 치환(s/2/5/g, s/1521/1522/g)은 의도하지 않은 곳까지 바꾸기 쉬우므로 줄, 패턴, 앵커(^, $, =)로 범위를 좁힘

vi에서 저장하지 않고 나가려면 :q!이며, alert 로그처럼 DB가 쓰고 있는 파일은 vi로 편집하지 않고 조회만 함

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

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

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