ORACLE/ADMIN2018. 7. 21. 10:58
반응형

Oracle 9i의 CONNECT롤 및 RESOURCE롤에 부여된 시스템 권한

SQL> select * from role_sys_privs where role='CONNECT';
ROLE PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
CONNECT CREATE VIEW NO
CONNECT CREATE TABLE NO
CONNECT ALTER SESSION NO
CONNECT CREATE CLUSTER NO
CONNECT CREATE SESSION NO
CONNECT CREATE SYNONYM NO
CONNECT CREATE SEQUENCE NO
CONNECT CREATE DATABASE LINK NO
8 개의 행이 선택되었습니다.

SQL> select * from role_sys_privs where role='RESOURCE';
ROLE PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
RESOURCE CREATE TYPE NO
RESOURCE CREATE TABLE NO
RESOURCE CREATE CLUSTER NO
RESOURCE CREATE TRIGGER NO
RESOURCE CREATE OPERATOR NO
RESOURCE CREATE SEQUENCE NO
RESOURCE CREATE INDEXTYPE NO
RESOURCE CREATE PROCEDURE NO
8 개의 행이 선택되었습니다.

다음은 Oracle 10g의 CONNECT롤 및 RESOURCE롤에 부여된 시스템 권한

Oracle 9i와 비교할 때, 10g에서는 CONNECT 롤에 CREATE SESSION 시스템 권한만 부여되어 있으며, RESOURCE롤의 경우에도 부여된 시스템 권한이 일부 변경 되었음.

SQL> select * from role_sys_privs where role='CONNECT';
ROLE PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
CONNECT CREATE SESSION NO

SQL> select * from role_sys_privs where role='RESOURCE';
ROLE PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
RESOURCE CREATE SEQUENCE NO
RESOURCE CREATE TRIGGER NO
RESOURCE CREATE CLUSTER NO
RESOURCE CREATE PROCEDURE NO
RESOURCE CREATE TYPE NO
RESOURCE CREATE OPERATOR NO
RESOURCE CREATE TABLE NO
RESOURCE CREATE INDEXTYPE NO

CREATE VIEW 권한과 CREATE SYNONYM 시스템 권한 등이 CONNECT 롤에서 회수되었기 때문에 해당 권한이 필요한 경우에는 다음과 같이 직접 권한을 부여해주어야만 합니다.

grant create view, create synonym to scott;

반응형
Posted by [PineTree]
ORACLE/ADMIN2018. 7. 19. 18:26
반응형

출처
https://t1.daumcdn.net/cfile/tistory/2579F94C555538A01D


문제

listener 시작시 에러 발생



원인

oracle계정에 대한 디렉토리 권한 설정을 해주어서 oracle계정이 쓰기 권한을 갖게 해준다.



해결방법

# cd /var/tmp


# chown oracled .oracle

# chgrp dbad .oracle


or

# chmod 777 .oracle
Also check enough space for /var/tmp/.oracle


aix서버는 /tmp/.oracle 수정

출처: http://yoonkni.tistory.com/entry/listener-시작시-오류TNS12546TNS12560TNS00516 [YooNi]

반응형
Posted by [PineTree]
ORACLE/ADMIN2017. 10. 10. 22:16
반응형

downgrading oracle database to earlier release , 11.2.0.3 to 11.2.0.1 , oracle 11g to 10g


http://orababy.blogspot.kr/2013/08/downgrade-oracle-database-to-earlier.html
Below are the steps for downgrading oracle databases from 11.2.0.3 to 11.2.0.1 and from 11g to 10g

This assumes a) you do not have oracle valult installed. 2) You do not have oracle application express 3) you do not have objects created from fixed tables 4) database is not configured for Label Security 5) this is single instance database

Step 1 : Timzone data types consideration:

A). If you previously had upgraded the database and then used the DBMS_DST PL/SQL package to update the database time zone version, then you must apply the patch for the same time zone file version into the earlier release's Oracle home before downgrading.

