« Previous : 1 : 2 : 3 : 4 : 5 : ... 10 : Next »




# INSTANCE NAME/ DB NAME을 확인하고 싶은데 권한이 없는 일반 유저가 확인하고 싶을때 가능
 - SYS_CONTEXT 함수는 세션정보를 얻어오는 함수 입니다.
 - USERENV : 현재 세션의 환경정보를 반환는 네임스페이스 입니다.
   SYS_CONTEXT ('namespace', 'parameter')

Oracle Docs : http://docs.oracle.com/cd/E11882_01/olap.112/e23381/row_functions079.htm



-- DB 이름
SELECT SYS_CONTEXT('userenv', 'db_name') db_name FROM DUAL;
DB_NAME
------------
oracle3 

-- Instance 이름
SELECT SYS_CONTEXT('userenv', 'instance_name') instance_name FROM DUAL;
INSTANCE_NAME
------------------
oraSub3 

-- 접속자 IP 주소
SELECT SYS_CONTEXT('USERENV','IP_ADDRESS') "My IP Address"  FROM DUAL; 

-- DBA 여부
SELECT SYS_CONTEXT('USERENV','ISDBA') isdba FROM DUAL;
ISDBA
-------
TRUE 


SELECT SYS_CONTEXT('USERENV','TERMINAL') terminal FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','LANGUAGE') language FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','SESSIONID') sessionid FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','INSTANCE') instance FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','ENTRYID') entryid FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','ISDBA') isdba FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','NLS_TERRITORY') nls_territory FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','NLS_CURRENCY') nls_currency FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','NLS_CALENDAR') nls_calendar FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') nls_date_format FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','NLS_SORT') nls_sort FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','CURRENT_USER') current_user FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','SESSION_USER') session_user FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','SESSION_USERID') session_userid FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','PROXY_USER') proxy_user FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','DB_NAME') db_name FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','HOST') host FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','OS_USER') os_user FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','BG_JOB_ID') bg_job_id FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','FG_JOB_ID') fg_job_id FROM DUAL; 
SELECT SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') FROM DUAL;


12 13, 2011 10:00 12 13, 2011 10:00

Trackback URL : http://develop.sunshiny.co.kr/trackback/681

  1. # 비밀방문자 2012年 01月 11日 09時 52分 Delete Reply

    관리자만 볼 수 있는 댓글입니다.

    1. Re: # sunshiny 2012年 01月 11日 19時 53分 Delete

      답글 주셔서 고맙습니다^^
      소스 복사시에 소스 있는칸에 더블 클릭하시고 Ctrl+c 하면 온전하게 복사가 됩니당^^

Leave a comment


# ASSM(Automatic Segment Space Management)

# 오라클 이전 버전까지는 데이터베이스 관리자가 모든 논리적 저장구조(INITIAL, NEXT, MINEXTENTS, MAXEXTENTS, PCTINCREASE, PCTFREE, PCTUSED, FREELIST, FREELIST GROUP)에 대한 공간관리를 직접 분석,
설계하여 값을 정의하였습니다.
하지만, 오라클 9i 버전부터는 이러한 파라메터 값을 사용자가 직접 정의한다는 것이 쉽지 않기 때문에 오라클 서버가 자동으로 관리할 수 있도록 기능이 추가되었습니다.
이러한 기능은 기본적으로 로컬매니저 테이블스페이스를 통해 구현 가능하며 모든 세그멘트들에 대한 공간관리를 오라클 서버가 수행해 줍니다.

CREATE TABLESPACE [테이블스페이스 명]
DATAFILE '[데이터 파일이 생성될 경로와 파일명]' SIZE [크기]
EXTENT MANAGEMENT LOCAL
UNIFORM SIZE [크기]
SEGMENT SPACE MANAGEMENT AUTO 
;


이 문법은 로컬매니저 관리 테이블스페이스를 생성하는 문법입니다.
마지막 줄에 [SEGMENT SPACE MANAGEMENT AUTO] 절이 세그멘트의 공간관리를 오라클 서버가 자도으로 해주는 옵션 절입니다.
세그멘트의 공간을 자동으로 관리하게 되면 생성 시 PCTUSED, FREELIST, FREELIST GROUP 절은 사용할 수 없습니다.
만약, 테이블스페이스를 생성할 때 이 절이 없으면 이전과 같은 방법으로 빈 공간을 수동 관리하게 됩니다.
다음은 오라클 서버가 빈 공간관리를 어떻게 하는지 자세히 알아봅시다.

1) 먼저, 로컬매니저 관리 테이블스페이스가 세그멘트 자동관리 옵션 절에 의해 생성되어 있습니다.
사용자는 PCTFREE=10 인 EMP 테이블을 생성하였고 해당 블록에는 10%의 공간이 미래에 어떤 행이 변경될 때를 위해 빈 공간으로 설정됩니다.

2) 하나의 블록을 전체 4등분했을 때 현재 데이터가 25~50% 사이만큼 입력되어 있습니다. (이런 상태를 데이터 블록이 FS3 상태라고 합니다.)

3) 새로운 행들이 추가적으로 입력되고 때론 변경되어 해당 블록은 PCTFREE(10%) 공간 만을 남겨 놓은 채 빈 공간이 모두 사용(90%)되었습니다.

4) 다시, 삭제작업으로 인해 블록에서 행들이 삭제되었고 블록은 75% 이상 사용되고 있으며 빈 공간은 75% 이하로 떨어지지 않고 있습니다.
이 블록은 전체 공간을 4등분했을 때 아직 최소공간의(1/4) 빈 공간도 확보하지 못했기 때문에 새로운 입력 작업 시 데이터를 입력하지 못할 것입니다.

5) 이 블록에 새로운 삭제작업이 진행되었고 빈 공간이 75% 이하로 떨어졌기 때문에 새로운 입력 작업 시 데이터를 빈 공간에 다시 입력하게 될 것입니다.

이전 버전에서 사용자가 직접 PCTFREE, PCTUSED, FREELIST 절을 통해 블록의 공간사용을 조절하였던 방법과는 달리 오라클 9i에서는 ASSM 기능을 활성화하게 되면 PCTFREE를 제외한 모든 옵션 절을 사용자가 직접 정의할 수 없으며 모든 세그멘트에 대한 공간 관리는 서버가 자동으로 수행해 줍니다.


09 18, 2011 17:25 09 18, 2011 17:25

Trackback URL : http://develop.sunshiny.co.kr/trackback/663

Leave a comment




# 현재 SYSTEM 테이블 스페이스에 잘못 생성해 둔 테이블이 있는지 확인

SET LINESIZE 500
COL OWNER FORMAT A10
COL SEGMENT_NAME FORMAT A25
COL TABLESPACE_NAME FORMAT A15

SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME  FROM DBA_SEGMENTS  WHERE TABLESPACE_NAME = 'SYSTEM'  AND OWNER = 'SCOTT' ;



DBA_SEGMENTS 자료사전을 통해 개발자가 생성한 일반 테이블 구조가 SYSTEM 테이블 스페이스에 저장되어 있다면 해당 테이블에 대한 SQL문을 실행할 때 좋은 성능을 기대할 수 없습니다.
그렇다면, 이러한 테이블들을 어떻게 사용자의 테이블스페이스로 이동시킬수 있을까요? 다음과 같이 2가지 방법이 있습니다.

1) 오라클 8i 이전 버전에서는 EXPORT/IMPORT 유틸리티로 할 수 있습니다.
- 먼저, EXPORT 유틸리티에서 TABLE 단위의 백업을 합니다.

EXP SYSTEM/MANAGER OWNER=SCOTT FILE=SCOTT.DMP

-- 다음은 해당 사용자를 삭제한 후 DEFAULT TABLESPACE 절에 이동하려는 테이블스페이스를 지정하고 다시 생성합니다.

DROP USER SCOTT CASCADE;

CREATE USER SCOTT1
   IDENTIFIED BY TIGER1
   DEFAULT TABLESPACE EXAMPLE ;

GRANT CONNECT, RESOURCE, IMP_FULL_DATABASE TO SCOTT1 ;

EXIT

IMP SCOTT/TIGER FILE=SCOTT.DMP FULL=Y FROM_USER=SCOTT TO_USER=SCOTT1


2) 다음은 오라클 9i 버전부터 제공되는 기능입니다.
EXPORT, IMPORT 유틸리티를 통해 이동하는 방법은 절차가 복잡할 뿐 아니라 번거러워 효과적으로 작업하기에 어려움이 많았습니다.
오라클 8i 버전부터는 ALTER TABLE 명령어로 특정 테이블 단위로 쉽게 이동할 수 있습니다.
ALTER TABLE BIG_EMP MOVE TABLESPACE UNDOTBS1 ;
ALTER TABLE BIG_DEPT MOVE TABLESPACE UNDOTBS1 ;
ALTER TABLE EMP MOVE TABLESPACE UNDOTBS1 ;


09 18, 2011 16:51 09 18, 2011 16:51

Trackback URL : http://develop.sunshiny.co.kr/trackback/662

Leave a comment


My Oracle Guide
Subject:     Requirements for Installing Oracle 9iR2 on RHEL 4


PURPOSE
-------

Following requirements needs to be met for a successful installation of
the new release 9.2.0.4 (a 3 CD set which includes the base release
and all fixes from prior patchsets including 9.2.0.4) on
Red Hat Enterprise Linux AS/ES 4.0 (RHEL4) on platform Linux x86 .

This list is based upon a "default-RPMs" installation of RHEL AS/ES 4 (base release). Additional RPMs may be needed if a "less-than-default-RPMs" installation of RHEL AS/ES 4 is performed. For additional information on "default-RPMs", please see                                                                                                  , "Defining a "default RPMs" installation of the RHEL OS.

You can download the 9.2.0.4 from following URL.
But you require a valid OTN account for download.
http://www.oracle.com/technology/software/products/oracle9i/index.html

SCOPE & APPLICATION
-------------------

This procedure is meant for Oracle DBA and to person willing to install Oracle
on Redhat 4.0

Requirements for Installing Oracle 9iR2 on RHEL4
------------------------------------------------


1.    Minimum Software Requirement:
        =============================
        * Required OS Components
            - compat-db-4.1.25-9
            - compat-gcc-32-3.2.3-47.3
            - compat-gcc-32-c++-3.2.3-47.3
            - compat-oracle-rhel4-1.0-3
            - compat-libcwait-2.0-1
            - compat-libgcc-296-2.96-132.7.2
            - compat-libstdc++-296-2.96-132.7.2
            - compat-libstdc++-33-3.2.3-47.3
            - gnome-libs-1.4.1.2.90-44
            - gnome-libs-devel-1.4.1.2.90-44
            - libaio-devel-0.3.102-1
            - libaio-0.3.102-1
            - make-3.80-5
            - openmotif21-2.1.30-11
            - xorg-x11-deprecated-libs-devel-6.8.1-23.EL
            - xorg-x11-deprecated-libs-6.8.1-23.EL

The compat-oracle-rhel4-1.0-3 and compat-libcwait-2.0-1 packages are available
from Oracle Metalink Patch 4198954 .
While installing the patch you might receive the warning. It is a normal behaviour.

rpm -ivh compat-libcwait-2.0-2.i386.rpm
Preparing...                ########################################### [100%]
cat: /etc/ld.so.preload: No such file or directory
   1:compat-libcwait        ########################################### [100%]

You can receive following error at the time of linking the binaries if any of the above packages are missed.

