Oracle/Admin2010. 9. 7. 11:54


alert log에 다음과 같은 에러가 발생했을 경우


Errors in file /oracle/app/admin/CRMDB/bdump/crmdb1_j003_659828.trc:
ORA-12012: error on auto execute of job 1317768
ORA-04063: ORA-04063: package body "ORACLE_OCM.MGMT_DB_LL_METRICS" has errors
ORA-06508: PL/SQL: could not find program unit being called: "ORACLE_OCM.MGMT_DB_LL_METRICS"
ORA-06512: at line 1


아래의 뷰들을 통하여 어느 잡인지 확인한다.

dba_jobs
dba_scheduler_jobs


오브젝트 상태가 어떤지 확인한다.

dba_object


토드나 오렌지와 같은 툴들로 패키지 바디를 보고 컴파일을 실행 후
문제가 되는 것을 찾는다.(권한 박탈 등의 문제)


grant <권한명> on <유저명>;


패키지를 다시 컴파일 한다.

alter package <유저명>.<패키지명> compile;
Posted by 자수성가한 부자
Oracle/Admin2010. 8. 27. 09:36

아래와 같은 명령으로 SQL*PLUS에서 sga의 크기를 확인할 수 있다.

SQL> show sga;

Total System Global Area 7680782816 bytes
Fixed Size                   737760 bytes
Variable Size            3321888768 bytes
Database Buffers         4294967296 bytes
Redo Buffers               63188992 bytes

여기서 각각의 항목에 대해서 간단히 설명을 하자면

Total System Global Area : SGA의 크기
Fixed Size : SGA의 고정된 영역의 크기(파라미터값들과 SGA를 관리하는 매커니즘에 관한 정보가 저장)
Variable Size : ?????
Database Buffers : 데이터베이스 버퍼 캐쉬의 크기
Redo Buffers : 리두 로그 버퍼의 크기

Variable Size는 무엇일까?

아래의 쿼리를 보면 이해가 될 것이다.

SQL> select pool, sum(bytes)
         from v$sgastat
         group by pool;


POOL        SUM(BYTES)
----------- ----------
large pool   167772160
shared pool 3154116608
            4358883808

그렇다.
variable size 는 shared pool 영역에서 dynamic area의 크기를 말하는 것이다.
asmm을 사용할 경우 dynamic area는
shared pool,
java pool,
large pool의 크기를 합친 것과 같은 것이다.

Posted by 자수성가한 부자
Oracle/Admin2010. 7. 7. 16:07



리스너에 패스워드를 설정해 보안을 강화할 수 있다.

리스너에 패스워드를 설정하게 되면 
lsnrctl(리스너 컨트롤) 명령어로 status(리스너 프로세스 상태 정보 확인) stop(리스너 프로세스 정지)을 하기 위해서는
이 패스워드를 설정한 후에야 가능하다.
단, start는 패스워드 설정없이도 가능하다.

그러면 지금부터 따라해보자. (참고로 오라클 버전은 10.2.0.4이고, 실습은 모두 default 리스너로 실행)
순서는 아래와 같다.

1. 패스워드 설정 안함
  1). listener.ora 파일 확인
  2). listener start
  3). listener status 확인
  4). listener stop

2. 패스워드 설정
  1). listener.ora 파일 확인
  2). listener start
  3). set passwd
  4). listener.ora 파일 확인
  5). listener status 확인
  6). listener stop






1. 패스워드 설정안함
  1). listener.ora 파일 확인

os] vi $ORACLE_HOME/network/admin/listener.ora

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
  )
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = test.domain.com)(PORT = 1521))
    )
  )



  2). listener start

[oracle@test admin]$ lsnrctl start
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 07-JUL-2010 16:24:29
Copyright (c) 1991, 2007, Oracle.  All rights reserved.
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.4.0 - Production
System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ghjang.domain.com)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ghjang.domain.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Start Date                07-JUL-2010 16:24:29
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test.domain.com)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully


  3). listener status 확인

