ORACLE/Migration2015. 9. 14. 21:26
반응형
출처 : http://blog.naver.com/itisksc/30046151023

복사om/itisksc/30046151023

이관 - 오라클 exp/imp를 이용한 단순 이관 방법 및 순서 

2009.04.13. 17:20


No.

서버

작업순서

작업내용

비고

1OLD테이블스페이스 파악각 업무별 Tablespace 및 Size 조회 
2OLDUser/Role 정보 및 권한 파악각 User별 Default Tablespace 및 Temporary, Password, Lock&Expire, Profile 등 
3OLDUser별 Object수 파악이관 작업 후 확인자료로 사용하기 위한 Object 수 파악(Table/Index/PK/FK/CK/SP/SF/Trigger/Sequece/Grant/DB Link 등등) 
4OLDObject별 Status이관 작업 후 확인자료로 사용하기 위한 점검 리스트 작성
(Role/Table/Index/PK/FK/CK/SP/Trigger/Sequece/Synonym/Grant/DB Link 등등)
 
5OLDListener Stoplsnrctl stop 리스너명 
6OLDDB ShutdownSQL> shutdown immediate 
7OLDDB StartupSQL> startup 
8OLDUser별 Export각 업무 단위(User Mode)로 Export(Rows=n Indexes=n Option 사용)크기가 크지 않은 경우 Rows=y Indexes=y로 하고 [9번] 생략
9OLD테이블별 Export테이블의 크기가 큰 것은 별도 Export
테이블의 크기가 작은 것들은 모아서 Export하되 적당한 크기로 분할하여 Export
Direct=y Buffer=102400000 사용
10OLDExport한 .dmp 파일 신규 서버로 복사Ftp 또는 rcp, NFS 등을 이용하여 복사
용량이 부족할 경우 나누어 Export한 파일을 순차적으로 복사하여 Import한 다음 삭제하는 방법으로 작업
NFS를 이용하여 직접 Import는 권장하지 않음
1NEWDB CreateDB 재생성 작업 
2NEWTablespace 재생성업무별, 부하분산 고려한 Tablespace 생성 
3NEWUser 및 Role 생성User/Role생성 후 권한 부여 
4NEWUser별 ImportUser별 Export(rows=n indexes=n)한 .dmp 파일 Import필요시 테이블/인덱스 initial size 조정 
5NEWForegin Key Disable  
6NEWTrigger Disable  
7NEW테이블별 Import테이블별 Export한 .dmp 파일들을 동시에 Import를 여러 개 실행(Ignore=y Commit=y Buffer=102400000)OLD [9번]을 수행하지 않은 경우 이 작업은 Skip
8NEWForegin Key Enable  
9NEWTrigger Enable  
10NEWUser별 Object수 파악이관 작업 후 확인자료로 사용하기 위한 Object 수 파악(Role/Table/Index/PK/FK/CK/SP/SF/Trigger/Sequece/Grant/DB Link 등등) 
11NEWObject별 Status이관 작업 후 확인자료로 사용하기 위한 점검 리스트 작성
(Role/Table/Index/PK/FK/CK/SP/Trigger/Sequece/Synonym/Grant/DB Link 등등)
 
12NEWObject 확인 작업DB 이관 전/후 비교 
13NEWTable Analyze 작업DBMS_STATS Packge를 이용하여 통계정보 생성 
14NEWDB ShutdownSQL> shutdown immediate 
15NEWDB StartupSQL> Startup 
16NEWListener Startlsnrctl start 리스너명 
17NEW응용 프로그램 테스트응용프로그램을 실행하여 테스트 실시 
18NEWListener Stoplsnrctl stop 리스너명 
19NEWDB ShutdownSQL> shutdown immediate 
20NEWArchive log Mode 적용init$SID.ora 수정
SQL> Startup mount
SQL> alter database archivelog
SQL> archive log list
SQL> alter database open
SQL> shutdown immediate
 
21NEWDB Clod백업백업 장비(BCV,DLT,DAT 등)을 이용한 데이터파일 백업  


반응형
Posted by [PineTree]
ORACLE/RAC2015. 9. 6. 18:35
반응형


In this Document

Purpose
Scope
Details

APPLIES TO:

Oracle Database - Enterprise Edition - Version 10.2.0.1 to 12.1.0.1 [Release 10.2 to 12.1]
IBM AIX on POWER Systems (64-bit)

PURPOSE

AIX GPFS certification information on RAC

SCOPE

IBM AIX on POWER Systems (64-bit)
IBM AIX Based Systems (64-bit)
Oracle Database Server - Enterprise Edition - Version: 10gR2, 11gR2, 12cR1
AIX 7.1, 6.1 and 5.3 Systems (64-bit)
GPFS Version 4.1, 3.5, 3.4 and3.3.
IBM Spectrum Scale 4.1.1.
This document contains information specific to GPFS and IBM Spectrum Scale on AIX with Oracle RAC. For general
AIX information, refer to the My Oracle Support, AIX note (282036.1).

 

DETAILS

NEW
Oracle certifications of GPFS 4.1 includes IBM Spectrum Scale 4.1.1+ with APAR IV76383

CURRENT
For Oracle RAC 12cR1, IBM Spectrum Scale 4.1.1 is certified with AIX7.1 and AIX6.1
Status of GPFS 3.2 Certifications with Oracle RAC.
For Oracle RAC 11gR2, 11gR1, & 10gR2: GPFS 3.2 out of support and removed from document.
For Oracle RAC 11gR2 , GPFS ver. 4.1 is certified with AIX7.1 and AIX6.1.
For Oracle RAC 12cR1 , GPFS ver. 3.5 and ver. 3.4 are certified with AIX7.1 and AIX6.1
Status of GPFS 4.1 Certifications with Oracle RAC.
For Oracle RAC 11gR2 , GPFS ver. 4.1 is certified with AIX7.1 and AIX6.1
Status of GPFS 3.5 Certifications with Oracle RAC.
For Oracle RAC 12cR1: GPFS 3.5 is certified with AIX7.1, and AIX6.1.
For Oracle RAC 11gR2: GPFS 3.5 is certified with AIX7.1, and AIX6.1.
Status of GPFS 3.4 Certifications with Oracle RAC.
For Oracle RAC 12cR1: GPFS 3.4 is certified with AIX7.1, and 6.1.
For Oracle RAC 11gR2: GPFS 3.4 is certified with AIX7.1, 6.1 and 5.3.
For Oracle RAC 10gR2: GPFS 3.4 is certified with AIX 5.3 and AIX6.1.
Status of GPFS 3.3 Certifications with Oracle RAC.
For Oracle RAC 11gR2, 11gR1, and 10gR2: GPFS 3.3 is certified with AIX 5.3 and 6.1.
For Oracle RAC 11gR2: GPFS 3.3 is certified with AIX7.1.

 

