데이터베이스 연구실.log

별칭과 환경변수

DBA용 별칭과 .bash_profile, export, source의 적용 범위, ORACLE_SID, NLS_LANG, TNS_ADMIN 설정과 환경 장애 진단, 점검 메뉴 스크립트

aliasexportsource환경변수ORACLE_SIDNLS_LANGTNS_ADMINORA-01034

#핵심 요약

자주 쓰는 이동, 접속 명령은 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용 별칭

파일 (~/.bash_profile 끝에 추가)객체 또는 설정을 변경함
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'
Linux Bash (oracle)현재 세션 설정만 변경함
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의 범위

Linux Bash (oracle)현재 세션 설정만 변경함
ORACLE_SID=<SERVICE_NAME>
env | grep ORACLE_SID
export ORACLE_SID=<SERVICE_NAME>
env | grep ORACLE_SID
파일 (~/a.sh)객체 또는 설정을 변경함
export 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
Linux Bash (oracle)현재 세션 설정만 변경함
./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로 다른 인스턴스에 붙음

#로그인 때 자동 적용

Linux Bash (oracle)객체 또는 설정을 변경함
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)

Linux Bash (oracle, 새 터미널 또는 unset 뒤)조회만 함
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 별칭

Linux Bash (oracle)현재 세션 설정만 변경함
export NLS_LANG=AMERICAN_AMERICA.US7ASCII
sqlplus scott/<PASSWORD>
export NLS_LANG=KOREAN_KOREA.AL32UTF8
lsnrctl status
sqlplus system/<PASSWORD>@<SERVICE_NAME>
파일 ($ORACLE_HOME/network/admin/tnsnames.ora에 추가)객체 또는 설정을 변경함
<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>로 접속함

별칭의 포트는 리스너가 실제로 듣는 포트와 같아야 하며, 실습 리스너는 기본값이 아닌 포트로 바꿔 둔 상태였음

#환경 점검 메뉴 스크립트

파일 (~/check_env.sh)객체 또는 설정을 변경함
#!/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할 때마다 경로가 길어지므로 정리해 둠

설정 파일과 별칭에 계정 비밀번호를 적지 않음

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

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

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