[oracle@test admin]$ lsnrctl status
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 07-JUL-2010 16:25:28
Copyright (c) 1991, 2007, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test.domain.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Start Date                07-JUL-2010 16:24:29
Uptime                    0 days 0 hr. 0 min. 58 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test.domain.com)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "test" has 1 instance(s).
  Instance "test", status READY, has 1 handler(s) for this service...
Service "testXDB" has 1 instance(s).
  Instance "test", status READY, has 1 handler(s) for this service...
The command completed successfully


  4). listener stop

[oracle@test admin]$ lsnrctl stop
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 07-JUL-2010 16:26:26
Copyright (c) 1991, 2007, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test.domain.com)(PORT=1521)))
The command completed successfully


2. 패스워드 설정
  1). listener.ora 파일 확인


# listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
  )
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = test.domain.com)(PORT = 1521))
    )
  )


  2). set password

리스너에 패스워드를 걸기 위해서는 listener.ora파일에
LOCAL_OS_AUTHENTICATION_LISTENER 파라미터가 OFF로 설정이 되어 있어야 한다.

os] vi $ORACLE_HOME/network/admin/listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
  )
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = test.domain.com)(PORT = 1521))
    )
  )
LOCAL_OS_AUTHENTICATION_LISTENER = OFF


그리고 listener를 start시킨다. 패스워드를 설정하기 위해서는 listener 프로세스가 실행되어 있어야 한다.


[oracle@test admin]$ lsnrctl
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 07-JUL-2010 16:35:40
Copyright (c) 1991, 2007, Oracle.  All rights reserved.
Welcome to LSNRCTL, type "help" for information.
LSNRCTL> start
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.4.0 - Production
System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test.domain.com)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test.domain.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Start Date                07-JUL-2010 16:35:41
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  OFF                         => 패스워드 설정이 안되어 있는 것을 알 수 있다.
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test.domain.com)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully


패스워드를 설정한다.
처음 설정할 경우 old password는 입력하지 않아도 되고, 마지막에는 꼭 save_config 명령을 실행하여
패스워드를 저장하도록 한다.
만약 save_config를 하지 않을 경우 패스워드가 등록되지 않는다.

[oracle@test admin]$ lsnrctl
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 07-JUL-2010 16:39:24
Copyright (c) 1991, 2007, Oracle.  All rights reserved.
Welcome to LSNRCTL, type "help" for information.
LSNRCTL> change_password
Old password:
New password:
Reenter new password:
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test.domain.com)(PORT=1521)))
Password changed for LISTENER
The command completed successfully
LSNRCTL> save_config
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test.domain.com)(PORT=1521)))
Saved LISTENER configuration parameters.
Listener Parameter File   /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Old Parameter File   /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.bak
The command completed successfully

  4). listener.ora 파일 확인


# listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
  )
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ghjang.domain.com)(PORT = 1521))
    )
  )
LOCAL_OS_AUTHENTICATION_LISTENER = OFF
#----ADDED BY TNSLSNR 07-JUL-2010 16:50:34---
PASSWORDS_LISTENER = 12BC9D5D72FD1F01                        => 암호화된 패스워드가 설정되었다.
#--------------------------------------------

  5). listener status 확인


[oracle@test admin]$ lsnrctl status
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 07-JUL-2010 16:51:47
Copyright (c) 1991, 2007, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test.domain.com)(PORT=1521)))
TNS-01169: The listener has not recognized the password    => 패스워드가 설정되어 확인할 수 없다는 메시지가 나온다.

확인하기 위해서는 패스워드를 입력해야 한다. 패스워드를 입력하는 방법은 아래와 같다.