Please see “Software Requirements” section of the attachment to determine the minimum certified levels of the software products involved.

 

Database - RAC/Scalability Community
To discuss this topic further with Oracle experts and industry peers, we encourage you to review, join or start a discussion in the My Oracle Support Database - RAC/Scalability Community

 


반응형
Posted by [PineTree]
ORACLE/Migration2015. 9. 6. 18:15
반응형


Problem Description: 
====================== 
How to backup the database on the raw device to the filesystem using 'dd'.




 
 
Solution Description: 
===================== 
 
The following commands will allow you to copy a raw device to the filesystem 
and restore from the filesystem to the raw device. 
 
You must use the dd command to copy from the raw device.  
 
Please Note: 
============  
	1. Caution is required because some AIX backup programs ignore large 
	files; you must	verify that any oversized AIX files are indeed  
        backed up.	  
  
	2. When doing copy/backup operations, please consider the 4KB 
	offset (taken by Oracle) for the Logical Volume Control Block(LVCB) at 
	the beginning of all IBM Virtual Shared Disks when performing 
	backup/restore operations. 
        
        3. When using zero offset raw devices (devices created using:
        # mklv -T O -y new_raw_device VolumeGroup NumberOfPartitions), ensure
        the 'skip' parameter is adjusted accordingly.  The offset can be 4096 
        bytes or 128 KB on AIX logical volumes or zero on AIX logical volumes 
        created with the mklv -T O option.
 
Copying to Filesystem  
--------------------------  
  
Use the command:  
  
% dd if=<raw device name> of=<filesystem name> bs=<BlockSize> 
skip=<SkipInputBlocks> 
  
Example:  
% dd if=/dev/rVh09.za.716c1 of=/a/spdevs04/ibmfs/osupport/dismith/test.ctl 
bs=4096 skip=1 
 
In the above example we specify the blocksize as 4096 bytes and skip 1 block 
for the offset for the Logical Volume Control Block(LVCB) 
 
bs=BlockSize - Specifies both the input and output block size, 
superceding the ibs and obs flags. The block size values specified with 
the bs flag must always be a multiple of the physical block size for the 
media being used. 
 
skip=SkipInputBlocks - Skips the specified SkipInputBlocks value of 
input blocks before starting to copy. 
 
Restoring from Filesystem  
--------------------------  
 
Use the command:  
  
% dd if=/a/spdevs04/ibmfs/osupport/dismith/test.ctl of=/dev/rVh09.za.716c1 
bs=4096 seek=1  
 
In the above example we specify the blocksize as 4096bytes and seek 1 block 
past the beginning of output file before copying, so we will not 
overwrite the Logical Volume Control Block(LVCB) 
 
seek=RecordNumber - Seeks the record specified by the RecordNumber  
variable from the beginning of output file before copying.


반응형
Posted by [PineTree]
ORACLE/ADMIN2015. 5. 9. 18:08
반응형

출처 : http://jhroom.co.kr/12050

통계 정보 생성 Procedure GATHER_TABLE_STATS

 

[  참고 ]
 1. 메뉴얼 [ GATHER_TABLE_STATS ] 
 http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_stats.htm#i1036461
 2. OPTIMIZER INVALIDATION PERIOD
 http://wiki.ex-em.com/index.php/OPTIMIZER_INVALIDATION_PERIOD

 

A.GATHER_TABLE_STATS Procedure

 

1. 개요

: Table,Column,  그리고 index 에 대한 통계 정보를 수집 하게 하는Procedure

 

2. Syntax

:DBMS_STATS.GATHER_TABLE_STATS (<?xml:namespace prefix = o /><?xml:namespace prefix = o />

   Ownname VARCHAR2,

   Tabname  VARCHAR2,

   Partname  VARCHAR2 DEFAULT NULL,

   Estimate_percent NUMBER DEFAULTto_estimate_percent_type

                                              (get_param(‘ESTIMATE_PERCENT’)),

   block_sample BOOLEAN DEFAULT FALSE,

   method_opt  VARCHAR2 DEFAULT get_param(‘METHOD_OPT’),

   degree       NUMBER DEFAULT to_degree_type(get_param(‘DEGREE’)),

   granularity     VARCHAR2 DEFAULT GET_PARAM(‘GRANULARITY’),

   cascade      BOOLEAN DEFAULT to_cascade_type(get_param(‘CASCADE’))

   stattab         VARCHAR2 DEFAULT NULL,

   statid          VARCHAR2 DEFAULT NULL,

  statown        VARCHAR2 DEFAULTNULL,

   no_invalidate   BOOLEAN DEFAULT

to_no_invalidate_type(get_param(‘NO_INVALIDATE’)),

   force           BOOLEAN DEFAULT FALSE );

 

3. Parameter 설명

: dbms_stats.set_param 에 의해서 디폴트 파라미터 설정 변경이 가능하다.

  [ 가능한 값은 
   CASCADE,  DEGREE,  ESTIMATE_PERCENT,  METHOD_OPT,  NO_INVALIDATE,   GRANULARITY,

   ==> 이상은 수동 통계정보 생성 시에 저정을 하지 않았을 때 적용되는 Default 값에 영향을 미치고

   AUTOSTATS_TARGET [ AUTO - Oracle이 자동으로 대상 Object 결정
                                      ALL - 대상 시스템의 모든 Objects
                                      ORACLE - SYS/SYSTEM OBJECT 만 ]

   ==> 자동 통계정보(GATHER_STATS_JOB) 시에만 영향을 미친다.

 

Default 값 확인

SYS>select dbms_stats.get_param('method_opt') from dual ;

DBMS_STATS.GET_PARAM('METHOD_OPT')
--------------------------------------------------------------------------------
FOR ALL COLUMNS SIZE AUTO

 

Default 값 변경

SYS>execute dbms_stats.set_param('method_opt','FOR ALL COLUMNS SIZE 1') ;

PL/SQL procedure successfully completed.

 

변경된 Default 값 확인

SYS>select dbms_stats.get_param('method_opt') from dual ;

DBMS_STATS.GET_PARAM('METHOD_OPT')
--------------------------------------------------------------------------------
FOR ALL COLUMNS SIZE 1

 

Parameter

Description

Ownname

분석할 테이블 소유자

tabname

테이블 이름

partname

파티션 이름지정 하지 않으면 NULL 

Estimate_percent

분석할 Row Percentage, NULL 이면 Compute(Row 전체)
유효값은 1/1000000 ~ 100

디폴트로, DBMS_STATS.AUTO_SAMPLE_SIZE 에 의해서 최적의 값을 결정

Block_sample

random block sampling or random row sampling 결정

random block sampling 이 좀더 효과적이다.

데이터의 블록 별 분포도가 안좋을 시에는 부적절한 정보 생성

디폴트 값이 False, random row sampling 을 수행한다.

Method_opt

Histogram 생성시 사용하는 옵션

l        FOR ALL [ INDEXED | HIDDEN ] COLUMNS [ size_clause ]

l        FOR COLUMN [ size clause ] column | attribute [size clause]

                  [, column|attribute [ size clause ]…]

 Size_clause := SIZE { integer | REPEAT | AUTO | SKEWONLY }

n        Integer : Histogram Bucket , Max  1,254

n        REPEAT : 이미 Histogram 이 있는 칼럼에 대해서만 생성

n         AUTO : 데이터 분산도와 칼럼 부하 정도에 따라서 생성 결정

n         SKEWONLY : 데이터 분산도에 따라서 생성 결정

디폴트 값은 FOR ALL COLUMNS SIZE AUTO 이다.

즉, Histogram 의 생성여부를 Oracle 이 알아서 판단하게 된다.

이 경우

EX) method_opt => FOR ALL COLUMNS SIZE 1

    모든 컬럼에 대해서 Histogram bucket 의 수를 1로 한다.

    컬럼 내에 존재하는 여러 가지 값들의 cardinality 는 모두 동일한

     값으로 간주한다. ( histogram 을 사용하지 않는다.)

     이것은 where 조건에 들어오는 특정 컬럼에 대한 값의 변화에 따라서

      PLAN 이 변경될 가능성을 없애고자 함이다.

FOR ALL COLUMNS SIZE 1 로 설정하여 Histogram 정보가 생성되지

않도록 조치 한다.

degree

병렬처리 정도

디폴트 값은 NULL 이고, CREATE TABLE, ALTER TABLE 

설정된 DEGREE 값에 의해 정해진다.

AUTO_DEGREE 값은 병렬처리 정도를 자동으로 결정한다.

이것은 1 or DEFAULT_DEGREE [ Object Size  CPU Count 에 의해 결정 ]

granularity

Parition table 에 대한 분석시 사용

‘ALL’ – Global, Partition, Subpartition 통계정보 수집 – Parition Table 대상

‘AUTO’ – 디폴트 값으로 ,Partition Type 에 따라서 결정 – 일반 Table 대상

‘DEFAULT’ – Global, Partition 통계정보 수집, Old Version 과 호환을 위해 사용

‘GLOBAL’ -  Global 통계정보 수집

‘GLOBAL AND PARTITION’ – SubPartition 에 대한 통계정보는 수집되지 않는다.

‘PARTITION’ – Partition 통계정보 수집

‘SUBPARTITION’ – SubPartition 통계정보 수집

cascade

대상 테이블의 인덱스에 대한 통계수집 여부

인덱스 통계정보는 병렬처리가 불가능하다.

TRUE – 대상 테이블에 관련된 index 에 대해서 통계정보 수집

stattab

통계수집을 통한 기존 통계정보 Update 전에,

기존에 존재하는 통계정보를 저장할 User Stat Table 을 지정

statid

Stattab 와 연관된 구분자 값

statown

Stattab 에 지정한 User Stat Table 의 소유자가 다를 경우 지정

no_invalidate

의존적인 Cursor Invalidate 할지 , 안할지 결정

True –   관련된 Cursor  invalidate 하지 않는다.

False – 관련된 Cursor  Invalidate 한다.

Default 로 DBMS_STATS.AUTO_INVALIDATE 값이고,

의미는 DBMS 가 의존적 Cursor 를  언제 invalidate 할지 자동으로 결정

이때 작용하는 Parameter는 _OPTIMIZER_INVALIDATION_PERIOD 이고,

Default 롤 18000 초(5시간) 이다.

 즉, 통계 정보 수집에 의해 통계 정보가 변경된 후 약 5시간에 걸쳐 랜덤한 시점에  해당 Cursor가 실행될 때 invalidation이 발생한다.

이것을 Auto Invalidation이라고 부른다. 
일정 시간에 걸쳐 랜덤하게 Cursor를 Invalidation함으로써 특정 시점에

Hard Parse가  한꺼번에 몰리는 현상을 피할 수 있다.

2011/03/30

_OPTIMIZER_INVALIDATION_PERIOD 파라미터로 시간 조절 가능

force

Lock 걸린 Table 에 대해서도 강제로 통계정보 생성

 

 

예제 ) 참조– 메타링크 (일반 테이블- 237537.1, 파티션 테이블 - 237538.1 )

