반응형

오라클 SR 처리를 위해

아래와 같은 정보를 수집하면 편하다...

ulimit -a : 메모리 정보

uname -a : OS 정보

adrci : 문제가 발생한 내역 압축하기 (ips 명령 사용)

opatch : 현재 패치 내역 조회하기



testdb01:/oracle_test] ulimit -a

time(seconds)        unlimited

file(blocks)         unlimited

data(kbytes)         2000000

stack(kbytes)        8192

memory(kbytes)       unlimited

coredump(blocks)     4194303

testdb01:/oracle_test] uname -a

HP-UX testdb01 B.11.23 U ia64 1770507378 unlimited-user license



testdb01:/tmp] adrci


ADRCI: Release 11.1.0.7.0 - Production on Sat Jan 13 09:25:50 2018


Copyright (c) 1982, 2007, Oracle.  All rights reserved.


ADR base = "/oralog_test/dblog"

adrci> show problem


ADR Home = /oralog_test/dblog/diag/rdbms/testdb/testdb1:

*************************************************************************

PROBLEM_ID           PROBLEM_KEY                                                 LAST_INCIDENT        LASTINC_TIME                             

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

14                   ORA 600 [kjuscv]                                            1630464              2018-01-12 22:36:29.336735 +09:00       

13                   ORA 600 [kjucvl:!busy]                                      1630463              2018-01-12 22:36:25.059486 +09:00         

14 rows fetched


adrci> show incident


ADR Home = /oralog_test/dblog/diag/rdbms/testdb/testdb1:

*************************************************************************

INCIDENT_ID          PROBLEM_KEY                                                 CREATE_TIME                              

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

1630464              ORA 600 [kjuscv]                                            2018-01-12 22:36:29.336735 +09:00       

1630463              ORA 600 [kjucvl:!busy]                                      2018-01-12 22:36:25.059486 +09:00       

 

50 rows fetched


adrci> ips pack problem 13 in /tmp

Generated package 9 in file /tmp/ORA600kju_20180113092623_COM_1.zip, mode complete

adrci> ips pack problem 14 in /tmp 

Generated package 10 in file /tmp/ORA600kju_20180113092815_COM_1.zip, mode complete

adrci> ips pack incident 1630464 in /tmp

Generated package 11 in file /tmp/ORA600kju_20180113092948_COM_1.zip, mode complete

adrci> ips pack incident 1630463 in /tmp

Generated package 12 in file /tmp/ORA600kju_20180113093112_COM_1.zip, mode complete


opatch lsinventory

반응형
반응형

pctfree 

 

 a) 수정 시 늘어나는 데이타를 수용하기 위한 공간이다.     

 b) 디풀트는 10이나 빈번히 수정이 되면서 null 이었다가 데이타가 채워지는 경우는 

   이 값을 약 20 혹은 30 까지 크게 설정한다.  

PCTFREE(20%) : 블록은 80% 찰때까지 행을 삽입할수 있고 20%는 기존 행 갱신할경우를 위해
빈영역으로 남겨둔다. default 10%

 

pctused 

 

재사용되기 위해 필요한 블럭의 사용량을 설정한다.디폴트는 60이나 입력,

삭제가 자주 발생하지 않는 경우는 90 정도로 큰 값을 설정하고,

수정작업이 자주 발생하면서 로우 사이즈가 증가할 때에는 40 정도로 낮은 값을 설정한다.

PCTUSED(60%) : 사용된 영역이 40%보다 작아져야 새로운 행을 삽입할수 있다.

 

freelist 

 

 a) insert 작업 시 미리 사용 가능한 블럭을 리스트하고 있다가 할당하는 곳이다.     

 b) insert 작업이 많이 발생하는 테이블이나 인덱스에서는 이 값을 증가시켜 빈 블럭을 

   할당 받기 위해 대기하는 일이 없도록 한다.

 

freelists 와 Free List Group(OPS에서만 사용됨)은

주로 OPS에서 쓰여집니다.

늘리는 것은 결과치가 1%이하나 적당한 값이 나올때까지 허용하는 한도내에서 조금씩 늘립니다.

 

그럼 이제부터 쉽게 설명해 보겠습니다.

 

PCTUSED, PCTFREE 모두 Block에 대해서 지정하는 옵션 파라미터입니다.
오라클 데이타 입출력의 최소 단위는 Block인 것은 알고 계시리라 생각합니다.
PCTFREE는 update로 인해 기존 row가 커질 경우를 대비해서 예약해두는 공간입니다.
주로 varchar2 같이 가변 길이 자료형의 경우 업데이트를 통해서 row가 커질 수 있습니다. 그래서 update로 인해 자료 사이즈가 커질 수 있는 경우에는 pctfree를 크게 주라고 이야기합니다. 너무 크게 주면 한 블록에 들어갈 수 있는 row 수가 적어지므로 비효율적이겠지요.

비유를 해볼까요? 우리가 술잔에 술을 따를 때 넘치게 따르지 않습니다. 어느 정도 여유를 두고 따르죠.
그리고 애기들 옷살 때도 몸에 꼭맞는걸 사는게 아니라 약간 큰걸 사죠. 그래야... 애기가 커서도 입을 수 있으니까요. 

PCTUSED는 데이타를 삭제했을 경우에 필요한 파라미터입니다.
PCTFREE가 10%인 블록에 row를 계속해서 insert 해서 90%까지 차게되면 이 블록은 더 이상 insert를 하지 않고 다음 블록으로 넘어가게 됩니다. 그렇다면 다시 블록에 row를 delete로 삭제하면, 이 블록이 바로 재활용이 될까요? 아닙니다. 언제 다시 Freelist로 등록되어서 다음 insert 시 사용될 수 있을지를 지정하는 것이 pctused입니다.