[oracle@test admin]$ lsnrctl
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 07-JUL-2010 16:54:24
Copyright (c) 1991, 2007, Oracle.  All rights reserved.
Welcome to LSNRCTL, type "help" for information.
LSNRCTL> set password
Password:
The command completed successfully
LSNRCTL> status
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test.domain.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Start Date                07-JUL-2010 16:49:44
Uptime                    0 days 0 hr. 4 min. 49 sec
Trace Level               off
Security                  ON: Password       => 패스워드가 설정되어있음을 확인할 수 있다.
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test.domain.com)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "test" has 1 instance(s).
  Instance "test", status READY, has 1 handler(s) for this service...
Service "testXDB" has 1 instance(s).
  Instance "test", status READY, has 1 handler(s) for this service...
The command completed successfully


  6). listener stop

[oracle@test admin]$ lsnrctl stop
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 07-JUL-2010 16:52:32
Copyright (c) 1991, 2007, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test.domain.com)(PORT=1521)))
TNS-01169: The listener has not recognized the password     => 패스워드가 설정되어 확인할 수 없다는 메시지가 나온다.

리스너를 stop 시키기 위해서는 패스워드를 입력해야 한다. 아래와 같다.

 [oracle@test admin]$ lsnrctl
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 07-JUL-2010 16:55:54
Copyright (c) 1991, 2007, Oracle.  All rights reserved.
Welcome to LSNRCTL, type "help" for information.
LSNRCTL> set password
Password:
The command completed successfully
LSNRCTL> stop
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test.domain.com)(PORT=1521)))
The command completed successfully

'Oracle > Admin' 카테고리의 다른 글

특정 패키지가 invalid 되었을 때  (0) 2010.09.07
show sga의 variable size의 크기는?  (0) 2010.08.27
deadlock을 판단하는데 걸리는 시간은?  (0) 2010.07.01
[펌] DB link  (0) 2010.06.06
[펌] TNS-12546: TNS:permission denied  (0) 2010.05.28
Posted by 자수성가한 부자
Oracle/Admin2010. 7. 1. 15:22

히든 파라미터가 존재합니다.

_lm_dd_interval

단위는 초입니다. 그리고 default는 60입니다.

60초 동안 기다렸다가 응답이 없을 경우 dead lock으로 간주합니다.



참고로 hidden parameter 확인하는 쿼리는

SQL> select ksppinm name,
                  ksppstvl value,
                  decode(bitand(ksppiflg/256,1),1,'true','false') ses_modifiable,
                  decode(bitand(ksppiflg/65536,3),1,'immediate',2,'deferred',3,'immediate','false') sys_modifiable,
                  ksppdesc description
        from sys.x$ksppi i, sys.x$ksppcv v
        where i.indx = v.indx
                 and i.ksppinm like '%&1%';


참고 : http://cafe.naver.com/prodba
         http://wiki.ex-em.com/index.php/Hidden_parameter

'Oracle > Admin' 카테고리의 다른 글

show sga의 variable size의 크기는?  (0) 2010.08.27
리스너에 패스워드 걸기  (0) 2010.07.07
[펌] DB link  (0) 2010.06.06
[펌] TNS-12546: TNS:permission denied  (0) 2010.05.28
session kill 하는 SQL  (0) 2010.05.21
Posted by 자수성가한 부자
Oracle/Admin2010. 6. 6. 23:16

DB를 사용하다 보면 현재 사용자의 스키마 뿐만 아니라 다른 사용자의 데이터베이스, 혹은 다른 시스템의 데이터베이스를 사용해야 하는 경우가 생긴다. 이때 DBLink를 사용하게 된다. DBLink는 말 그대로 서로 떨어져 있는 데이터베이스 간에 접속을 위하여 사용된다. DBLINK는 일반 사용자 권한으로 만들 수 없고 반드시 DBA 권한이 있어야 한다.

DBLink를 만들기전에 가능한 tnsname.ora 파일에 서버에 관한 정보를 추가해놓는것이 좋다.

 

생성법]

CREATE [private|public] BATABASE LINK 링크명

CONNECT TO 아이디 IDENTIFIED BY 암호

USING 연결할서버TNS