/usr/lib/gcc/i386-redhat-linux/3.4.3/libgcc_s.so: undefined reference to `dl_iterate_phdr@GLIBC_2.2.4'
collect2: ld returned 1 exit status


2.    Environment:
        ============
        * The first, critical, environment item is related to the gcc v3.2 and g++ v3.2 RPMs that were
          installed above. Run the following command to check the current gcc version...

            gcc -v

        If the command above returns any gcc version other than 3.2.x, then
        run these commands:

            mv /usr/bin/gcc /usr/bin/gcc.orig
            mv /usr/bin/g++ /usr/bin/g++.orig
            ln -s /usr/bin/i386-redhat-linux-gcc32 /usr/bin/gcc
            ln -s /usr/bin/i386-redhat-linux-g++32 /usr/bin/g++

        If the "mv" (move) command lines above return an error, it only means that your system did not
        have a pre-existing /usr/bin/gcc or /usr/bin/g++ to rename.

        * Required Environment Variable
           - LD_ASSUME_KERNEL=2.4.19
        * Modify your kernel settings in /etc/sysctl.conf (RedHat) as follows:
           kernel.hostname   = yourhost.yourdomain.com  #<--- full qualified hostname !!
           kernel.domainname = yourdomain               #<--- correct domain name !!
           fs.file-max       = 327679
        * Required kernel parameters
           - SEMMNI  100     Defines the maximum number of semaphore sets in the entire system.  
           - SEMMNS  256     Defines the maximum semaphores on the system.
                             This setting is a minimum recommended value, for initial installation only.
                             The SEMMNS parameter should be set to the sum of the PROCESSES parameter
                             for each Oracle database, adding the largest one twice, and then adding
                             an additional 10 for each database.
           - SEMOPM  100     Defines the maximum number of operations for each semop call.  
           - SEMMSL  100     Defines the minimum recommended value, for initial installation only.  
           - SHMMAX          Set this parameter to half the size of physical RAM available on your system.
                             This value cannot exceed 4294967295
           - SHMMNI  100     Defines the maximum number of shared memory segments in the entire system.  
           - SHMALL  2097152 Defines the maximum total shared memory system wide.

        * Hostname command should return the fully qualified hostname as shown
          below:
             % hostname
               hostname.domainname
        * If any Java packages are installed on the system, unset the Java
          environment variables, for example  JAVA_HOME.
        * The oracle account used to install Oracle 9.2.0.1, should not have
          the Oracle install related variables  set by default.
          For example setting ORACLE_HOME, PATH, LD_LIBRARY_PATH to include
          Oracle  binaries in .profile, .login file and /etc/profile.d should
          be completely avoided.


          
3.  Now You are ready to invoke your Oracle Universal Installer.

ADDITIONAL NOTES
----------------
 
   Generic Information
   -------------------

   * After installing 9.2.0.4.0 base. Please apply the 9.2.0.6.0 or above patchset.
     As the certification metric on metalink minimum certified version on RedHat 4 is 9.2.0.6.0

   * After installing the Patch 4198954 . Following errors can be encountered

     During the shutdown of the server
     ---------------------------------
     Unmounting file systems:  umount2: Device or resource busy
     umount: /usr: device is busy
     umount2: Device or resource busy
     umount: /usr: device is busy

     During the startup of the server
     ---------------------------------
     ERROR: ld.so: object '/usr/lib/libcwait.so' from /etc/ld.so.preload cannot be
     preloaded: ignored.
     ERROR: ld.so: object '/usr/lib/libcwait.so' from /etc/ld.so.preload cannot be
     preloaded: ignored.
     Setting clock  (localtime): Mon Jun 13 08:32:36 EEST 2005 ERROR: ld.so:
     object '/usr/lib/libcwait.so' from /etc/ld.so.preload cannot be preloaded:
     ignored.
     [  OK  ]
 
     Above error are only possible if the /usr has seperate mount point.

     Workaround
     ----------
     Move the libcwait.so library from /usr/lib to /lib
     Modify the path in /etc/ld.so.preload.

     % cat /etc/ld.so.preload
       /usr/lib/libcwait.so      ## Change this line to /lib/libcwait.so

    After the changing the file should look like
     % cat /etc/ld.so.preload
       /lib/libcwait.so

     This issue has been fixed
     Please redownload the Patch 4198954 from the metalink site.

    This issues was tracked in
                                                                         Abstract: Patch 4198954 RESULTS IN ERRORS DURING BOOT IF /USR IS OWN FILE SYSTEM


   * To increase the SGA Address space on RedHat
       Article-ID:                                                                                                          
       Title:              Increasing Usable Address Space for Oracle on 32-bit Linux

   * During the linking phase you might recieve the error if you have installed the agent.
     To overcome this problem. Please apply the Patch 3119415.

       /u00/demo/demodb/9.2.0/network/lib/libnmi.a(snmite.o)(.text+0x1427): In
       function `snmitetn_tempName':
       : warning: the use of `tmpnam_r' is dangerous, better use `mkstemp'
       /u00/demo/demodb/9.2.0/network/lib/libnmi.a(nmijs.o)(.text+0x3571): In function
       `nmijsupper':
       : undefined reference to `__ctype_b'
       /u00/demo/demodb/9.2.0/network/lib/libnmi.a(snmifork.o)(.text+0x149): In
       function `snmifon2p_NameToPathname':
       : undefined reference to `__ctype_b'

   * To enable the Direct I/O support. Please read the note.
       Article-ID:                                                                                                          
       Title:              DirectIO on Redhat and SuSe Linux

   9.2.0.6.0 Related Notes
   -----------------------

   * Before installing the 9.2.0.6.0 patchset. You must download the Patch 4188455.
     And the follow instruction from the README.txt of the patch.

      If the above patch is not installed you will receive following errors
       Starting Oracle Universal Installer...
       Checking installer requirements...
       Checking operating system version: must be SuSE-7, redhat-2.1AS, redhat-2.1,
       UnitedLinux-1.0, redhat-3 or SuSE-8
                                      Failed <<<<
       Exiting Oracle Universal Installer, log for this session can be found at
           /opt/oracle/oraInventory/logs/installActions2005-04-07_01-04-18PM.log


   * After installing the 9.2.0.6.0 patchset. You should apply the Patch 4190568.
   
   * For ASYNC-IO support on RHEL 4.0. Patch 3208258 is not required.
     Because this issue has been fixed in Patch 4190568.

   9.2.0.7.0 Related Notes
   -----------------------

   * To enable the ASYNC IO on the 9207. Please apply the Patch 4199559.
   
   * Also install the Patch 4276957


RELATED DOCUMENTS
-----------------

Oracle9i Release Notes
Release 2 (9.2.0.4.0) for Linux x86
Part No. B13670-06
http://download-west.oracle.com/docs/html/B13670_06/toc.htm







# centos 4.4 버전에 존재
http://ftp.linux.co.kr/pub/centos/4.4/os/i386/CentOS/RPMS/

make-3.81-3.el5
compat-db-4.2.52-5.1
compat-db-4.2.52-5.1

compat-gcc-32 패키지가 설치되어 있지 않습니다
compat-gcc-32-c++ 패키지가 설치되어 있지 않습니다
compat-oracle-rhel4 패키지가 설치되어 있지 않습니다

gnome-libs 패키지가 설치되어 있지 않습니다
gnome-libs-devel 패키지가 설치되어 있지 않습니다

xorg-x11-deprecated-libs-devel 패키지가 설치되어 있지 않습니다
xorg-x11-deprecated-libs 패키지가 설치되어 있지 않습니다

compat-libcwait-2.1-1
compat-libgcc-296-2.96-138
compat-libstdc++-296-2.96-138
compat-libstdc++-33-3.2.3-61
compat-libstdc++-33-3.2.3-61
gcc-4.1.2-50.el5
gcc-c++-4.1.2-50.el5
libaio-devel-0.3.106-5
libaio-devel-0.3.106-5
libaio-0.3.106-5
libaio-0.3.106-5
make-3.81-3.el5
openmotif21-2.1.30-11.RHEL4.6


09 1, 2011 18:11 09 1, 2011 18:11

Trackback URL : http://develop.sunshiny.co.kr/trackback/660

Leave a comment

Oracle - 삭제된 데이타 복구하기

Posted 08 4, 2011 17:38, Filed under: DataBase/Oracle


좋은 정보가 있어서 공유합니다.
Oracle 몇 버젼부터 되었는지는 모르겠지만,
Oracle 8i 에서도 되더라구요

------------------------------------------
SQL> Delete from TEST where num = 1;
SQL> Commit;
------------------------------------------

. Oracle에서 데이타 Delete후에 Commit을 때렸는데
10분 정도 지나서 고객이 " 앗 그 데이타 지우면 안됩니다. 복구해주세요~ "
라면 정말 좀 난감하시죠.. 간단히 해결할 수 있습니다.

------------------------------------------
SQL> Select *
From TEST
AS OF timestamp(systimestamp - interval '15' minute )
Where num = 1;
------------------------------------------

이렇게 조회하면 15분 전에 존재했던 데이타가 조회됩니다
간단히 Insert Select로 북귀 하시면 됩니다

------------------------------------------
SQL> Insert into TEST
Select *
From TEST
AS OF timestamp(systimestamp - interval '15' minute )
Where num = 1;
------------------------------------------
당근 Commit은 날려야죠


시간이 얼마까지 작동할지는 확실히는 모르겠고,
대략 2시간 정도까지라고 합니다.


출처: http://math05.egloos.com/2933699


# 시간, 분
as of timestamp(systimestamp-interval '30' minute) -- 30분 이전 데이터를 보여줌.
as of timestamp(systimestamp-interval '5' hour)     -- 5시간 이전 데이터를 보여줌.




08 4, 2011 17:38 08 4, 2011 17:38

Trackback URL : http://develop.sunshiny.co.kr/trackback/650

Leave a comment

Oracle - SQL문으로 oracle alert 로그 확인

Posted 06 21, 2011 11:50, Filed under: DataBase/Oracle


# External Table 테이블을 만들어줌.


DECLARE
 BDumpDir  VARCHAR2(200);
 SID       VARCHAR2(16);
 ObjectExists EXCEPTION;
 PRAGMA EXCEPTION_INIT(ObjectExists,-955);
BEGIN
 -- get the bdump dir
 SELECT value
 INTO BDumpDir
 FROM v$parameter
 WHERE name='background_dump_dest';

 -- create the directory for the bdump dir
 EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY bdump_dir AS '''||
   BDumpDir||'''';

 -- grant the necessary privileges
 EXECUTE IMMEDIATE 'GRANT READ ON DIRECTORY bdump_dir TO system';

 -- get the SID
 SELECT instance_name INTO SID FROM v$instance;

 -- create the external table
 EXECUTE IMMEDIATE 'CREATE TABLE system.ALERT_LOG_EXTERNAL
   (TEXT VARCHAR2(255)
   ) ORGANIZATION EXTERNAL
   (TYPE ORACLE_LOADER
    DEFAULT DIRECTORY BDUMP_DIR
    ACCESS PARAMETERS
    (records delimited by newline
     nobadfile
     nologfile
    )
    LOCATION (''alert_'||SID||'.log'')
   )
   REJECT LIMIT UNLIMITED'
 ;
-- ignore ORA-955 errors (object already exists)
EXCEPTION WHEN ObjectExists THEN NULL;
END;
/

/** 사용 **/
SELECT * FROM system.alert_log_external ;


06 21, 2011 11:50 06 21, 2011 11:50

Trackback URL : http://develop.sunshiny.co.kr/trackback/636

Leave a comment

Oracle - Export, Import

Posted 05 29, 2011 13:32, Filed under: DataBase/Oracle


# Export와 Import 유틸리티는 DB가 Open된 상태에서만 사용 가능합니다.
그리고 export와 import는 OS 기종이나 오라클 버전이 달라도 데이터를 이동시킬수 있기 때문에 이식성이 아주 좋습니다.
단 export와 import는 데이터가 많을 경우 물리적인 백업보다 시간이 많이 걸릴 수 있습니다.
실제로 export의 단점 중 하나가 시간이 많이 소요된다는 것입니다.

##### EXPORT #####
# 우리가 full export를 수행하면 수많은 오브젝트를 export 하게 되는데 아래의 순서로 해당 object를 export 합니다.
1. Tablespaces
2. Profiles
3. Users
4. Roles
5. System Privilege Grants
6. Role Grants
7. Default Roles
8. Tablespace Quotas
9. Resource Costs
10. Rollback Segments
11. Database Links
12. Sequences (includes Grants)
13. Snapshots (includes grants, auiting)
14. Snapshot logs
15. Job Queues
16. Refresh Groups
17. Cluster Definitions
18. Tables(includes grants, column grants, comments, indexes, constraints, auditing)
19. Referential Integrity
20. POSTTABLES actions
21. Synonyms
22. Views
23. Stored Procedures
24. Triggers
25. Default and System Auditing

# Conventional Path export 와 Direct Path export
- Exports는 conventional path export와 direct path export로 구분되며 기본값은 conventional Path export입니다.

- 위 그림에서 알 수 있듯이 conventional path export 는 export 명령어가 수행되면 Export client가 메모리에 evaluation buffer라는 곳을 만들고 DB buffer cache 에 있는 데이터를 evaluation buffer로 가졍ㄴ 후 이곳이 ㄷ 차면 다시 디스크에 파일로 저장합니다.
이렇게 하는 이유는 direct path load는 원본 테이블에 여러 process가 동시에 접근을 못하는 단점이 있는데 conventional path load는 그 부부늘 해결할 수 있습니다.
그 외에도 동시성 문제 등에서 direct path가 문제가 있어서 오라클은 기본적으로 여러 사람이 동시에 사용하는 DB이기 때문에 conventional path 모드로 작동하게 되어 있습니다.
그러나 conventional path는 direct path에 비해 과정이 다소 복잡하기 때문에 속도가 저하 됩니다.

1. conventional Path로 Full export 받기(기본모드)
# time exp system/admin full=y log=/export/home/oracle/data/backup/dmp/full_log.log file=/export/home/oracle/data/backup/dmp/full_test01.dmp

2. Direct Path로 Database Full export 받기
# time exp system/admin full=y log=/export/home/oracle/data/backup/dmp/full_log.log file=/export/home/oracle/data/backup/dmp/full_test02.dmp direct=y