말이 어려운 것 같아도 비유를 해봅시다.
앞서 비유와 같이 술잔을 10% 남겨두고 90%까지 채웠습니다. 
(PCTFREE 10%)
그런데 같이 술마시던 친구가 40%를 남겨두고 한모금에 마셨습니다.
그럼 한잔을 더 따라줘야 해야할까요? 말아야할까요?
어느 시점에서 술을 더 따라줘야할지 정해주는게 PCTUSED입니다.
PCTUSED가 40%라면 40% 이하로 친구가 술잔을 비우면 더 따라줘야합니다. (즉, Block을 delete 해서 사용량이 40% 이하로 내려갔을 때...)
한국 사람은 이 수위가 더 낮지요. 첨잔을 금기시하는 음주 문화라... ^^;
한국 사람의 경우 PCTUSED가 10%쯤 될까요? 거의 바닥이 보이게 되면 그제서야 "친구 한잔 더 받게"하면서 따라주죠.

그럼 Freelist는 뭘까요?
위에선 2명이서 마셨지만... 이제 동창회 모임이라서 20명이 한꺼번에 마십니다. 기억력이 나쁜 저는 어느 친구의 잔이 비었는지 목록이 필요해집니다. 즉, insert 의후보로 쓰일 수 있는 가용한 Block의 목록을 가지고 있는게 freelist입니다. 
pctused 이하로 술잔이 비워진 친구들의 목록을 기록해두는 장부라고 해두죠.
마지막으로 freelist에 가용한 블록이 전혀 없다면 어떻게 될까요?
그러면 extents를 추가로 더 할당받아야하겠죠. 그리고 다른 새로운 블록을 할당받아야합니다. HWM(High Water Mark)도 올라가겠지요.

그럼 PCTUSED와 PCTFREE 설정의 기준을 간략히 말하자면..


1. 오로지 insert만 되는 테이블 :  이 경우에는 PCTFREE를 아주 낮게 설정하는게 한 블록을 꽉꽉 채울 수 있으므로 더 효율적이겠지요.
전혀 업데이트가 없다면 PCTFREE 0%도 가능합니다.

2. insert와 delete가 반복되는 테이블 : 위에서는 insert만 이루어졌지만 이번에는 delete 가 됩니다. 그러면 pctfree  도 낮게 설정되어야하겠지만 pctused도 낮게 설정하는게 좋습니다.
pctused가 높다는 이야기는 블록의 데이타가 조금만 delete되어도 바로 freelist에 등록되어서 다음 insert의 후보로 사용된다는 이야기고...
왔다갔다하는 빈도수가 잦아지므로 좋지 않습니다. 

3. update 로 인해 row가 커질 수 있는 경우 : 위에서 언급한 바와 같이 pctfree를 Row migration이 안생기는 수준까지 키워주는게 좋습니다.

PCTUSED가 Delete로 인해서 40% 이하로 떨어지면 Freelist에 등록이 됩니다. 즉, 이 블록은 이제 재사용해도 좋다라는 허가가 떨어집니다.
이제 insert를 하면 다시 PCTFREE 10%를 남겨놓고 90%까지는 insert가 가능해집니다.

9i부터는 ASSM(Automatic Segment Space Management) 기능을 통해서 PCTUSED와 FREELIST를 없앴습니다.
(물론 이전처럼 사용하실 수도 있습니다만...)
어쨌거나 ASSM에서는 빈블록의 목록을 Freelist가 가지고 있는게 아니라... 세그먼트의 처음 3블록이 bitmap으로 가지고 있습니다.
즉, freelist를 일일이 뒤져보지 않아도 bitmap만 보면 그 블록이 얼마나  찼는지 알 수가 있습니다.
그래서 ASSM기능을 사용할 경우 PCTUSED와 Freelist는 사용하실 수가 없으며 PCTFREE만 DBA가 지정해주면 됩니다.
freelist를 뒤지는건 순차적인 작업이므로 동시에 DML 되는게 많다면 상당한 오버헤드였거든요.
특히 다수의 노드가 하나의 스토리지를 바라다보는 RAC 클러스터 같은 환경에선 ASSM이 Manual 에 비해서 35% 정도 빠르다는 오라클 내부 벤치마크 결과가 있습니다.
저는 ASSM을 권장하는 편입니다. Freelist, pctused를 제대로 설정한다는건 경험많은 DBA에게도 쉽지 않은 일이고... freelist를 뒤지는 오버헤드도 무시할 수가 없기 때문입니다.
ASSM 기능을 사용하시려면 9iR2 버젼에 9.2.0.4 이상의 패치셋을 반드시 적용하신 후 사용하시기 바랍니다.
(LOB Type 의 경우 corruption 문제가 있고 bitmap index관련해서도 버그가 리포트 되었습니다.)



반응형
반응형

-- PENDING OFFLINE 걸린 SEGMENT 조회
  select name, xacts ACTIVE_TRANSACTIONS FROM
  v$rollname, v$rollstat where status = 'PENDING OFFLINE' and v$rollname.usn = v$rollstat.usn;
 
  -- 특정 ROLLBANK 네임으로 검색
  SELECT S.SID
       , S.USERNAME
    FROM V$ROLLNAME R
       , V$TRANSACTION T
       , V$SESSION S
   WHERE R.NAME = '_SYSSMU26_3785803917$'
     AND T.XIDUSN = R.USN
     AND S.SADDR  = T.SES_ADDR;
    
    
  -- 전체 ROLLBACK 검색 (나온 SID를 KILL 해주면 정상 복구)
  SELECT S.SID
       , S.USERNAME
    FROM V$ROLLNAME R
       , V$TRANSACTION T
       , V$SESSION S
   WHERE R.NAME IN
         (
            select name FROM
                v$rollname, v$rollstat where status = 'PENDING OFFLINE' and v$rollname.usn = v$rollstat.usn
         )
     AND T.XIDUSN = R.USN
     AND S.SADDR  = T.SES_ADDR
     ;
    
  -- ROLLBACNK 상태 검색 
  select * from v$rollstat;    
 
  -- 특정 ROLLBACK 세그먼트 ONLINE
  alter rollback segment "_SYSSMU16_678252039$" online;
 
  -- 롤백 세그먼트 rbs 테이블 스페이스 크기 확인
  SELECT FILE_NAME, BYTES
    FROM DBA_DATA_FILES
   WHERE TABLESPACE_NAME = 'RBS';
  
 
 
  SELECT * FROM DBA_ROLLBACK_SEGS;
 
  -- 언두를 1G 추가 
  alter tablespace UNDOTBS1 add datafile '/u02/data/undotbs2.dbf' size 1000M;