보다시피 상당히 단순한 구조로 되어있다.

하지만 위에서도 언급했다시피, tnsname.ora 파일에 추가한 TNS네임을 입력해야 하며

만약 TNS네임을 추가하지 않았다면 다음과 같은 복잡한 방법을 사용하게 된다.

USING '(description=(address=(protocol=TCP)(host=IP/HostName)(port=Port))(connect_data=(sid=SID)))'      <- TNS네임대신 적어주는내용;

DBLink가 작성되었는지 여부는 SELECT 명령어를 이용하여 확인할수 있다.

SELECT * from all_db_links             일반사용자

SELECT * from dba_db_links            DBA

작성된 DBLink는 다음과 같이 사용할수 있다. 만약 네이밍 룰이 길다고 느껴지면 Synonym을 사용하여 줄이면 된다.

SELECT * from [사용자.]테이블명@링크명

필요없는 DBLink는 다음과 같이 삭제할 수 있다.

DROP DATABASE LINK 링크명

[출처] DBLink|작성자 도토리

'Oracle > Admin' 카테고리의 다른 글

리스너에 패스워드 걸기  (0) 2010.07.07
deadlock을 판단하는데 걸리는 시간은?  (0) 2010.07.01
[펌] TNS-12546: TNS:permission denied  (0) 2010.05.28
session kill 하는 SQL  (0) 2010.05.21
create index, index rebuild  (0) 2010.04.27
Posted by 자수성가한 부자
Oracle/Admin2010. 5. 28. 11:05
장비는 solaris 280R 테스트장비 입니다
각 계정마다 인스턴스(*6EA) 를 올린 상황입니다
[code sql]

LSNRCTL> start
Starting /app/oracle/product/102/bin/tnslsnr: please wait...

TNSLSNR for Solaris: Version 10.2.0.3.0 - Production
System parameter file is /app/oracle/product/102/network/admin/listener.ora
Log messages written to /app/oracle/product/102/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=meta4)))
Error listening on: (DESCRIPTION=(address=(protocol=ipc)(key=meta3)))
TNS-12546: TNS:permission denied
TNS-12560: TNS:protocol adapter error
TNS-00516: Permission denied
Solaris Error: 13: Permission denied
[/code]

다음과 같은 에러메시지를 나타냅니다.

해결책은 다음과 같습니다
1.기동되고 있는 모든 listener를 stop 시킵니다.
2.1 O/S에서 디렉토리 권한이 제대로 되어있는지 확인합니다.
2.2 다른 O/S에서 같은 IPC를 사용하고 있는지 확인합니다.
3. 위의 경우에도 해결이 되지 않으면 /var/tmp/.oracle 을 확인합니다
보통 자동으로 이 디렉토리가 정리가 되는데 정리가 안되어서 위와같은 에러를 발생시킵니다

mv 나 rm -rf 명령으로 .oracle 디렉토리를 삭제합니다.

listener를 재기동 시킵니다.


출처 : http://junan.kr/442

'Oracle > Admin' 카테고리의 다른 글

deadlock을 판단하는데 걸리는 시간은?  (0) 2010.07.01
[펌] DB link  (0) 2010.06.06
session kill 하는 SQL  (0) 2010.05.21
create index, index rebuild  (0) 2010.04.27
alert_SID.log  (0) 2010.03.24
Posted by 자수성가한 부자
Oracle/Admin2010. 5. 21. 22:22
한 세션에서 쿼리를 수행하는데 아주 많은 CPU를 사용한다면 그 세션을 일단 찾아서 kill시켜야 한다.

일단, 현재 CPU를 많이 소모하고 있는 세션과 그 쿼리를 찾는 방법은 무엇일까?


1. os명령어 top으로 현재 cpu를 많이 소모하고 있는 세션의 ospid를 알아낸다.


2. 다음의 쿼리로 해당 세션의 pid를 알아낸다.

