ORACLE/Migration2015. 9. 14. 21:37
반응형

RMAN을 사용한 raw device migration


출 처: http://jhroom.co.kr/21369
예전에 테스트했던 자료인데.. ASM -> filesystem의 경우에도 가능합니다..
개요
Oracle datafile을 raw device에서 file system file로, 또는 반대로 file system에서 raw device로 변환하기 위해 일반적으로 dd 명령을 주로 사용하게 되는데, Operating System마다 각기 다른 raw device control block size를 가지고 있기 때문에 작업 수행시 추가적인 확인 작업이 필요하다. 그러나 RMAN을 사용하여 변환 작업을 수행하면 이와 같은 과정 없이 변환이 가능하다.
작업절차
본 시나리오에서는 데이터베이스 전체에 대해 raw device/file system 상호 변환하는 과정을 테스트하였다.

##        RAW DEVICE -> FILE SYSTEM

1. Database mount

SQL> startup mount

2. Control file 재생성을 위해 trace 형태로 백업 수행

SQL> alter database backup controlfile to trace;

3. Raw device로 되어 있는 spfile을 pfile로 변경

SQL> create pfile from spfile;

4. Password file 재생성

ORA10@/oracle/product/10.2.0/dbs> orapwd file=orapwORA10 password=oracle force=y

5. RMAN을 이용하여 raw device datafile을 file system으로 변환

ORA10@/oracle> rman nocatalog target /
RMAN> copy datafile '/dev/raw/raw1' to '/oracle/oradata/ORA10/system.dbf'; -- 이처럼 파일마다 개별적으로 작업이 가능하지만, DB 전체를 복사할 경우 아래와 같이 작업한다.
RMAN> backup as copy database;

6. 위 단계에서 backup된 datafile들을 실제로 사용할 file 이름으로 변경

ORA10@/oracle> mv data_D-ORA10_I-650271866_TS-SYSTEM_FNO-1_04jsnkjp /oracle/oradata/ORA10/system.dbf
ORA10@/oracle> mv data_D-ORA10_I-650271866_TS-UNDOTBS1_FNO-2_05jsnkl6 /oracle/oradata/ORA10/undotbs1.dbf
ORA10@/oracle> mv data_D-ORA10_I-650271866_TS-SYSAUX_FNO-3_06jsnkmt /oracle/oradata/ORA10/sysaux.dbf
ORA10@/oracle> mv data_D-ORA10_I-650271866_TS-USERS_FNO-4_07jsnkol /oracle/oradata/ORA10/users.dbf

7. Parameter file(init.ora)을 열어 재 생성될 control file 경로를 지정

ORA10@/oracle/product/10.2.0/dbs> vi initORA10.ora
control_files='/oracle/oradata/ORA10/control01.ctl','/oracle/oradata/ORA10/control02.ctl'

8. Database shutdown

SQL> shutdown immediate;

9. 2번 단계에서 생성된 스크립트를 수정하여 datafile들의 새로운 경로를 지정한 후, resetlogs 옵션으로 데이터베이스를 오픈한다. 그리고 오픈 후 temp file들도 생성해 준다.

SQL> STARTUP NOMOUNT
SQL> CREATE CONTROLFILE REUSE DATABASE "ORA10" RESETLOGS  NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/oracle/oradata/ORA10/redo01.dbf'  SIZE 45M,
  GROUP 2 '/oracle/oradata/ORA10/redo02.dbf'  SIZE 45M
DATAFILE
  '/oracle/oradata/ORA10/sysaux.dbf',  
  '/oracle/oradata/ORA10/system.dbf',  
  '/oracle/oradata/ORA10/undotbs1.dbf', 
  '/oracle/oradata/ORA10/users.dbf'
CHARACTER SET KO16MSWIN949;
 
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;
ORA-00279: change 179042 generated at 10/09/2008 14:50:53 needed for thread 1
ORA-00289: suggestion : /oracle/product/10.2.0/dbs/arch1_11_667665402.dbf
ORA-00280: change 179042 for thread 1 is in sequence #11
 
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
Media recovery cancelled.
SQL> ALTER DATABASE OPEN RESETLOGS;
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/oradata/ORA10/temp.dbf' SIZE 200M;