반응형
반응형

分类: Linux


修改时间 21-NOV-2011     类型 BULLETIN     状态 PUBLISHED 

Applies to:

Oracle Server - Enterprise Edition - Version: 8.1.5.0 to 11.1.0.6 - Release: 8.1.5 to 11.1
Information in this document applies to any platform.

Purpose

The purpose of this bulletin is to assist support analysts in understanding and 
resolving the stranded dba_2pc_entries.

Scope and Application

The intended audience are support analysts having good experience on distributed
databases.

How To Resolve Stranded DBA_2PC_PENDING Entries


Contents

1. Problem Description
2. Solutions
2.1 Dba_2pc entries without a corresponding transaction
2.2 Distributed transaction without corresponding dba_2pc entries
2.3 How to PURGE the DISTRIBUTED transaction in PREPARED state, when COMMIT
or ROLLBACK FORCE hangs ?, where we have entries for both Distributed
transaction and dba_2pc entries.

1. Problem Description:
=======================

As a result of a failed commit of a distributed transaction, some entries can
be left in dba_2pc views, i.e. dba_2pc_pending and dba_2pc_neighbors. The RECO
process checks these views to recover the failed txn. However, in some cases
RECO cannot perform. the recovery. One cause is that all sites involved in the
transaction not being accessible at the same time. Another cause is dba_2pc
views being inconsistent with the transaction table, which is the topic of
this article. This cause can further be classified as follows:

1. dba_2pc views have entries for a non-existent distributed transaction

2. There is a distributed transaction for which there are no entries in
dba_2pc views

3. How to PURGE the DISTRIBUTED transaction in PREPARED state, when COMMIT
or ROLLBACK FORCE hangs ?, where we have entries for both Distributed
transaction and dba_2pc entries.

Solutions to each subclass is provided in the rest of the article.


2. Solutions:


2.1 Dba_2pc entries without a corresponding transaction


In this case dba_2pc views show distributed transactions but there are no txns
in reality. If the state of the transaction is committed, rollback forced or
commit forced then this is normal and it can be cleaned up using

dbms_transaction.purge_lost_db_entry

However, if the state of the transaction is PREPARED and there is no entry in
the transaction table for it then this entry can be cleaned up manually as
follows:



set transaction use rollback segment SYSTEM;
delete from sys.pending_trans$ where local_tran_id = ;
delete from sys.pending_sessions$ where local_tran_id = ;
delete from sys.pending_sub_sessions$ where local_tran_id = ;
commit;

Example:
--------
The following query reports a dist. txn. in prepared state
select local_tran_id, state from dba_2pc_pending;
LOCAL_TRAN_ID STATE
---------------------- ----------------
1.92.66874 prepared

Given that a transaction id is composed of triple,
'1.92.66874' is located in rollback segment# 1. To find out the list of
active transactions in that rollback segment, use:

SELECT KTUXEUSN, KTUXESLT, KTUXESQN, /* Transaction ID */
KTUXESTA Status,
KTUXECFL Flags
FROM x$ktuxe
WHERE ktuxesta!='INACTIVE'
AND ktuxeusn= 1; <== this is the rollback segment#

no rows selected

It is not possible to rollback force or commit force this transaction.



rollback force '1.92.66874';

ORA-02058: no prepared transaction found with ID 1.92.66874

Hence, we have to manually cleanup that transaction:



set transaction use rollback segment SYSTEM;

delete from sys.pending_trans$
where local_tran_id = '1.92.66874';

delete from sys.pending_sessions$ where local_tran_id = '1.92.66874';

delete from sys.pending_sub_sessions$ where local_tran_id = '1.92.66874';

commit;


2.2 Distributed transaction without corresponding dba_2pc entries

In this case dba_2pc views are empty but users are receiving distributed txn
related errors, e.g. ORA-2054, ORA-1591. Normally such a case should not appear
and if it is reproducible a bug should be filed. Here is the list of several
alternative solutions that can be used in this case:

a. Perform. incomplete recovery
b. Truncate the objects referenced by that transaction and import them
c. Use _corrupted_rollback_segments parameter to drop that rollback segment
d. Insert dummy entries into dba_2pc views and either commit or rollback
force the distributed transaction

The first three solutions are discussed in Backup and Recovery manuals and in
the notes referred above. In the 4th solution a dummy entry is inserted into
the dictionary so that the transaction can be manually committed or rolled back.
Note that RECO will not be able to process this txn and distributed txn recovery
should be disabled before using this method. Furthermore, please take a BACKUP
of your database before using this method.

The stranded entries is the cause of ORA-01591 so we need to
clear the stranded entries by purging them using

execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('transanction_id');



The following example describes how to diagnose and resolve this case. Suppose
that users are receiving



ORA-1591: lock held by in-doubt distributed transaction 1.92.66874

and the following query returns no rows:



select local_tran_id, state from dba_2pc_pending
where local_tran_id='1.92.66874';

no rows selected