SQL> select s.sid, s.serial#, p.spid
         from v$session s, v$process p
        where s.paddr=p.addr
        and p.spid=<ospid>;


3. 2번에서 찾아낸 sid를 이용하여 SQL을 찾아낸다.

SQL> set long 1000
SQL> select a.sql_text from v$sqltext a, v$session b
         where a.address=b.sql_address
         and a.hash_value=b.sql_hash_value
         and b.sid= <sid>
         order by a.piece;



sqlplus에서 세션 kill하기

특정 세션을 죽이기 위한 SQL문은 다음과 같다.


SQL> alter system kill session '<SID>, <SERIAL#>' immediate;

이 SQL을 실행하게 되면 바로 그 세션이 죽는 것이 아니라, SMON에 의해서 롤백과 같은 작업이 진행된다.
(alert 로그를 보면 다음과 같은 메시지가 나온다. : SMON: Parallel transaction recovery tried)


참고 : http://cafe.naver.com/prodba.cafe
         http://blog.naver.com/chowstephen?Redirect=Log&logNo=10067319212
        
        

'Oracle > Admin' 카테고리의 다른 글

[펌] DB link  (0) 2010.06.06
[펌] TNS-12546: TNS:permission denied  (0) 2010.05.28
create index, index rebuild  (0) 2010.04.27
alert_SID.log  (0) 2010.03.24
index rebuild 작업  (0) 2010.02.25
Posted by 자수성가한 부자
Oracle/Admin2010. 4. 27. 09:26

-- CREATE INDEX 시에 하기 쿼리로 SPACE 를 추적 가능
-- CREATE INDEX XAK1MIG_TEST2 ON MIG_TEST2 ( A2, B ) ;
-- 병렬로 생성 가능
-- CREATE INDEX XAK1MIG_TEST2 ON MIG_TEST2 ( A2, B ) PARALLEL 10 ;
-- 병렬로 인덱스 리빌드 가능
-- ALTER INDEX XAK1MIG_TEST2 REBUILD TABLESPACE USERS PARALLEL 10 ;

-- 병렬 체크
select a.sql_text
from v$sqltext a, v$session b
where a.address=b.sql_address and
a.hash_value=b.sql_hash_value and
b.sid in (select sid from v$px_session) ;

-- Sort Usage 체크
select   se.username
        ,se.sid
        ,su.extents
        ,su.blocks * to_number(rtrim(p.value)) as Space
        ,tablespace
        ,segtype
from     v$sort_usage su
        ,v$parameter  p
        ,v$session    se
where    p.name          = 'db_block_size'
and      su.session_addr = se.saddr
order by se.username, se.sid ;

 

병렬 작업 후 반드시 해당 인덱스의 DEGREE 를 1로 변경 해준다.

 

ALTER INDEX XAK_CHECK_PARALLEL PARALLEL (DEGREE 1 ) ;

 

확인은

SELECT OWNER,INDEX_NAME,TABLE_NAME, DEGREE FROM DBA_INDEXES

WHERE INDEX_NAME ='XAK_CHECK_PARALLEL';

 

병렬 쿼리 인덱스 관련 정보

2. Space 의 관리

(1) Create table .. as select, create index 작업의 저장 영역


Parallel 하게 table 이나 index를 생성하는 경우 create 명령의
storage 절의 initial 값으로 temporary segment를 생성한다.
Initial 값이 5M이고 parallel degree 를 10으로 설정하여 table을
생성하는 경우는 5M 씩 10개의 temporary segment가 만들어지면서
data를 저장한다. 그리고 Parallel coordinator 가 temporary
segment를 병합한다.


(2) Temporary segment 의 free space 관리