##        FILE SYSTEM -> RAW DEVICE

1. Database mount

SQL> startup mount

2. Control file 재생성을 위해 trace 형태로 백업 수행

SQL> alter database backup controlfile to trace;

3. Password file을 raw device로 변경

ORA10@/oracle/product/10.2.0/dbs> dd if=orapwORA10 of=/dev/raw/raw13
ORA10@/oracle/product/10.2.0/dbs> rm -f orapwORA10
ORA10@/oracle/product/10.2.0/dbs> ln -s /dev/raw/raw13 orapwORA10

4. RMAN을 사용하여 file system datafile을 raw device로 변환

ORA10@/oracle> rman nocatalog target /
RMAN> copy datafile '/oracle/oradata/ORA10/system.dbf' to '/dev/raw/raw1';
RMAN> copy datafile '/oracle/oradata/ORA10/sysaux.dbf' to '/dev/raw/raw2';
RMAN> copy datafile '/oracle/oradata/ORA10/users.dbf' to '/dev/raw/raw6';
RMAN> copy datafile '/oracle/oradata/ORA10/undotbs1.dbf' to '/dev/raw/raw3';

5. Parameter file(init.ora)을 수정하여 재 생성될 control file의 경로 지정

ORA10@/oracle/product/10.2.0/dbs> vi initORA10.ora
control_files='/dev/raw/raw10','/dev/raw/raw11'

6. Database shutdown

SQL> shutdown immediate;

7. 2번 단계에서 생성된 스크립트를 수정하여 datafile들의 새로운 경로를 지정한 후, resetlogs 옵션으로 데이터베이스를 오픈한다. 그리고 오픈 후 temp file들도 생성해 준다.

SQL> STARTUP NOMOUNT
SQL> CREATE CONTROLFILE REUSE DATABASE "ORA10" RESETLOGS  NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/dev/raw/raw8'  SIZE 45M,
  GROUP 2 '/dev/raw/raw9'  SIZE 45M
-- STANDBY LOGFILE
DATAFILE
  '/dev/raw/raw1',
  '/dev/raw/raw3',
  '/dev/raw/raw2',
  '/dev/raw/raw6'
CHARACTER SET KO16MSWIN949
;

SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;
ORA-00279: change 179846 generated at 10/09/2008 16:45:11 needed for thread 1
ORA-00289: suggestion : /oracle/product/10.2.0/dbs/arch1_1_667672438.dbf
ORA-00280: change 179846 for thread 1 is in sequence #1
  
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
Media recovery cancelled.
SQL> ALTER DATABASE OPEN RESETLOGS;
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/dev/raw/raw5' size 190M REUSE;

8. File system으로 되어 있는 pfile을 raw device spfile로 변환

SQL> create spfile='/dev/raw/raw12' from pfile;

9. Parameter file을 수정하여 spfile을 사용하도록 지정한다.

ORA10@/oracle/product/10.2.0/dbs> vi initORA10.ora
SPFILE=/dev/raw/raw12


반응형
Posted by [PineTree]
ORACLE/Migration2015. 9. 14. 21:31
반응형
출처 : http://blog.naver.com/itisksc/30046860726
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


반응형
Posted by [PineTree]
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/TroubleShooting2015. 5. 12. 16:49
반응형
출처 :
http://db.necoaki.net/m/post/155

원인: object statistics are locked. It turns out that in 10gR2, when you import (imp or impdp) table without data i.e. structure only, oracle will lock the table statistics.


lock 확인


SQL> select table_name, stattype_locked from dba_tab_statistics where owner = '계정' and stattype_locked is not null;


SQL> exec DBMS_STATS.UNLOCK_TABLE_STATS('owner','table name');


테이블이 너무 많은 경우


SQL> set head off

SQL> set feedback off

SQL> set pages 100

SQL> set line 200


SQL> spool unlock_tb.sql


SQL> select 'exec DBMS_STATS.UNLOCK_TABLE_STATS ('''|| owner ||''','''|| table_name ||''');' from dba_tab_statistics where owner = '계정' and stattype_locked is not null;


SQL> spool off


해서 생성 되는 스크립트를 돌려준다.

반응형
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]