Furthermore querying the rollback segment shows that 1.92.66874 remains in
prepared state



SELECT KTUXEUSN, KTUXESLT, KTUXESQN, /* Transaction ID */
KTUXESTA Status,
KTUXECFL Flags
FROM x$ktuxe
WHERE ktuxesta!='INACTIVE'
AND ktuxeusn= 1; /* <== Replace this value with your txn undo seg#
Which is displayed in the first part of
the transaction ID */

KTUXEUSN KTUXESLT KTUXESQN STATUS FLAGS
---------- ---------- ---------- ---------------- ------------------------
1 92 66874 PREPARED SCO|COL|REV|DEAD


Trying to manually commit or rollback this transaction



commit force '1.92.66874';

ORA-02058: no prepared transaction found with ID 1.92.66874

raises ORA-02058 since dba_2pc views are empty. In order to use commit force or
rollback force a dummy record should be inserted into pending_trans$ as follows:



alter system disable distributed recovery;

insert into pending_trans$ (
LOCAL_TRAN_ID,
GLOBAL_TRAN_FMT,
GLOBAL_ORACLE_ID,
STATE,
STATUS,
SESSION_VECTOR,
RECO_VECTOR,
TYPE#,
FAIL_TIME,
RECO_TIME)
values( '1.92.66874', /* <== Replace this with your local tran id */
306206, /* */
'XXXXXXX.12345.1.2.3', /* These values can be used without any */
'prepared','P', /* modification. Most of the values are */
hextoraw( '00000001' ), /* constant. */
hextoraw( '00000000' ), /* */
0, sysdate, sysdate );

insert into pending_sessions$
values( '1.92.66874',/* <==Replace only this with your local tran id */
1, hextoraw('05004F003A1500000104'),
'C', 0, 30258592, '',
146
);

commit;

commit force '1.92.66874';


If commit force raises an error then note the errormessage and execute the
following:


delete from pending_trans$ where local_tran_id='1.92.66874';
delete from pending_sessions$ where local_tran_id='1.92.66874';
commit;
alter system enable distributed recovery;

Otherwise run purge the dummy entry from the dictionary, using

alter system enable distributed recovery;
connect / as sysdba
COMMIT;
Use following query to retrieve the value for such _smu_debug_mod parameter:

col Parameter for a20
col "Session Value" for a20
col "Instance Value" for a20

SELECT a.ksppinm "Parameter",b.ksppstvl "Session Value",c.ksppstvl "Instance Value"
FROM x$ksppi a, x$ksppcv b, x$ksppsv c
WHERE a.indx = b.indx AND a.indx = c.indx AND a.ksppinm = '_smu_debug_mode'
/


-- set it temporarily to 4:


alter system set "_smu_debug_mode" = 4; /* if automatic undo management
is being used */
-- in 9.2x alter session can be used instead.

commit; /* this is to prevent the ORA-01453 in purge_lost_db_entry call */

exec dbms_transaction.purge_lost_db_entry( '1.92.66874' );

SQL> commit;

SQL> alter system set "_smu_debug_mode" = ;

SQL> commit;



2.3 How to PURGE the DISTRIBUTED transaction in PREPARED state, when COMMIT
or ROLLBACK FORCE hangs ?, where we have entries for both Distributed
transaction and dba_2pc entries.



ORA-01591: lock held by in-doubt distributed transaction 44.88.85589

The row exist from dba_2pc_pending & Rollback segment



SQL> SELECT LOCAL_TRAN_ID,STATE FROM DBA_2PC_PENDING;

LOCAL_TRAN_ID STATE
----------------- -----------
44.88.85589 prepared


SQL> SELECT KTUXEUSN, KTUXESLT, KTUXESQN, /* Transaction ID */
KTUXESTA Status,
KTUXECFL Flags
FROM x$ktuxe
WHERE ktuxesta!='INACTIVE'
AND ktuxeusn= 44; /* <== Replace this value with your txn undo seg#
Which is displayed in the first part of
the transaction ID */

KTUXEUSN KTUXESLT KTUXESQN STATUS FLAGS
---------- ---------- ---------- ---------------- ------------------------
44 88 85589 PREPARED SCO|COL|REV|DEAD


SQL> Commit force 44.88.85589;
SQL> rollback force 44.88.85589;


Executing COMMIT or ROLLBACK FORCE hangs

The wait event is ""free global transaction table entry"


Purging the transaction should fail with below error:



EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('44.88.85589');
BEGIN DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('44.88.85589'); END;

*
ERROR at line 1:
ORA-06510: PL/SQL: unhandled user-defined exception
ORA-06512: at "SYS.DBMS_TRANSACTION", line 94
ORA-06512: at line 1



Solution:
--------

You have to implement both the solution :

2.1 Dba_2pc entries without a corresponding transaction
2.2 Distributed transaction without corresponding dba_2pc entries

1.

delete from sys.pending_trans$ where local_tran_id = '44.88.85589';
delete from sys.pending_sessions$ where local_tran_id = '44.88.85589';
delete from sys.pending_sub_sessions$ where local_tran_id ='44.88.85589';
commit;


2. Now insert the dummy record as explained in section:

2.2 Distributed transaction without corresponding dba_2pc entries
commit;

3. Commit force '44.88.85589'

4. Purge the transaction:

exec dbms_transaction.purge_lost_db_entry('44.88.85589');


Note:126069.1 Manually Resolving In-Doubt Transactions: Different Scenario's

Still have questions ?

To discuss this information further with Oracle experts and industry peers, we encourage you to review, join or start a discussion via My Oracle Support Streams and Distributed Database Community


References

NOTE:100664.1 - Master Note for Troubleshooting Oracle Managed Distributed Transactions
NOTE:126069.1 - Manually Resolving In-Doubt Transactions: Different Scenarios