Data의 loading 작업이 끝난 후에 각 temporary segment에서
사용되지 않은 free space를 가진 extent가 tablespace level에서
설정한 minimum extent 값보다 크면 parallel coordinator 가
모든 temporary segment를 병합할 때 사용하지 않은 영역은 잘라낸다.
잘려진 영역은 datafile의 free space로 돌려지며 다른 object에 의해
사용될 수 있다. 그러나 연속된 영역이 아니므로 하나의 큰 segment로
합쳐질 수 없다. (external fragmentation)
위의 경우에서 free space를 가진 extent가 minimum extent 값보다
작으면 parallel coordinator 가 모든 temporary segment를 병합할 때
사용하지 않은 영역도 포함시킨다. 이 부분은 후에 data가 insert될 때
사용된다. (internal fragmentation)

'Oracle > Admin' 카테고리의 다른 글

[펌] TNS-12546: TNS:permission denied  (0) 2010.05.28
session kill 하는 SQL  (0) 2010.05.21
alert_SID.log  (0) 2010.03.24
index rebuild 작업  (0) 2010.02.25
Globalization  (0) 2010.01.11
Posted by 자수성가한 부자
Oracle/Admin2010. 3. 24. 23:11

● 어떤 파일?
 - 오라클 인스턴스가 동작할 때 발생되는 여러 이벤트나 에러 등이 기록되는 파일로,
   데이터베이스의 관리, 백업, 복구, 튜닝에 중요한 정보를 제공.

● 어느 위치에 저장?
 - background_dump_dest에 정의된 위치

● 확인 가능한 내용은?
 - 데이터베이스 startup, shutdown 등

Starting ORACLE instance (normal)


 - 테이블스페이스 생성

create tablespace SYSAUX datafile  '/jenis/oradata/system/sysaux01.dbf'
SIZE 10240M REUSE AUTOEXTEND ON NEXT  1024K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO online

 
- system parameter 중 기본값이 아닌 파라미터 값


System parameters with non-default values:
  processes                = 4000
  sessions                 = 4405
  shared_pool_size         = 1258291200
  large_pool_size          = 117440512
  java_pool_size           = 117440512
  control_files            = /jenis/oradata/system/control01.ctl, /jenis/oradata/system/control02.ctl, /jenis/oradata/system/control03.ctl
  db_block_size            = 8192
  db_cache_size            = 4194304000
  compatible               = 10.2.0.3.0
.....


 - 백그라운드 프로세스 기동내용

PMON started with pid=2, OS id=19798
PSP0 started with pid=3, OS id=19800
MMAN started with pid=4, OS id=19802
DBW0 started with pid=5, OS id=19804
DBW1 started with pid=6, OS id=19806
DBW2 started with pid=7, OS id=19808
LGWR started with pid=8, OS id=19810
CKPT started with pid=9, OS id=19812
SMON started with pid=10, OS id=19814
RECO started with pid=11, OS id=19816
CJQ0 started with pid=12, OS id=19818
MMON started with pid=13, OS id=19820


 - 로그 스위치 내용

Thu Feb 25 22:00:10 2010
Thread 1 advanced to log sequence 10 (LGWR switch)
  Current log# 1 seq# 10 mem# 0: /jenis/oradata/system/redo01_01.log
  Current log# 1 seq# 10 mem# 1: /jenis/oradata/system/redo01_02.log



 - Checkpoint 발생시간과 상태


Checkpoint not complete
  Current log# 3 seq# 54 mem# 0: /jenis/oradata/system/redo03_01.log
  Current log# 3 seq# 54 mem# 1: /jenis/oradata/system/redo03_02.log


● 특징은?
 - 데이터베이스 당 하나씩 생성
 - 하나의 파일에 계속 내용이 쌓이므로 파일이 너무 커졌을 경우 다른 곳으로 복사하고
   새로 생성할 필요가 있음.(최대크기는 max_dump_file_size에 정의되어 있음)

'Oracle > Admin' 카테고리의 다른 글

session kill 하는 SQL  (0) 2010.05.21
create index, index rebuild  (0) 2010.04.27
index rebuild 작업  (0) 2010.02.25
Globalization  (0) 2010.01.11
Security  (0) 2010.01.08
Posted by 자수성가한 부자
Oracle/Admin2010. 2. 25. 18:55
질문 :