Cascade => TRUE

è 인덱스에 대한 통계정보도수집하라.

Cascade => FALSE

è 인덱스에 대한 통계정보도수집하라.

method_opt =>'FOR ALL COLUMNS SIZE 1'

 è 칼럼(High and Low Column Value)에 대한 통계정보도 수집하라.

method_opt =>'FOR COLUMNS'

 è 컬럼에 대한통계정보를 수집하지 마라

 

 ) 일반 테이블

SQL> show user

USER is"SYS"

1.  SCOTT BIG_TABLE 의 전체 테이블과 모드 인덱스를 가지고,

테이블칼럼(Highand Low Column Value)연관 인덱스

통계정보를 생성한다.( COMPUTE STATISTICS )

SQL> execdbms_stats.gather_table_stats(ownname => 'SCOTT',

tabname => 'BIG_TABLE', cascade =>TRUE,

method_opt => 'FOR ALL COLUMNS SIZE 1');

PL/SQL proceduresuccessfully completed.

 

2.      SCOTT  BIG_TABLE 15% Row 를 가지고,

테이블칼럼연관인덱스의

통계정보를 생성한다. ( SAMPLE 15 PERCENT )

 

SQL> execdbms_stats.gather_table_stats(ownname => 'SCOTT',

 tabname=> 'BIG_TABLE', cascade => TRUE, estimate_percent => 15) ;

 

PL/SQL proceduresuccessfully completed.

 

3.  SCOTT  BIG_TABLE 의 의 전체 테이블과 모드 인덱스를 가지고,