출처 : http://blog.itpub.net/38267/viewspace-713103/


반응형
반응형


1. cpu 및 실행 시간의 plan을 아래와 같이 수행 후


explain plan for

          select * from dual;


2. 해당 plan 내역 조회


select * from table(dbms_xplan.display);


time(수행시간)이 나오지 않고


plan_table is old version 


에러가 뜨면 나타 나지 않을 때는


조치 방법

1. 기존 테이블 삭제

    $> DROP TABLE PLAN_TABLE;


2. sqlplus 서버에 접속해서


    $> @?$ORACLE_HOME/rdbms/admin/utlxpls.sql 실행


완료


2에서 오류 발생시 조치 방법


# > sqlplus '/as sysdba' 접속


$> SELECT DBMS_METADATA.GET_DDL('TABLE','PLAN_TABLE$','SYS') FROM DUAL;


위의 query 나온 결과에서


SYS 와 $ 표시를 삭제하고


해당 계정에서 실행하면 새로운 PLAN 테이블이 생성되고


time도 정상적으로 나온다. 



* EXPLAIN PLAN 시 이름 주고 조회하기


EXPLAIN PLAN SET STATEMENT_ID='TSH' FOR

SELECT *

FROM   emp e, dept d

WHERE  e.deptno = d.deptno

AND    e.ename  = 'SMITH';


SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL, 'TSH', 'ALL', NULL));


1 번째 인자 : PLAN TABLE 명으로 NULL 명시해도 됨(기본 사용)

2 번째 인자 : EXPLAIN PLAN SET STATEMENT_ID 에서 사용한 이름 (여러명이 동시 사용시에는 이름이 나와야 정확함) -> NULL은 마지막 값 조회

3. 번째 인자 : DBMS_XPLAN.DISPLAY 에서 상세하게 볼 때 사용하는 옵션으로 TYPICAL, ALL, BASIC 등이 있음



참고 : http://web-dev.tistory.com/662


참고 사이트 : http://stackoverflow.com/questions/25613444/how-to-create-explain-plan-table-on-amazon-rds-database

반응형
반응형


오라클에서 


EXP -> IMP 하는 방식에는


exp 테이블 스키마 추출

exp id/passwd file=./temp.dmp log=./log.log compress=n rows=n


 imp id/passwd indexfile=create.sql full=y 옵션을 주어


입력하지는 않고 create.sql을 만들어


스크립트 형태로 수동으로 돌릴 수 있다.


다만,


그냥 import 했을 때는


커져버린 초기값을 만나게 되는데...


이것을 수정하는 방법은


initial, next 값 수정!


- 테이블 스페이스 생성시 local로 생성해야만 함 ~

확인 쿼리

SELECT initial_extent, next_extent, pct_increase,

            extent_management, allocation_type

     FROM DBA_TABLESPACES

     WHERE tablespace_name=upper('테이블스페이스명');


- initial 값 수정


1. 분석하기 (emp1 테이블 분석)


analyze table emp1 compute statistics;


2. 분석을 기준으로 사용하지 않는 불럭 초기화

alter table emp1 deallocate unused keep 0;


3. 블럭 사이즈  확인 하는 법

select table_name, initial_extent from user_tables;


** 다른 방법


1. alter and move the table to another tablespace. e.g. (다른 테이블 스페이스로 옮기기)

ALTER TABLE MY_TABLE MOVE TABLESPACE ANOTHER_TABLESPLACE STORAGE (INITIAL 2M NEXT 2M PCTINCREASE 0);

2. alter and move the table back to the original tablesace with the desired initial extent size, e.g. (원 테이블 스페이스에 옮기기)

ALTER TABLE MY_TABLE MOVE TABLESPACE ORIGINAL_TABLESPACE STORAGE (INITIAL 256M NEXT 2M PCTINCREASE 0);



- next 값 수정

위와 동일하며


alter table emp1 storage(next 10M);


으로 가능함 

반응형

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

도스 모드 sql 실행 bat 배치 만들기  (0) 2016.03.25
ndd 설정하기  (0) 2013.09.23
오라클 미디어 팩 신청하기  (0) 2013.01.31
one port multi listener 설정 하기  (0) 2012.12.24
DBMS_XPLAN 정보 조회  (0) 2012.09.07
반응형


후암..


잘 다니던 회사를 퇴직하고


오라클이 필요할때... -_-....


어렵다.. 구하기 어렵다..


다행히도 otn 정보는 아직 유효하여


참고 사항을 올린다. ~


