Oracle for UNIX FAQ   : http://www.orafaq.com/faqunix.htm

 

1. 오라클을 꼭 유닉스에서 돌려야 하나?
 ===> 돌려라. Why 가장 믿을 만하니깐,... 라고 이야기 함.

 

2. ORATAB
 ===> oratab 파일은 보통  /etc 나 /var/opt/oracle 에 위치한다. 모든 디비가 등록된다.
  
 database_sid:oracle_home_dir:Y|N

 위의 포맷으로 써지는데, sid, home 은 말그대로구, Y/N 은 부팅시 자동으로 올릴 것인지 말 것인지를 결정한다.
 자동 부팅은 좋은 방법은 아닐지 싶다. 디비가 꺼진다는 것은 심각한 상황이고 왠만하믄 메뉴얼하게 해놓는 것이 나을지 싶다.
 주석처리는 # 으로 한다.

예)
#   $ORACLE_SID:$ORACLE_HOME:[N|Y]
#
ORCL:/u01/app/oracle/product/8.0.5:Y
#

위의 말은 자동 부팅한다는 이야기구, 그럼 자동으로 띄울 수 있는 정보를 유닉스 서버에게 줘야한다.
/etc/rc2.d/S99dbstart 또는 다른 파일에 다음 내용의 파일을 만든다.

su - oracle -c "/path/to/$ORACLE_HOME/bin/dbstart"         # Start DB's
su - oracle -c "/path/to/$ORACLE_HOME/bin/lsnrctl start"   # Start listener
su - oracle -c "/path/tp/$ORACLE_HOME/bin/namesctl start"  # Start OraNames (optional)

유닉스, 리눅스 둘다 비슷할 것으로 생각되는데,...
리눅스 기준으로 이야기 하믄, 처음 부팅시에 /etc/initab 이라는 파일을 읽으면서 부팅이 시작되고, /etc/rc.d 에 있는 내용을 실행시키게 된다. rc.d 에는 rc1.d, rc2.d 와 같은 구성으로 되어 있고, 이중 하나에 파일을 집어 넣는다.

 

3. 설치된 오라클 제품을 어떻게 알아 낼까?
 ===> ora7, 8 
 cd $ORACLE_HOME/orainst
 ./inspdver
 ===> 8i 이상
 cd $ORACLE_HOME/install
 cat unix.rgs

 

4. 테이프로 직접 Export 하려면 어떻게 하는가?
 ===> VOLSIZE= 를 지정해 준다. 단위는 m, k, b , default 는 bytes 이다.
 예) exp userid/password file=/dev/rmt0 table=emp volsize=1.2G
 유닉스에서의 파일시스템은 마운드로 사용된다. 시디롬을 써도 마운트하고, 테이프를 써도 마운트 한다. 테이프가 /dev/rmt0 여기를 차지하고 있는 것이고, 그곳을 지정해주면 알아서 쓴다. 단, 복구 안되니깐, 잘 써야 겠지...

 

5. export 를 하고 싶은데, 내 데이터 베이스에 충분한 공간이 없다. 어떻게 하는 것이 좋을까?

 ===> 돈많으면 사라...

 ===> compress 를 사용한다.

# Make a pipe
mknod expdat.dmp p            # or mkfifo pipe
# Start compress sucking on the pipe in background
compress < expdat.dmp > expdat.dmp.Z &
# Wait a second or two before kicking off the export
sleep 5
# Start the export
exp scott/tiger file=expdat.dmp

 ===> 네트웍..
 
 Host A:
 mknod FIFO.dmp p
 exp u/p FILE=FIFO.dmp 옵션들...

 Host B:
 mknod FIFO2.dmp p
 rsh host1 dd if=FIFO.dmp > FIFO2.dmp &
 imp u/p FILE=FIFO2.dmp 옵션들...


6. 유닉스는 파일이 2기가를 넘지 못한다. 이를 어떻게 해결할 것인가?

 ===> split 명령을 사용하여 파일을 자른다.

 cd /tmp/data
 rm exp.dmp
 mknod exp.dmp p       # mkfifo on certain Unix flavours
 split -b2047m
 exp scott/tiger file=/tmp/data/exp.dmp record=n tables=tableX

 cd /tmp/data
 rm exp.dmp
 mknod exp.dmp p
 cat xaa xab xac xad >/tmp/data/exp.dmp &
 imp scott/tiger file=/tmp/data/exp.dmp commit=y tables=tableX


7. exp/imp 를 빨리 해치우고 싶다면?

 ===> exp/ imp 는 오라클은 프로그램이 오동작으로부터 SGA 를 보호하기 위해 two task mode 로 실행된다. 따라서, 이것을 single 모드로 바꾸면 속도가 향상된다. 당연히 안 권하겠지. 시간이 심각한 문제가 아니라면 그냥 두는게 나을거 같기도 하다.

 cd $ORACLE_HOME/rdbms/lib
        make -f ins_rdbms.mk singletask
        # make -f ins_rdbms.mk expst
        # make -f ins_rdbms.mk impst
        # make -f ins_rdbms.mk sqlldrst
        # mv expst $ORACLE_HOME/bin/
        # mv impst $ORACLE_HOME/bin/
        # mv sqlldrst $ORACLE_HOME/bin/