3. export를 저장하는 백업파일을 분할해서 받기
- Export를 수행하다 보면 백업파일 하나가 너무 크게 받아져서 후속 작업이 어려운 경우가 종종 있습니다.
여기서는 큰 파일 하나를 여러 개의 작은 파일로 분할해서 받도록 합니다.
# time exp system/admin full=y
        file=(/export/home/oracle/data/backup/dmp/full_test03_1.dmp ,\
              /export/home/oracle/data/backup/dmp/full_test03_2.dmp ,\
              /export/home/oracle/data/backup/dmp/full_test03_3.dmp ,\
              /export/home/oracle/data/backup/dmp/full_test03_4.dmp )\
              filesize=100M direct=y

4. 특정 테이블 스페이스만 받기
# time exp system/admin file=/export/home/oracle/data/backup/dmp/full_test04.dmp tablespaces=(scott_data, undotbs1);

5. 특정 사용자 백업 받기(여러 사용자를 동시에 백업)
# time exp system/admin file=/export/home/oracle/data/backup/dmp/scott_hr.dmp owner=(scott,sms);

6. evaluation Buffer 값을 조정하면서 특정 테이블만 export 수행
1) evaluation Buffer 값을 설정하지 않고 export 수행
# time exp scott/tiger file=/export/home/oracle/data/backup/dmp/scott_01.dmp tables=test;

2) evaluation Buffer 값을 1M로 설정 후 export 수행
# time exp scott/tiger file=/export/home/oracle/data/backup/dmp/scott_01.dmp tables=test buffer=1024000;

7. parameter file을 이용한 export 수행
# vi par_full.dat
file=/export/home/oracle/data/backup/dmp/scott_par.dmp
full=y
direct=y

# exp system/admin parfile=par_full.bat

8. 특정 조건만 export 받기 - query 옵션 사용하기(8i부터 사용 가능)
- emp 테이블에서 첫글자가 F인 사람만 export 받기
(OS에서 사용하는 ', ", < 등의 문자를 쓸 경우 \(escape 문자)를 꼭 써줘야 합니다.)

# exp scott/tiger query=\"where ename like \'F%\'\" tables=emp file=/export/home/oracle/data/backup/dmp/scott_emp.dmp

- parameter file에서 query 옵션을 사용하기 - escape 문자 안 써도 됨

# vi par_q.dat
table=emp query="where job='CLERK' and sal > 1000"
:wq!

# exp scott/tiger parfile=par_q.dat


## 일반 사용자 scott 가 어떤 롤을 가지고 있는지 확인
SQL> SELECT * 
  2     FROM DBA_ROLE_PRIVS 
  3     WHERE GRANTEE='SCOTT';

GRANTEE                        GRANTED_ROLE                   ADM DEF
------------------------------ ------------------------------ --- ---
SCOTT                          RESOURCE                       NO  YES
SCOTT                          DBA                            NO  YES
SCOTT                          TROLE                          NO  YES
SCOTT                          CONNECT                        NO  YES

SQL> GRANT EXP_FULL_DATABASE TO SCOTT;
SQL> SELECT *
  2  FROM DBA_ROLE_PRIVS
  3  WHERE GRANTEE='SCOTT';

GRANTEE                        GRANTED_ROLE                   ADM DEF
------------------------------ ------------------------------ --- ---
SCOTT                          RESOURCE                       NO  YES
SCOTT                          DBA                            NO  YES
SCOTT                          TROLE                          NO  YES
SCOTT                          EXP_FULL_DATABASE              NO  YES
SCOTT                          CONNECT                        NO  YES


##### IMPORT #####
- Import는 export를 수행해서 만든 파일을 다시 데이터베이스로 넣는 작업을 수행합니다.
그래서 export와 거의 옵션이 비슷합니다.
- import 수행
Import 작업은 DDL과 DML을 수행하는 것이므로 Redo log와 undo segment를 사용하게 됩니다.
따라서 대량의 데이터를 import 할 때는 반드신 큰 undo tablespace를 준비해서 작업하여야 합니다.
만약 undo tablespace의 용량이 부족할 경우에는 마지막에 에러가 나면서 전부 rollback 될 수도 있습니다.
이런 위험을 줄이려면 import 할 때 commit=y로 변경하고 import를 수행하면 array 단위로 commit을 수행하기 때문에 전체가 rollback되는 현상을 막을 수 있습니다.
또한 DBA로 export를 받은 파일은 반드시 DBA로 import 해야 합니다.

- 특정 사용자의 데이터만 import 수행
# imp system/admin file=/export/home/oracle/data/backup/dmp/scott.dmp fromuser=scott tables=emp ignore=y

- scott 사용자의 test02 테이블을 hr 사용자 소유로 변경하기
* 테스트 테이블 생성
SQL> create table test02(no number, addr varchar2(10));

Table created.

SQL> 
SQL> begin
  2  for i in 1..1000 loop
  3     insert into test02 values(i, dbms_random.string('A', 10));
  4  end loop;
  5  commit;
  6  end;
  7  /

PL/SQL procedure successfully completed.

SQL> select count(*) from test02;

  COUNT(*)
----------
      1000

SQL> 

exp scott/tiger file=/export/home/oracle/data/backup/dmp/scott_test02.dmp tables=test02

imp system/oracle file=/export/home/oracle/data/backup/dmp/scott_test02.dmp fromuser=scott touser=hr ignore=y


- 실제 데이터는 import 하지 않고 DDL 문장만 추출하기
두 가지 방법이 있는데 한 가지는 show=y 옵션을 사용하는 것이고, 한가지는 indexfile 옵션을 사용하는 방법입니다.
import 옵션 중에 show=y 라고 주면 export 파일의 모든 내용들이 보여지는데 log 옵션을 주면 그 내용들이 전부 로그 파일에 저장됩니다.
그 후에 그 로그 파일을 편집하면 됩니다.

# imp system/admin file=/export/home/oracle/data/backup/dmp/scott_test02.dmp full=y show=y log=/export/home/oracle/data/backup/dmp/scott_test02.log

- import 할 때 테이블과 index를 분리해 내기
오라클 권장 사항은 테이블과 인덱스는 서로 다른 테이블 스페이스에 저장해야 성는이 좋아집니다.
그런데 그렇지 못한 경우가 많아서 export 후 import 할 때 같은 테이블 스페이스에 있던 테이블과 인덱스를 다른 테이블 스페이스로 분리하려고 합니다.
만약 인덱스 생성 스크립트가 있다면 import 할 때 indexes=n 옵션으로 import를 해서 import한 후 나중에 인덱스 스크리브를 수정해서 생성될 테이블 스페이스로 변경하고 실행하면 인덱스가 간단히 분리될 수 있습니다.

그러나 인덱스 생성 스크립트가 없다면 좀 더 복잡해집니다.
이럴 경우는 import 옵션 중에 indexfile이라는 옵션을 사용하면 인덱스 생성 스크립트를 만들어 줍니다.
이 스크립트에는 테이블 생성 스크립트까지 포함되어 있습니다.
아래 스크립트에서 테이블 생성하는 부분의 REM은 주석이란 뜻이며 필요하면 REM을 삭제한 후 사용하면 됩니다.
SQL> create index idx_test02_addr on test02(addr);

Index created.

SQL> 

# exp scott/tiger file=/export/home/oracle/data/backup/dmp/scott_test02_idx.dmp tables=test02

# imp scott/tiger file=/export/home/oracle/data/backup/dmp/scott_test02_idx.dmp indexfile=/export/home/oracle/data/backup/dmp/scott_test02_idx.sql full=y
# cat scott_test02_idx.sql
REM  CREATE TABLE "SCOTT"."TEST02" ("NO" NUMBER, "ADDR" VARCHAR2(10)) 
REM  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 
REM  FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE 
REM  "SCOTT_DATA" LOGGING NOCOMPRESS ;
REM  ... 1000 rows
CONNECT SCOTT;
CREATE INDEX "SCOTT"."IDX_TEST02_ADDR" ON "TEST02" ("ADDR" ) PCTFREE 10 
INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 
1 BUFFER_POOL DEFAULT) TABLESPACE "SCOTT_DATA" LOGGING ;
-- 위 내용에서 원하는 테이블 스페이스로 수정해서 실행하면 됩니다.

# export와 import에 대한 일반적인 굼금증들
Q1) Export 시 화면에 내용이 안 나오게 하는 방법 -- 여기서는 RedHat Linux를 기준으로 함
A1) exp scott/tiger file=/export/home/oracle/data/backup/dmp/scott_test02_idx.dmp tables=test02 > /dev/null 2>&1
-- CShell :         exp ...... > &/dev/null
-- Ksh, Bsh, Bash : exp ..... >/dev/null > 2>&1

Q2) export 시 Buffer와 Recordlength의 차이는 무엇?
A2) export 시 Conventional Path를 이용할 경우 (기본값) 메모리에 evaluation Buffer를 생성하고 DB Buffer Cache에 있는 내용을 evaluation buffer로 가져온 후 다른 부가 작업을 해서 OS 파일로 저장을 하게 됩니다.
여기서 Buffer라 evaluation Buffer크기를 결정하는 파라미터이고 recordlength는 buffer의 내용을 OS 파일로 내려쓸 때 사용하는 레코드의 크기를 결정하는 파라미터 입니다.
이 두가지 파라미터의 크기는 OS 블록의 배수로 설정하시는 것이 좋습니다.
그리고 DB bufer cache의 내용을 evaluation bufferㄹ 가져올 때 한 건씩 가져오는 것이 아니라 여러 건의 데이터를 한꺼번에 가져오게 되는데 그것을 Array fetch라고 합니다.

Q3) 큰 데이터를 export 또는 import 할 때 화면이 정지된 것 같이 보이는데 입력되고 있는지 아닌지 알 수 있는 방법
A3) export / import 옵션중에 feedback이라는 옵션이 있습니다.
feedback=정수값 이렇게 사용하며 진행되는 과정을 눈에 보여줍니다.

Q4) export 할 때 한 건씩이 아니라 Array fetch로 추출된다고 하는데 한 번에 몇 개의 Row 가 추출되나요?
A4) 이 값은 Bufer(evaluation buffer) 크기와 관련이 있습니다.
하나의 Row가 export 시 차지하는 양은 각 column 크기의 합 + 4 X (column 개수)로 구해집니다.
이 자료를 기준으로 해서 한 번 Fetch될 때 Row 수는 Buffer size / 1 row size 입니다.
이를 이용하면 export 된 파일의 총 크기는 1row size X row 수 입니다.

Q5) import 를 수행하다 보면 가끔 core dump/segmentation fault가 발생합니다.
원인은 무엇이며 해결은 어떻게 하나요?
A5) 오라클은 데이터를 저장하기 때문에 character set 이라는 것이 있습니다
국내는 주로 US7ASCII 또는 KO16KSC5601, KO16MSWIN949를 사용하는 데 export 받은 DB와 import 하는 DB의 캐릭터 셋이 다를 경우 위와 같은 에러가 발생합니다.
해결방법은 캐릭터 셋을 일치시킨 후 export를 받는게 정석이지만 이미 받아버린 덤프파일이라면 convert 프로그램을 이용하여 import 하는 곳의 캐릭터 셋과 동일하게 변경한 후 import를 수행하면 됩니다.
참고) 오라클 캐릭터 셋 종류
한글을 지원하는 캐릭터 셋은 아래와 같이 4가지가 있습니다. 각각의 특생이 다르므로 잘 확인하고 사용해야 합니다.
1. KO16KSC5601 : 완성형 한글. 한글 2350 글자, 한자: 4888 글자, 히라카나, 카티카나, 영문, 특수기호
2. KO16MSWIN949 : 확장완성형. 위 1번을 모두 포함하고 8822 글자 추가됨.
3. UTF8 / AL32UTF8 : 가변길이 한글. 현대 한글 11172 글자 표현 가능함.

Q6) Array Fetch란 무엇인가요?
A6) export는 select 문장을 만들어서 DB Buffer Cache에 있는데이터를 evaluation buffer로 가져옵니다.
만약 한 번에 한 문장씩 가져와서 파일로 내려쓴다면 시간이 너무 오래 걸리고 파일에 I/O하는 회수도 아주 많아 질 것입니다.
그래서 export는 evaluation Buffer에 일정량의 데이터가 쌓이게 되면 한꺼번에 파일에 내려씁니다.
즉 만약 10개의 row를 파일에 export 해야 한다면 1번에 1개씩 하면 10번 I/O가 발생하지만 10개를 한 번에 내려쓴다면 I/O는 한 번만 일어나면 되겠죠.
이렇게 해서 I/O를 줄여서 속도를 높이는 방법이 array fetch라는 기법입니다.

Q7) import 시에 array insert는 무엇인가요?
A7) export와 마찬가지로 import 시에도 한번에 1row씩 insert를 하게 되면 너무 비효율적입니다.
그래서 import할 때도 여러 건의 데이터를 한꺼번에 insert 하게 되는데 이것이 array insert 입니다.