테이블의통계정보를 수집하라인덱스와 칼럼에 대한 통계정보는 제외

 

SQL> execdbms_stats.gather_table_stats(ownname => 'SCOTT',

 tabname=> 'BIG_TABLE', cascade => FALSE, method_opt => 'FOR COLUMNS');

 

PL/SQL proceduresuccessfully completed.

 

4.  SCOTT  BIG_TABLE 의 전체 테이블과 모드 인덱스를 가지고,

테이블과인덱스에 대한 통계정보를 수집하라칼럼에 대한 통계정보는 제외

 

SQL> execdbms_stats.gather_table_stats(ownname => 'SCOTT',

tabname => 'BIG_TABLE', cascade  => TRUE, method_opt =>'FOR COLUMNS');

 

PL/SQL proceduresuccessfully completed.

 

5.    SCOTT  BIG_TABLE 의 전체 테이블과 모드 인덱스를 가지고,

테이블과칼럼(No Histogram) 그리고 인덱스에 대한 통계정보를 수집하라.

잠시 후에

인덱스 칼럼들의 Histogram 통계정보를 수집하라.

SQL> execdbms_stats.gather_table_stats(ownname => 'SCOTT',

tabname => 'BIG_TABLE', cascade => TRUE) ;

PL/SQL proceduresuccessfully completed.

잠시 후에..

SQL> exec  dbms_stats.gather_table_stats(ownname =>'SCOTT',

            tabname => 'BIG_TABLE', cascade=> TRUE,

method_opt => 'FOR ALL INDEXED COLUMNSSIZE 1');

PL/SQL proceduresuccessfully completed.

 

6. SCOTT  BIG_TABLE 의 전체 테이블과 모드 인덱스를 가지고,

   테이블과 인덱스칼럼(Only High and Low )에 대한 통계정보를 수집하라

   인덱스에 대한 통계정보는수집하지 마라.

 

SQL> execdbms_stats.gather_table_stats(ownname => 'SCOTT',

tabname => 'BIG_TABLE', cascade =>FALSE,

method_opt => 'FOR ALL INDEXED COLUMNSSIZE 1');

 

PL/SQL proceduresuccessfully completed.

 


나.) PartitionTable 의 경우

    추가적으로 granularity 정보를 ‘ALL’,’AUTO’,’PARITION’,

’GLOBAL AND PARTITION,’GLOBAL’,’SUBPARTITION’을 통해서

통계수집 대상 Table Segment 를 선정 가능하다.



참고 ] LOCK VS DBMS_STATS.GATHER_TABLE_STATS
        : DML 이 LOCK 이 발생 하여도 GATHER_TABLE_STATS 는 정상적으로 진행된다.
 SCOTT10> begin
    for i in 1001 .. 5000 loop
    insert into check_lock values ( i , i , 'lock');
    end loop ;
    end ;
     / 
 PL/SQL procedure successfully completed.

 SYS>@check_user_lock.sql
 Enter value for user_name: scott10
 old  46: and b.username =upper('&USER_NAME')
 new  46: and b.username =upper('scott10')

 USERNAME    SID LOCK_TYPE       MODE_HELD   MODE_REQUE LOCK_ID1 LOCK_ID2
 ---------- ---- --------------- ----------- ---------- -------- --------
 SCOTT10     151 DML             Row-X (SX)  None       51782    0
 SCOTT10     151 Transaction     Exclusive   None       131077   307


 SYS>execute dbms_stats.gather_table_stats(ownname =>'SCOTT10',tabname => 'CHECK_LOCK');
 PL/SQL procedure successfully completed.
 ==> DML LOCK 과는 무관하게 진행 된다.


반응형
Posted by [PineTree]
ORACLE/ADMIN2015. 5. 9. 17:57
반응형

제품 : ORACLE SERVER

작성날짜 : 2003-12-03


LOGON ON TRIGGER를 이용한 접속제한 | TRACE 설정
===============================================

PURPOSE
-------
데이터베이스에 접속하는 IP, USERNAME으로 접속을 제한하거나, TRACE를 설정하는 방법에 
대하여 알아본다.

Explanation
-----------
DB를 접속하는 사용자를 USER/ROLE로 구분하여 관리하는 Accecs Policy 라면 관계 없지만 
하나의 USER/PASSWORD로 Application을 이용하는 경우에는 Application을 통해서만 
DB에 접속하도록 통제하는 것이 불가능하게 된다.

즉 일부 사용자가 PC에 설치된 SQL*Net을 통하여 SQL*Plus나 3rd party TOOL로 DB에 접속하여 
데이터의 열람/조작을 한다면 이를 방지하거나 추적하기가 어렵다.

아래 예제는 DB server로의 TELNET접속을 통한 특정 DB User(SCOTT)의 접속을 원천적으로 막고, 
특정 IP(152.69.41.232)로부터 접속하는 Session에 trace를 설정하는 예제이다.

REM ------------------------------------------------------------------------ 
REM DISCLAIMER: 
REM This script is provided for educational purposes only. It is NOT 
REM supported by Oracle World Wide Technical Support. 
REM The script has been tested and appears to work as intended. 
REM You should always run new scripts on a test instance initially. 
REM ------------------------------------------------------------------------ 
REM Main text of script follows: 

-- Use an error number in the range of -20000 to -20999 --

CREATE OR REPLACE TRIGGER SCOTT_LOGON_TRACE
AFTER LOGON ON SCOTT.SCHEMA
BEGIN
-- LOCAL=YES로 접속 못 하도록 설정 --
IF ( ORA_CLIENT_IP_ADDRESS IS NULL ) THEN
RAISE_APPLICATION_ERROR ( -20001
, 'Local connection as SCOTT is not allowed!'
);
-- LOOPBACK으로 접속 못 하도록 설정(DB server IP:152.69.41.21) --
ELSIF ( ORA_CLIENT_IP_ADDRESS = '152.69.41.21' ) THEN
RAISE_APPLICATION_ERROR ( -20002
, 'IP '
|| ORA_CLIENT_IP_ADDRESS
|| ' is not allowed to connect database as SCOTT!'
);
-- 특정 IP에 대하여 TRACE 설정 --
ELSIF ( ORA_CLIENT_IP_ADDRESS = '152.69.41.232' ) THEN
SYS.DBMS_SESSION.SET_SQL_TRACE(TRUE);
END IF;
END;
/
----------- cut ---------------------- cut -------------- cut -------------- 


Example
-------
sqlplus /nolog

SQL*Plus: Release 8.1.7.0.0 - Production on Wed Nov 6 17:16:57 2002