1. 오라클 사이트 (https://support.oracle.com ) 방문하여 로그인한다.

   : 예전회사는 OTN 계약을 별도로 했었다... -_-...


 - 로그인 후 우측 상단에 Contact US 를 눌러 아래 화면을 띄운다.

    ※ 참고로 한글 언어셋으로 설정시 안된다는 소문(?)을 들어 영문으로 설정하고 시작하였다.

    Problem Summary : DVD

    => 문제점을 요약하면 : DVD  (ㅋㅋㅋ -_-..)

    Support Identifier : 현재 유효한 8자리 ID값이 출력됨. (우측 상단에 Next를 눌러 넘어감 : 총 3단계!)






 - 2단계 각 화면들이다.

    Problem Type : Software & OS Media Requests

    문제 유형 : 소프트웨어와 OS 미디어 요청


    1) IS this a physical software media shipment request?

       이것은 물리적 소프트웨어 미디어 수송 요청인가?

       -> 난 물리적으로 받고 싶다 -_- Yes ~

    

    2) Which Product line does the media request involve?

        Oracle Database

        미디어 포함 요청에 어떤 제품 라인을 할것인가?

        난 오라클 10g 이므로 Oracle Database

 

    3) Are you requesting a required password for a path download?

        NO

        다운로드 경로를 위한 패스워드가 필요한 요청인가?

        다운로드 한 것에 대한 암호를 설정하는 것 같은데.. 필요 없으므로.. NO.... (잘 모르겠음 -_- ㅋ)




   4) Are you requesting a patch on CD/DVD?

      NO

      당신은 CD/DVD의 패치가 필요한가?

      아니요 


      난 설치본이 필요함 -_-... 패치는 otn에서 걍 받을꺼임...


   5) 4번항목의 패치 필요한 내역을 기재하는 것인데.. 없으므로 난 스킵 (*가 아닌것은 필수 아님)

   6) List the product name and version requested for physical media shipment?( EX: E-business Suite 12.1.1...)

       Oracle Database 10G / Oracle Client 10G

       물리적 미디어 배송을 위한 제품 이름과 버전 목록을 요청하라.

       오라클 데이터베이스 서버 10g와 오라클 클라이언트 10G

   7) What is the OS/platform for the requested media?(EX : Windows 32bit. ....)

       IBM Aix Power 32,64 bit / hp up risc 32/64 bit

       요청한 미디어의 OS(운영체제)와 Platform(플렛폼)은 무엇인가?

      IBM Aix Power 시리즈의 32,64 bit와

      HP ux risc 32/64 비트




 8) Are any language required for this shipment?

     YES

     이번 배송을 위한 어떠한 언어라도 괜찮은가?

  11) Ship to Contact Name :

      배송을 위한 이름 : 

       


12. 배송을 위한 전화번호

     82(국제번호)-10(010이라도 0을 뺌)-xxxx-xxxx


13. 배송을 위한 이메일 주소

     aaa@naaa.aaa


14. 회사명 :



15. 주소1 :

     실제 주소를 알면 -> 다음, 네이버등을 통해 주소 영문 변환으로 검색 뒤 ...

                                  한글 주소를 영문으로 변환하여 붙여넣기 한다.






위와 같이 입력뒤 우측 상단에 Next를 누른다.


아래는 최종 단계인 Contact 확정 단계로


Primary Contact : 이름

Phone Numbers : 전화번호

Email-Address : 이메일 주소

Coontact Method : WEB (웹상에 아래 조회항목을 통해 확인 가능할듯...)

(영어가 약해서 전화오면 챙피해서 죽어버릴지도 모름 -_-....)




위와 같은 최종 확인 뒤 우측 상단에 Submit를 눌러 확정함.





위와 같이 정상 Submit 하고 난뒤 상태를 조회하거나 WEb를 통한 메시지를 확인하고자 할 때는



상단에 Service Requests 메뉴를 클릭뒤


중간부분에 Contact Us Service Reqests 항목에 조회된다.

후암... 간략하게 정리해 봤다...


반응형
반응형

하나의 포트로 여러 리스너 설정하기...


listener.ora


일부 서버들에서 되고 안되고 문제는 SID_LIST_LISTENER 설정에서 SID_DESC 설정 정보가 없을 때 발생함... (랜덤 -_-ㅋ)


 # listener.ora Network Configuration File: /oracle/product/10g/network/admin/listener.ora

# Generated by Oracle configuration tools.


SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME = /oracle/product/10g)

      (PROGRAM = extproc)

    )

    (SID_DESC =

      (SID_NAME = SEVSEDEV)

      (ORACLE_HOME = /oracle/product/10g)

    )

    (SID_DESC =

      (SID_NAME = SEVPTDEV)

      (ORACLE_HOME = /oracle/product/10g)

    )

  )


LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.86)(PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

    )

  )


SID_LIST_LISTENER_SEVPTDEV =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = SEVPTDEV)

      (ORACLE_HOME = /oracle/product/10g)

    )

  )


LISTENER_SEVPTDEV =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.86)(PORT = 1521))

    )

  )


SID_LIST_LISTENER_SEVSEDEV =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = SEVSEDEV)

      (ORACLE_HOME = /oracle/product/10g)

    )

  )


LISTENER_SEVSEDEV =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.86)(PORT = 1521))

    )

  )


 sqlnet.ora


# sqlnet.ora Network Configuration File: /oracle/product/10g/network/admin/sqlnet.ora

# Generated by Oracle configuration tools.

SQLNET.INBOUND_CONNECT_TIMEOUT=0 





반응형
반응형

10g에 추가된 Tuning Advisor


SQL ID 와 Begin SNAP 부분은 addm 을 통해 조회하여 입력하는 것이 좋음.(자동 생성 SH은 비밀글 참조...)


출처 : http://blog.daum.net/onjshop/175


★★ www.oraclejava3.co.kr 에서 더욱 유용한 정보를 확인하실 수 있습니다. ★★ 
(분당정자점은 양재, 강남에서 15분 거리에 있습니다. ^^)

Automatic SQL Tuning in Oracle Database 10g(SQL Tuning Advisor) 

이번 강좌에서는 오라클 10g의 새 특징인 자동 SQL 튜닝기능에 대해 알아 보도록 하겠습니다. 

Normal Mode에서 오라클 옵티마이저는 아주 짧은 시간에 최적의 실행 계획을 계산해 내야 합니다. 그러므로 항상 최선의 실행 계획을 만들어 낼 수는 없다 이겁니다~^^ 

Oracle 10g는 옵티마이저가 튜닝 모드에서 실행될 수 있도록 하여 추가적인 통계 정보를 모아 추후에는 튜닝된 최적의 실행 계획을 만들어 낼 수 있도록 지원 합니다. 물론 이러한 프로세스는 하나의 SQL문장에 대해 몇 분이 걸릴지도 모르므로 리소스를 많이 잡아 먹는 경향이 있습니다. 

튜닝모드에서 옵티마이저가 하는 일에 대해 정리해 볼까요? 