8. 유닉스 쉘 스크립트를 통해 select 를 하고 싶다.

 ===>
 #!/bin/sh
 VALUE=`sqlplus -silent user/password@instance <
 set pagesize 0 feedback off verify off heading off echo off
 select max(c1) from t1;
 exit;
 END`
 if [ -z "$VALUE" ]; then
   echo "No rows returned from database"
   exit 0
 else
   echo $VALUE
 fi

 ===>

 #!/bin/ksh
 sqlplus -s >junk1 /nolog <
 connect user/password@instance
 column num_rows new_value num_rows format 9999
 select count(*) num_rows
   from table_name;
 exit num_rows
 EOF
 echo "Number of rows are: $?"

 ===>

 sqlplus  -s /nolog |&     # Open a pipe to SQL*Plus
 
 print -p -- 'connect user/password@instance'
 print -p -- 'set feed off pause off pages 0 head off veri off line 500'
 print -p -- 'set term off time off'
 print -p -- "set sqlprompt '"
 
 print -p -- "select sysdate from dual;"
 read  -p SYSDATE
 
 print -p -- "select user from dual;"
 read  -p USER
 
 print -p -- "select global_name from global_name;"
 read  -p GLOBAL_NAME
 
 print -p -- exit
 
 echo SYSDATE:     $SYSDATE
 echo USER:        $USER
 echo GLOBAL_NAME: $GLOBAL_NAME

 

9. 자동 on-line 백업을 합시다. ( online 백업이란 오라클 켜놓고 하는 백업입니당 )

 1) 어떤 tablespace 가 있는지 확인해서
    SELECT TABLESPACE_NAME FROM SYS.DBA_TABLESPACES;
 2) 각 tablespace 를 백업 모드로 만든다.
    ALTER TABLESPACE ... BEGIN BACKUP;
 3) 각 데이터 파일을 알아내고, 각 파일을 pax, tar, ufsdump, dd, cpio  등의 방법으로 카피한다.
    대상이 되는 파일은 데이터 파일, 컨드롤 파일, 로그 파일이다.
   
    SELECT NAME FROM SYS.V_$DATAFILE;
    SELECT NAME FROM SYS.V_$CONTROLFILE;
    SELECT MEMBER FROM SYS.V_$LOGFILE;

    $ find . -depth -print | cpio -ocBv >/dev/tapedevice
    $ dd if=/dev/raw_device of=/dev/tape_device BS=8k
    $ pax -w -f archive.pax *

 4) 각 tablespace 의 백업모드를 해제한다.
    ALTER TABLESPACE ... END BACKUP;


** script : cp 한 경우,


rem -----------------------------------------------------------------------
rem Filename:   backup.sql
rem Purpose:    Generate script to do a simple on-line database backup.
rem Notes:      Adjust the copy_cmnd and copy_dest variables and run from
rem             sqlplus. Uncomment last few lines to do the actual backup.
rem Author:     Frank Naude, Oracle FAQ
rem -----------------------------------------------------------------------

set serveroutput on
set trimspool on
set line 500
set head off
set feed off

spool backup.cmd

declare
  copy_cmnd constant varchar2(30) := 'cp';       -- Use "ocopy" for NT
  copy_dest constant varchar2(30) := '/backup/'; -- C:\BACKUP\ for NT

  dbname  varchar2(30);
  logmode varchar2(30);
begin
  select name, log_mode
  into   dbname, logmode
  from   sys.v_$database;

  if logmode <> 'ARCHIVELOG' then
     raise_application_error(-20000,
                     'ERROR: Database must be in ARCHIVELOG mode!!!');
     return;
  end if;

  dbms_output.put_line('spool backup.'||dbname||'.'||
                       to_char(sysdate, 'ddMonyy')||'.log');

  -- Loop through tablespaces
  for c1 in (select tablespace_name ts
             from   sys.dba_tablespaces)
  loop
    dbms_output.put_line('alter tablespace '||c1.ts||' begin backup;');
    -- Loop through tablespaces' data files
    for c2 in (select file_name fil
               from   sys.dba_data_files
               where  tablespace_name = c1.ts)
    loop
      dbms_output.put_line('!'||copy_cmnd||' '||c2.fil||' '||copy_dest);
    end loop;

    dbms_output.put_line('alter tablespace '||c1.ts||' end backup;');
  end loop;

  -- Backup controlfile and switch logfiles
  dbms_output.put_line('alter database backup controlfile to trace;');
  dbms_output.put_line('alter database backup controlfile to '||''||
                       copy_dest||'control.'||dbname||'.'||
                       to_char(sysdate,'DDMonYYHH24MI')||''||';');
  dbms_output.put_line('alter system switch logfile;');
  dbms_output.put_line('spool off');
end;
/

spool off

set head on
set feed on
set serveroutput off