Q8) import 시에 "ABNORMAL END OF FILE" 라는 에러 메시지는 어떤 의미인가요?
A8) 이 에러는 export 받은 파일에 문제가 있음을 의미합니다. 다시 export 받아야 합니다.

Q9) sys 소유자의 객체는 왜 export가 안되나요?
A9) sys 계정은 dictionary 객체들을 소유하고 있습니다.
새로운 데이터베이스는 이미 고유의 딕셔너리를 가지고 있을 것입니다.
Sys 계정은 DB를 관리하는 계정으로 sys 계정의 객체를 export 하고 import 한다는 것은 아주 큰 위험 부담이 있고 부하도 많이 걸리는 작업이라 sys 계정은 export를 수행할 수 없도록 되어 있습니다.
또 개인적인 업무를 하기 위해 sys 계정으로 접속하는 것은 권장사항이 아니므로 주의하여야 합니다.

Q10) A 사용자 소유의 테이블에 B 사용자가 인덱스를 만들었다면 A 사용자가 export 받을 때 B 사용자의 인덱스도 함께 export 받을 수 있나요?
A10) A 사용자 계정으로 export 를 수행하면 받을 수 없으나 DBA 권한으로 받으면 가능합니다.

Q11) offline 상태의 테이블 스페이스도 export 받을 수 있나요?
A11) 에러 납니다.


자료 출처 : 서진수 지음 - 원리부터 실무까지 오라클 백업과 복구

05 29, 2011 13:32 05 29, 2011 13:32

Trackback URL : http://develop.sunshiny.co.kr/trackback/627

Leave a comment

Oracle - Control File 파일 장애 복구

Posted 05 15, 2011 20:15, Filed under: DataBase/Oracle



# Control File 장애 복구

ORACLE instance started.

Total System Global Area  369098752 bytes
Fixed Size                  1280276 bytes
Variable Size              92276460 bytes
Database Buffers          272629760 bytes
Redo Buffers                2912256 bytes
Database mounted.
Database open

SQL>startup -> parameter file (no mount) -> control file (mount) -> data/redo log file (open)
- 위에서 본 것처럼 startup 명령어를 치면 parameter file을 읽어서 instance를 생성하고 그 후에 control file의 위치를 확인해서 메모리로 불러들이게 됩니다.
이 순서를 기억하면서 아래에 contron file 관련 장애를 자세하게 살펴보겠습니다.

1. control file 장애 1 - 경로가 틀린 경우
- contron file 의 위치는 parameter file에 있는데 parameter file에 있는 control file의 위치와 실제 control file의 위치가 다를 경우입니다.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL>!
-bash-3.00$ cat /app/oracle/oraapp/product/10.2.0/dbs/inittestdb.ora
-bash-3.00$ rm -f /app/oracle/oradata/oracle10/control03.ctl
-bash-3.00$ ls /app/oracle/oradata/oracle10/control03.ctl
                control03.ctl: No such file or directory
-bash-3.00$ exit

SQL>
SQL> startup
ORACLE instance started.

Total System Global Area  369098752 bytes
Fixed Size                  1280276 bytes
Variable Size              92276460 bytes
Database Buffers          272629760 bytes
Redo Buffers                2912256 bytes
ORA-00205: error in identifying control file, check alert log for more info -- 에러 발생

-- Alert_testdb.log 파일을 확인
Sun May 15 16:32:04 2011
starting up 1 dispatcher(s) for network address '(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))'...
MMNL started with pid=12, OS id=998
Sun May 15 16:32:04 2011
starting up 1 shared server(s) ...
Sun May 15 16:32:05 2011
ALTER DATABASE   MOUNT
Sun May 15 16:32:05 2011
ORA-00202: Message 202 not found; No message file for product=RDBMS, facility=ORA; arguments: [/app/oracle/oradata/oracle10/control03.ctl]
ORA-27037: Message 27037 not found; No message file for product=RDBMS, facility=ORA
Intel SVR4 UNIX Error: 2: No such file or directory
Additional information: 3
Sun May 15 16:32:08 2011
ORA-205 signalled during: ALTER DATABASE   MOUNT...

-- 이런 장애가 생긴 이유는 parameter file 에는 control03.ctl이 있다고 적어두고 실제 파일은 없어서 그런 것입니다.
-- Database를 startup하게 되면 서버 프로세스가 지정된 경로에서 파라미터 파일을 찾아서 읽고 인스턴스 생성 등의 작업을 한 후 parameter file에 적혀 있는 경로대로 control file을 찾으러 가게 됩니다.
지금 발생한 에러는 parameter file에 있는 경로 모두에 control file 이 있어야 하는 데 control03.ctl 파일이 없기 때문에 발생한 것입니다.
해결 방법은 parameter file의 내용을 수정하든지 control03.ctl을 만들어주던지 하면 됩니다.
여기선 control03.ctl을 만들도록 합니다.
SQL> select status from v$instance;

STATUS
------------
STARTED

SQL> !cp /app/oracle/oradata/oracle10/control01.ctl /app/oracle/oradata/oracle10/control03.ctl

SQL> alter database mount;

Database altered.

SQL> alter database open;

Database altered.

2. control file 장애 2 - Version 에러 복구하기
- 모든 컨트롤 파일끼리는 정보가 동일해야 합니다. 두 번째 장애는 컨트롤 파일끼리 정보가 달라서 발생하는 version error를 봅니다.

# 현재 상태 확인
SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/app/oracle/oradata/oracle10/control01.ctl
/app/oracle/oradata/oracle10/control02.ctl
/app/oracle/oradata/oracle10/control03.ctl

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> !
bash-3.00$ vi /app/oracle/oraapp/product/10.2.0/dbs/initora10g.ora
...
...
###########################################
# File Configuration
###########################################
control_files=("/app/oracle/oradata/oracle10/control01.ctl"
                , "/app/oracle/oradata/oracle10/control02.ctl")
        #       , "/app/oracle/oradata/oracle10/control03.ctl") -- 사용 못하게 주석처리


-- 즉 control03.ctl 은 사용 못하게 설정을 변경.

SQL> startup
ORACLE instance started.

Total System Global Area  369098752 bytes
Fixed Size                  1280276 bytes
Variable Size             113247980 bytes
Database Buffers          251658240 bytes
Redo Buffers                2912256 bytes
Database mounted.
Database opened.
SQL>
SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/app/oracle/oradata/oracle10/control01.ctl
/app/oracle/oradata/oracle10/control02.ctl

SQL> alter system checkpoint;

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> !
bash-3.00$ pwd
/export/home/oracle
bash-3.00$ vi $ORACLE_HOME/dbs/initora10g.ora

###########################################
# File Configuration
###########################################
control_files=("/app/oracle/oradata/oracle10/control01.ctl"
                , "/app/oracle/oradata/oracle10/control02.ctl"
                , "/app/oracle/oradata/oracle10/control03.ctl")

"/app/oracle/oraapp/product/10.2.0/dbs/initora10g.ora" 87 lines, 2650 characters
bash-3.00$
bash-3.00$ exit

SQL> startup
ORACLE instance started.

Total System Global Area  369098752 bytes
Fixed Size                  1280276 bytes
Variable Size             113247980 bytes
Database Buffers          251658240 bytes
Redo Buffers                2912256 bytes
ORA-00214: control file '/app/oracle/oradata/oracle10/control01.ctl' version 1203
inconsistent with file '/app/oracle/oradata/oracle10/control03.ctl'  version 1188

-- 위의 에러를 보면 control01.ctl은 버전이 1203인데 control03.ctl은 버전이 1188이라는 에러를 보이고 있습니다.
즉 컨트롤 파일끼리 정보가 달라서 생기는 에러인 것입니다.
이 숫자는 실습할 때 본문과 다르게 나올 수 있습니다.
해결방법은 일반적으로 번호가 큰 파일이 최신이기 때문에 번호가 큰 파일을 작은 파일에 덮어씌면 됩니다.
SQL> !cp /app/oracle/oradata/oracle10/control01.ctl /app/oracle/oradata/oracle10/control03.ctl

SQL> aleter database mount;
SP2-0734: unknown command beginning "aleter dat..." - rest of line ignored.
SQL> alter database mount;

Database altered.

SQL> alter database open;

Database altered.

SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/app/oracle/oradata/oracle10/control01.ctl
/app/oracle/oradata/oracle10/control02.ctl
/app/oracle/oradata/oracle10/control03.ctl



# control file 장애 3(old control file / control file 재생성하기)
-- 현재 상태 확인

SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/app/oracle/oradata/oracle10/control01.ctl
/app/oracle/oradata/oracle10/control02.ctl
/app/oracle/oradata/oracle10/control03.ctl

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> !
bash-3.00$ vi $ORACLE_HOME/dbs/initora10g.ora

###########################################
# File Configuration
###########################################
control_files=("/app/oracle/oradata/oracle10/control01.ctl"
                , "/app/oracle/oradata/oracle10/control02.ctl")
#               , "/app/oracle/oradata/oracle10/control03.ctl")

bash-3.00$ exit
exit

SQL> startup
ORACLE instance started.

Total System Global Area  369098752 bytes
Fixed Size                  1280276 bytes
Variable Size             113247980 bytes
Database Buffers          251658240 bytes
Redo Buffers                2912256 bytes
Database mounted.
Database opened.
SQL>
SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/app/oracle/oradata/oracle10/control01.ctl
/app/oracle/oradata/oracle10/control02.ctl

SQL> alter system checkpoint;

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> !
bash-3.00$ vi $ORACLE_HOME/dbs/initora10g.ora

###########################################
# File Configuration
###########################################
control_files=("/app/oracle/oradata/oracle10/control01.ctl"
                , "/app/oracle/oradata/oracle10/control02.ctl"
                , "/app/oracle/oradata/oracle10/control03.ctl")

bash-3.00$ exit

SQL> startup
ORACLE instance started.

Total System Global Area  369098752 bytes
Fixed Size                  1280276 bytes
Variable Size             113247980 bytes
Database Buffers          251658240 bytes
Redo Buffers                2912256 bytes
ORA-00214: control file '/app/oracle/oradata/oracle10/control01.ctl' version
1231 inconsistent with file '/app/oracle/oradata/oracle10/control03.ctl'
version 1214


SQL> !cp /app/oracle/oradata/oracle10/control03.ctl /app/oracle/oradata/oracle10/control01.ctl

SQL> alter database mount;
alter database mount
*
ERROR at line 1:
ORA-00214: control file '/app/oracle/oradata/oracle10/control02.ctl' version
1231 inconsistent with file '/app/oracle/oradata/oracle10/control01.ctl'
version 1214


SQL> !cp /app/oracle/oradata/oracle10/control01.ctl /app/oracle/oradata/oracle10/control02.ctl

SQL> alter database mount;

Database altered.

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01122: database file 1 failed verification check
ORA-01110: data file 1: '/app/oracle/oradata/oracle10/system01.dbf'
ORA-01207: file is more recent than control file - old control file

 이 에러의 원인은 control file의 체크포인트 정보가 데이터 파일의 체크포인트 정보보다 예전 내용이기 때문입니다.
이 문제를 해결하는 방법은 2가지가 있는데 한가지는 using backup controlfile 옵션으로 recovery 하는 것이고 그 방법이 불가할 경우 부득이하게 control file을 재생성해야 합니다.
정리를 하면 old control file 장애 해결방법은 아래의 두 가지 case 로 구분됩니다.

Case 1. Redo log와 archive log, data file 백업 있을 경우 복구하기 - using bckup control file
Case 2. Redo log와 archive log, data file 백업 없을 경우 복구하기 - 재생성하기


Case 1. Redo log와 archive log, data file 백업 있을 경우 복구하기


1. 전체 백업 수행합니다.
SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/app/oracle/oradata/oracle10/system01.dbf
/app/oracle/oradata/oracle10/undotbs01.dbf
/app/oracle/oradata/oracle10/sysaux01.dbf
/app/oracle/oradata/oracle10/SCOTT_DATA.dbf
/app/oracle/oradata/oracle10/users01.dbf
/app/oracle/oradata/oracle10/TS_SMS01.dbf
/app/oracle/oradata/oracle10/test01.dbf

7 rows selected.

SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/app/oracle/oradata/oracle10/control01.ctl
/app/oracle/oradata/oracle10/control02.ctl
/app/oracle/oradata/oracle10/control03.ctl

SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/app/oracle/oradata/oracle10/redo01.log
/app/oracle/oradata/oracle10/redo02.log
/app/oracle/oradata/oracle10/redo03.log

SQL> shutdown immediate
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.