(c) Copyright 2000 Oracle Corporation. All rights reserved.

SQL> conn scott/tiger
ERROR:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: Local connection as SCOTT is not allowed!
ORA-06512: at line 3


SQL> conn scott/tiger@kyulee
ERROR:
ORA-00604: error occurred at recursive SQL level 1
ORA-20002: IP 152.69.41.21 is not allowed to connect database as SCOTT!
ORA-06512: at line 7


SQL> conn system/manager
Connected.


Reference Documents
-------------------
1.
<Note:178924.1>
http://metalink.oracle.com/metalink/plsql/ml2_documents.showNot?p_id=178924.1&p_font=

2.
Bulletin No: 11848
Product: ORACLE_SERVER
Subject: ORACLE 8I SYSTEM EVENT TRIGGER ( ORACLE 8.1.6 )


    반응형
    Posted by [PineTree]
    ORACLE/TroubleShooting2015. 5. 1. 15:54
    반응형


    In this Document

    SymptomsCauseSolution


    Applies to:

    Oracle Database - Enterprise Edition - Version 10.2.0.1 and later
    Information in this document applies to any platform.

    Symptoms

    - Freshly installed Oracle 10.2.0.1.0. and newly created database instance. 
    - After approximately 4-5 hours of normal database operation, trace files start populating about once every minute.
    - The significance of the messages at this time are unclear except that they indicate that no OS
    statistics for CPU are being collected.

    ERROR:
    ksugetosstat failed: op = slsgetkstat, location = slsupdatesta (physmem)

    Cause

    The O/S statistics are not getting collected for some reason which is causing the file to be produced.

    There has not been much information on this problem except that it is usually related to enabling and disabling CPUs on the box while the database is up and running. 

    Once this has occurred that the database will stop collecting OS statistics at all.

    Solution

    To implement the solution, please execute the following steps:

    1.Set the 'statistics_level=basic' database parameter
    2. Bounce the database
    3. Monitor for production of any new trace files after setting the 'statistics_level=basic' parameter.
    4. If the problem persists, open a service request with Oracle Support Services to further investigate the issue.
    반응형
    Posted by [PineTree]
    ORACLE/TUNING2015. 4. 25. 23:21
    반응형

    PURPOSE
     
    부정형의 비교를 긍정형 비교로 바꾸어서 인덱스 사용을 유도하는 방법에 대해서 알아본다.


    KEY IDEA
     
    부정형의 비교에는 논리적으로 인덱스를 사용할 수 없다. 하지만 약간의 IDEA를 첨부한다면
    부정형의 비교를 긍정형의 비교로 바꾸어서 인덱스의 사용을 유도할 수 있다.
    (KEY WORD : INDEX 활용, 인덱스, 부정형 비교, NOT IN, NOT EXISTS, <> )


    DESCRIPTION
      
    다음의 SQL을 보자.
         SELECT ‘Not found’  FROM EMP WHERE EMPNO <> ‘1234’

    • 대개의 Application에서는 사용자가 처리한 데이터의 타당성을 검증하기 위해 이 값의
      존재 유무를 확인하는 경우가 빈번하게 발생한다.  
      이럴 경우 위의 예처럼 부정형의 문장을 사용하는 경우가 자주 있다.

    • 하지만 아래와 같이 ‘NOT EXISTS’를 이용해서 서브쿼리(SUB-QUERY)내의 SQL을 긍정형으로 바꾸면 인덱스를 사용할 수 있다.

       SELECT ‘NOT FOUND’ FROM DUAL
          WHERE NOT EXISTS ( SELECT ‘X’ FROM EMP WHERE EMPNO = ‘1234’ )

    • 그러나 ‘EXISTS’를 사용하는 것이 항상 유리한 것은 아니다. 다음의 3개의 SQL을 보자.

      [SQL1]
        SELECT * FROM TAB1
           WHERE YYYYMM = ‘199910’
               AND NOT EXISTS ( SELECT * FROM TAB2
                                         WHERE COL2 = COL1
                                             AND YYYYMM = ‘199910’ )
      [SQL2]
        SELECT * FROM TAB1
            WHERE YYYYMM =’199910’
                AND COL1 NOT IN (SELECT COL2 FROM TAB2
                                             WHERE YYYYMM = ‘199910’ )
      [SQL3]
         SELECT * FROM TAB1
             WHERE (YYYYMM, COL1) IN ( SELECT ‘199910’, COL1 FROM TAB1
                                                         WHERE YYYYMM = ‘199910’
                                                     MINUS
                                                     SELECT ‘199910’, COL2 FROM TAB2
                                                          WHERE YYYYMM = ‘199910’ )

    • TAB1 테이블의 ‘YYYYMM’, ‘COL1’이 각각 인덱스로 생성되어 있고
      TAB2의 ‘YYYYMM’, ‘COL2’가 각각 인덱스로 생성되어 있다.
       
    • [SQL1] 은 ‘TAB1’의 ‘YYYYMM’ 인덱스만을 사용하여 테이블의 로우를 엑세스하고
      각 로우마다 TAB2 테이블을 엑세스하는 서브쿼리가 수행되어 TAB2 에 존재하지 않는
      로우만 추출하게 된다. 이 SQL은 ‘199910’조건에 해당하는 모든 로우에 대해 서브
      쿼리가 랜덤엑세스를 수행한다. 왜냐하면 서브쿼리내에 메인쿼리의 컬럼인 'COL1'이
      존재하기 때문
      이다.
       
    • [SQL2] 는 서브쿼리 내에 메인쿼리 컬럼을 없애기 위해 작성하였지만 동일한 결과를
      초래한다. 그 이유는 'NOT IN'을 사용한 서브쿼리는 항상 나중에 수행되거나
      필터링(Filtering) 조인방식으로 수행되기 때문
      이다.
       
    • [SQL3]은 각 테이블에 ‘YYYYMM + COL1’, ‘YYYYMM + COL2’의 결합인덱스가 존재한
      다면 먼저 서브쿼리에서 두 개의 테이블을 ‘MINUS’하여 결과를 추출하고 그 결과를
      이용해 메인쿼리를 엑세스하게 할 수 있다. 이 경우에는 서브쿼리가 먼저 수행된다.
      인덱스만으로도 처리가 가능하기 때문에 테이블을 엑세스하지 않고 양쪽 테이블의
      인덱스들만 범위스캔(Range Scan)하여 ‘SORT-MERGE’방식으로 서브쿼리가 처리 된다.
       
    • 위의 경우에서는 결과적으로 [SQL3]가 가장 유리한 처리방법이라 하겠다.

    참고 : http://kdonghwa.tistory.com/58?srchid=BR1http%3A%2F%2Fkdonghwa.tistory.com%2F58

    반응형
    Posted by [PineTree]
    ORACLE/TUNING2015. 4. 25. 23:17
    반응형

    * 인덱스를 타지 않는 SQL
    1. 인덱스 컬럼 절의 변형
    2. 내부적인 데이터 변환
    3. NULL 조건의 사용
    4. 부정형 조건의 사용
    5. LIKE 연산자 사용
    6. 최적기가 판단


    1 - 인덱스 컬럼 절의 변형
    SQL> select ename from emp where sal * 2.1 > 950 --인덱스 사용불가
    SQL> select ename from emp where sal > 950 /2.1  --인덱스 사용가능
    SQL> select ename from emp where to_char(hiredate,'DDMMYY') = '250884' --인덱스 사용불가
    SQL> select ename from emp where hiredate = to_date('250884','DDMMYY') --인덱스 사용가능

    -> 인덱스 컬럼에 변형을 가하면은 사용할수 없습니다. 단 변형 가능하더라도 쓰고 싶다면은
        말리지는 않겠지만 create index .... on emp to_char(hiredate,'DDMMYY') 이렇게 하시면 됩니다.


    2 - 내부적인 데이터 변환
    SQL> select * from emp where hiredate ='14-JAN-85' --인덱스 사용불가
    SQL> select * from emp hiredate = to_date('71-10-22','YY/DD/DD') --인덱스 사용가능
    SQL> select * from emp where empno = '7936' --인덱스 사용불가
    SQL> select * from emp where empno = to_number('7936') --인덱스 사용가능

    -> 내부적인 데이터변환에서 가장 많이 실수하는 부분은 문자값 데이터타입을 갖는 컬럼에
        '값' -> 값 이렇게 하시는분이 많습니다. 딱맞는 데이터타입을 주세요 ^_^


    3 - NULL 조건의 사용
    SQL> select ename from emp where comm is null --인덱스 사용불가
    SQL> select ename from emp where comm is not null --인덱스 사용불가
    SQL> select ename from emp where ename > '' --인덱스 사용가능
    SQL> select ename from emp where comm >= 0 --인덱스 사용가능

    -> NULL조건으로 검색한다는 가정하에는 거의 인덱스 풀 스캔이 일어나겠죠. 적절히 사용합씨다.


    4 - 부정형 조건의 사용
    SQL> select ename from emp where deptno != 30 --인덱스 사용불가
    SQL> select ename from emp where deptno < 30 and deptno > 30 --인덱스 사용가능

    -> 논리적으로 부정형을 이용하여 인덱스를 사용하겠다는것은 말이 안되죠...
        이 쿼리문도 적절히 사용합씨다.


    5 - Like 연산자 사용
    SQL> select * from emp where ename like 'S%' --인덱스 사용가능
    SQL> select * from emp where ename like '%S%' --인덱스 사용불가

    -> %S% 부분을 꼭 쓰고싶다면은 이렇게 하세요 앞에부분을 다 넣는거죠. AS%, BS%...
        요즘 홈피를 보면 본문 찾기는 거의 없어져가고 있죠. 엔코아 경우 주제어를 검색을..


    6 - 최적기가 판단

    -> RBO경우 무조건 타죠 있으면은 이눔은 워낙 법을 좋아해서리..CBO는 통계값을 기준으로
        하기 때문에 DBA가 잘 해야겠죠. 그럼 우리가 판단하게 할라면은 HINT를 써서 이눔들을
        인도해야죠... 오늘도 전도를 ^____^


    마지막으로 인덱스를 이용한 sort 회피 방법에 대해서 알아보겠습니다.
    SQL> select empno, ename, job, comm from emp order by empno --sort 정렬
    SQL> select empno, ename, job, comm from emp where empno >= 0 --sort 정렬제거

    -> 인덱스는 값이 정렬되어 들어가있는 구조이기 때문에 처음부터 작은값 맨 끝값은
        최대값이 있겠죠. 잘 사용하면 최고의 튜닝이 되겠죠.


    반응형

    'ORACLE > TUNING' 카테고리의 다른 글

    [Oracle] 부정형(NOT IN, <>, NOT EXISTS ...)의 비교  (0) 2015.04.25
    DBMS_XPLAN.DISPLAY_CURSOR 결과 보는 법  (0) 2013.06.23
    Sort Area 크기 조정  (0) 2012.09.07
    SORT와 PGA_AGGREGATE_TARGET  (0) 2012.09.06
    PGA(Program Global Area) 관리  (0) 2012.09.06
    Posted by [PineTree]
    ORACLE/Migration2015. 3. 23. 14:17
    반응형
    1. raw device에는 LVCB(Logical Volume Control Block)가 있지만
       file system에는 없음.

     

       - bs    : 파일 입출력의 block(버퍼) 크기

       - skip  : 입력 파일에서 처리하지 않고 통과할 블록의 개수
                 (Raw Device to Filesystem 복사 시 지정해야 함)
       - seek  : 출력 파일에서 처리하지 않고 통과할 블록의 개수
                 (Filesystem to Raw Device 복사 시 지정해야 함)

       - count : 복사할 회수 or 블록의 개수 (생략 시 모든 데이터 복사 )

                 (Raw Device to Filesystem 복사 시 반드시 명시해야 함,
                  그 이외의 경우는 생략 가능)

    플랫폼
    LVCB
    플랫폼
    LVCB
    Solaris
    0
    True64
    64KB
    HP-UX
    0
    Linux
    0
    AIX
    4KB
    Windows
    0

     

     

    2. dbfsize로 확인

       $ORACLE_HOME/bin/dbfsize <Oracle Datafile 명>

       [file system 결과]
       /data05/TESTDB] dbfsize UNDO01_01.dbf
       Database file: UNDO01_01.dbf
       Database file type: file system             : File Type
       Database file size: 128000 8192 byte blocks :8192 byte Block이 128000 개

     

       [raw device 결과]

       Database file type: raw device             : File Type

       Database file size: 1408 8192 byte blocks  : 8192 byte Block이 1408 개

       ※ dbsize로 조회한 결과(Dictionary View에서 select로 조회한
          block 수도 마찬가지)에는 Datafile Header Block 및 LVCB가 포함되지 않음
     
          다음과 같은 경우에는 파일이 손상된 경우이므로 다시 복사
          Header block file size is bad;            trying raw file format...
          Header block magic number is bad
     
    3. 참고사항
    1) Raw Device 에서 Filesystem으로 변환
       dd if=/dev/rv_data001 of=/data01/TESTDB/data001.dbf bs=4096
          skip=1 count=2818
    2) Filesystem 에서 Raw Device로 변환
       dd if=/data01/TESTDB/data001.dbf of=/dev/rv_data001 bs=4096 seek=1
    3) Raw Device 에서 Raw Device로 복사
       dd if=/dev/re_data001 of=/dev/rv_data001_bk bs=4096 skip=1 seek=1
    4) Filesystem 에서 file system으로 복사
       cp /data01/TESTDB/data001.dbf /data01/TESTDB/data001.bak
     

    [출처] 이관 - raw device to file system(dd copy)|작성자 smileDBA

    [출처]    http://power.iotn.co.kr/zboard.php?id=9_1_bbs&no=1197

     


    [ Oracle 9.2.0.8 ]

    [ filesystem to raw device ]
    $ dbfsize /oracle/system/tools01.dbf

    Database file: /data/system/tools01.dbf
    Database file type: file system
    Database file size: 83840 8192 byte blocks

    SQL> alter database datafile '/data/system/tools01.dbf' offline;
    SQL> !dd if=/data/system/tools01.dbf of=/dev/rdsk/c0t0d0s1 bs=8192 count=83840
    83840+0 레코드 입력
    83840+0 레코드 출력
    SQL> alter database rename file '/data/system/tools01.dbf' to '/dev/rdsk/c0t0d0s1';
    SQL> recover datafile '/dev/rdsk/c0t0d0s1';
    SQL> alter database datafile '/dev/rdsk/c0t0d0s1' online;

    [ raw device to filesystem ]

    $ dbfsize /dev/rdsk/c0t0d0s1

    Database file: /dev/rdsk/c0t0d0s1
    Database file type: raw device
    Database file size: 83840 8192 byte blocks

    SQL> alter database datafile '/dev/rdsk/c0t0d0s1' offline;
    SQL> !dd if=/dev/rdsk/c0t0d0s1 of=/data/system/tools01.dbf bs=8192 count=83840
    83840+0 레코드 입력
    83840+0 레코드 출력
    SQL> alter database rename file '/dev/rdsk/c0t0d0s1' to '/data/system/tools01.dbf';
    SQL> recover datafile '/data/system/tools01.dbf';
    ORA-00283: recovery session canceled due to errors
    ORA-01110: data file 2: '/data/system/tools01.dbf'
    ORA-01122: database file 2 failed verification check
    ORA-01110: data file 2: '/data/system/tools01.dbf'
    ORA-01200: actual file size of 83839 is smaller than correct size of 83840 blocks
    SQL> !dd if=/dev/rdsk/c0t0d0s1 of=/data/system/tools01.dbf bs=8192 count=83841
    83841+0 레코드 입력
    83841+0 레코드 출력
    14:31:23 SQL> recover datafile '/data/system/tools01.dbf';
    Media recovery complete.
    14:31:38 SQL> alter database datafile '/data/system/tools01.dbf' online;
    Database altered.

     
      $ rawutl -s /dev/vx/rdsk/oracle/system.dbf [ 운영중인 lv size 2G, datafile size 2G ]
    2148532224 [ 2G ]
    $ rawutl -s /dev/vx/rdsk/oracle/r_system.dbf [ 임시 복구 lv size 3G, datafile size 2G ]
    3221225472 [ 3G ]

    $ dbfsize /dev/vx/rdsk/oracle/system.dbf
    Database file: /dev/vx/rdsk/oracle/system.dbf
    Database file type: raw device
    Database file size: 262144 8192 byte blocks

    $ dbfsize /dev/vx/rdsk/oracle/r_system.dbf
    Database file: /dev/vx/rdsk/oracle/r_system.dbf
    Database file type: raw device
    Database file size: 262144 8192 byte blocks

    SQL> select file#,name,bytes from v$datafile where file#=1;
     FILE# NAME BYTES
    ---------- ---------------------------------------- ----------
     1 /dev/vx/rdsk/oracle/system.dbf 2147483648 / 8192 = 262144 +1 = 262145

    $ dd if=/dev/vx/rdsk/oracle/r_system.dbf of=system.dbf bs=8192 count=262145
    $ ls -al
    -rw-r--r-- 1 oracle dba 2147491840 9월 7일 13:28 system.dbf

    $ dbfsize system.dbf
    Database file: system.dbf
    Database file type: file system
    Database file size: 262144 8192 byte blocks

    $ dd if=/dev/vx/rdsk/oracle/r_system.dbf of=system.dbf count=262144
    $ ls -al
    -rw-r--r-- 1 oracle dba 134217728 9월 7일 13:31 system.dbf [ 134217728 / 262144 = 512 block ]

     

      for AIX

    select 'dd if='||f.name||' of='||lower(t.name)||
    row_number() over (partition by t.name order by f.file# )||
    '.dbf bs=4k count='||to_char(((BLOCKS*BLOCK_SIZE)/4096)+4906)||
    ' #'||t.name||' '||f.file#
     from v$datafile f,v$tablespace t where t.ts#=f.ts#;

    or

    select 'dd if='||fname||' of='||lower(tname)||
    decode(sign(rn -9),1,'','0')||rn||
    '.dbf bs=4k count='||to_char(((BLOCKS*BLOCK_SIZE)/4096)+4906)||
    ' #'||tname||' '||file#
    from (select f.name fname,t.name tname,f.file#,blocks,block_size,
    row_number() over (partition by t.name order by f.file# ) rn
    from v$datafile f,v$tablespace t where t.ts#=f.ts#);

    select 'dd if='||member||' of=redo'||group#||'.log bs=4k count='||to_char(((lesiz*lebsz)/4096)+4096)
     from v$logfile f, x$kccle l where f.group#=l.lenum;

    select 'dd if='||name||' of=control.ctl bs=4k count='||to_char(((file_size_blks*block_size)/4096)+4096)
     from v$controlfile where rownum=1;

    wait: there are no child processes.
    같은 서버에서 test 나기도하고 안나기도함.
    파일크기 같고 rename 성공


      -- DSVM prime
    vxprint -g data -m gj_v4_001_5g|grep devsubtype
     devsubtype=dsvmprime
    dd if=/dev/vx/rdsk/data/gj_v4_001_5g of=/data/oradata/TSADMI_04.dbf bs=8192k
    -- DSVM
    vxprint -g data -m gj_v3_013_10g|grep devsubtype
     devsubtype=dsvm
    dd if=/dev/vx/rdsk/data/gj_v3_013_10g of=/data/oradata/TSADMI_05.dbf bs=4096 skip=1 count=2560002

    반응형
    Posted by [PineTree]
    ORACLE/ADMIN2015. 3. 12. 08:36
    반응형
    우선 DB관리자계정이 아닌 경우에 DBMS_CRYPTO를 다른 계정(x)에서 쓸 수 있도록  권한을 부여해야한다

    Grant excute on DBMS_CRYPTO to x;

    사용방법
    rawtohex(DBMS_CRYPTO.Hash(to_clob(passwd),2))

    두번째 파라미터 
    1 : md4, 2 : md5, 3 : sh1 암호화 방식을 의미

    넣을때 암호화하여 넣고, 비교할 때 문자열을 암호화 하여 비교 한다.
    문자열 암호화 : rawtohex(DBMS_CRYPTO.Hash(to_clob(to_char('inputpw')),2)) 

    ex)
    where id='id' and passwd = rawtohex(DBMS_CRYPTO.Hash(to_clob(to_char('inputpw')),2))

    [출처] 오라클 10g DBMS_CRYPTO 암호화 방법|작성자 positively_

    -- dbms_crypto 에 대한 실행 권한만 부여하면 권한은 끝!
    grant execute on DBMS_CRYPTO to sinu;

    -- package 껍데기
    CREATE OR REPLACE PACKAGE pkg_crypto

    IS

        FUNCTION encrypt (

            input_string        IN  VARCHAR2 ,

            key_data IN VARCHAR2 := '12345678'

        ) RETURN RAW;

        

        FUNCTION decrypt (

            input_string        IN  VARCHAR2 ,

            key_data IN VARCHAR2 := '12345678'

        ) RETURN VARCHAR2;


    END pkg_crypto;

    /


    -- package body 를 살펴보자

    CREATE OR REPLACE PACKAGE BODY pkg_crypto

    IS

    -- 에러 발생시에 error code 와 message 를 받기 위한 변수 지정.

        SQLERRMSG   VARCHAR2(255);

        SQLERRCDE   NUMBER;


    -- 암호화 함수 선언 key_data 는 입력하지 않을 시에 default 로 12345678 로 지정됨.

        FUNCTION encrypt (input_string IN VARCHAR2 , key_data IN VARCHAR2 := '12345678') 

         RETURN RAW

        IS

        

            key_data_raw        RAW(64);

            converted_raw       RAW(64);

            encrypted_raw       RAW(64);


        BEGIN


    -- 들어온 data 와 암호키를 각각 RAW 로 변환한다.

            converted_raw := UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8');

            key_data_raw     := UTL_I18N.STRING_TO_RAW(key_data, 'AL32UTF8');


    -- DBMS_CRYPTO.ENCRYPT 로 암호화 하여 encrypted_raw 에 저장.

            encrypted_raw := 

                 DBMS_CRYPTO.ENCRYPT(

                     src => converted_raw ,

    -- typ 부분만 변경하면 원하는 알고리즘을 사용할 수 있다. 

    --단, key value bype 가 다 다르니 확인해야 한다.

                     typ => DBMS_CRYPTO.DES_CBC_PKCS5 ,

                     key => key_data_raw ,

                     iv =>  NULL);

            

            RETURN encrypted_raw;

        END encrypt;


        FUNCTION decrypt (input_string IN VARCHAR2 , key_data IN VARCHAR2 := '12345678') 

         RETURN VARCHAR2

        IS

            converted_string    VARCHAR2(64);

            key_data_raw        RAW(64);

            decrypted_raw    VARCHAR2(64);


        BEGIN


            key_data_raw     := UTL_I18N.STRING_TO_RAW(key_data, 'AL32UTF8');

            

            decrypted_raw := 

                DBMS_CRYPTO.DECRYPT(

                     src => input_string ,

                     typ => DBMS_CRYPTO.DES_CBC_PKCS5 ,

                     key => key_data_raw ,

                     iv =>  NULL);


    -- DBMS_CRYPTO.DECRYPT 수행 결과 나온 복호화된 raw data 를 varchar2 로 변환하면 끝!

            converted_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8');


            RETURN converted_string;

        END decrypt ;

    END pkg_crypto;

    /



    create table card_info ( id number, card_number varchar2(64) ) ;


    -- 8자리 16자리 data 를 넣어보자.

    insert into card_info values ( 1 , pkg_crypto.encrypt('1234567812345678')) ;

    insert into card_info values ( 2 , pkg_crypto.encrypt('12345678')) ;

    commit;


    -- 암호화 되어 return 되는 bytes 가 다르다!

    select * from card_info ;

            ID CARD_NUMBER                                     

    ---------- ----------------------------------------------------------------

             1 96D0028878D58C89D73FBE0238428B0A3D440C49910337FB

             2 96D0028878D58C898E250D5F4C76644B                


    -- 복호화 해보니 정상적으로 잘 보인다.

    select id , pkg_crypto.decrypt(card_number) card_number

    from card_info;


            ID CARD_NUMBER                                     

    ---------- ----------------------------------------------------------------

             1 1234567812345678                                

             2 12345678                                        


    -- key value 를 00000000 으로 바꾸어 보자

    insert into card_info values ( 3 , pkg_crypto.encrypt('1234567812345678','00000000')) ;


    -- 데이터는 id=1 과 같은데 key 가 다르므로 암호화된 값이 다름을 알 수 있다.

    select * from card_info where id = 3;

            ID CARD_NUMBER                                     

    ---------- ----------------------------------------------------------------

             3 858B176DA8B125034356364E8179CD61040EE2CAC3041331


    -- 복호화 할 때는 반드시 암호화 시 사용했던 key value 가 필요하다.

    select id , pkg_crypto.decrypt(card_number,'00000000') card_number from card_info where id = 3  ;


            ID CARD_NUMBER                                     

    ---------- ----------------------------------------------------------------

             3 1234567812345678                                



    포인트는 

    DBMS_CRYPTO.ENCRYPT

    DBMS_CRYPTO.DECRYPT

    요 2가지 이고 나머지는 그냥 varchar2 와 raw 의 converting 작업이다.


    나머지 세세한 사항은 메뉴얼을 참고하자!


    http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_crypto.htm#i1003081

    http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_crypto.htm#i1004271

    출처: http://m.blog.naver.com/eureka6846/110076105943
    반응형
    Posted by [PineTree]