-- Unremark/uncomment the following line to run the backup script
-- @backup.cmd
-- exit


10. sgadef.dbf 파일은??

 ===> ${ORACLE_HOME}/dbs  에 있는 파일이다. User process 가 DB 에 접속했을때,  Oracle shadow processes 에게 SGA 주소를 알려준다. 당연히, 지우면 데이터베이스가 다운된다.


11. 오라클에 어떤 패치가 되었을까??

 ===>  owhat 을 사용한다.

$ cd $ORACLE_HOME/bin
$ owhat oracle
Oracle patches in /app/oracle/product/7.3.4/bin/oracle:
        sf.c VLFS patch 08/1/96
        sksa.c VLFS patch 08/1/96
        sp.c VLFS patch 08/1/96
        ssf.c VLFS patch 08/1/96


12. 프로세스 모니터링

    truss -rall -wall -p
    truss -p $ lsnrctl dbsnmp_start

    truss 는 sun 머신에서 사용한다. HP-UX : tusc , Linux : strace , SCO Unix : trace

 ===>  시스템 로그를 보려면,
    tail -f /var/adm/SYSLOG
    tail -f /var/adm/messages
    tail -f /var/log/syslog


13. 모든 디비에게 일을 시키는 스크립트.

 ===>  모든 디비는 ORATAB 에 리스트 되어 있으므로, 읽어서 해결한다.

        #!/bin/ksh
        ALL_DATABASES=`cat /etc/oratab|grep -v "^#"|grep -v "N$"|cut -f1 -d: -s`
        for DB in $ALL_DATABASES
        do
           unset  TWO_TASK
           export ORACLE_SID=$DB
           export ORACLE_HOME=`grep "^${DB}:" /etc/oratab|cut -d: -f2 -s`
           export PATH=$ORACLE_HOME/bin:$PATH
           echo "---> Database $ORACLE_SID, using home $ORACLE_HOME"
           sqlplus -s system/${DB}password @<<-EOF
        select * from global_name;
        exit;
        EOF
        done


14. 오라클이 테이블스페이스 삭제시 데이터 파일을 삭제하지 않는 이유는?

 ===>  불편하다고 생각했는데, 읽어보니 당연한 이야기네... 오라클이 실행되는 동안에 오라클 프로세스와 관련있는 파일을 삭제하는 것은 좋지 않다. shutdown 되었을때 삭제된다.

 

15. 환경변수

LD_LIBRARY_PATH  : 라이브러리 파일 있는 곳 예: /usr/lib:/usr/openwin/lib:$ORACLE_HOME/lib:/usr/games/lib 
ORACLE_BASE    : 기본 HOME. 보통 오라클이 설치될때 버전번호 들어가기 전까지의 디렉토리를 의미한다.  즉, 처음 설치한 곳.
ORACLE_HOME      : 사용중인 오라클 HOME
ORACLE_SID       : ORACLE Server system identifier (SID) or instance name. 보통 데이터베이스 이름이 사용되며, 디비를 식별해내는 이름이니깐 상당히 중요하당.
ORACLE_PATH      : 명령어를 실행할때 어디를 가장 먼저 봐야 하는지 설정한다. 보통은 쉘상에서 사용하니깐, ORACLE_PATH 가 안잡혀서 문제라기 보담, PATH 에 오라클 관련 bin path 가 잡히지 않는 것이 문제다.  
ORACLE_TERM      : 문자모드 에서 무엇을 사용하는가?
ORAENV_ASK       : This will not ask for ORACLE_SID, it will take it as it is specified. This variable is normally set to "NO" before oraenv is invoked from a script. 
TNS_ADMIN        : TNSNAMES.ORA, SQLNET.ORA  와 같은 TNS (Transparent Network Substrate) 파일이 어디 있는지. 
ORACLE_TRACE  Trace Oracle's Unix shell scripts as they execute (using set -x). 
TWO_TASK  : 원격머신에 접속하기 위한 방법이다.
      sqlplus scott/tiger@db1  , export TWO_TASK=db1; sqlplus scott/tiger  는 동일한 의미이다.
TMPDIR          : 오라클 사용자가 쓸수 있는 최소 20 메가의 디렉토리 공간을 의미한다. 리눅스에서는 보통 /usr/tmp 를 쓴다.


16. 오라클 프로세스 찾는 요령

ps -ef | grep inherit   : 모든 사용중인 리스너
ps -ef | grep smon   : 모든 사용중인 디비
ipcs | grep oracle  : ipcrm 을 통해 삭제된 Semaphores 와 shared memory segments. 주의!! 
ls -la . | awk '{total += $5}; END {print total}'  : 현재 디렉토리의 파일의 총 사이즈.
ls -laR . | awk '{total += $5}; END {print total/1024/1024 " Meg"}'  : 현재 디렉토리 및 서브까지 포함한 파일 총 사이즈
ls -laR | awk '{print $5 "\t" $9}' | sort -n | tail  : 현재 디렉토리 및 서브에서 가장 큰 파일

+ Recent posts