리다이렉션과 출력 처리
덮어쓰기와 이어쓰기, 정상, 오류 출력의 분리와 병합, tee와 sudo tee, < 입력과 히어도큐먼트로 SQL*Plus 스크립트를 실행, 저장하는 예
#핵심 요약
>는 새로 만들거나 덮어쓰기, >>는 이어쓰기임
정상 출력은 1번(표준출력), 오류는 2번(표준에러)이라 >> 정상.log 2>> 오류.log로 나누고 >> 한파일.log 2>&1로 합침
tee는 화면과 파일에 함께 쓰고, root 파일에 쓸 때는 echo ... | sudo tee -a 파일처럼 파일을 여는 쪽을 sudo로 실행함
<와 히어도큐먼트(<< 'EOF')는 파일이나 여러 줄 텍스트를 명령의 입력으로 넘기며, SQL*Plus 스크립트 실행, 리포트 저장에 씀
#개념과 동작 원리
| 기호 | 의미 |
|---|---|
> 파일 |
표준출력을 파일로, 있으면 덮어씀 |
>> 파일 |
표준출력을 파일 끝에 이어씀 |
2> 파일, 2>> 파일 |
표준에러를 파일로 덮어쓰기, 이어쓰기 |
> 파일 2>&1 |
표준에러를 표준출력과 같은 곳으로 보냄, 순서가 중요함 |
명령 | tee 파일, tee -a |
화면과 파일에 함께 출력, -a는 이어쓰기 |
명령 < 파일 |
파일 내용을 표준입력으로 |
<< 'EOF' ... EOF |
여러 줄을 표준입력으로, 따옴표로 묶으면 $를 셸이 풀지 않음 |
2>&1은 "2번을 지금 1번이 가리키는 곳으로 복사"하는 뜻이라 >> all.log 2>&1처럼 1번을 먼저 정한 뒤에 씀2>&1 >> all.log로 순서를 바꾸면 오류는 여전히 화면으로 감
#필수 명령어 또는 SQL
#덮어쓰기와 이어쓰기
grep -i 'salesman' emp.csv > special_job.csv
grep -i 'analyst' emp.csv >> special_job.csv
cat special_job.csv
grep -i 'ora-' alert* >> ora_alert.txt
wc -l ora_alert.txt결과 해석:
실습 기록: SALESMAN 네 줄 아래에 ANALYST 두 줄이 붙어 여섯 줄이 됨
수업 자료는 첫 저장도 >>로 적었는데, 같은 명령을 다시 실행하면 앞 결과 아래에 또 쌓이므로 첫 저장은 >로 하는 것이 맞음
실습 기록: alert 로그의 ORA- 줄 42개가 저장되고, 앞쪽은 리두 로그 그룹을 열지 못한 ORA-00313, ORA-00312, ORA-27037 묶음임
#정상 출력과 오류 출력 나누기, 합치기
#!/bin/bash
echo "디스크 점검 시작"
df -h /
ls /no_exist_dir1
ls /no_exist_dir2
echo "디스크 점검 종료"chmod +x check_disk.sh
./check_disk.sh >> disk.log 2>> disk_error.log
cat disk.log
cat disk_error.log
./check_disk.sh >> all_disk.log 2>&1
ls emp.csv dept.csv nofile2.csv >> list_check.log 2>&1결과 해석:
실습 기록: disk.log에는 시작, 종료 메시지와 df -h / 결과(루트 사용률 93%), disk_error.log에는 없는 디렉터리 두 개에 대한 ls: cannot access ... 두 줄이 남음
같은 형태의 backup.sh에서도 백업 시작, 백업 종료 메시지는 backup.log로, 없는 디렉터리 오류만 backup_error.log로 감
2>&1로 합치면 정상 메시지와 오류가 한 파일에 남아 무엇이 어느 단계에서 실패했는지 함께 볼 수 있음
다만 프로그램이 표준출력을 버퍼에 모았다가 쓰면 파일 안의 순서가 화면에서 본 순서와 다를 수 있음
이 형태(>> all_disk.log 2>&1)가 리눅스 이수자 평가 2번 문제의 답임
#화면과 파일에 함께, root 파일에 기록
grep -i 'manager' emp.csv | tee manager_list.log
echo "oracle test line" >> /etc/oracle_test.conf
sudo echo "oracle test line" >> /etc/oracle_test.conf
echo "oracle test line" | sudo tee -a /etc/oracle_test.conf결과 해석:
실습 기록: MANAGER 세 줄(BLAKE, CLARK, JONES)이 화면에 나오고 같은 내용이 manager_list.log에 저장됨
sudo echo ... >> /etc/...도 허가 거부로 실패함>>로 파일을 여는 것은 sudo가 아니라 oracle 계정의 셸이기 때문이며, sudo tee -a는 파일을 여는 tee를 root로 실행해 성공함
실습은 root에서 visudo -f /etc/sudoers.d/oracle로 oracle ALL=(ALL) ALL을 넣어 oracle 계정이 sudo를 쓰게 함
이 설정은 oracle 계정에 root 전체 권한을 주는 것이라 운영 서버에서는 필요한 명령만 허용함
#파일을 SQL*Plus 입력으로
cat > script.sql
sqlplus scott/<PASSWORD> < script.sql
cat > log_mode.sql << 'EOF'
select log_mode from v$database;
EOF
sqlplus scott/<PASSWORD> @log_mode.sql결과 해석:
cat > script.sql 뒤에 내용을 입력하고 Ctrl+D로 끝냄
sqlplus ... < script.sql은 파일 내용을 키보드 입력처럼 넘기므로 실행 뒤 입력이 끝나 SQLPlus가 바로 종료됨@log_mode.sql처럼 스크립트로 실행하면 끝에 exit이 없을 때 SQLPlus 프롬프트에 그대로 남음
v$database의 $는 셸이 변수로 풀어 버리므로, 히어도큐먼트 종료 표식을 'EOF'처럼 따옴표로 묶어 그대로 저장되게 함
실습 기록: log_mode.sql 실행 결과는 NOARCHIVELOG
접속하자마자 DB 이름을 보여 주게 해서 운영, 테스트 서버를 헷갈리지 않게 하는 과제도 있음(select name from v$database;를 로그인 때 실행)
SQL*Plus는 접속 때 $ORACLE_HOME/sqlplus/admin/glogin.sql과 SQLPATH(Linux는 ORACLE_PATH도) 경로의 login.sql을 실행함
#SQL 결과를 리포트 파일로
SELECT a.tablespace_name,
ROUND(a.bytes_alloc/1024/1024, 0) AS total_mb,
ROUND(NVL(b.bytes_free, 0)/1024/1024, 0) AS free_mb,
ROUND((a.bytes_alloc - NVL(b.bytes_free, 0))/1024/1024, 0) AS used_mb,
ROUND((1 - NVL(b.bytes_free, 0)/a.bytes_alloc) * 100, 2) AS used_pct
FROM (SELECT tablespace_name, SUM(bytes) bytes_alloc FROM dba_data_files GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) bytes_free FROM dba_free_space GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name(+)
ORDER BY used_pct DESC;
exit;sqlplus scott/<PASSWORD> @report.sql > a.txt
cat a.txt결과 해석:
테이블스페이스별 전체, 빈, 사용 MB와 사용률을 사용률 높은 순으로 보는 리포트이며, 끝의 exit;가 있어야 실행 뒤 SQL*Plus가 끝나 리다이렉션이 마무리됨
실습 기록: USERS 95.14%, SYSAUX 93.79%, SYSTEM 81.11%, UNDOTBS1 3.09%
DBA_DATA_FILES, DBA_FREE_SPACE는 DBA 뷰라 조회 권한이 있는 계정이어야 함
실습은 scott으로 실행했으므로 scott에 해당 권한이 부여된 환경임
> a.txt에는 접속 배너와 종료 메시지까지 들어가므로 결과만 남기려면 sqlplus -s(배너 없음)를 씀
#사용 조건과 주의사항
>는 묻지 않고 덮어쓰므로 중요한 로그, 설정 파일 이름에 쓰지 않음set -o noclobber를 켜면 >가 기존 파일을 덮어쓰지 못함
명령줄에 계정/비밀번호를 쓰면 ps와 셸 기록에 남으므로 스크립트에서는 OS 인증(/ as sysdba)이나 전자 지갑 같은 방법을 검토함