As an example scenario, assume that a release 10.2.0.4 database on Linux x64 using DSTv4 had been upgraded to release 11.2.0.2, and DBMS_DST was then run to update this database to DSTv14. Then, before downgrading from release 11.2.0.3 to 10.2.0.4, you need to apply on the release 10.2.0.4 side the DSTv14 patch for 10.2.0.4 for Linux x64. This ensures that your TIMESTAMP WITH TIME ZONE data is not logically corrupted during retrieval.

To find which time zone file version your database is using, run:

SELECT value$ FROM sys.props$ WHERE NAME = 'DST_PRIMARY_TT_VERSION';
B). If you had set the ORA_TZFILE environment variable to the full path name of the timezone.dat file when you upgraded to Oracle Database 11g Release 2 (11.2), then you must unset it if you subsequently downgrade your database.

Two time zone files are included in the Oracle home directory:

◦The default time zone file at
$ORACLE_HOME/oracore/zoneinfo/timezonelrg.dat
◦A smaller time zone file at
$ORACLE_HOME/oracore/zoneinfo/timezone.dat
If you do not unset the ORA_TZFILE variable, then connecting to the database using the smaller time zone file might produce the following errors:
SP2-1503: Unable to initialize Oracle call interface
SP2-0152: ORACLE may not be functioning properly

Step 3:  Connect to sys user from higher ORACLE_HOME and run downgrade scripts

sqlplus / as sysdba
 
SQL> STARTUP DOWNGRADE
 
SQL> drop user sysman cascade [ if you have existing sysman user]
 
SQL> spool downgrade.log
 
SQL> @?/rdbms/admin/catdwgrd.sql
  
SQL>spool off

Step 4:  Start Oracle database service from lower ORACLE_HOME and reload old dictionary

A) Now copy init files and password files from higher ORACLE_HOME to lower ORACLE_HOME
 
B) If you are on windows then delete existing Oracle database service by
 
 oradim -delete -sid SID_NAME from Higher ORACLE_HOME\bin

and create oracle service in lower ORACLE_HOME by 
 
oradim -new -sid ORCL -startmode auto -srvcstart system
 
C) set ORACLE_HOME=LOWER_ORACLE_HOME or export ORACLE_HOME=LOWER_ORACLE_HOME
 
D) sqlplus / as sysdba [ using binaries of OLD_ORACLE_HOME]
 
SQL>spool reload.log

SQL> startup upgrade
 
SQL> @?/rdbms/admin/catrelod.sql
 
Additional steps:
 
If you are downgrading to Oracle Database 11g Release 1 (11.1.0.6), run the xsrelod.sql script:
SQL> @xsrelod.sql
If you are downgrading to Oracle Database 10g Release 1 (10.1.0.5) and you have XDB in your database, then run the dbmsxdbt.sql script:
@dbmsxdbt.sql
SQL>spool off
 

Step 6: Open the database in normal mode

sqlplus / as sysdba
SQL>shutdown immediate
 
SQL> startup
 
SQL>@?/rdbms/admin/utlrp.sql
 
SQL> col comp_name form a50
SQL> select comp_name,version,status from dba_registry ;

-- done--
 
Query from DBA_REGISTRY should show all components to earlier ORACLE_HOME versions.

Below is output from downgrading 11.2.0.3 to 11.2.0.1
Before upgrade i.e before running catdwgrd in higher ORACLE_HOME:

COMP_NAME                                          VERSION                        STATUS   
-------------------------------------------------- ------------------------------ -----------                                                                                                                                                                                                               
OWB                                                11.2.0.1.0                     VALID                   
Oracle Application Express                         3.2.1.00.10                    VALID    
Oracle Enterprise Manager                          11.2.0.3.0                     VALID    
LAP Catalog                                       11.2.0.3.0                    VALID                                                                                                                                                                                                                     
Spatial                                            11.2.0.3.0                     VALID       
Oracle Multimedia                                  11.2.0.3.0                     VALID 
Oracle XML Database                                11.2.0.3.0                     VALID 
Oracle Text                                        11.2.0.3.0                     VALID   
Oracle Expression Filter                           11.2.0.3.0                     VALID  
Oracle Rules Manager                               11.2.0.3.0                     VALID   
Oracle Workspace Manager                           11.2.0.3.0                     VALID  
Oracle Database Catalog Views                      11.2.0.3.0                     VALID 
Oracle Database Packages and Types                 11.2.0.3.0                     VALID     
JServer JAVA Virtual Machine                       11.2.0.3.0                     VALID  
Oracle XDK                                         11.2.0.3.0                     VALID 
Oracle Database Java Packages                      11.2.0.3.0                     VALID    
OLAP Analytic Workspace                            11.2.0.3.0                     VALID                                                                                                                                                                                                                     
Oracle OLAP API                                    11.2.0.3.0                     VALID    