index에 관해서 공부를 하다가 궁금한 점이 있어 이렇게 질문을 등록합니다.

테이블에 데이터가 자주 들락날락해서 delete된 데이터의 index가 그대로 남아있어, 필요이상으로 많은 공간을 차지할 때 한다는 것을 알고 있습니다.

그런데, 이렇게 필요이상으로 index가 공간을 많이 차지한다는 것을 어떻게 알 수 있을까요?





답변1 :

아래에 있는 두 방법의 결과로 판단합니다.


첫번째 방법 :

우선 분석하고자 하는 인덱스에 대한 통계정보를 생성합니다.

SQL> analyze index 인덱스명 compute statistics;
-- 수백만건 이상의 row를 지닌 테이블에 대한 인덱스인 경우 compute statistics 대신에 estimate 옵션을 사용할 것.


아래 쿼리 결과의 blevel값이 4가 넘으면 index rebuild를 하는 것이 좋습니다.
이 blevel(Branch level)이 의미하는 것은 오라클이 index access를 할 때 몇 단계를 거쳐서 블럭의 위치를 찾아가는 가와 관계가 있습니다.

SQL> select index_name, blevel
     from user_indexes
     where index_name = '인덱스명';


두번째 방법 :

아래의 쿼리를 이용하여 index_stats테이블에 추가적인 인덱스 정보를 생성합니다.

SQL> analyze index 인덱스명 validate structure;


아래 쿼리 결과의 pct_deleted가 20%이상으로 나타나면 rebuild 대상입니다.

그리고 distinctiveness는 인덱스가 만들어진 컬럼의 값이 얼마나 자주 반복되는지를 보여주는 값입니다.

예를 들면, 만일 1만건의 row와 9000건의 서로 다른 값을 가진 테이블이 있을 때 distinctiveness값은 다음과 같이 계산됩니다.

(10000-9000)*100/10000 = 10        => 컬럼의 값이 잘 분산되어 있음

또 다른 예를 들면, 1만건의 row가 있지만 2가지 값으로만 중복되어 있다면 distintiveness값은

(10000-2)*100/10000 = 99.98        => rebuild 대상이 아니라 bitmap index로 만들 대상(99%이상이면 bitmap index 대상)

SQL> select del_lf_rows*100/decode(lf_rows,0,1,lf_rows) pct_deleted,
            (lf_rows-distinct_keys)*100/decode(lf_rows,0,1,lf_rows) distinctiveness
     from index_stats
     where name = '&index_name';




답변2 :

답변2도 답변 1과 같은 내용이지만 스크립트를 사용함으로써, 한번에 여러개의 rebuild 대상 index를 찾을 수 있다는 장점이 있다.


결과 정보를 휘발성으로 저장하는데, 그 결과를 통해서 rebuild 대상을 체크할 수 있음.
주의할 점은 아래의 쿼리 실행시 Lock이 발생하므로, 업무시간 이외에 할 것을 강추함.

SQL> analyze index index_name validate structure ;


rebuild_indx.sql

REM =============================================================
REM
REM rebuild_indx.sql
REM
REM Copyright (c) Oracle Software, 1998 - 2000
REM
REM Author : Jurgen Schelfhout
REM
REM The sample program in this article is provided for educational
REM purposes only and is NOT supported by Oracle Support Services.
REM It has been tested internally, however, and works as documented.
REM We do not guarantee that it will work for you, so be sure to test
REM it in your environment before relying on it.
REM
REM This script will analyze all the indexes for a given schema
REM or for a subset of schema's. After this the dynamic view
REM index_stats is consulted to see if an index is a good
REM candidate for a rebuild or for a bitmap index.
REM
REM Database Version : 7.3.X and above.
REM
REM =============================================================

