별칭과 환경변수
DBA용 별칭과 .bash_profile, export, source의 적용 범위, ORACLE_SID, NLS_LANG, TNS_ADMIN 설정과 환경 장애 진단, 점검 메뉴 스크립트
#핵심 요약
자주 쓰는 이동, 접속 명령은 alias로 묶어 ~/.bash_profile에 두고 source ~/.bash_profile로 현재 셸에 반영함
export하지 않은 변수는 현재 셸에만 있고 sqlplus 같은 자식 프로세스에 전달되지 않음
./a.sh, bash a.sh는 자식 셸에서 실행돼 현재 셸 값을 바꾸지 않고, source a.sh(. a.sh)만 현재 셸에 반영함
ORACLE_SID가 실제 떠 있는 인스턴스와 다르면 ORA-01034, ORACLE_HOME이 자식에 전달되지 않으면 SP2-0667처럼 증상이 다르게 나옴
#개념과 동작 원리
| 변수 | 역할 |
|---|---|
ORACLE_BASE |
Oracle 소프트웨어와 진단 파일의 최상위 경로 |
ORACLE_HOME |
이 셸에서 쓰는 Oracle 소프트웨어 홈, bin, 메시지 파일 위치를 정함 |
ORACLE_SID |
/ as sysdba 같은 로컬 접속이 붙을 인스턴스 이름 |
PATH |
실행 파일 검색 경로, $ORACLE_HOME/bin이 들어 있어야 sqlplus를 찾음 |
LD_LIBRARY_PATH |
공유 라이브러리 검색 경로 |
NLS_LANG |
클라이언트의 언어, 지역, 문자셋, 터미널 인코딩과 맞아야 한글이 바르게 보임 |
TNS_ADMIN |
tnsnames.ora, sqlnet.ora를 찾을 디렉터리, 없으면 $ORACLE_HOME/network/admin |
TIME_STYLE |
ls -l의 시각 형식 |
로그인 셸은 ~/.bash_profile을 읽고, 실습 파일은 그 안에서 ~/.bashrc를 다시 불러옴
Oracle 설정을 별도 파일(a.sh)에 두고 .bashrc에서 source하면 새 터미널마다 같은 환경이 적용됨
#필수 명령어 또는 SQL
#DBA용 별칭
alias alert='cd $ORACLE_BASE/diag/rdbms/<db_name>/<SID>/trace'
alias net2='cd $ORACLE_HOME/network/admin'
alias dbs='cd $ORACLE_HOME/dbs'
alias ss='sqlplus / as sysdba'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias cls='clear'
alias ll='ls -lh'
alias lt='ls -ltrh'
alias la='ls -alh'
alias dfh='df -h'
alias duh='du -sh * 2>/dev/null'
alias prodb='export ORACLE_SID=<SERVICE_NAME>'
alias orcl='export ORACLE_SID=orcl'source ~/.bash_profile
alias
unalias rman결과 해석:
alert, net2, dbs는 alert 로그, 네트워크 설정, 파라미터 파일 디렉터리로 바로 가는 별칭이고, ss는 SYSDBA 접속임
rm -i, cp -i, mv -i 별칭은 지우거나 덮어쓰기 전에 묻게 해 실수를 줄임
lt(ls -ltrh)는 수정 시각 오름차순이라 가장 최근 파일이 맨 아래에 나와 로그 디렉터리에서 자주 씀
prodb, orcl처럼 ORACLE_SID를 바꾸는 별칭을 두면 한 서버의 여러 인스턴스를 오갈 때 편함
바꾼 뒤에는 echo $ORACLE_SID로 지금 어느 인스턴스를 가리키는지 확인함
수업 자료는 RMAN에는 별칭을 만들지 말라고 함alias rman='rman target / nocatalog'를 두면 rman만 쳐도 그 순간의 ORACLE_SID 인스턴스에 바로 접속돼, 대상을 확인하지 않고 백업, 복구 명령을 내릴 위험이 있음
계정과 비밀번호를 넣은 접속 별칭(sqlplus 계정/비밀번호@...)은 alias 출력과 설정 파일에 비밀번호가 그대로 남으므로 쓰지 않음
#export와 source의 범위
ORACLE_SID=<SERVICE_NAME>
env | grep ORACLE_SID
export ORACLE_SID=<SERVICE_NAME>
env | grep ORACLE_SIDexport ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
export ORACLE_SID=<SERVICE_NAME>
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_LANG=KOREAN_KOREA.AL32UTF8
export TNS_ADMIN=$ORACLE_HOME/network/admin./a.sh
echo $ORACLE_SID
source a.sh
echo $ORACLE_SID
source ~/.bash_profile
echo $ORACLE_SID결과 해석:
일반 변수는 env에 나오지 않고 export 뒤에야 ORACLE_SID=<SERVICE_NAME>로 나옴
실습 기록: ./a.sh 뒤에는 그대로 ORCL2, source a.sh 뒤에는 <SERVICE_NAME>, 다시 source ~/.bash_profile 뒤에는 ORCL2로 돌아옴
같은 SQL(select instance_name from v$instance)을 실행해도 각각 <SERVICE_NAME>, ORCL2로 다른 인스턴스에 붙음
#로그인 때 자동 적용
cat >> ~/.bashrc <<'EOF'
# Oracle environment
if [ -f /home/oracle/a.sh ]; then
source /home/oracle/a.sh
fi
EOF
source ~/.bashrc
echo $ORACLE_SID
which sqlplus결과 해석:
-f는 파일이 있을 때만 읽게 해, 파일이 없어도 로그인이 오류로 끝나지 않음
기본 .bash_profile에는 이미 if [ -f ~/.bashrc ]; then . ~/.bashrc; fi가 있음
수업 자료처럼 같은 블록을 한 번 더 넣으면 .bashrc가 두 번 실행되므로 이미 있는지 먼저 확인함
설정 파일을 고친 뒤에는 새 로그인 세션을 열어 실제로 적용되는지 확인함
#환경 장애 진단 (SP2-0667, ORA-01034)
unset ORACLE_HOME ORACLE_SID
source ~/prof_lab/case1.sh
echo $ORACLE_HOME
echo $ORACLE_SID
env | grep ORACLE
ps -ef | grep pmon | grep -v grep결과 해석:
사례 1(case1.sh)은 ORACLE_SID=orcl만 export 없이 적어 둔 경우임
수업 자료에 적힌 증상은 Error 6 initializing SQL*Plus, SP2-0667: Message file sp1<lang>.msb not found이며, 제목은 ORA-12162로 되어 있어 두 오류가 서로 맞지 않음
이 사례의 ORACLE_HOME은 /u01/app/oracle/product/19c/db_1이라 실습 서버의 실제 홈과 다름
메시지 파일을 못 찾는 SP2-0667은 ORACLE_HOME이 잘못된 경우의 증상이고, ORACLE_SID를 export하지 않은 경우는 보통 ORA-12162(SID 미지정)가 남
사례 2(case2.sh)는 ORACLE_SID=testdb인데 실제로는 그 인스턴스가 떠 있지 않아 ORA-01034: ORACLE not available, ORA-27101: shared memory realm does not exist가 남ps -ef | grep pmon의 ora_pmon_<SID>에서 실제 SID를 확인해 맞춤
고치기 전에 cp -p ~/.bash_profile ~/.bash_profile.org로 원래 설정을 남겨 둠
#NLS_LANG과 TNS 별칭
export NLS_LANG=AMERICAN_AMERICA.US7ASCII
sqlplus scott/<PASSWORD>
export NLS_LANG=KOREAN_KOREA.AL32UTF8
lsnrctl status
sqlplus system/<PASSWORD>@<SERVICE_NAME><SERVICE_NAME> =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = <HOST>)(PORT = <PORT>))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = <SERVICE_NAME>)
)
)결과 해석:
US7ASCII로 두고 한글 데이터를 조회하면 글자가 깨지는 것을 보는 실습이며, 터미널이 UTF-8이면 AL32UTF8로 맞춤
dbca로 만든 <SERVICE_NAME>가 리스너에 READY로 등록됐는지 lsnrctl status의 서비스 요약에서 본 뒤, tnsnames.ora에 별칭을 넣어 easy connect(호스트:포트/서비스) 대신 @<SERVICE_NAME>로 접속함
별칭의 포트는 리스너가 실제로 듣는 포트와 같아야 하며, 실습 리스너는 기본값이 아닌 포트로 바꿔 둔 상태였음
#환경 점검 메뉴 스크립트
#!/bin/bash
check_env() {
echo "ORACLE_BASE=$ORACLE_BASE"
echo "ORACLE_HOME=$ORACLE_HOME"
echo "ORACLE_SID=$ORACLE_SID"
echo "NLS_LANG=$NLS_LANG"
echo "TNS_ADMIN=$TNS_ADMIN"
echo "sqlplus=$(which sqlplus 2>/dev/null)"
ps -ef | grep ora_pmon | grep -v grep
}
echo " 1. 오라클 환경변수 확인"
echo " 2. 인스턴스 기동 상태 확인"
echo " 3. 리스너 상태 확인"
echo " 4. .bash_profile 을 오늘날짜로 백업하기"
echo " q. 종료"
read -p "번호를 선택하세요 : " num
case $num in
1) check_env ;;
2) ps -ef | grep ora_pmon | grep -v grep ;;
3) lsnrctl status ;;
4) cp -v ~/.bash_profile ~/.bash_profile_$(date +%Y%m%d)
ls -al ~/.bash_profile* ;;
q|Q) echo "종료합니다." ;;
*) echo "잘못된 번호입니다." ;;
esac결과 해석:
read -p로 번호를 받고 case로 갈라 실행하는 메뉴 형태이며, 함수(check_env)로 묶은 점검은 다른 번호에서도 다시 부를 수 있음
cp -vf .bash_profile ...는 현재 디렉터리 기준이라 홈이 아닌 곳에서 실행하면 실패함~/를 붙이면 홈의 파일을 백업함
설정 파일을 바꾸기 전에는 날짜를 붙여 백업하는 습관을 스크립트 메뉴로 만들어 둔 예임
#사용 조건과 주의사항
한 서버에 여러 Oracle 홈과 인스턴스가 있으면 ORACLE_HOME과 ORACLE_SID를 함께 바꿔야 하며, / as sysdba 전에 echo $ORACLE_SID로 대상을 확인함
.bash_profile에 같은 PATH 추가 줄이 반복되면 source할 때마다 경로가 길어지므로 정리해 둠
설정 파일과 별칭에 계정 비밀번호를 적지 않음