After upgrade:

COMP_NAME                           STATUS      VERSION
----------------------------------- ----------- ----------
Oracle Database Packages and Types  VALID       11.2.0.1.0
Oracle Database Catalog Views       VALID       11.2.0.1.0
JServer JAVA Virtual Machine        VALID       11.2.0.1.0
Oracle XDK                          VALID       11.2.0.1.0
Oracle Database Java Packages       VALID       11.2.0.1.0
Oracle Text                         INVALID     11.2.0.1.0
Oracle XML Database                 VALID       11.2.0.1.0
Oracle Workspace Manager            VALID       11.2.0.1.0
OLAP Analytic Workspace             VALID       11.2.0.1.0
OLAP Catalog                        VALID       11.2.0.1.0
Oracle OLAP API                     VALID       11.2.0.1.0
Oracle Multimedia                   INVALID     11.2.0.1.0
Spatial                             INVALID     11.2.0.1.0
Oracle Expression Filter            VALID       11.2.0.1.0
Oracle Rules Manager                VALID       11.2.0.1.0
Oracle Application Express          VALID       3.2.1.00.1
OWB                                 VALID       11.2.0.1.0

1. Oracle MultiMedia component became VALID after running utlrp.sql
2. For making Oracle Text Valid perform below step in Lower Oracle home:

sqlplus / as sysdba
SQL>shutdown immediate
SQL>startup upgrade
SQL> drop public synonym ctx_filter_cache_statistics;
SQL> drop view ctx_filter_cache_statistics;
SQL>@?/rdbms/admin/catrelod.sql
SQL>shutdown immediate
SQL>startup 
SQL>@utlrp.sql


반응형
Posted by [PineTree]
ORACLE/ADMIN2016. 7. 8. 14:23
반응형

오라클 리스터 프로세느 확인

ps -ef | grep LOCAL=NO | awk '{print $2}'

오라클 리스너 프로세스 한꺼 번에 정리

ps -ef | grep LOCAL=NO | awk '{print $2}' | xargs kill -9

반응형
Posted by [PineTree]
ORACLE/ADMIN2016. 2. 18. 10:09
반응형

Truncate Table From a Remote Database


Truncating from a remote database is not allowed. On a development database environment, developers are in need of truncating certain tables on a regular basis. Delete is allowed over database link, that’s an option. But, that’s a bad example for allowing fragmentation and high water mark over the period of time.

If you try to truncate a table on a remote database, you will get the following error:
ORA-02021: DDL operations are not allowed on a remote database.

As, procedure can be executed over a dblink, so following workaround can be a good option on such scenario.

1.    Create a procedure on Remote Database that can truncate
CREATE OR REPLACE PROCEDURE
Trunc_Rem_Tab(p_table_name VARCHAR2) AS
   v_sql_error_code PLS_INTEGER;
   v_sql_error_message VARCHAR2(512);
BEGIN
   EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || p_table_name;
EXCEPTION
   WHEN OTHERS THEN
      v_sql_error_code := SQLCODE;
      v_sql_error_message := SQLERRM(v_sql_error_code);
      DBMS_OUTPUT.ENABLE(5000);
      DBMS_OUTPUT.PUT_LINE('OTHER ERROR');
      DBMS_OUTPUT.PUT_LINE(v_sql_error_message);
END Truncate_Remote_Table;