prompt
ACCEPT spoolfile CHAR prompt 'Output-file : ';
ACCEPT schema CHAR prompt 'Schema name (% allowed) : ';
prompt
prompt
prompt Rebuild the index when :
prompt - deleted entries represent 20% or more of the current entries
prompt - the index depth is more then 4 levels.
prompt Possible candidate for bitmap index :
prompt - when distinctiveness is more than 99%
prompt
spool &spoolfile

set serveroutput on
set verify off
declare
c_name INTEGER;
ignore INTEGER;
height index_stats.height%TYPE := 0;
lf_rows index_stats.lf_rows%TYPE := 0;
del_lf_rows index_stats.del_lf_rows%TYPE := 0;
distinct_keys index_stats.distinct_keys%TYPE := 0;
cursor c_indx is
select owner, table_name, index_name
from dba_indexes
where owner like upper('&schema')
and owner not in ('SYS','SYSTEM');
begin
dbms_output.enable (1000000);
dbms_output.put_line ('Owner Index Name % Deleted Entries Blevel Distinctiveness');
dbms_output.put_line ('--------------- --------------------------------------- ----------------- ------ ---------------');

c_name := DBMS_SQL.OPEN_CURSOR;
for r_indx in c_indx loop
DBMS_SQL.PARSE(c_name,'analyze index ' || r_indx.owner || '.' ||
r_indx.index_name || ' validate structure',DBMS_SQL.NATIVE);
ignore := DBMS_SQL.EXECUTE(c_name);

select HEIGHT, decode (LF_ROWS,0,1,LF_ROWS), DEL_LF_ROWS,
decode (DISTINCT_KEYS,0,1,DISTINCT_KEYS)
into height, lf_rows, del_lf_rows, distinct_keys
from index_stats;
--
-- Index is considered as candidate for rebuild when :
-- - when deleted entries represent 20% or more of the current entries
-- - when the index depth is more then 4 levels.(height starts counting from 1 so > 5)
-- Index is (possible) candidate for a bitmap index when :
-- - distinctiveness is more than 99%
--
if ( height > 5 ) OR ( (del_lf_rows/lf_rows) > 0.2 ) then
dbms_output.put_line (rpad(r_indx.owner,16,' ') || rpad(r_indx.index_name,40,' ') ||
lpad(round((del_lf_rows/lf_rows)*100,3),17,' ') ||
lpad(height-1,7,' ') || lpad(round((lf_rows-distinct_keys)*100/lf_rows,3),16,' '));
end if;

end loop;
DBMS_SQL.CLOSE_CURSOR(c_name);
end;
/

spool off
set verify on
- - - - - - - - - - - - - - - - Code ends here - - - - - - - - - - - - - - - -


샘플 결과

Sample Output
-------------

Rebuild the index when:

- deleted entries represent 20% or more of the current entries.
- the index depth is more then 4 levels.

Possible candidate for bitmap index:

- when distinctiveness is more than 99%

Owner Index Name % Deleted Entries Blevel Distinctivenes
--------------- ------------------------- ----------------- ------ -------------
SMS PLATMAP_I1 31.504 1 32.927
SMS PLATMAP_I2 27.682 1 29.399
SMS PLATMAP_I3 31.237 1 31.237
SMS PRODMAP_I4 8.765 5 99.9
SMS SB_CR_BOM_ITEMS_I1 34.496 2 97.356
SMS SB_CR_OS_VERSIONS_I1 51.942 1 68.063
SMS SB_CR_RELEASES_I1 34.584 1 18.426
SMS TAR_HEAD_I2 21.728 5 22.344

PL/SQL procedure successfully completed.


참조 : http://cafe.naver.com/prodba/16759
         http://oracleclub.com/article/46676

'Oracle > Admin' 카테고리의 다른 글

create index, index rebuild  (0) 2010.04.27
alert_SID.log  (0) 2010.03.24
Globalization  (0) 2010.01.11
Security  (0) 2010.01.08
Resource Manager  (0) 2010.01.07
Posted by 자수성가한 부자