bash-3.00$ cp /app/oracle/oradata/oracle10/* data/backup/close/
bash-3.00$

2. 장애를 발생시킴
-bash-3.00$ vi /app/oracle/oraapp/product/10.2.0/dbs/initora10g.ora

###########################################
# File Configuration
###########################################
control_files=("/app/oracle/oradata/oracle10/control01.ctl"
                , "/app/oracle/oradata/oracle10/control02.ctl")
#               , "/app/oracle/oradata/oracle10/control03.ctl")

SQL> alter system checkpoint;

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /

System altered.

bash-3.00$ vi $ORACLE_HOME/dbs/initora10g.ora

###########################################
# File Configuration
###########################################
control_files=("/app/oracle/oradata/oracle10/control01.ctl"
                , "/app/oracle/oradata/oracle10/control02.ctl"
                , "/app/oracle/oradata/oracle10/control03.ctl")


SQL> startup
ORACLE instance started.

Total System Global Area  369098752 bytes
Fixed Size                  1280276 bytes
Variable Size             113247980 bytes
Database Buffers          251658240 bytes
Redo Buffers                2912256 bytes
ORA-00214: control file '/app/oracle/oradata/oracle10/control01.ctl' version
1218 inconsistent with file '/app/oracle/oradata/oracle10/control03.ctl'
version 1216


SQL> !cp /app/oracle/oradata/oracle10/control03.ctl /app/oracle/oradata/oracle10/control01.ctl

SQL> alter database mount;
alter database mount
*
ERROR at line 1:
ORA-00214: control file '/app/oracle/oradata/oracle10/control02.ctl' version
1218 inconsistent with file '/app/oracle/oradata/oracle10/control01.ctl'
version 1216


SQL> !cp /app/oracle/oradata/oracle10/control01.ctl /app/oracle/oradata/oracle10/control02.ctl

SQL> alter database mount;

Database altered.

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01122: database file 1 failed verification check
ORA-01110: data file 1: '/app/oracle/oradata/oracle10/system01.dbf'
ORA-01207: file is more recent than control file - old control file

3. 백업 데이터 파일 복원 후 복구 시작

SQL> shutdown immediate
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.
SQL> !pwd
/export/home/oracle

SQL> !cp /export/home/oracle/data/backup/close/*.dbf /app/oracle/oradata/oracle10/

SQL> startup mount
ORACLE instance started.

Total System Global Area  369098752 bytes
Fixed Size                  1280276 bytes
Variable Size             113247980 bytes
Database Buffers          251658240 bytes
Redo Buffers                2912256 bytes
Database mounted.

SQL> recover database until cancel using backup controlfile;
ORA-00279: change 627967 generated at 05/15/2011 18:04:36 needed for thread 1
ORA-00289: suggestion :
/app/oracle/flash_recovery_area/ORACLE10/archivelog/2011_05_15/o1_mf_1_36_%u_.ar
c
ORA-00280: change 627967 for thread 1 is in sequence #36


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: cannot open archived log
'/app/oracle/flash_recovery_area/ORACLE10/archivelog/2011_05_15/o1_mf_1_36_%u_.a
rc'
ORA-27037: unable to obtain file status
Intel SVR4 UNIX Error: 2: No such file or directory
Additional information: 3


ORA-00308: cannot open archived log
'/app/oracle/flash_recovery_area/ORACLE10/archivelog/2011_05_15/o1_mf_1_36_%u_.a
rc'
ORA-27037: unable to obtain file status
Intel SVR4 UNIX Error: 2: No such file or directory
Additional information: 3


ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: '/app/oracle/oradata/oracle10/system01.dbf'


SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: '/app/oracle/oradata/oracle10/system01.dbf'


SQL>


-- # 오류 발생
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: '/app/oracle/oradata/oracle10/system01.dbf'


- hidden parameter 적용
$ORACLE_HOME/dbs/initora10g.ora 파일에 아래를 추가

###########################################
# Controlfile Recreate
###########################################


_offline_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3 $,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)
_corrupted_rollback_segments=true
"/app/oracle/oraapp/product/10.2.0/dbs/initora10g.ora" 98 lines, 2965 characters
bash-3.00$ exit

SQL> alter database backup controlfile to trace;

Database altered.

SQL> show parameter user_dump_dest

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest                       string      /app/oracle/admin/oracle10/udu
                                                 mp

SQL> recover database until cancel using backup controlfile;
ORA-00279: change 627967 generated at 05/15/2011 18:04:36 needed for thread 1
ORA-00289: suggestion :
/app/oracle/flash_recovery_area/ORACLE10/archivelog/2011_05_15/o1_mf_1_36_%u_.ar
c
ORA-00280: change 627967 for thread 1 is in sequence #36


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
*
ORA-00308: cannot open archived log '*'
ORA-27037: unable to obtain file status
Intel SVR4 UNIX Error: 2: No such file or directory
Additional information: 3


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: cannot open archived log
'/app/oracle/flash_recovery_area/ORACLE10/archivelog/2011_05_15/o1_mf_1_36_%u_.a
rc'
ORA-27037: unable to obtain file status
Intel SVR4 UNIX Error: 2: No such file or directory
Additional information: 3


ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: '/app/oracle/oradata/oracle10/system01.dbf'


SQL> alter database open resetlogs;

Database altered.

SQL>
SQL> alter database open
  2  ;
alter database open
*
ERROR at line 1:
ORA-01531: a database already open by the instance


SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  369098752 bytes
Fixed Size                  1280276 bytes
Variable Size             113247980 bytes
Database Buffers          251658240 bytes
Redo Buffers                2912256 bytes
Database mounted.
Database opened.

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/app/oracle/oradata/oracle10/system01.dbf
/app/oracle/oradata/oracle10/undotbs01.dbf
/app/oracle/oradata/oracle10/sysaux01.dbf
/app/oracle/oradata/oracle10/SCOTT_DATA.dbf
/app/oracle/oradata/oracle10/users01.dbf
/app/oracle/oradata/oracle10/TS_SMS01.dbf
/app/oracle/oradata/oracle10/test01.dbf

7 rows selected.

SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/app/oracle/oradata/oracle10/redo01.log
/app/oracle/oradata/oracle10/redo02.log
/app/oracle/oradata/oracle10/redo03.log

SQL> select name from v$controlfile;   

NAME
--------------------------------------------------------------------------------
/app/oracle/oradata/oracle10/control01.ctl
/app/oracle/oradata/oracle10/control02.ctl
/app/oracle/oradata/oracle10/control03.ctl


Case 2. Redo log와 archive log, data file 백업 없을 경우 복구하기 - 재생성하기

Control file을 재생성하는 경우는 몇가지가 있는데 대표적인 경우는
1. control file이 전부 삭제되었을 때
2. old control file 에러 발생시에
3. DB Name 변경하고 싶을 때
4. 최대 데이터 파일 개수와 리두 로그 파일 개수를 변경하고 싶을 때 등입니다.


# Control file 재생성
Control file 을 재생성을 하려며 No mount 상태에서 DB를 재생성하는 명령어를 입력하면 디는데 그 명령어가 너무 길어서 스크립트로 만들어서 생성하는 방법을 사용.
Control file 을 재생성하는 스크립트는 현재 old control file로붜 trace해서 만들게 되며 아래의 방법으로 하면 됩니다.
SQL> select status from v$instance;

STATUS
------------
MOUNTED

SQL> alter database backup controlfile to trace as '/export/home/oracle/recon_mount.sql';

Database altered.

SQL> !      
bash-3.00$ vi /export/home/oracle/recon_mount.sql

-- The following are current System-scope REDO Log Archival related
-- parameters and can be included in the database initialization file.
--
-- LOG_ARCHIVE_DEST=''
-- LOG_ARCHIVE_DUPLEX_DEST=''
--
-- LOG_ARCHIVE_FORMAT=%t_%s_%r.dbf
--
-- DB_UNIQUE_NAME="oracle10"
--
-- LOG_ARCHIVE_CONFIG='SEND, RECEIVE, NODG_CONFIG'
-- LOG_ARCHIVE_MAX_PROCESSES=2
-- STANDBY_FILE_MANAGEMENT=MANUAL
-- STANDBY_ARCHIVE_DEST=?/dbs/arch
-- FAL_CLIENT=''
-- FAL_SERVER=''
--
-- LOG_ARCHIVE_DEST_10='LOCATION=USE_DB_RECOVERY_FILE_DEST'
-- LOG_ARCHIVE_DEST_10='OPTIONAL REOPEN=300 NODELAY'
-- LOG_ARCHIVE_DEST_10='ARCH NOAFFIRM NOEXPEDITE NOVERIFY SYNC'
-- LOG_ARCHIVE_DEST_10='REGISTER NOALTERNATE NODEPENDENCY'
-- LOG_ARCHIVE_DEST_10='NOMAX_FAILURE NOQUOTA_SIZE NOQUOTA_USED NODB_UNIQUE_NAME'
-- LOG_ARCHIVE_DEST_10='VALID_FOR=(PRIMARY_ROLE,ONLINE_LOGFILES)'
-- LOG_ARCHIVE_DEST_STATE_10=ENABLE

--
-- Below are two sets of SQL statements, each of which creates a new
-- control file and uses it to open the database. The first set opens
-- the database with the NORESETLOGS option and should be used only if
-- the current versions of all online logs are available. The second
-- set opens the database with the RESETLOGS option and should be used
-- if online logs are unavailable.
-- The appropriate set of statements can be copied from the trace into
-- a script file, edited as necessary, and executed when there is a
-- need to re-create the control file.
--
--     Set #1. NORESETLOGS case
--
-- The following commands will create a new control file and use it
-- to open the database.
-- Data used by Recovery Manager will be lost.
-- Additional logs may be required for media recovery of offline
-- Use this only if the current versions of all online logs are
-- available.

-- After mounting the created controlfile, the following SQL
-- statement will place the database in the appropriate
-- protection mode:
--  ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE

STARTUP NOMOUNT -- 여기서부터 실제 필요한 스크립트 부분이므로 이전 까지는 전부 지우세요.
CREATE CONTROLFILE REUSE DATABASE "ORACLE10" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/app/oracle/oradata/oracle10/redo01.log'  SIZE 50M,
  GROUP 2 '/app/oracle/oradata/oracle10/redo02.log'  SIZE 50M,
  GROUP 3 '/app/oracle/oradata/oracle10/redo03.log'  SIZE 50M
-- STANDBY LOGFILE -- 이 부분도 삭제해야 합니다.
                   -- 이 부분도 삭제해야 합니다. 공백이 없어야 합니다.
DATAFILE
  '/app/oracle/oradata/oracle10/system01.dbf',
  '/app/oracle/oradata/oracle10/undotbs01.dbf',
  '/app/oracle/oradata/oracle10/sysaux01.dbf',
  '/app/oracle/oradata/oracle10/SCOTT_DATA.dbf',
  '/app/oracle/oradata/oracle10/users01.dbf',
  '/app/oracle/oradata/oracle10/TS_SMS01.dbf',
  '/app/oracle/oradata/oracle10/test01.dbf'
CHARACTER SET AL32UTF8
; -- noresetlogs 옵션으로 만들 경우라면 여기까지만 필요합니다.

-- Take files offline to match current control file.
ALTER DATABASE DATAFILE '/app/oracle/oradata/oracle10/test01.dbf' OFFLINE DROP;

-- Commands to re-create incarnation table
-- Below log names MUST be changed to existing filenames on
-- disk. Any one log file from each branch can be used to
-- re-create incarnation records.
-- ALTER DATABASE REGISTER LOGFILE '/app/oracle/flash_recovery_area/ORACLE10/archivelog/2011_05_22/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/app/oracle/flash_recovery_area/ORACLE10/archivelog/2011_05_22/o1_mf_1_1_%u_.arc';
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE

-- All logs need archiving and a log switch is needed.
ALTER SYSTEM ARCHIVE LOG ALL;

-- Database can now be opened normally.
ALTER DATABASE OPEN;

-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE '/app/oracle/oradata/oracle10/temp01.dbf' REUSE;
ALTER TABLESPACE SCOTT_TEMP ADD TEMPFILE '/app/oracle/oradata/oracle10/SCOTT_TEMP.dbf' REUSE;
ALTER TABLESPACE TEMP_SMS ADD TEMPFILE '/app/oracle/oradata/oracle10/TEMP_SMS01.dbf' REUSE;
-- End of tempfile additions.
--
--     Set #2. RESETLOGS case -- 여긴 resetlogs 옵션에서 사용될 control file을 생성합니다.
--
-- The following commands will create a new control file and use it
-- to open the database.
-- Data used by Recovery Manager will be lost.
-- The contents of online logs will be lost and all backups will
-- be invalidated. Use this only if online logs are damaged.

-- After mounting the created controlfile, the following SQL
-- statement will place the database in the appropriate
-- protection mode:
--  ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE

STARTUP NOMOUNT  -- 여기서부터 실제 필요한 스크립트입니다.
CREATE CONTROLFILE REUSE DATABASE "ORACLE10" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/app/oracle/oradata/oracle10/redo01.log'  SIZE 50M,
  GROUP 2 '/app/oracle/oradata/oracle10/redo02.log'  SIZE 50M,
  GROUP 3 '/app/oracle/oradata/oracle10/redo03.log'  SIZE 50M
-- STANDBY LOGFILE -- 이 부분도 삭제해야 합니다.
                   -- 이 부분도 삭제해야 합니다. 공백이 없어야 합니다.
DATAFILE
  '/app/oracle/oradata/oracle10/system01.dbf',
  '/app/oracle/oradata/oracle10/undotbs01.dbf',
  '/app/oracle/oradata/oracle10/sysaux01.dbf',
  '/app/oracle/oradata/oracle10/SCOTT_DATA.dbf',
  '/app/oracle/oradata/oracle10/users01.dbf',
  '/app/oracle/oradata/oracle10/TS_SMS01.dbf',
  '/app/oracle/oradata/oracle10/test01.dbf'
CHARACTER SET AL32UTF8
;  -- 여기까지만 필요합니다. 여기 밑으로는 전부 지우세요.

-- Commands to re-create incarnation table
-- Below log names MUST be changed to existing filenames on
-- disk. Any one log file from each branch can be used to
-- re-create incarnation records.
-- ALTER DATABASE REGISTER LOGFILE '/app/oracle/flash_recovery_area/ORACLE10/archivelog/2011_05_22/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/app/oracle/flash_recovery_area/ORACLE10/archivelog/2011_05_22/o1_mf_1_1_%u_.arc';
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE USING BACKUP CONTROLFILE

-- Database can now be opened zeroing the online logs.
ALTER DATABASE OPEN RESETLOGS;

-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE '/app/oracle/oradata/oracle10/temp01.dbf' REUSE;
ALTER TABLESPACE SCOTT_TEMP ADD TEMPFILE '/app/oracle/oradata/oracle10/SCOTT_TEMP.dbf' REUSE;
ALTER TABLESPACE TEMP_SMS ADD TEMPFILE '/app/oracle/oradata/oracle10/TEMP_SMS01.dbf' REUSE;
-- End of tempfile additions.

- 그럼 위 스크립트에서 지금 상황(old control file 에러 발생 또는 모든 컨트롤 파일 삭제됨)에 맞는 control file 을 새로 생성합니다.
이런 상황이라면 resetlogs 옵션으로 DB를 open해야 합니다.
따라서 #2 RESETLOGS 옵션에 있는 스크립트를 이용합니다.

앞부분은 전부 삭제 하고
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORACLE10" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/app/oracle/oradata/oracle10/redo01.log'  SIZE 50M,
  GROUP 2 '/app/oracle/oradata/oracle10/redo02.log'  SIZE 50M,
  GROUP 3 '/app/oracle/oradata/oracle10/redo03.log'  SIZE 50M
DATAFILE
  '/app/oracle/oradata/oracle10/system01.dbf',
  '/app/oracle/oradata/oracle10/undotbs01.dbf',
  '/app/oracle/oradata/oracle10/sysaux01.dbf',
  '/app/oracle/oradata/oracle10/SCOTT_DATA.dbf',
  '/app/oracle/oradata/oracle10/users01.dbf',
  '/app/oracle/oradata/oracle10/TS_SMS01.dbf',
  '/app/oracle/oradata/oracle10/test01.dbf'
CHARACTER SET AL32UTF8
;

뒷부분도 전부 삭제하고 위 내용만 남겨두고 :w /export/home/oracle/recon_mount2.sql 새 이름으로 저장합니다.

# 위 스크립트의 내용 중 주의사항
1. DB가 Reserlogs로 open되는지 No resetlogs로 open 되는지 정확히 구분하세요.
2. 스크립트 안에 주석이나 공백이 있으면 생성 도중에 에러가 남.
3. 스크립트 내부의 Redo log는 실제 파일이 없어도 Resetlogsㄹ open될 때 생성됩니다.
4. 데이터 파일은 반드시 그 경로에 있어야 합니다.
5. control file의 생성 위치는 파라미터 파일에 지정된 경로입니다.
그 경로에 control file이 이미 존재하고 있으면 생성이 안되고 에러 발생.

위 5가지 사항을 주의해서 control file을 재생성해 주세요.

- 스크립트로 control file 생성
SQL> shutdown immediate

SQL> @/export/home/oracle/recon_mount2.sql

SQL> alter database open resetlogs;

SQL> select name from v$controlfile;

# Control file이 재생성되어 DB가 정상적을 Open 되는 것을 확인합니다.
Control file 을 재생성하는 작업은 어렵지는 않지만 신중하여야 합니다.
Control file 을 재생성 하면 RMAN 백업도 사용 못하게 될수 있고 FlashBack 기능도 사용 못하게 될수 있습니다.


14.4 종합 복구 문제
데이터 파일만 백업이 있고 사용 중이던 control file과 Redo log file 전부 다 삭제가 되었을 경우 복구

* 장애 상황 설명
DBA 박현영 엔지니어에게 고객 사이트에서 긴급복구 요청을 했습니다.
현재 상황은 운영 중인 서버의 RAID 장애로 모든 파일(데이터파일, 리두 로그 파일, 컨트롤 파일)이 소실되었으며 현재 가지고 있는 파일은 어제 백업 받았던 전체 데이터 파일과 2개월 전에 백업 받았던 컨트롤 파일밖에 없다고 합니다.
고객 사이트에서는 어제까지의 데이터라도 복구해 달라고 요청을 합니다.
어제의 데이터 파일들과 2개월 전의 컨트롤 파일만 가지고 어제 상태로 복구하세요.

step 1. 현재상태 확인 후 데이터 파일만 백업합니다.
이 작업 전에 미리 컨트로 파일만 백업 받으세요.
즉 데이터 파일보다 컨트롤 파일을 먼저 백업 받아야 합니다.
SQL> select name from v$datafile;  

NAME
--------------------------------------------------------------------------
/app/oracle/oradata/oracle10/system01.dbf
/app/oracle/oradata/oracle10/undotbs01.dbf
/app/oracle/oradata/oracle10/sysaux01.dbf
/app/oracle/oradata/oracle10/SCOTT_DATA.dbf
/app/oracle/oradata/oracle10/users01.dbf
/app/oracle/oradata/oracle10/TS_SMS01.dbf
/app/oracle/oradata/oracle10/test01.dbf

7 rows selected.

SQL> select name from v$controlfile;

NAME
---------------------------------------------------------------------------
/app/oracle/oradata/oracle10/control01.ctl
/app/oracle/oradata/oracle10/control02.ctl
/app/oracle/oradata/oracle10/control03.ctl

SQL> select member from v$logfile;

MEMBER
--------------------------------------------------
/app/oracle/oradata/oracle10/redo01.log
/app/oracle/oradata/oracle10/redo02.log
/app/oracle/oradata/oracle10/redo03.log

SQL> !
bash-3.00$ cp /app/oracle/oradata/oracle10/*.dbf /export/home/oracle/data/backup/close/

step 2. 장애 발생
bash-3.00$ rm -f /app/oracle/oradata/oracle10/*.log
bash-3.00$ rm -f /app/oracle/oradata/oracle10/*.ctl

이 상황을 복구합니다.

### 종합 복구 문제 정답 - control file 재생성해서 복구

step 1. 복구를 위한 파일 복원
복구 작업은  /export/home/oracle/data/backup/imsy/ 디렉토리에 하겠습니다.
복구를 위해 필요한 일은 백업 데이터 파일과 예전에 백업 받았던 컨트롤 파일입니다.

-bash-3.00$ mkdir  /export/home/oracle/data/backup/imsy/
-bash-3.00$ cp /export/home/oracle/data/backup/close/*.dbf /export/home/oracle/data/backup/imsy/
-bash-3.00$ cp /export/home/oracle/data/backup/close/*.ctl /export/home/oracle/data/backup/imsy/

step 2. 컨트롤 파일 위치 변경 후 마운트


step 3. Control file 재생성
SQL> shutdown immediate
ORA-01507: database not mounted


ORACLE instance shut down.
SQL> !
bash-3.00$ vi recon_mount2.sql
"recon_mount2.sql" 22 lines, 743 characters 
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORACLE10" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/app/oracle/oradata/oracle10/redo01.log'  SIZE 50M,
  GROUP 2 '/app/oracle/oradata/oracle10/redo02.log'  SIZE 50M,
  GROUP 3 '/app/oracle/oradata/oracle10/redo03.log'  SIZE 50M
DATAFILE
  '/app/oracle/oradata/oracle10/system01.dbf',
  '/app/oracle/oradata/oracle10/undotbs01.dbf',
  '/app/oracle/oradata/oracle10/sysaux01.dbf',
  '/app/oracle/oradata/oracle10/SCOTT_DATA.dbf',
  '/app/oracle/oradata/oracle10/users01.dbf',
  '/app/oracle/oradata/oracle10/TS_SMS01.dbf',
  '/app/oracle/oradata/oracle10/test01.dbf'
CHARACTER SET AL32UTF8
;

데이터 파일만 있으므로 Open 시킬 때 Resetlogs 옵션을 써야 합니다.
즉 Case 2. Resetlogs 옵션으로 사용될 내용만 위와 같이 남기고 다 지운 후 아래와 같이 로그와 데이터 파일 위치를 변경합니다.
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORACLE10" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/export/home/oracle/data/backup/imsy/redo01.log'  SIZE 50M,
  GROUP 2 '/export/home/oracle/data/backup/imsy/redo02.log'  SIZE 50M,
  GROUP 3 '/export/home/oracle/data/backup/imsy/redo03.log'  SIZE 50M
DATAFILE
  '/export/home/oracle/data/backup/imsy/system01.dbf',
  '/export/home/oracle/data/backup/imsy/undotbs01.dbf',
  '/export/home/oracle/data/backup/imsy/sysaux01.dbf',
  '/export/home/oracle/data/backup/imsy/SCOTT_DATA.dbf',
  '/export/home/oracle/data/backup/imsy/users01.dbf',
  '/export/home/oracle/data/backup/imsy/TS_SMS01.dbf',
  '/export/home/oracle/data/backup/imsy/test01.dbf'
CHARACTER SET AL32UTF8
;

SQL> @recon_mount2.sql
ORACLE instance started.

Total System Global Area  369098752 bytes
Fixed Size                  1280276 bytes
Variable Size             113247980 bytes
Database Buffers          251658240 bytes
Redo Buffers                2912256 bytes
CREATE CONTROLFILE REUSE DATABASE "ORACLE10" RESETLOGS  ARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01189: file is from a different RESETLOGS than previous files
ORA-01110: data file 7: '/export/home/oracle/data/backup/imsy/test01.dbf'

SQL> !vi recon_mount2.sql
"recon_mount2.sql" 22 lines, 823 characters 
  '/export/home/oracle/data/backup/imsy/test01.dbf'
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORACLE10" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/export/home/oracle/data/backup/imsy/redo01.log'  SIZE 50M,
  GROUP 2 '/export/home/oracle/data/backup/imsy/redo02.log'  SIZE 50M,
  GROUP 3 '/export/home/oracle/data/backup/imsy/redo03.log'  SIZE 50M
DATAFILE
  '/export/home/oracle/data/backup/imsy/system01.dbf',
  '/export/home/oracle/data/backup/imsy/undotbs01.dbf',
  '/export/home/oracle/data/backup/imsy/sysaux01.dbf',
  '/export/home/oracle/data/backup/imsy/SCOTT_DATA.dbf',
  '/export/home/oracle/data/backup/imsy/users01.dbf',
  '/export/home/oracle/data/backup/imsy/TS_SMS01.dbf'
   -- test01.dbf 삭제
CHARACTER SET AL32UTF8
;

~
"recon_mount2.sql" 21 lines, 770 characters 

SQL> 
SQL> shutdown immediate
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.
SQL> @recon_mount2.sql
ORACLE instance started.

Total System Global Area  369098752 bytes
Fixed Size                  1280276 bytes
Variable Size             113247980 bytes
Database Buffers          251658240 bytes
Redo Buffers                2912256 bytes

Control file created.

SQL> select name from v$datafile;

NAME
----------------------------------------------------------------------
/export/home/oracle/data/backup/imsy/system01.dbf
/export/home/oracle/data/backup/imsy/undotbs01.dbf
/export/home/oracle/data/backup/imsy/sysaux01.dbf
/export/home/oracle/data/backup/imsy/SCOTT_DATA.dbf
/export/home/oracle/data/backup/imsy/users01.dbf
/export/home/oracle/data/backup/imsy/TS_SMS01.dbf

6 rows selected.

SQL> select status from v$instance;

STATUS
------------
MOUNTED

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

SQL> alter database open resetlogs;

Database altered.

SQL> @redo

GROUP# MEMBER                                                     MB ARC        SEQ STATUS
------ -------------------------------------------------- ---------- --- ---------- ------------
     1 /export/home/oracle/data/backup/imsy/redo01.log                    50 YES          0 UNUSED
     2 /export/home/oracle/data/backup/imsy/redo02.log                    50 YES          0 UNUSED
     3 /export/home/oracle/data/backup/imsy/redo03.log                    50 NO           1 CURRENT

- 이 실습의 핵심은 데이터 파일과 checkpoint SCN 정보가 다른 old control file을 이용해서 어떻게 현재 데이터 파일을 복구해 내느냐입니다.
즉 컨트롤 파일 생성을 할 수 있어야 해결할 수 있는 장애 상황이었습니다.



자료 출처 : 서진수 지음 - 원리부터 실무까지 오라클 백업과 복구


05 15, 2011 20:15 05 15, 2011 20:15

Trackback URL : http://develop.sunshiny.co.kr/trackback/624

Leave a comment

Oracle - 사용자 관리.

Posted 05 7, 2011 14:06, Filed under: DataBase/Oracle



# 테이블 스페이스 생성및 사용자 생성

1) smsuser의 default tablespace 생성하기
SQL> set line 200
SQL> col tablespace_name for a10
SQL> col file_name for a50
SQL> SELECT TABLESPACE_NAME, BYTES/1024/1024 MB, FILE_NAME
        FROM DBA_DATA_FILES;

TABLESPACE         MB FILE_NAME
---------- ---------- --------------------------------------------------
SYSTEM            480 /app/oracle/oradata/oracle10/system01.dbf
UNDOTBS1          200 /app/oracle/oradata/oracle10/undotbs01.dbf
SYSAUX            250 /app/oracle/oradata/oracle10/sysaux01.dbf
USERS               5 /app/oracle/oradata/oracle10/users01.dbf
SCOTT_DATA       1000 /app/oracle/oradata/oracle10/SCOTT_DATA.dbf

SQL> CREATE TABLESPACE TS_SMS
                DATAFILE '/app/oracle/oradata/oracle10/TS_SMS01.dbf' SIZE 10M;  2  

Tablespace created.

SQL> SELECT TABLESPACE_NAME, BYTES/1024/1024 MB, FILE_NAME
  2          FROM DBA_DATA_FILES;

TABLESPACE         MB FILE_NAME
---------- ---------- --------------------------------------------------
SYSTEM            480 /app/oracle/oradata/oracle10/system01.dbf
UNDOTBS1          200 /app/oracle/oradata/oracle10/undotbs01.dbf
SYSAUX            250 /app/oracle/oradata/oracle10/sysaux01.dbf
TS_SMS             10 /app/oracle/oradata/oracle10/TS_SMS01.dbf
USERS               5 /app/oracle/oradata/oracle10/users01.dbf
SCOTT_DATA       1000 /app/oracle/oradata/oracle10/SCOTT_DATA.dbf

6 rows selected.

2) Temporary tablespace 생성
SQL> CREATE TEMPORARY TABLESPACE TEMP_SMS
        TEMPFILE '/app/oracle/oradata/oracle10/TEMP_SMS01.dbf' SIZE 10M;  2  

Tablespace created.

3) 사용자 생성
SQL> CREATE USER SMSUSER
      IDENTIFIED BY SMSPWD
      DEFAULT TABLESPACE TS_SMS
      TEMPORARY TABLESPACE TEMP_SMS
      QUOTA UNLIMITED ON TS_SMS
     QUOTA 0M ON SYSTEM
  ;

User created.

4) 권한 설정하기
SQL> GRANT RESOURCE, CONNECT TO SMSUSER ;

Grant succeeded.

SQL> CONN SMSUSER/SMSPWD
Connected.
SQL> 

-- # 사용자 정보 확인
SQL> set line 200
SQL> col defulat_tablespace for a10
SQL> col temporary_tablespace for a10
SQL> SELECT USERNAME, DEFAULT_TABLESPACE "Default TS", TEMPORARY_TABLESPACE "Temp TS"
  2     FROM DBA_USERS
  3     WHERE USERNAME = 'SMSUSER'
  4  ;

USERNAME                       Default TS                     Temp TS
------------------------------ ------------------------------ ------------------------------
SMSUSER                        TS_SMS                         TEMP_SMS

# profile 관리하기
- Profile은 사용자 계정의 행동에 제약사항을 두기 위해서 사용하는 경우가 대부분입니다.
예를 들어 5분 이상 활동이 없으면 접속을 강제로 종료시킨다든지, 1개월 마다 암호를 다른 것으로 바꾸게 강제로 적용한다든지 하는 것들이 대표적인 예입니다.
1)Password profile 관련 파라미터
1. Failed_login_attempts : login 시도를 실패할 경우 계정을 잠그는데 여기 설정된 횟수만큼 시도한 후 계정을 잠그게 됩니다.
2. Password_lock_time : 위 1번에서 계정이 잠기면 여기서 며칠 동안 잠글 것인지 기간을 정하는 파라미터입니다.
단위는 일이고 여기서 일수와 무관하게 DBA가 unlock 해서 사용하게 할 수 있습니다.
3. Password_life_time : 동일한 암호를 며칠간 사용하게 할 것인지 설정하는 파라미터입니다.
단위는 일이며 이 기간이 지나도 안 바꾸면 다음 로그인할 때 강제로 바꾸게 프롬프트를 보여줍니다.
4. Password_grace_time : 위 3번 항목에서 만료되어도 이 파라미터에 지정된 값만큼 더 암호를 변경할 기간을 허용하게 됩니다.
5. Password_reuse_time : 동일한 암호를 다시 사용할 수 없도록 설정하는 기간, 즉 암호를 변경하라고 했는데 사용자가 동일한 암호를 다시 사용하려고 할 수 있기에 같은 암호를 다시 쓸 수 없게 만들어야 할 때 사용하는 파라미터
6. Password_reuse_max : 동일한 암호를 위 5번 설정을 피해 재사용을 할 경우 최대 사용 가능한 횟수를 지정하는 파라미터
7. Password_verify_function : 암호를 보다 복잡하게 만들기 위해서 특정 함수를 적용시켜 사용자의 암호를 점검.
이 함수는 오라클에서 만들어 둔 기본 함수인 verify_function을 사용할 수 있고 사용자가 별도의 함수를 만들어서 적용할 수도 있습니다.

여기서는 verify_function 함수를 이용할 경우 어떤 조건을 점검하는지 보겠습니다.
* 암호는 최소한 4글자 이상 되어야 합니다.
* 암호는 사용자 계정과 달라야 합니다.
* 암호는 하나의 특수문자나, 알파벳, 숫자가 포함되어야 합니다.
* 암호는 이전 암호와 3글자 이상 달라야 합니다.

# Password 관련 profile 생성
- 조건 1: 로그인 시도 3회 실패시 계정을 5일동안 사용 못하게 할 것.
- 조건 2: 계정의 암호는 15일에 한 번씩 변경하게 할 것.
- 조건 3: 동일한 암호는 15일 동안 사용 못하게 할 것.
SQL> CREATE PROFILE SAMPLE_PROF LIMIT
  2     FAILED_LOGIN_ATTEMPTS 3
  3     PASSWORD_LOCK_TIME    5
  4     PASSWORD_LIFE_TIME    15
  5     PASSWORD_REUSE_TIME   15
  6  ;

Profile created.

# Resource profile 관련 파라미터
- 이 profile을 사용하려면 resource_limit = true 라는 설정이 되어 있어야 합니다.
즉 startup 할 때 사용되는 parameter file 에 위 문장을 적어 놓거나 또는 지금 즉시 적용시키고 싶으면 9i 이상 버전일 경우엔 alter system set resource_limit = true; 를 실행하면 됩니다.

1. Cpu_per_session : 하나의 세션이 CPU를 연속적으로 사용할 수 있는 최대 시간을 설정합니다.
무한루프 같은 쿼리가 작동되면 혼자서 CPU를 연속적으로 점유하기 때문에 이 설정을 사용해서 그런 일을 막고자 하는 것입니다.
1/100 초 단위입니다.
2. Sessions_per_user : 하나의 사용자 계정으로 몇 명의 사용자가 동시에 접속할 수 있는지를 설정하는 파라미터입니다.
3. Connect_time : 하루동안 DB Server에 접속할 수 있는 총 시간을 설정합니다.
4. Idle_time : 연속적으로 휴먼 시간이 여기 값을 넘으면 접속을 해제합니다.
예를 들어 idle_time 5 이렇게 하면 5분동안 활동이 없는 세션은 강제로 접속이 끊어지게 됩니다.
5. Logical_reads_per_session : 한 session에서 사용 가능한 최대 block 수를 지정합니다.
6. Private_sga : MTS / shared server 일 경우 해당 session의 SGA 사용량을 bytes 단위로 설정합니다.
7. Cpu_per_call : 하나의 call당 cpu를 점유할 수 있는 시간이며 1/100 초 단위입니다.
8. Logical_reads_per_call : 하나의 call 당 읽을 수 있는 block의 개수를 지정합니다.

# Resource 관련 profile 만들기
SQL> ALTER SYSTEM SET RESOURCE_LIMIT = TRUE;

System altered.

- 조건 1: 1명당 연속적으로 CPU를 사용할 수 있는 시간을 10초로 제한할 것.
- 조건 2: 하루 중 8시간만 DB에 접속 가능하게 할 것.
- 조건 3: 10분동안 사용하지 않으면 강제로 접속을 끊을 것.
SQL> CREATE PROFILE RE_SAMPLE_PROF LIMIT
        CPU_PER_SESSION 1000
        CONNECT_TIME  480
       IDLE_TIME 10
    ;

Profile created.

# 사용자에게 profile 할당하기
- 여기에서는 위 2번과 4번에서 만든 profile을 smsuser에게 설정 합니다.

1. 현재 모든 사용자가 적용받고 있는 profile 확인 하기
SQL> SET PAGESIZE 50
SQL> SELECT USERNAME , PROFILE 
        FROM DBA_USERS
        WHERE USERNAME = 'SMSUSER'
     ;

USERNAME                       PROFILE
------------------------------ ------------------------------
SMSUSER                        DEFAULT

2. 해당 profile에 어떤 내용이 있는지 확인하기
- 위에서 만든 sample_prof의 내용을 조회
SQL> SET LINE 200    
SQL> COL PROFILE FOR A13
SQL> COL RESOURCE_NAME FOR A30
SQL> COL RESOURCE FOR A10
SQL> COL LIMIT FOR A10
SQL> SELECT * FROM DBA_PROFILES
  2  WHERE PROFILE = 'SAMPLE_PROF'
  3  ;

PROFILE       RESOURCE_NAME                  RESOURCE LIMIT
------------- ------------------------------ -------- ----------
SAMPLE_PROF   COMPOSITE_LIMIT                KERNEL   DEFAULT
SAMPLE_PROF   SESSIONS_PER_USER              KERNEL   DEFAULT
SAMPLE_PROF   CPU_PER_SESSION                KERNEL   DEFAULT
SAMPLE_PROF   CPU_PER_CALL                   KERNEL   DEFAULT
SAMPLE_PROF   LOGICAL_READS_PER_SESSION      KERNEL   DEFAULT
SAMPLE_PROF   LOGICAL_READS_PER_CALL         KERNEL   DEFAULT
SAMPLE_PROF   IDLE_TIME                      KERNEL   DEFAULT
SAMPLE_PROF   CONNECT_TIME                   KERNEL   DEFAULT
SAMPLE_PROF   PRIVATE_SGA                    KERNEL   DEFAULT
SAMPLE_PROF   FAILED_LOGIN_ATTEMPTS          PASSWORD 3
SAMPLE_PROF   PASSWORD_LIFE_TIME             PASSWORD 15
SAMPLE_PROF   PASSWORD_REUSE_TIME            PASSWORD 15
SAMPLE_PROF   PASSWORD_REUSE_MAX             PASSWORD DEFAULT
SAMPLE_PROF   PASSWORD_VERIFY_FUNCTION       PASSWORD DEFAULT
SAMPLE_PROF   PASSWORD_LOCK_TIME             PASSWORD 5
SAMPLE_PROF   PASSWORD_GRACE_TIME            PASSWORD DEFAULT

16 rows selected.

-- 위에서 만든 re_sample_prof의 내용을 조회
SQL> COL PROFILE FOR A15
SQL> SELECT *
       FROM DBA_PROFILES
       WHERE PROFILE = 'RE_SAMPLE_PROF'
       ;

PROFILE         RESOURCE_NAME                  RESOURCE LIMIT
--------------- ------------------------------ -------- ----------
RE_SAMPLE_PROF  COMPOSITE_LIMIT                KERNEL   DEFAULT
RE_SAMPLE_PROF  SESSIONS_PER_USER              KERNEL   DEFAULT
RE_SAMPLE_PROF  CPU_PER_SESSION                KERNEL   1000
RE_SAMPLE_PROF  CPU_PER_CALL                   KERNEL   DEFAULT
RE_SAMPLE_PROF  LOGICAL_READS_PER_SESSION      KERNEL   DEFAULT
RE_SAMPLE_PROF  LOGICAL_READS_PER_CALL         KERNEL   DEFAULT
RE_SAMPLE_PROF  IDLE_TIME                      KERNEL   10
RE_SAMPLE_PROF  CONNECT_TIME                   KERNEL   480
RE_SAMPLE_PROF  PRIVATE_SGA                    KERNEL   DEFAULT
RE_SAMPLE_PROF  FAILED_LOGIN_ATTEMPTS          PASSWORD DEFAULT
RE_SAMPLE_PROF  PASSWORD_LIFE_TIME             PASSWORD DEFAULT
RE_SAMPLE_PROF  PASSWORD_REUSE_TIME            PASSWORD DEFAULT
RE_SAMPLE_PROF  PASSWORD_REUSE_MAX             PASSWORD DEFAULT
RE_SAMPLE_PROF  PASSWORD_VERIFY_FUNCTION       PASSWORD DEFAULT
RE_SAMPLE_PROF  PASSWORD_LOCK_TIME             PASSWORD DEFAULT
RE_SAMPLE_PROF  PASSWORD_GRACE_TIME            PASSWORD DEFAULT

16 rows selected.

3. 사용자에게 profile 적용시키고 확인
SQL> ALTER USER SMSUSER PROFILE SAMPLE_PROF ;

User altered.

SQL> ALTER USER SMSUSER PROFILE RE_SAMPLE_PROF ;

User altered.

SQL> SELECT USERNAME , PROFILE 
        FROM DBA_USERS
        WHERE USERNAME = 'SMSUSER'
      ;

USERNAME                       PROFILE
------------------------------ ---------------
SMSUSER                        RE_SAMPLE_PROF

위 예에서 알 수 있듯이 여러 개의 프로파일을 적용시킬 수 없습니다.
그래서 처음부터 프로파일을 만들 때 원하는 파라미터를 전부 넣고 한꺼번에 만든 후 그것을 적용시켜야 합니다.

4. 사용 안 하는 profile 삭제하기
- 현재 사용 중인 re_sample_prof 프로파일을 삭제
SQL> DROP PROFILE RE_SAMPLE_PROF ;
DROP PROFILE RE_SAMPLE_PROF
*
ERROR at line 1:
ORA-02382: profile RE_SAMPLE_PROF has users assigned, cannot drop without CASCADE

앞에서 보듯이 현재 사용자에게 할당이 되어 있는 profile은 기본적으로 삭제가 안됩니다.
그러나 cascade 옵션으로 삭제하면 삭제할 수 있습니다.
그렇게 삭제하게 되면 해당 프로파일을 사용하던 사용자는 default profile을 사용하게 됩니다.
SQL> DROP PROFILE RE_SAMPLE_PROF CASCADE ;

Profile dropped.

SQL> SELECT USERNAME , PROFILE 
  2          FROM DBA_USERS
  3             WHERE USERNAME = 'SMSUSER'
  4        ;

USERNAME                       PROFILE
------------------------------ ---------------
SMSUSER                        DEFAULT

# privilege(권한) 관리하기
Profile은 사용자가 어떤 것들을 못하게 막는 것이 목적이지만 privilege는 사용자에게 어떤 것들을 하게 허락해주는 것으 목적으로 합니다.
일반적으로 OS는 계정을 생성하고 암호만 주면 서버에 접속이 간으하고 적절한 작업도 가능하지만 Oracle은 계정을 생성하고 암호를 설정하고 적절한 권한까지 줘야만 접속도 할 수 있고 작업도 할 수 있습니다.

privilege는 크게 system 관련 privilege와 object 관련 privilege로 나뉩니다.
1) System 관련 주요 privilege
2) SYSOPER / SYSDBA privilege
3) SYSTEM 관련 권한 할당하기 / 해제하기
- scott 사용자에게 create table, create session 권한을 할당 합니다.
SQL> GRANT CREATE TABLE, CREATE SESSION TO SCOTT ;

Grant succeeded.

- scott 사용자에게 create table 권한을 해제합니다.
SQL> REVOKE CREATE TABLE FROM SCOTT;

Revoke succeeded.

4) 사용자가 가지고 있는 권한 조회하기
- scott 사용자가 가지고 있는 모든 권한을 조회
SQL> SELECT *
        FROM DBA_SYS_PRIVS
        WHERE GRANTEE = 'SCOTT'
        ; 

GRANTEE                        PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
SCOTT                          UNLIMITED TABLESPACE                     NO
SCOTT                          CREATE SESSION                           NO

위에서 ADM 컬럼은 With admin option 옵션 여부를 나타냅니다
With admin option 이란 권한을 위임하는 기능인데 예를 들어서 DBA가 A 에게 Create Table이란 권한을 줄 때 그냥 주면 A 사용자는 create table을 수행하는 권한만 받게 되지만
GRANT CREATE TABLE TO A WITH ADMIN OPTION 이렇게 주게 되면 A 사용자는 또 다른 사용자에게 WITH ADMIN OPTION 과 함께 받은 CREATE TABLE이 이라는 권한을 마치 DBA처럼 할당해 줄수가 있게 됩니다.
또한 다른 사용자가 가진 create table이란 권한을 회수할 수도 있게 됩니다.

5) Object 관련 privilege
주로 DML과 연관이 많습니다.
즉 object를 select, insert, update, delete 등을 할 수 있는 권한을 말합니다.

6) Object 권한 할당하기 / 해제하기
- scott 사용자에게 smsuser가 만든 smstest 테이블을 select 할 수 있도록 함
SQL> GRANT SELECT ON SMSUSER.SMSTEST TO SCOTT ;
Grant succeeded.

-- 여러 테이블의 권한을 주고자 할때 테이블 개수만큼 쿼리 생성
SELECT 'GRANT SELECT ON SMSUSER.'||TABLE_NAME || ' TO SCOTT;'
FROM ALL_TABLES
WHERE OWNER = 'SMSUSER'
;

-- 오라클 전체 테이블 1
SELECT 'GRANT SELECT ON '||TNAME||' TO SCOTT;'
FROM TAB
;
-- 오라클 전체 테이블 2
GRANT SELECT ANY TABLE TO SCOTT
;


- scott 사용자에게 smsuser가 만든 smstest 테이블을 update 할 수 있도록 하세요.
그리고 scott 사용자가 이 권한을 다른 사람에게 줄수 있는 권한도 주세요.
SQL> GRANT UPDATE ON SMSUSER.SMSTEST TO SCOTT WITH GRANT OPTION ;

Grant succeeded.

- scott 사용자가 가진 smsuser의 smstest 테이블을 select 하는 권한을 해제 하세요.
SQL> REVOKE SELECT ON SMSUSER.SMSTEST FROM SCOTT ;

Revoke succeeded.

- with grant option 이란?
System privilege에서 권한 위임을 하기 위해서는 권한 할당을 할 때 with admin option을 사용하였습니다.
그러나Object privilege에서는 같은 의미의 작업을 할 때 with grant option을 사용합니다.
차이점은 DBA가 A사용자에게 with admin option을 사용하여 권한을 주고 A 사용자가 다시 B 사용자에게 권한을 주었을때 DBA가 A 사용자에게서 권한을 해제해도 A 사용자로부터 권한을 받은 B 사용자는 권한이 해제가 안되지만 with grant option은 A 사용자의 권한을 해제하면 자동으로 A 사용자로부터 받은 B 사용자의 권한까지 해제되게 됩니다.

# Role 관리
사용자가 어떤 작업을 DB 내에서 수행하려면 반드시 그 권한을 가지고 있어야 한다고 앞에서 살펴보았습니다.
그런데 이 권한이 너무 많아서 grant 명령어로 권한 하나하나를 매번 할당하기에는 아주 힘이 드는 경우가 많이 있습니다.
이럴 경우를 위해서 만들어진 기능이 Role입니다.
Role이란 권한의 그룹이라고 생각하면 됩니다.
-- 1) Role 생성하기
SQL> CREATE ROLE TROLE ;

Role created.

-- 2) Role에 create session, create table 권한 할달 하기
SQL> GRANT CREATE SESSION, CREATE TABLE TO TROLE ;

Grant succeeded.

-- 3) Scott 사용자에게 trole 할당하기
SQL> GRANT TROLE TO SCOTT ;

Grant succeeded.

-- 4) 어떤 사용자가 어떤 Role을 사용하는지 확인하기
SQL> SELECT * 
        FROM DBA_ROLE_PRIVS
  2    3        WHERE GRANTEE = 'SCOTT'
  4     ;

GRANTEE                        GRANTED_ROLE                   ADM DEF
------------------------------ ------------------------------ --- ---
SCOTT                          RESOURCE                       NO  YES
SCOTT                          DBA                            NO  YES
SCOTT                          TROLE                          NO  YES
SCOTT                          CONNECT                        NO  YES

-- 5) 어떤 Role에 어떤 권한이 있는지 확인
SQL> SELECT *
  2     FROM DBA_SYS_PRIVS
  3     WHERE GRANTEE = 'CONNECT'
  4     ;

GRANTEE                        PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
CONNECT                        CREATE SESSION                           NO

SQL> SELECT *
  2       FROM DBA_SYS_PRIVS
  3       WHERE GRANTEE = 'RESOURCE'
  4  ;

GRANTEE                        PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
RESOURCE                       CREATE TRIGGER                           NO
RESOURCE                       CREATE SEQUENCE                          NO
RESOURCE                       CREATE TYPE                              NO
RESOURCE                       CREATE PROCEDURE                         NO
RESOURCE                       CREATE CLUSTER                           NO
RESOURCE                       CREATE OPERATOR                          NO
RESOURCE                       CREATE INDEXTYPE                         NO
RESOURCE                       CREATE TABLE                             NO


자료 출처 : 서진수 지음 - 원리부터 실무까지 오라클 백업과 복구


05 7, 2011 14:06 05 7, 2011 14:06

Trackback URL : http://develop.sunshiny.co.kr/trackback/616

Leave a comment




ORA-01157: cannot identify/lock data file 4 - see DBWR trace file
ORA-01110: data file 4: '/app/oracle/oradata/oracle10/.dbf'
위와 같은 에러 발생시 아래 처럼 해당 데이타 파일을 오프라인 후 삭제

ALTER DATABASE DATAFILE '/app/oracle/oradata/oracle10/.dbf' OFFLINE DROP ;

SQL> STARTUP
ORACLE instance started. Total System Global Area  369098752 bytes
Fixed Size                  1280276 bytes
Variable Size             113247980 bytes
Database Buffers          251658240 bytes
Redo Buffers                2912256 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 4 - see DBWR trace file
ORA-01110: data file 4: '/app/oracle/oradata/oracle10/.dbf' 

SQL> ALTER DATABASE DATAFILE '/app/oracle/oradata/oracle10/.dbf' OFFLINE DROP ; 
Database altered. 
SQL> ALTER DATABASE OPEN; 
Database altered. 
SQL> SHUTDOWN IMMEDIATE
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> STARTUP
ORACLE instance started. Total System Global Area  369098752 bytes
Fixed Size                  1280276 bytes
Variable Size             113247980 bytes
Database Buffers          251658240 bytes
Redo Buffers                2912256 bytes
Database mounted.
Database opened.
SQL> 


05 1, 2011 19:58 05 1, 2011 19:58

Trackback URL : http://develop.sunshiny.co.kr/trackback/615

Leave a comment

« Previous : 1 : 2 : 3 : 4 : 5 : ... 10 : Next »

Recent Posts

  1. Linux - Telnet 서비스 비활성및 실행
  2. NT - 서버 원격데스크탑 연결
  3. NT - http와 https간에 세션 공유가...
  4. Unix - 대량 파일 이동, 삭제시 Argu...
  5. Oracle - SYS_CONTEXT 함수를 이용하...

Recent Comments

  1. 네. 고맙습니다^^ 행복한 한해 보... sunshiny 01 16,
  2. sunshiny님. 안녕하세요... 올려 주... yihans 01 16,
  3. 답글 주셔서 고맙습니다^^ 소스 복... sunshiny 01 11,
  4. 관리자만 볼 수 있는 댓글입니다. 비밀방문자 01 11,
  5. 넵 답변감사합니다^^ 좋은 하루 되... 노로링

Recent Trackbacks

  1. 윈도우 cmd 명령어 팁 월풍도원(月風道院) - Delight on th... %M
  2. 파일 압축 Like RadioHead %M
  3. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   02 2012   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. Oracle All Documentation
  4. 엑셈
  5. 오라클 클럽
  6. 네이버개발자센터
  7. API - Java
  8. API - Spring
  9. Java Community
  10. Reference - Spring
  11. 스프링사용자
  12. 자바지기
  13. Ready System
  14. Solaris Freeware
  15. Linux-Site
  16. RedHat Korea
  17. 윈디하나의 솔라나라

Site Stats

TOTAL 217715 HIT
TODAY 17 HIT
YESTERDAY 115 HIT