- 통계 분석(statistics Analysis) : 옵티마이저는 오래전에 만들어진 통계 정보나 또는 통계 정보가 없는 부분에 대해 통계 정보를 생산 하는 것을 권고 하며 SQL Profile안에 부가적인 객체에 대한 통계 정보를 저장 합니다. 

- SQL Profileing : CBO(Cost Base Optimizer)로 수행될 때 SQL문을 위해서는 부가 정보들이 필요 합니다. 이러한 SQL문의 정보들을 SQL 프로파일이라는 형태로 수집해 놓습니다. 이러한 SQL 프로파일이 필요할 때마다 SQL Tuning Advisor 에 의해 업데이트됩니다. 

- 실행 경로 분석(Access Path Analysis) : 어떤 인덱스를 통해 데이터를 접근하여 추출할지를 결정 합니다. 필요하다면 SQL Access Advisor를 호출해 인덱스에 대한 권고를 요구하기도 합니다. 

- SQL 구조 분석(SQL Structure Analysis) : SQL문이 비효율적인 실행 계획을 생성할 경우 같은 결과를 보여줄 수 있는 비슷한 SQL문을 생성해 권고하는 역할을 합니다. 

이러한 Automatic SQL Tuning 특징은 EM(Enterprise Manager)의 “Advisor Central” 을 이용해서도 사용 할 수 있으며 또한 PL/SQL의 DBMS_SQLTUNE 패키지를 이용해서도 사용 가능 합니다. 본 강좌에서는 PL/SQL에 초점을 맞추어서 진행토록 하겠습니다. 

SQL Tuning Advisor 

SQL Tuning API에 접근 하기 위해서는 ADVISOR라는 권한이 있어야 합니다. 

아래처럼 하면 됩니다. 

SQL>CONN sys/password AS SYSDBA 
SQL>GRANT ADVISOR TO scott; 
SQL>CONN scott/tiger 

SQL Tuning Advisor를 사용하기 위한 첫 번째 단계는 CREATE_TUNING_TASK를 이용하여 새로운 tuning task를 만드는 일입니다. 분석되고자 하는 SQL 문장은 AWR이나 CURSOR CACHE, SQL Tuning set 또는 매뉴얼하게 만들어져 검색 될 수 있습니다. 

SET SERVEROUTPUT ON 

-- Tuning task created for specific a statement from the AWR. 
DECLARE 
l_sql_tune_task_id VARCHAR2(100); 
BEGIN 
l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task ( 
begin_snap => 764, 
end_snap => 938, 
sql_id => '19v5guvsgcd1v', 
scope => DBMS_SQLTUNE.scope_comprehensive, 
time_limit => 60, 
task_name => '19v5guvsgcd1v_AWR_tuning_task', 
description => 'Tuning task for statement 19v5guvsgcd1v in AWR.'); 
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id); 
END; 


-- Tuning task created for specific a statement from the cursor cache. 
DECLARE 
l_sql_tune_task_id VARCHAR2(100); 
BEGIN 
l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task ( 
sql_id => '19v5guvsgcd1v', 
scope => DBMS_SQLTUNE.scope_comprehensive, 
time_limit => 60, 
task_name => '19v5guvsgcd1v_tuning_task', 
description => 'Tuning task for statement 19v5guvsgcd1v.'); 
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id); 
END; 


-- Tuning task created from an SQL tuning set. 
DECLARE 
l_sql_tune_task_id VARCHAR2(100); 
BEGIN 
l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task ( 
sqlset_name => 'test_sql_tuning_set', 
scope => DBMS_SQLTUNE.scope_comprehensive, 
time_limit => 60, 
task_name => 'sqlset_tuning_task', 
description => 'Tuning task for an SQL tuning set.'); 
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id); 
END; 


-- Tuning task created for a manually specified statement. 
DECLARE 
l_sql VARCHAR2(500); 
l_sql_tune_task_id VARCHAR2(100); 
BEGIN 
l_sql := 'SELECT e.*, d.* ' || 
'FROM emp e JOIN dept d ON e.deptno = d.deptno ' || 
'WHERE NVL(empno, ''0'') = :empno'; 

l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task ( 
sql_text => l_sql, 
bind_list => sql_binds(anydata.ConvertNumber(100)), 
user_name => 'scott', 
scope => DBMS_SQLTUNE.scope_comprehensive, 
time_limit => 60, 
task_name => 'emp_dept_tuning_task', 
description => 'Tuning task for an EMP to DEPT join query.'); 
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id); 
END; 



만약 TASK_NAME 파라미터에 값이 있다면 SQL tune task의 식별자로서 사용 되구요, 생략된다면 시스템에서 “TASK_1478” 등과 같이 만들어서 리턴 합니다. 

NVL이 SQL 문장에 사용되다면 옵티마이저로부터 반작용을 유발 하며 부가적으로 그러한 테이블에 관한 통계정보를 지우는 것도 가능 합니다. 

EXEC DBMS_STATS.delete_table_stats('SCOTT','EMP'); 

위에서 tuning task에 대해 정의를 했는데 그 다음으로 할 일은 EXECUTE_TUNING_TASK procedure를 이용하는 일 입니다. 

EXEC DBMS_SQLTUNE.execute_tuning_task(task_name => 'emp_dept_tuning_task'); 

물론 아래처럼 task를 중단하거나 재시작 하거나 취소하거나 하는 것들이 가능 합니다. 

-- Interrupt and resume a tuning task. 
EXEC DBMS_SQLTUNE.interrupt_tuning_task (task_name => 'emp_dept_tuning_task'); 
EXEC DBMS_SQLTUNE.resume_tuning_task (task_name => 'emp_dept_tuning_task'); 

-- Cancel a tuning task. 
EXEC DBMS_SQLTUNE.cancel_tuning_task (task_name => 'emp_dept_tuning_task'); 