2.    Execute the procedure from local database.
BEGIN
   Trunc_Rem_Tab@REMOTE_LINK('TEST');
END;


반응형
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/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]
    ORACLE/ADMIN2014. 12. 4. 10:27
    반응형
    DB를 사용하다 보면 batch작업이나 long query를 사용하는 경우가 있는데, 이럴때 장시간 반응이 없어서 pc의 전원을 강제로 꺼버리거나 작업도중 정전이 발생할 수도 있는데, 이럴 경우 세션은 비정상적으로 종료가 되어 세션이 정리가 되지 않고 남아 있게된다.

     

    만약 이러한 세션이 다수가 되면 정상적인 다른 세션들에게 자원배분(메모리등)이 정상적으로 되지 않거나 프로세스 초과 에러 메세지가 발생할 수 있다. 이렇게 실제 사용하지 않은 세션들을

    DEAD SESSION(죽은 세션)이라고 하는데 이들을 정리할 필요가 있다.

     

    KeepAlive 란 Idle TCP/IP Connection 의 Time out 기능을 말한다.

    TCP/IP 기반으로 remote 로 연결된 상태에서 클라이언트의 갑작스런 리부팅이나 스위치 Off 의 경우 해당 연결을 서버에서 Closing 하지 못하게 된다.


    이것은 TCP/IP의 제한인 것이지 오라클의 문제는 아니다.
    이 때 KeepAlive가 정확하게 configure되어 있다면 좀 더 빨리 Dead connection을 발견하고 빨리 Closing할 것이다.
    TCP/IP 에 관련된 것이므로 KeepAlive를 각 플랫폼 별로 지정하는 방법이 모두 틀리다.

    예를들면 유저가 PC 에서 Unix Oracle Server로 연결 후 실수로 다음 쿼리 문을 실행했다.

     

    SQL> select * from largetable, greatetable, verybigtable;

     

    적게는 수십분, 많게는 몇시간이 걸릴 작업이라면 유저는 쿼리를 인터럽트하기 보다 reset 버튼을 누르게 될 것이다. 이때 클라이언트 프로세스는 없어졌지만 백그라운드 서버 프로세스는 계속

    running 중일것이다.
    이런 현상은 수시로 일어날 수 있다. 또한 당연한 것이다.

    유저가 사용을 잘못하는 것이기 때문이다.

    하지만 SQL*NET 2.1 이상에서 Dead-Connection-Detection 이라 불리는 기능을 지원한다.

    이것은 곧 KeepAlive 를 지정할 수 있는 기능이다.
    반드시 서버 사이드의 $ORACLE_HOME/network/admin/sqlnet.ora 파일에 다음의 파라미터

    지정해야 한다. 클라이언트에는 지정해봐야 전혀 소용이 없다.

     

    sqlnet.expire_time = 3   (단위 : 분)

     

    Netware를 제외한 모든 Platform, Protocol에서 지원이 된다.

    # Windows NT 에서 KeepAlive 를 지정하는 방법(타 플랫폼은 제외)

    Regedt32 를 실행한다.

    레지스트리에서

    HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters

    까지 이동한다.
    여기서 키 추가가 아닌 값 추가를 한다.

    파라미터는  KeepAliveTime (REG_DWORD) 로 입력한다.

    값은 Decimal  -> 180000 (for example = 3 minutes) 으로 지정한다.

    반응형
    Posted by [PineTree]
    ORACLE/ADMIN2014. 11. 12. 14:16
    반응형
    Windows 
    C:\> cd \oracle\ora92\network\log 
    C:\oracle\ora92\network\log> lsnrctl set log_status off 
    C:\oracle\ora92\network\log>
    리스너로그파일 덮어쓰기로삭제
    rename listener.log listener.old 
    C:\oracle\ora92\network\log> lsnrctl set log_status on 



    UNIX 
    % cd /u01/app/oraclein/product/9.2.0/network/log 
    % lsnrctl set log_status off 
    % mv listener.log listener.old 
    % cp /dev/null listener.log
    % lsnrctl set log_status on



    반응형
    Posted by [PineTree]