-- Reset a tuning task allowing it to be re-executed. 
EXEC DBMS_SQLTUNE.reset_tuning_task (task_name => 'emp_dept_tuning_task'); 
다음과 같이 tuning task는 DBA_ADVISOER_LOG라는 뷰를 통해서 확인 가능 합니다. 

SQL>SELECT task_name, status FROM dba_advisor_log WHERE owner = 'SCOTT'; 

TASK_NAME STATUS 
------------------------------ ----------- 
emp_dept_tuning_task COMPLETED 

tuning task가 성공적으로 수행 되면 REPORT_TUNING_TASK라는 함수를 통해 권고를 확인 할 수 있습니다. 

SET LONG 10000; 
SET PAGESIZE 1000 
SET LINESIZE 200 
SELECT DBMS_SQLTUNE.report_tuning_task('emp_dept_tuning_task') AS recommendations FROM dual; 
SET PAGESIZE 24 

결과는 아래와 같습니다. 

RECOMMENDATIONS 
-------------------------------------------------------------------------------- 
GENERAL INFORMATION SECTION 
------------------------------------------------------------------------------- 
Tuning Task Name : emp_dept_tuning_task 
Scope : COMPREHENSIVE 
Time Limit(seconds): 60 
Completion Status : COMPLETED 
Started at : 05/06/2004 09:29:13 
Completed at : 05/06/2004 09:29:15 

------------------------------------------------------------------------------- 
SQL ID : 0wrmfv2yvswx1 
SQL Text: SELECT e.*, d.* FROM emp e JOIN dept d ON e.deptno = d.deptno 
WHERE NVL(empno, '0') = :empno 

------------------------------------------------------------------------------- 
FINDINGS SECTION (2 findings) 
------------------------------------------------------------------------------- 

1- Statistics Finding 
--------------------- 
Table "SCOTT"."EMP" and its indices were not analyzed. 

Recommendation 
-------------- 
Consider collecting optimizer statistics for this table and its indices. 
execute dbms_stats.gather_table_stats(ownname => 'SCOTT', tabname => 
'EMP', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, 
method_opt => 'FOR ALL COLUMNS SIZE AUTO', cascade => TRUE) 

Rationale 
--------- 
The optimizer requires up-to-date statistics for the table and its indices 
in order to select a good execution plan. 

2- Restructure SQL finding (see plan 1 in explain plans section) 
---------------------------------------------------------------- 
The predicate NVL("E"."EMPNO",0)=:B1 used at line ID 2 of the execution plan 
contains an __EXPRESSION!__ on indexed column "EMPNO". This __EXPRESSION!__ prevents 
the optimizer from selecting indices on table "SCOTT"."EMP". 

Recommendation 
-------------- 
Rewrite the predicate into an equivalent form to take advantage of 
indices. Alternatively, create a function-based index on the __EXPRESSION!__. 

Rationale 
--------- 
The optimizer is unable to use an index if the predicate is an inequality 
condition or if there is an __EXPRESSION!__ or an implicit data type conversion 
on the indexed column. 

------------------------------------------------------------------------------- 
EXPLAIN PLANS SECTION 
------------------------------------------------------------------------------- 

1- Original 
----------- 
Plan hash value: 1863486531 

---------------------------------------------------------------------------------------- 
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 
---------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT | | 1 | 107 | 4 (0)| 00:00:01 | 
| 1 | NESTED LOOPS | | 1 | 107 | 4 (0)| 00:00:01 | 
| 2 | TABLE ACCESS FULL | EMP | 1 | 87 | 3 (0)| 00:00:01 | 
| 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 20 | 1 (0)| 00:00:01 | 
| 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00:00:01 | 
---------------------------------------------------------------------------------------- 

Note 
----- 
- dynamic sampling used for this statement 

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


1 row selected. 

Tuning task는 다음처럼 DROP 합니다. 

BEGIN 
DBMS_SQLTUNE.drop_tuning_task (task_name => '19v5guvsgcd1v_AWR_tuning_task'); 
DBMS_SQLTUNE.drop_tuning_task (task_name => '19v5guvsgcd1v_tuning_task'); 
DBMS_SQLTUNE.drop_tuning_task (task_name => 'sqlset_tuning_task'); 
DBMS_SQLTUNE.drop_tuning_task (task_name => 'emp_dept_tuning_task'); 
END; 

 

반응형

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

one port multi listener 설정 하기  (0) 2012.12.24
DBMS_XPLAN 정보 조회  (0) 2012.09.07
10G OCP 자격증 관련  (2) 2012.07.08
오라클 패키지 CURSOR(커서) 출력 값 조회  (0) 2012.02.23
일정 시간 별로 쿼리 정보 조회  (0) 2012.02.20
반응형


각 시험당 비용이 21만원으로 올랐음 -_-


- 시험코드 : 1z0-007

- 시 험 명 : SQL

- 시험비용 : $125

- 시험시간 : 120분

- 시험문항 : 52문제

- 커트라인 : 72% (37.44)

- 시험장소 : 온라인(피어슨뷰 http://www.vue.com에 신청 가능)


- 시험코드 : 1z0-042

- 시 험 명 : WORKSHOP1

- 시험비용 : $125

- 시험시간 : 120분

- 시험문항 : 84문제

- 커트라인 : 68%(57.12)

- 시험장소 : 오프라인


- 시험코드 : 1z0-043

- 시 험 명 : WORKSHOP2

- 시험비용 : $125

- 시험시간 : 90분

- 시험문항 : 92문제

- 커트라인 : 70%(64.4)

- 시험장소 : 오프라인


오라클 시험 다보고


Hand On 정보 등록 후 OCP 자격증 신청 방법



아이티윌_NEWhandson.pdf


오라클사_Hands-on_작성방법(OCP).pdf


반응형

+ Recent posts