반응형

SQL*Plus: Release 10.2.0.4.0 - Production on Tue Sep 27 08:40:00 2011

 

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

 

SQL> ERROR:

ORA-09817: Write to audit file failed.

HPUX-ia64 Error: 28: No space left on device

ORA-01075: you are currently logged on


bdump, udump, adump, cdump 의 용량이 초과 되어서 발생되는 문제이다.

bdf를 쳐보니 위 로그 파일들이 저장되는 곳이 100% 를 치고 있었다.
일단 해당파일들을 삭제하지 않고 다른 곳으로 옮겨 놓았다. 

반응형
반응형
* 나는 핫백업이 끝나는 시점까지의 아카이브 파일들은 항상 백업을 해놓는다.
* 로그마이너를 사용하는데에 있어 내가 데이터를 삭제,수정한 시점을 대충이라도
   기억을 하면 좀 더 수월한 작업이 진행 되지 않을까 생각된다.

* 만약 오후 4시 10분 쯤에 DML 작업을 하였고, 그 이후에 잘못되었다는 것을 알았을 때
  archive 파일 쌓이는 곳을 확인하여 해당시간대에 쌓인 archive 파일을 dbms_logmnr 를 이용하여 복구 시킨다.


-rw-r----- 1 oracle dba 2769920 2011-08-30 16:07 1_17_760545262.dbf
-rw-r----- 1 oracle dba 2712064 2011-08-30 16:08 1_18_760545262.dbf
-rw-r----- 1 oracle dba 2759680 2011-08-30 16:09 1_19_760545262.dbf
-rw-r----- 1 oracle dba 1183232 2011-08-30 16:11 1_20_760545262.dbf
-rw-r----- 1 oracle dba 120832 2011-08-30 16:12 1_21_760545262.dbf
-rw-r----- 1 oracle dba 62976 2011-08-30 16:13 1_22_760545262.dbf
-rw-r----- 1 oracle dba 103424 2011-08-30 16:19 1_23_760545262.dbf
-rw-r----- 1 oracle dba 156160 2011-08-30 16:20 1_24_760545262.dbf
-rw-r----- 1 oracle oinstall 51224064 2011-08-30 17:04 1_25_760545262.dbf

* archive 파일이 /oracle/oradata/arch에 쌓이지만,
   arch_recovery라는 폴더를 생성하여 위 해당 파일들을 복사하였다.


cf. archive 파일 경로 확인 방법.
     show parameter log_archive_dest
     archive log list (sys계정에서만 가능)

* sys 접속
sqlplus "/as sysdba"

* archive 파일 등록
exec dbms_logmnr.add_logfile('/oracle/oradata/arch/arch_recovery/1_20_760545262.dbf');
exec dbms_logmnr.add_logfile('/oracle/oradata/arch/arch_recovery/1_21_760545262.dbf');
exec dbms_logmnr.add_logfile('/oracle/oradata/arch/arch_recovery/1_22_760545262.dbf');
exec dbms_logmnr.add_logfile('/oracle/oradata/arch/arch_recovery/1_23_760545262.dbf');
exec dbms_logmnr.add_logfile('/oracle/oradata/arch/arch_recovery/1_24_760545262.dbf');

* 등록된 archive 분석
exec dbms_logmnr.start_logmnr( options => dbms_logmnr.dict_from_online_catalog);

* 분석된 내용 조회
select * from v$logmnr_contents where operation = 'DELETE' and table_name = 'TEMP_DELETE_TABLE'; 

cf.  v$logmnr_contents : 활성화되지 않으면 조회할수 없다. 아래와 같은 에러 발생.
      ORA-01306: v$logmnr_contents에서 선택하기 전에 dbms_logmnr.start_logmnr()이 호출되어야 합니다

* 다른 계정으로 분석 데이터 복사.
create table scott.temp_logmnr_contents
select * from v$logmnr_contents where operation = 'UPDATE' and table_name='TEMP_DELETE_TABLE';

* dbms_logmnr 종료.
exec dbms_logmnr.end_logmnr;

* 데이터를 확인하여 보면 undo_sql과 redo_sql이 있다.
   로그파일 특성상 쿼리문이 저장되기 때문에 쿼리가 그대로 보여지게 된다.
반응형
반응형
1. startup nomount
 - pfile 또는 spfile을 읽어서 SGA 까지 올라옴.
 - pfile 또는 spfile들에 구성된 내용들을 볼 수 있다.

2. startup mount
 - Database의 정보를 가지고 있는Control file 까지 올라옴.
 - Oracle Dynamic Performance Views 까지 조회할 수 있음.

3. startup
 - Database open
 - 정상구동.

4. startup restrict
 - restrict 권한을 가진 계정만 DB에 접속할 수 있다.
 - 다른 session들을 막고 open된 상태에서 DB를 조작하여야 할 때 사용.(패치 또는 백업)
반응형

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

특정 IP만 접속  (0) 2011.11.21
Linux 10.2.0.4 upgrade Patch  (0) 2011.10.31
startup 종류?  (0) 2011.08.18
shutdown 종류?  (0) 2011.08.18
UTL_URL 함수  (0) 2011.08.01
UNDO tablespace 변경  (0) 2011.07.26
반응형
1. shutdown (normal)
  : dml 작업을 한 다른 session 들이 commit이나 rollback을 하지 않는 이상 절대 shutdown 불가능

2. shutdown transactional 
  - dml 작업을 한 session들은 그대로 냅두고, 다른 session 들만 끊는다.
  - 어쨌든 normal 과 같은 경우.

3. shutdown immediate
  - shutdown을 할때 가장 많이 쓰이는 명령어.
  - dml 작업을 한 다른 session 들을 자동 rollback 시키고 shutdown 을 가능하게 함.

4. shutdown abort
  - 강제로 shutdown 함.
  - system에 무리를 줄 수가 있음.
반응형

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

Linux 10.2.0.4 upgrade Patch  (0) 2011.10.31
startup 종류?  (0) 2011.08.18
shutdown 종류?  (0) 2011.08.18
UTL_URL 함수  (0) 2011.08.01
UNDO tablespace 변경  (0) 2011.07.26
MAXDATAFILES, DB_FILES(ORA-01118, ORA-00059)  (0) 2011.03.10
반응형
오라클에는 URL 을 Encoding 및 Decoding 하는 함수가 있다.
유용하게 사용 할 수 있을 것 같다.

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_url.htm#i996850

Encoding : select utl_url.escape('함수') from dual;
Decoding : select utl_url.unescape('%EC%97%89%EB%98%A5%ED%8F%AD%ED%8F%AC','UTF-8') from dual;

Encoding 은 왤케 안되는지 모르겠다. 아무래도 한글로 Encoding 할려니 안되는 것 같다.
근데 Decoding은 왤케 잘되는지..
열심히 찾고 있는 중이다. ㅋㅋ
반응형

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

startup 종류?  (0) 2011.08.18
shutdown 종류?  (0) 2011.08.18
UTL_URL 함수  (0) 2011.08.01
UNDO tablespace 변경  (0) 2011.07.26
MAXDATAFILES, DB_FILES(ORA-01118, ORA-00059)  (0) 2011.03.10
characterset 변경 및 주의할 점.  (0) 2011.01.06
반응형
1. 또 다른 undo tablespace를 생성한다.
create undo tablespace undotbs2
datafile '/data4/oradata/undotbs2.dbf' size 1G autoextend on next 64M maxsize unlimited;

2. 새로 생성한 undo를 임시로 default 로 설정한다.
alter system set undo_tablespace = UNDOTBS2;

3. 기존 undo tablespace를 삭제한다.
drop tablespace undotbs1 including contents and datafiles cascade constraints;

4. 새로 적용할 undo tablespace를 생성한다.
create undo tablespace undotbs1
datafile '/data1/oradata/undotbs01.dbf' size 2G autoextend on next 100M maxsize 4G,
         '/data2/oradata/undotbs02.dbf' size 2G autoextend on next 100M maxsize 4G,
         '/data3/oradata/undotbs03.dbf' size 2G autoextend on next 100M maxsize 4G,
         '/data4/oradata/undotbs04.dbf' size 2G autoextend on next 100M maxsize 4G
;

5. default undo tablespace의 값을 재설정한다.
alter system set undo_tablespace = UNDOTBS1;

6. 임시로 만들어 놓은 undo tablespace를 삭제한다.
drop tablespace undotbs2 including contents and datafiles cascade constraints;
반응형

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

shutdown 종류?  (0) 2011.08.18
UTL_URL 함수  (0) 2011.08.01
UNDO tablespace 변경  (0) 2011.07.26
MAXDATAFILES, DB_FILES(ORA-01118, ORA-00059)  (0) 2011.03.10
characterset 변경 및 주의할 점.  (0) 2011.01.06
오라클 10.2.0.1.0 설치  (0) 2010.09.08
반응형
SQL> desc v$rollstat

Name                                     Null?    Type
 ------------------------- -------- ------------ 
USN                                                    NUMBER 
LATCH                                               NUMBER
 EXTENTS                                          NUMBER 
RSSIZE                                             NUMBER 
WRITES                                             NUMBER
 XACTS                                              NUMBER
 GETS                                                NUMBER 
WAITS                                               NUMBER 
OPTSIZE                                           NUMBER 
HWMSIZE                                          NUMBER 
SHRINKS                                            NUMBER 
WRAPS                                              NUMBER 
EXTENDS                                          NUMBER 
AVESHRINK                                       NUMBER 
AVEACTIVE                                       NUMBER 
STATUS                                             VARCHAR2(15) 
CUREXT                                             NUMBER 
CURBLK                                             NUMBER

EXTENTS    : ROLLBACK SEGMENT의 EXTENT의 개수
RSSIZE       : ROLLBACK SEGMENT의 현재 크기의 바이트
XACTS        : ROLLBACK SEGMENT에 작업중인 Transaction의 수
OPTSIZE     : ROLLBACK SEGMENT의 OPTIMAL 값
AVEACTIVE : 평균적으로 활성화된 EXTENT의 크기
STATUS      : -nline = 현재 사용할 수 있는 상태
                     Offline = 현재 ROLLBACK SEGMENT를 ALTER 문으로 offline하였으나  
                     활성 transaction으로 인해 대기 중인 상태
CUREXT      :  현재 ROLLBACK SEGMENT가 어느 EXTENT에 기록하고 있는지 나타냄
CURBLK      :  현재 ROLLBACK SEGMENT가 어느 BLOCK에 기록하고 있는지 나타냄
반응형

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

ALL_COL_COMMENTS  (0) 2011.12.22
v$rollstat  (0) 2011.04.15
v$session  (0) 2011.04.14
반응형

개념

1. 대기 이벤트란 오라클 인스턴스 내에서 공유된 자원을 사용하기 위해 프로세스들이 점유를 해야하는데 
   이 때 점유를 하지 못하는 상태에서는 sleep 상태에 빠지며, 이 때 발생되는 현상을 대기 이벤트라고 한다. 
   그때마다 오라클은 그 상태 정보를 파일 또는 SGA 메모리 내에 저장해 둔다.
2. 오라클 개발자들이 디버깅 용도로 개발한 것이라고 한다. 
    그것이 오늘에 이르러 OWI라는 이름을 덧입으면서 성능 관리 분야에 일대 변혁을 가져오게된다.

시스템 커널 레벨에서의 표현

1. 다른 프로세스를 기다려야 하는 상황에서 CPU를 쥔 채 대기하면 불필요하게 CPU 자원을 낭비하는 것이므로 
   CPU를 OS에 반환하고 수면(sleep) 상태로 빠지는 것을 말한다.
2. 수면 상태에 빠진다는 것은 프로세스가 wait queue로 옮겨지는 것을 말하며, wait queue에 놓인 
    프로세스에게는 CPU를 할당해 줄 필요가 없으므로 OS는 해당 프로세스를 스케쥴링 대상에서 제외 시킨다.
3. 선행 프로세스가 일을 마치면 OS에게 그 사실을 알려 자신을 기다리던 수면 상태의 프로세스를 깨우도록 
    신호를 보낸다. 그럼 OS는 그 프로세스를 runnalble queue에 옮김으로써 가능한 빨리 CPU를 할당 받아 
    일을 재개할 수 있도록 스케쥴링한다.

대기 이벤트는 언제 발생할까?

1. 자신이 필요로 하는 특정 리소스가 다른 프로세스에 의해 사용 중일때
   - 자신이 읽으려는 버퍼에 다른 프로세스가 쓰기 작업을 진행 중이라면 선행 프로세스가 일을
      마칠 때까지 기다려야 한다.
      'buffer busy waits','latch free','enqueue' 이벤트 등이 여기에 속함
2. 다른 프로세스에 의해 선행작업이 완료되기를 기다릴 때
   - DBWR가 Dirty 버퍼를 디스크에 기록할 때, 먼저 LGWR가 로그 버퍼에 있는 Redo Entry를 
     Redo Log 파일에 기록하는 작업이 선행되어야 하는데 이때 DBWR는 LGWR를 깨워 로그 버퍼를 비우라는 
     신호를 보내고 LGWR가 일을 마칠 때까지 수면 상태에서 휴식을 취함.
   - LGWR가 일을 마치면 DBWR를 깨우고 자신은 다시 대기 상태로 빠진다.
     'write complete waits','checkpoint completed','log file sync','log file switch' 이벤트 등이 여기에 속함
3. 할 일이 없을 때(idle 대기 이벤트)
   - 서버 프로세스는 쿼리 결과를 사용자에게 전송하는 동안 array 단위로 일을 처리하는데 array 크기만큼 
      데이터를 전송하면 다음 Fetch Call를 받을 때까지 기다림. 쿼리 결과집합을 모두 전송하고 나서도 
      다음 Parse Call 또는 Execute Call를 받을 때까지 기다린다. 
      'SQL*Net message from client' 등이 여기에 속함

session 1(scott 계정)                                        session2(scott 계정)
SQL>conn scott/tiger                                             SQL>conn scott/tiger
Connected.                                                           Connected.
SQL> insert into dept values(90,'DBA','BUSAN');      SQL> insert into dept values(90,'DBA','BUSAN');
1 row created.                                                       Hang 상태에 빠짐
SQL>

session3(system 계정)
sqlplus system/-****
SQL> select *
  2   from   v$session_wait
  3   order by wait_class, event, sid;

SID EVENT
--- ----------------------------
140 enq: TX - row lock contention <-- 대기 이벤트 발생.
SQL> select blocking_session_status, blocking_session
   2   from   v$session
   3   where  sid = 140;

BLOCKING_SESSION_STATUS BLOCKING_SESSION
-----------------------------    --------------------
VALID                                                          155  <-- SID 155가 140을 blocking 하고 있음.

SQL> select * from v$session_wait_class where sid=140;

SID SERIAL# WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS TOTAL_WAITS TIME_WAITED
--- -------- --------------- -------------- ------------ -------------- -------------
140       2564        4217450380                     1 Application                    649            188869
140       2564        3386400367                     5 Commit                       4                  16
140       2564        2723168908                     6 Idle                              36            177751
140       2564        2000153315                     7 Network                          36                   0
140       2564        1740759767                     8 User I/O                           1                   7

->application에 관련된 세션 wait 이벤트가 649회 188869에 걸쳐서 발생됨.


-- session wait history 정보를 자동 저장 관리하고 있다.
SQL> select event, wait_time, wait_count
   2  from v$session_wait_history
   3  where sid=145;

-- wait 이벤트중 (lock 이 걸렸을 때.)
EVENT                                 WAIT_TIME WAIT_COUNT
---------------------------- ----------- -------------
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1
enq: TX - row lock contention             293                  1

-- wait 이벤트가 끝났을 때
EVENT                                 WAIT_TIME WAIT_COUNT
---------------------------- ----------- -------------
log file sync                                        8                   1
SQL*Net message from client             261                  1
SQL*Net message to client                    0                  1
SQL*Net message from client                2                  1
SQL*Net message to client                    0                  1
enq: TX - row lock contention             150                  1
SQL*Net message from client            9261                  1
SQL*Net message to client                    0                  1
SQL*Net message from client                2                  1
SQL*Net message to client                    0                  1

대기 이벤트는 언제 사라질까?

1. 오라클 프로세스가 자신이 작업을 진행할 때 선행 프로세스가 먼저 점유하여 대기 상태에 빠질 경우 
    선행 작업이 끝나고 나서 자신에게 알려주어 일을 진행하거나, 타이머에 설정된 시간에 깨어나 
    선행 프로세스가 작업을 모두 마쳤는지 확인할 때 사라짐.
2. 대기 상태에 빠진 프로세스가 기다리던 리소스를 사용할 수 있게 될 경우
3. 작업을 계속 진행하기 위한 선행작업이 완료 될 경우
4. 해야 할 일이 생겼을 경우
반응형
반응형
desc v$session
반응형

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

ALL_COL_COMMENTS  (0) 2011.12.22
v$rollstat  (0) 2011.04.15
v$session  (0) 2011.04.14
반응형
대용량 파티션 테이블에 일정기간 데이터만을 보유할 경우 
부분적으로 파티션 테이블 및 테이블 스페이스를 삭제를 해야하는 경우가 있다.

아래 쿼리들은 Range 파티션 테이블 일때 해당 되는 쿼리이다.
partition_name을 날짜로 지정해 주었을 때만 해당기간에 대해서 날짜를 가져와서 출력할 수 있다.
쿼리 실행시 주의할 점은 전부 쿼리를 실행시켜서 script가 출력되게 하여야 한다는 것이다.
무슨말이냐면 아래 쿼리들은 전부 dba_tab_partitions에서 가져온다.
그러므로 파티션 테이블 삭제 스크립트만 돌리고 다음 쿼리(테이블스페이스 삭제 쿼리)를 실행시키고자 하면 데이터가 안나온다.

1. 파티션 테이블 부분 삭제 script 생성
select 'alter table '||table_owner||'.'||table_name||' drop partition '||partition_name||';' script
from dba_tab_partitions 
where table_owner = 'SCOTT'
and   table_name in ('테이블명')
and partition_name>= '20110201' and partition_name<= '20110228'
order by table_name, partition_name
;

subpartition 일때 parttiton 쿼리로 돌리면 엄한 테이블스페이스 및 데이터파일을 삭제할 수가 있으니 유념하자.

2. TABLESPACE 및 DATAFILE 삭제 script 생성
select 'drop tablespace '||tablespace_name||' including contents and datafiles cascade constraints;' script
from dba_tab_partitions 
where table_owner = 'SCOTT'
and   table_name in ('테이블명')
and   partition_name>= '20110201' and partition_name<= '20110228'
order by tablespace_name
;

3. subpartition table 일때 TABLESPACE 및 DATAFILE 삭제 script 생성
select 'drop tablespace '||tablespace_name||' including contents and datafiles cascade constraints;' script
from dba_tab_subpartitions 
where table_owner = 'SCOTT'
and   table_name in ('테이블명')
and   partition_name>= '20110201' and partition_name<= '20110228'
order by tablespace_name
;

4. datafile 삭제 여부 확인(오라클 버그로 간혹 데이터파일이 삭제가 되지 않을 때가 있다. OS 단에서 확인을 해보자)
select c.table_name, b.name tablespace_name, a.name datafile, 'ls '||a.name script
from v$datafile a, v$tablespace b, 
(
    select partition_name, table_name, tablespace_name
    from   dba_tab_partitions
    where  table_name in ('테이블명')
) c
where a.ts#=b.ts#
and   b.name=c.tablespace_name
and   partition_name >= '20110201' and partition_name <= '20110228'
group by c.table_name, b.name, a.name
;

반응형
반응형
SQL> alter tablespace temp add tempfile '/media/sda1/PROD/Disk3/temp02.dbf' size 32G;
alter tablespace temp add tempfile '/media/sda1/PROD/Disk3/temp02.dbf' size 32G
*
ERROR at line 1:
ORA-01144: File size (4194304 blocks) exceeds maximum of 4194303 blocks

데이터파일은 32기가를 넘을수가 없어서 위와 같은 에러메세지를 보여준다.
반응형
반응형
남궁혁 | 한국오라클

오라클에서는 패치 관리 유틸리티 Opatch를 통해 새로운 패치 관리 기능들을 제공하고 있다. 
여기서는 Opatch의 구성 및 설치 방법과 각 명령어의 사용법을 소개한다. 
아울러, 기존에 발생했던 몇 가지 문제들도 소개함으로써, 독자의 Opatch 사용에 도움을 줄 것이다. 

오라클에서는 특정 문제를 완벽하게 해결한 패치셋(patchset)이나 차기 릴리즈를 발표하기 전에 임시 패치(interim patch, 혹은‘one-off’patch) 를 제공하여 해당 문제에 적용할 수 있도록 하고 있다. 물론, 이 임시 패치 는 특정 버전의 컴포넌트에만 적용할 수 있다. 예를 들어, Oracle Database 8.1.7.3에 대해 생성된 임시 패치는 Oracle Database 8.1.7.4에 는 적용할 수 없다. 그리고, 대부분의 임시 패치는 차기 패치셋에 포함된다. 그런데, 이 임시 패치는 해당 문제가 해결됐는지는 테스트하지만, 패 치가 적용된 후 발생할 수 있는 부작용 등을 테스트하는 리그레션 (Regression) 테스트는 하지 않는다. 이 리그레션 테스트는 패치셋에서 테 스트된다. 따라서 특별한 경우가 아니라면, 임시 패치를 적용하기보다는 패치셋을 적용할 것을 권한다. 
임시 패치를 여러 개 적용하다 보면, 이전 임시 패치와의 충돌이 발생 하기도 한다. 이를 방지하기 위해서, 임시 패치를 요청할 경우에는 Oracle Support에 이전에 설치한 모든 임시 패치 리스트를 제공하여, 충돌여부를 확인하고, 만약 충돌 발생시 병합하는 과정을 거치도록 해야 한다(임시 패 치 적용시 또 하나 주의할 점은 함께 제공되는 해당 패치의 Readme 파일 을 꼭 확인하는 것이다). 
Oracle Database 9.0.1 버전까지는 패치 적용시 셸 스크립트를 이용 하여 패치를 적용하도록 되어 있었다. 그러나 9.2 버전부터는‘Opatch’라 는 패치 관리 유틸리티가 등장하여, 이전에 없었던 새로운 패치 관리 기능 들을 제공하고 있다. 
이 글에서는 Oracle Database 9.2에서 패치 적용시 사용되는 Opatch 의 구성 및 설치 방법, 각 명령어의 사용방법에 대해 알아보도록 하겠다. 그 리고 기존에 발생했던 대표적인 Opatch 적용시의 문제들도 간략하게 소 개한다. 

Opatch 사용 환경 및 설치 방법

Opatch는 Oracle Database 9.2 이상의 오라클 데이타베이스와 Oracle Application Server 10g에 임시 패치를 적용하는 과정을 지원한다. 현재 지원되는 플랫폼은 Unix와 Windows 계열이며, 현재 IBM OS/390에 대 해서는 지원하지 않는다. 따라서, IBM OS/390에 대해서는 이전(Oracle Database 9.0.1 이전 방식)과 동일하게 임시 패치를 적용해야 한다. 
Opatch는 Oracle Database 9.2에 포함되어 있지 않으며, 설치하려면 Oracle Metalink에서 다운로드해야 한다. 다운로드 절차는 다음과 같다. 

1.Oracle Metalink(http://metalink.oracle.com)에 로그인한다. 
2.PATCHES 버튼을 선택한다. 
3.Simple Search 링크를 선택한다. 
4.Patch(s) Numbers 폼에‘2617419’를 입력한다. 
5.Platform or Language 리스트에서 해당 플랫폼을 선택한다. 
6.Go 버튼을 선택한다. 
7.다음 항목을 선택한다. 
2617419 Universal Installer: Patch OPATCH ARU PLACEHOLDER. (10.1.0.2) 
8.다운로드가 진행된다. 
9.다운 받은 파일을 압축 해제한다. 
$ unzip p2617419_10102_GENERIC.zip 
10.User Path에 등록한다. 
For Korn / Bourne shell : % export PATH=$PATH:/oracle/opatch/Opatch For C Shell : % setenv PATH $PATH:/oracle/opatch/Opatch 

Opatch를 실행을 위한 요구사항. 

● Perl : 최소 Perl 5.0.0.5_03 이상이 시스템에 설치되어야 하며, 5.6 버전 이상 이 권장된다. Perl은 오라클 설치시‘Typical’옵션으로 설치하거나, ‘Custom’설치시 Apache Web Server를 선택하면 $ORACLE_HOME/ Apache/perl에 설치된다. 

● Inventory : 오라클 제품은 두 개의 인벤토리를 유지하는데, 하나는 oraInst.loc 파 일 에 서 지 시 하 는 센 트 럴 인 벤 토 리 이 며 , 보 통 $ORACLE_BASE/oraInventory의 이름으로 존재한다. 이 인벤토리는 설치 된 오라클 제품의 정보를 보관한다. 또 하나의 인벤토리는 로컬 인벤토리로, $ORACLE_HOME/inventory에 위 치 한 다 . 이 인 벤 토 리 에 는 특 정 ORACLE_HOME에 설치된 컴포넌트 정보를 저장한다. 이 두 개의 인벤토리 가 정상적으로 유지되어야 한다(참고로, oralnst.loc의 위치는 AIX, Linux는 /etc 디렉토리에 위치하며, 다른 Unix에서는 /var/opt/oracle에 위치한다. Windows는 레 지 스 트 리 에 서 HKEY_LOCAL_MACHINE/Software/ Oracle/Oracle/inst_loc 항목에 지정된 위치에 있다). 

● Opatch : Oracle9i Database에는 Opatch 유틸리티가 번들되어 있지 않으므 로, 앞에서언급한것처럼Oracle Metalink에서다운받아야하며, 해당패치넘 버로 최신Opatch 버전이 업데이트되므로, 항상 최신 버전을 유지하도록 한다. 

● Path : RAC(Real Application Cluster)에서 임시 패치 적용시, $ORACLE_ HOME/lib와$ORACLE_HOME/srvm/lib이 라이브러리 패치에 포함되어야 한다(예를 들어, Solaris의 경우 LD_LIBRARY_PATH, HP-UX의 경우 SHLIB_PATH). 

Opatch를 설치한 후 디렉토리 구조를 보면 다음과 같이 구성되어 있다. 





패치 파일을 다운 받아 압축을 풀면, 해당 패치 번호의 이름으로 디렉 토리가 생성되며, 이 밑에 etc와 files 두 개의 디렉토리가 생성된다. Files 디렉토리 밑에는 lib 디렉토리가 있고, 이 디렉토리에 실제로 적용할 객체 파일들이 있다. 
etc 디렉토리 밑에는 config와 xml 디렉토리가 생성된다. Config 디렉토리 밑에 있는 Actions 파일은 패치가 적용되어야 하는 대상 아카이브 파일과 디렉토리, 메이크 파일 등이 기록되어 있다. Inventory 파일에는 패치 적용 후 오라클 인벤토리에 업데이트해야 하는 내용과 대상 플랫폼, 오라클 버전이 기록되어 있다. 
Xml 디렉토리에는 GenericAction.xml 파일이 있다. 이 파일에는 각 운영체제별로 사용할 명령어가 정의되어 있다. ShipHomeDirectoryStructure. xml 파일에는 패치 디렉토리의 구조가 정의되어 있다. 

Opatch의 사용 방법

Opatch의 기능을 정리하면 다음과 같다. 

● 임시 패치의 적용 
● 적용한 임시 패치의 제거
● 설치한 컴포넌트와 패치(임시 패치 및 패치셋)에대한정보조회 
● 임시 패치에 대한 정보 조회 

그러면 이런 기능들을 어떻게 사용하는지 하나씩 알아보자. 

Usage : opatch [ -h[elp] ] [ -r[eport] ] [ command ] [ command argument ]
Global argument
-h[elp] : 특정 명령어에 대한 설명
예) opatch -h lsinventory
-r[report] : 실제 패치 적용 없이 처리과정을 화면 출력
패치 적용

패치 적용은 Apply 명령어를 사용한다. 기본적인 명령은 다음과 같다. 

$ opatch apply [ -delay ] [ -force ]
[ -invPtrLoc ]
[ -jdk ] [ -jre ] [ -local ]
[ -minimize_downtime ] [ -no_bug_superset ]
[ -no_inventory ] [ -oh ]
[ -retry ] [ -silent ] [ -verbose ]
각각의명령어아규먼트(command argument)를설명하면, 다음과같다. 

● force : 이전에 설치한 임시 패치와 충돌 발생시 이를 무시하고 설치하도록 한 다. 이 경우 기존의 객체 파일을 새로운 객체 파일로 대체하게 되므로 주의하여 야한다. 

● invPtrLoc : oraInst.loc 파일의 위치를 수동으로 지정할 때 사용한다. 오라클 제품 설치시 별도의 옵션을 주지 않으면 oraInst.loc 파일은 각 플랫폼의 디폴 트 위치에 생성된다. 이 위치를 사용자가 변경하기 위해‘runInstaller - invPtrLoc <경로 및 파일명>’처럼 사용할 수 있다. Opatch에 oraInst.loc 파 일의 위치를 알려주기 위해 이 아규먼트를 사용해야 한다. 

● jdk : 디폴트로 사용되는$ORACLE_HOME/jdk 이외의 jdk를 이용하여 패치 할 때 이 아규먼트를 사용한다. 

● jre : 디폴트로 사용되는 $ORACLE_HOME/jre 이외의 jre를 이용하여 패치 할 때 이 아규먼트를 사용한다. 

● local : RAC에서 사용할 수 있으며, 패치 적용을 다른 노드에 전파하지 않고 로컬 노드에만 적용한 후 인벤토리도 로컬 노드에서만 업데이트한다. 이 경우 다른 노드에서도 개별적으로 로컬 아규먼트를 이용하여 즉시 패치가 적용되어 야한다. 일부 노드만 패치를 적용해 운영하는 것은 허용되지 않는다. 

● minimize_downtime : 임시 패치 적용중 RAC의 다운타임을 최소화하기 위해 사용할 수 있다. 

● no_bug_superset : 설치하려는 패치가 이미 설치한 패치의 슈퍼셋인 경우 에러를 발생시킨다. 

● no_inventory : 패치 적용 과정 중에서 인벤토리를 읽거나 업데이트하는 과 정을 생략한다. 이 명령어 아규먼트는 인벤토리 변조 등으로 인해 정상적으로 인벤토리를 읽거나 업데이트할 수 없을 때만 사용해야 하며, 일단 사용 후에는 미지원 상태가 되므로 사용에 주의해야 한다. 그리고 위에서 설명한 로컬 명령 어 아규먼트는와는 같이 사용할 수 없다 

● oh : 정의된$ORACLE_HOME 대신에사용할ORACLE_HOME을지정한다. 

● silent : 사용자 인터랙션을 모두 디폴트 값으로 적용하여 패치를 진행한다. 

● verbose : 기본적으로 나타나는 정보보다 더 자세한 내용을 화면과 로그 파일 에 출력한다. 

● Patch_location : 설치하려는 임시 패치의 모든 경로를 표시한다. 

그러면, 패치 적용의 사용 예를 간단히 알아보자. 

$ opatch apply 

단순히 이 명령으로 패치를 적용할 수 있다. 

$ opatch apply -invPtrLoc $ORACLE_HOME/oraInst.loc -silent 

이 명령으로 oraInst.loc 파일의 위치를 알려주고, 모든 사용자 인터랙 션은 디폴트 값으로 설정한 후 패치를 적용할 수 있다. 

패치 제거

패치 제거를 위해서는 Rollback 명령어를 사용한다. 

$ opatch rollback -id [ -invPtrLoc ] 
[ -jdk ] -jre -local
[ -oh [ -ph ]
-silent -verbose
Rollback 명령어 아규먼트 중 Apply 명령어 아규먼트와 중복되지 않 는 아규먼트는 다음과 같다. 

● id : 제거하려는 임시 패치 번호이다. 
● ph : 패치 스테이지의 위치, 즉 패치를 제거할 때도 패치 파일이 필요하다. 

간단한 패치 제거 사용 예는 다음과 같다. 

$ opatch -id 380927 -ph /opt/oracle/920/380927 

위의 명령으로 패치 번호 380927을 롤백하게 된다. 

패치 정보 조회

패치 정보 조회를 위한 명령은 다음과 같다. 

$ opatch query [ -all ] [ -get_base_bug ] [ -get_component ]
[ -get_date ] [ -get_os ] [ -get_system_change ] 
[ -is_rolling ] [ -is_shutdown ]
패치의 조회는 Query 명령어를 사용하며, 다운 받은 임시 패치 자체 의 정보를 확인할 때 사용한다. 
Query 명령어의 아규먼트는 다음과 같다. 

● all : 모든 아규먼트로 조회되는 정보를 알려준다. 
● get_base_bug : 해당 패치에 의해 수정된 베이스 버그를 알려준다. 
● get_component : 패치 적용시 요구되는 컴포넌트를 알려준다. 
● get_date : 패치가 생성된 일자를 알려준다. 
● get_os : 패치 파일이 지원하는 운영체제를 알려준다. 
● get_system_change : 해당 패치를 적용한 후 시스템에 변경되는 사항을 알 려주는 아규먼트이지만, 현재는 지원되지 않는다. 
● is_rolling : 해당 패치가 롤링 패치가 가능한지 알려준다. 
● is_shutdown : 해당 패치 적용시 인스턴스를 다운해야 하는지 여부를 알려주 지만, 현재는 지원되지 않는다. 

설치된 패치 리스트 조회

ORACLE_HOME에 설치된 오라클 제품 컴포넌트를 조회하거나, 적용된 임 시 패치를 조회할 때는 lsinventory 명령어를 사용한다. 

$ opatch lsinventory [ -all ] [ -detail ]
[ -invPtrLoc ] 
[ -jre ] [ -oh ]
이 명령어의 아규먼트는 다음과 같다. 

● all : ORACLE_BASE 밑에 설치된 모든ORACLE_HOME 정보를 표시한다. 
● detail : 설치된 패치 내에 포함된 라이브러리 파일까지 표시해 주므로 패치 적 용시 충돌되는 객체 파일을 확인할 수 있다. 

Opatch 버전 조회

Opatch의 버전을 조회하는 실제 예는 다음과 같다. 여기서 현재 사용한 Opatch는 1.0.0.0.50 버전임을 알 수 있다. 

[rmtdcaix4]/apac/rdbms/3748283> ../OPatch/opatch version 
PERL5LIB=/apac/rdbms/64bit/app/oracle/product/9.2.0.4/Apache/perl/lib/5.00503:../ 
OPatch/perl_modules; export PERL5LIB 
/apac/rdbms/64bit/app/oracle/product/9.2.0.4/Apache/perl/bin/perl 
../OPatch/opatch.pl version 
../OPatch/opatch.pl version: 1.0.0.0.50 

RAC에서의 Opatch 사용

기본적으로 임시 패치 적용시는 인스턴스를 다운한 후 적용해야 하므로, 패 치 적용시는 서비스를 할 수 없게 된다. RAC에서는 몇 가지 아규먼트를 사용 하여 다운타임을 최소화할 수 있다. 
대략적으로RAC에서 패치가 적용되는 방법을 적어보면 다음과 같다. 

If (사용자가 패치 적용방법을minimize_downtime으로 설정) 
patching mechanism = Minimize Downtime 
else if (패치가 롤링 패치를 지원) 
patching mechanism = Rolling 
else 
patching mechanism = All-Node 

여기서, 주의할 점은 CFS 등의 공유 파일 시스템에 오라클 제품을 설치 하여 여러 노드에서 공유하는 경우에는 minimize_downtime과 롤링 패치 가 적용되지 않는다는 것이다. 
그러면 각각의 방법에 대해 알아보자. 

All-Node

이것은 일반적인 데이타베이스에 패치를 적용하는 것처럼, 모든 인스턴스를 다운한 후, 한 노드씩 순차적으로 진행한다. ORACLE_HOME을 여러 노드 에서 공유하는 경우는 이 방식으로 패치를 적용해야 한다. 

Minimize_downtime

Minimize_downtime은 RAC 운영시 다운타임을 최소화하기 위해 사용된 다. 2노드RAC의 경우를 예로 패치 절차를 알아보자. 

1.먼저 로컬 노드의 인스턴스를 셧다운한다. 
‘opatch apply -minimize_downtime’명령으로 패치를 시작한다. 

2. ‘Is this node ready for updating?’질문에‘Yes’로 답하면, 로컬 노드에 패치가 적용된다. 

3.패치 적용 후 다음에 적용할 노드명을 물어본다. 

4.해당 노드명을 입력하면, 이 노드의 인스턴스를 셧다운하도록 요청한다. 

5.요청받은 노드의 인스턴스는‘Shutdown immediate’로 셧다운한 후, 셧 다운이 완료되면 이미 패치가 적용된 노드의 인스턴스가 셧다운한다. 

6.두 번째 노드에 패치를 적용한다. 

7.인벤토리 정보가 업데이트된다. 

8.패치가 완료되면 두 번째 인스턴스도 셧다운한다. 

Minimize_downtime 아규먼트를 사용해도 모든 인스턴스가 다운되는 단계는 있지만, 5번 단계에서만 해당되므로, 다운타임을 최소화할 수 있다. 

Rolling Patch

롤링 패치가 Minimize_downtime과 틀린 점은 다운타임이 전혀 없다는 것이다. 적용 절차는 다음과 같다. 

1.먼저 인스턴스1을 셧다운한다. 이 단계에서 인스턴스2는 서비스 중이다. 
2.노드1에서‘opatch apply’명령으로 패치를 적용한다. 
3.노드1에 패치가 적용되었으면, 인스턴스1을 시동하라는 메시지를 받는다. 
그리고 다음에 적용할 노드를 입력하도록 메시지를 받는다. 
4.인스턴스2를 셧다운한다. 
5.3번 세션에서 계속 이어서 노드2에 패치를 적용한다. 
6.패치 적용후 인스턴스2를 시동한다. 

롤링 패치는 모든 패치가 다 가능한 것은 아니고, 롤링 패치를 지원하도 록 설계된 패치만 가능하다. 롤링 패치가 가능한지 여부는‘opatch query - is_rolling’명령으로 확인할 수 있다. 

Windows 플랫폼에서 Opatch 사용

Windows에서 Opatch를 사용할 때도 기본적인 명령어는 동일하다. 
Opatch 명령을 실행하면 Windows 레지스트리에 ORACLE_HOME 이 등록되어 있어도, ORACLE_HOME이 지정되지 않았다는 메시지가 나 온다. Opatch 명령어를 사용할 때 -oh 아규먼트를 사용하여 ORACLE_HOME을 지정하거나, DOS 프롬프트에서 다음 명령으로 ORACLE_HOME을 지정한다. 

C:\> Set ORACLE_HOME = 

트러블슈팅

>임시 패치가 적용되었는지 어떻게 확인할 수 있는가?

일반적으로 패치가 적용되었는지를 보려면‘opatch lsinventory’를 사용하 여 확인한다. 

Oracle Database 9.2 이 상 에 서 임 시 패 치 를 적 용 하 면 , 

$ORACLE_HOME/.patch_storage 디렉토리 밑에 해당 패치 번호를 이름 으로 디렉토리가 생성되고, 이 디렉토리 밑에 패치 적용 로그와 패치 적용 이전의 라이브러리 파일, 롤백시 적용할 스크립트가 있다. 여기서 로그 파 일을 보는 것도 패치가 적용되었는지 확인하는 방법이 될 수 있다. 이 로그 파일은 패치 적용을 실행하는 횟수만큼 생성된다. 
또 한 가지 방법은 아카이브 파일을 Ar 명령으로 조회해 보는 것이다. 
예를 들어, kko.o 파일을 libserver9.a에 적용하는 경우, ‘ar tv libserver 9.a|grep kko.o’명령으로 kko.o의 타임스탬프를 조회할 수 있다. 

Windows에서 Opatch 실패

Windows 플랫폼에서Opatch를실행하면다음메시지가나오는경우가있다. 

C:\oracle\ora92\OPatch>opatch lsinventory 
“You have to invoke the patch tool manually.” 
“The syntax is:” 
“ perl /opatch.pl ” 
“If everything is installed correctly you should be able to run” 
“ perl /opatch.pl” 
“ and see the basic help message.” 
C:\oracle\ora92\OPatch>perl opatch.pl lsinventory 
<< 중략 >> Required Jar File under Oracle Universal Installer = jlib\OraInstaller.jar 
‘“”C:\Program’은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 
배치 파일이 아닙니다. 
Get inventory loc. from C:Program Files... 
<< 생략 >> 

Opatch 사용시 권장되는 Perl 버전은 5.6 이상이지만, 이상하게도 Windows에서 Perl 5.6 이상을 사용하여 Opatch를 실행하면 위와 같은 에러 메시지가 발생한다. 이 경우 $ORACLE_HOME/Apache /perl을 사 용하도록 한다. 

컴포넌트/버전의 불일치

This Oracle Home does not have components/versions required by the patch. 
ERROR: OPatch failed during pre-reqs check. 

위와 같은 메시지는 적용하려는 임시 패치가 요구하는 컴포넌트가 설치되 지 않았거나, 지원하는 버전이 틀린 경우이다. 
패치 파일의 요구사항은‘opatch-query’명령으로 조회해 볼 수 있다. 
혹은 patch stage/etc/config/inventory 파일을 열고, 항목을 확인해도 된다. 

유효한 패치 영역이 아닌 경우

Not a valid patch area 

이 경우는 현재의 작업 디렉토리가 패치 디렉토리가 아니거나 패치 디렉토 리명이 패치 ID와 같지 않아서 발생하는 문제이다. 
패치 디렉토리가 현재 디렉토리가 아닌 경우는 경로를 명시해 주어야 한다. 예를 들어서, 현재 디렉토리는‘/oracle’이고, 패치는‘/oracle/3809254’에 있는 경우, ‘opatch apply /oracle/3809254’라고 명령을 내려야 한다. 
패치 디렉토리가 패치 ID와 이름이 다른 경우는 먼저 패치 ID를 확인 한다. 이 정보는‘opatch query -all’로 확인하거나‘patch stage/etc /config/inventory’파일에서 reference_id 항목에서 확인할 수 있다. 이 후 디렉토리명을 패치 번호와 동일하게 맞춰 준다. 

java.lang.UnsatisfiedLinkError

Exception in thread “main”java.lang.UnsatisfiedLinkError: 
no oraInstaller in java.library.path 

이 경우 원인은 대부분 liboraInstaller.so가 라이브러리 경로에 포함 되지 않았기 때문이다. 
이 파일은 $ORACLE_HOME/oui/bin/ 디렉토리에 있 다. 이 경로를 라이브러리 경로에 추가하고, 다시 패치를 적용한다. 

java.lang.NullPointerException

Exception in thread “main”java.lang.NullPointerException at XXX.main... 

오라클 제품의 최초 설치시 RunInstaller를 -invPtrLoc 옵션을 사용해서 실행한 경우일 수 있다. 이 경우 Opatch를 사용할 때도 동일한 -invPtrLoc 를 사용하여 oraInst.loc의 위치를 명시해 주어야 한다. 

Oracle Support에 문의해야 하는 경우

모든 문제가 그렇지만, Opatch 실행시 발생하는 문제도 거의 유형별로 다 르기 때문에, 위와 같이 일반화 하는 것이 힘들다. 따라서 일단 문제가 발생 하면, 다음과 같이 기본적인 점검을 하고, 다음 사항을 검토한다. 

● Opatch가 최신 버전인지 확인 
● Opatch를 실행하기 위한 환경이 셋업되었는지 확인 
PERL, JDK, 환경변수(PATH, LIBRARY PATH, …) 
● Fresh Install인지 확인 
● HP에서 fuser 문제인 경우 NOTE. 234741.1를확인 

더 이상 확인이 안될 경우는 Oracle Metalink(http://www. metalink. com)에서TAR를연후Oracle Support 엔지니어와 같이 문제를 해결해야 한다. 이 경우 다음 정보들을 미리 준비하여 Oracle Support에 전달하면 문제 해결에 도움이 될 수 있다. 

● 운영체제 디버깅 아웃풋 
예 : truss -aefdD -o test.out opatch apply 
● oraInst.loc 파일 
● $ORACLE_HOME/inventory/ContentsXML/comps.xml 
● $ORACLE_HOME/.patch_storage 디렉토리를 압축 
● oraInst.loc에 기록된 인벤토리 디렉토리 밑의 ContentsXML/inventory 파일 
● 운영체제 환경변수‘OPATCH_DEBUG=TRUE’를 세팅한 후 Opatch 적용시의 아웃풋 
● 문제가 발생하고 있는 임시 패치 번호 

오라클 관리자의 필수 유틸리티

Oracle Database 9.2부터 지원되는 Opatch는 임시 패치 관리에 있어서 많은 편리한 기능을 제공한다. 애플리케이션 서버도 Oracle Application Server 10g부터는 Opatch로 임시 패치를 관리하게 되므로, 오라클 관리 자에게 Opatch는 필수 유틸리티라고 할 수 있다. 
마지막으로 당부하고 싶은 것은 임시 패치 적용 전 반드시 센트럴 인 벤토리와 로컬 인벤토리를 백업하여 예기치 못한 인벤토리 충돌시 복구가 가능하도록 하기 바란다. 

제공 : DB포탈사이트 DBguide.net 

출처명 : 한국오라클 

[출처] 오라클 OPatch 사용법|작성자 sulgata

반응형
반응형
temporary tablespace는 데이터베이스를 open 하는데 크게 영향을 받지 않는다.
그러나 temporary tablespace가 없다면 alert file에는 아래와 같은 메세지를 뿌려주게 되어있다.

데이터베이스 startup 하였을시...

*********************************************************************
WARNING: The following temporary tablespaces contain no files.
         This condition can occur when a backup controlfile has
         been restored.  It may be necessary to add files to these
         tablespaces.  That can be done using the SQL statement:

         ALTER TABLESPACE <tablespace_name> ADD TEMPFILE

         Alternatively, if these temporary tablespaces are no longer
         needed, then they can be dropped.
           Empty temporary tablespace: TEMP
*********************************************************************

반응형
반응형
디비 생성시 초기 설정 해줄수 있는 MAXDATAFILES와 
구동되고 있는 디비에서 spfile or pfile에서 수정해 줄수 있는 db_files 파라미터가 있다.

1. MAXDATAFILES에 값이 부족하여 데이터 파일을 만들 수 없을 때 ORA-01118 에러를 뿌려주게 되어있는데 
   controlfile에 있는  MAXDATAFILES가 자동 증가 하는 것을 확인 하였다.
   (MAXDATAFILES 4000 -> 8000으로 증가됨)
   언제 이 에러가 발생되는지 찾지 못했다.
   ORA-01118: cannot add any more database files: limit of string exceeded

2.. db_files의 값을 초과하여 데이터 파일을 만들 수 없을때 ORA-00059 에 대한 에러 메세지가 출력된다.
    ORA-00059: maximum number of DB_FILES exceeded

예제 1) MAXDATAFILES가 자동 증가된다는 것을 확인.
SQL> select type, records_total, records_used
  2  from v$controlfile_record_section
  3  where type='DATAFILE';

TYPE                  RECORDS_TOTAL  RECORDS_USED
---------------- ------------------ ----------------
DATAFILE                                4000                   3001

SQL> show parameter db_files

NAME                           TYPE        VALUE
------------------ ----------- -----------
db_files                         integer          4000

다량의 데이터 파일을 생성하는 중 한계치가 도달하여 ORA-00059 에러가 발생.

TYPE                  RECORDS_TOTAL  RECORDS_USED
---------------- ------------------ ----------------
DATAFILE                                4000                   4000

SQL> alter system set db_files=4001 scope=spfile;
SQL> shutdown immediate;
SQL> startup;
SQL> show parameter db_files --> MAXDATAFILES가 4000이 되고 db_files는 4001이 된다.
                                                   데이터파일이 생성이 될 것인지 에러메세지를 뿌려줄것인지 확인하였다.

NAME                           TYPE        VALUE
------------------ ----------- -----------
db_files                         integer          4001

SQL> create tablespace test3996 datafile '/media/sda1/PROD/Disk3/ test3996.dbf' size 500k;

MAXDATAFILES가 변경되면서 정상적으로 생성됨.
alert file에는 다음과 같은 메세지가 뿌려진다.

Expanded controlfile section 4 from 4000 to 8000 records
Requested to grow by 4000 records; added 105 blocks of records

SQL> select type, records_total, records_used
  2  from v$controlfile_record_section
  3  where type='DATAFILE';

TYPE                  RECORDS_TOTAL  RECORDS_USED
---------------- ------------------ ----------------
DATAFILE                                8000                   4001

자동증가되어있는 것을 알수 있다. 혹시나 하는 마음에 trace 파일로 떨궈서 보았지만 똑같다.

예제 2) MAXDATAFILES 수정.

SQL> show parameter user_dump_dest

NAME                               TYPE VALUE
--------------------- ---------- -----------------------------------
user_dump_dest                 string  /media/sda1/PROD/admin/udump

SQL> alter database backup controlfile to trace; OR alter database backup controlfile to trace as '경로명';

user_dump_dest에 있는 경로명으로 가서 trace 파일을 확인.

CREATE CONTROLFILE REUSE DATABASE "PROD" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 5
    MAXLOGMEMBERS 3
    MAXDATAFILES 4000
    MAXINSTANCES 1
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/media/sda1/PROD/Disk4/redo1a.log',
    '/media/sda1/PROD/Disk5/redo1b.log'
  ) SIZE 25M,
  GROUP 2 (
    '/media/sda1/PROD/Disk4/redo2a.log',
    '/media/sda1/PROD/Disk5/redo2b.log'
  ) SIZE 25M
-- STANDBY LOGFILE
DATAFILE
  '/media/sda1/PROD/Disk1/system01.dbf',
  '/media/sda1/PROD/Disk1/undotbs01.dbf',
.
.
CHARACTER SET KO16MSWIN949
;

이부분을 스크립트 파일로 복사한다.(control.sql 생성하여 복사)
MAXDATAFILES를 현재 설정된 4000의 값을 8000으로 수정하였다. 

cf.
스크립트 복사시 주위할 점은 NORESETLOGS와 RESETLOGS가 있어서 같은 
스크립트가 trace로 떨궜을 경우 두번 출력이 된다. 
나는 데이터파일을 워낙 많이 생성하여 처음부터 끝까지 긁어서 미처 생각지 못하고
noresetlogs와 resetlogs가 같이 실행되었다.(나만 바보짓함?)
noresetlogs가 실행되었기 때문에 resetlogs 쪽 스크립트는 에러를 발생시켜 실행은 되지 않았지만
에러가 났다는 것 자체가 찝찝하기 때문에.....

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup nomount;
ORACLE instance started.

Total System Global Area  612368384 bytes
Fixed Size                  1220868 bytes
Variable Size             188747516 bytes
Database Buffers          419430400 bytes
Redo Buffers                2969600 bytes
SQL> @/media/sda1/PROD/Script/control.sql

Control file created.

SQL> select status from v$instance;

STATUS
------------
MOUNTED

SQL> recover database;
Media recovery complete.
SQL> alter system archive log all;

System altered.

SQL> alter database open;

Database altered.

SQL> select status from v$instance;

STATUS
------------
OPEN

위와 했던 방식으로 controlfile을 trace로 떨구거나
v$controlfile_records_section 테이블을 select 하여 수정되었는지 다시 한번 확인해보자.
반응형

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

UTL_URL 함수  (0) 2011.08.01
UNDO tablespace 변경  (0) 2011.07.26
MAXDATAFILES, DB_FILES(ORA-01118, ORA-00059)  (0) 2011.03.10
characterset 변경 및 주의할 점.  (0) 2011.01.06
오라클 10.2.0.1.0 설치  (0) 2010.09.08
Oracle Analytic Function(분석함수)  (0) 2010.05.24
반응형
작성자 : 박상수
작성일자 : 2010.12.18
작업환경 : VMware7 [ RHEL4 + Oracle 10g R2 ]
참고자료 : 서진수 샘

스크랩URL : http://calmmass.tistory.com/275

1. Patsh Set  
오라클에서 패치 샛은 릴리즈 버전의 통합 패치파일로 생각 하시면 됩니다.
만약 10.2.0.1 버전을 Patch Set을 설치할 경우 10.2.0.4 로 변경 되며 각종 실행파일이 모두 10.2.0.4로 변경 됩니다.

결국 Patsh Set는 릴리즈 버전의 업데이트 패치 파일이라고 생각 하시면 보다 쉽게 이해하실 수 있습니다.
oracle 버전별 Patch Set 리스트는 여기에서 확인 하시기 바랍니다.

2. PSU(Patch Set Update)  
PSU(Patch Set Update)는 오라클에서 정기적으로 권고하는 패치로써 중요한 단일 패치들을 통합한 것을 의미합니다.
PSU 출시 일정은 분기별로 제공 하며 일정은 다음과 같습니다.
1월, 4월, 7월, 10월 중순의 화요일 제공됩니다.

PSU 패치는 다음과 같은 내용을 포합합니다.
- 실제 운영환경에서 이미 검증
- CPU 패치

PSU 패치는 다음과 같은 내용을 포함하지 않습니다.
- 새로운 인증이 필요한 패치(optimizer plan 이 변경가능한 패치)
- Database 구성의 변경이 필요한 패치

PSU 패치는 10.2.0.2.1~4 까지 가능합니다.(분기별 4번)


3. CPU(Critical Patch Update)  
CPU(Critical Patch Update)는 오라클 제품의 보안 문제 해결을 위한 패치입니다.

CPU 출시 일정은 분기별로 제공 하며 일정은 다음과 같습니다.
1월, 4월, 7월, 10월 중순의 화요일 제공됩니다.

CPU 패치는 10.2.0.2.1~4 까지 가능합니다.(분기별 4번)


반응형
반응형
데이터파일 생성시 ORA-00059에 대한 오류가 나올 경우가 있다.
데이터베이스의 데이터파일 개수를 제한하였기 때문에 나오는 에러이다.

show parameter db_files

SQL> show parameter db_files

NAME                TYPE       VALUE
---------------- --------- -----------
db_files               integer     200
SQL>

데이터 파일의 limit 개수가 나온다.

이 값을 올려주면 된다. 
참고로 최대 65334 까지 올려줄수 있다.(10g 기준)

alter system set db_files = 10000 scope=spfile;

shutdown immediate;
startup;

반응형
반응형
요즘 나태해지고 자만심으로 인하여 큰 화를 부르게 되었다.
대용량 테이블의 2월7일이후 데이터를 삭제한다는 것이 1월7일이후 데이터를 삭제하고 말았다.

데이터 복구 할려고 처음부터 배치작업을 하게 되었고, 시간과 기존데이터와 맞지않아 또 다시 돌리고 검증하고..
한마디로 개고생을 했다.

배치를 처음부터 돌리기 전에 지식인에 물어봐서 flashback이라는 것을 알게 되었다.
아래와 같이 명령어를 실행을 시켰다. 그러나 워낙 큰 대용량이라서 끝날 기미가 보이지가 않았다.
그래서 취소를 시키고 롤백하는데도 엄청난 시간이 걸렸다.
이작업을 포기하고 배치를 처음부터 돌리기 시작하였던 것이다.

insert /*+parallel(a,8)*/ into temp_pgheo_delete_table  a
select /*+parallel(delete_table ,8)*/*
from delete_table as of timestamp(systimestamp - interval '20' minute);

이후(7시간 후가 되겠다) 다시 돌린 데이터가 작업시간 및 데이터 싱크가 맞질않아 또 다시 몇시간을 소비하게 되었고,
다시 flashback에 대해서 눈이 가기 시작하였다.

결론부터 말하면 아래명령어로 복구를 하였다. 똑같은 쿼리지만 where 을 추가하였다.
이런 단순한 생각을 못했다는게 안타까울따름이다.

alter session enable parallel dml;

insert /*+parallel(a,8)*/ into temp_pgheo_delete_table  a
select /*+parallel(delete_table ,8)*/*
from delete_table as of timestamp(systimestamp - interval '7' hour) 
where date >= '20110107' and date <= '20110109';

commit;

insert into delete_table  select * from temp_pgheo_delete_table;

복구를 완료하였다.

오늘 하루 지옥과 천당을 수천번 왔다갔다한 기분이다.

반응형
반응형
http://blog.naver.com/bueun?Redirect=Log&logNo=60062866661

작업을 하면서 이상한 오류가 발생했다.
parallel ......어쩌구 저쩌구....
select * from TCSQCSM
ORA-12801: error signaled in parallel query server P004, instance testdb01:BKTDB
ORA-01157: cannot identify/lock data file 67 - see DBWR trace file
ORA-01110: data file 67: '/dev/rlv006_p023_02'
 
그래서 알아보다가 테이블이 parallel로 구성되어 있는것을 알았다.
TABLESPACE D01B623
PCTUSED 0
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 1M
NEXT 1M
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
LOGGING 
NOCACHE
PARALLEL ( DEGREE 4 INSTANCES 1 );
 
일반적으로 NOPARALLEL로 설정하는데....
 
select table_name, degree
from user_tables
where tablespace_name = 'D01B623'
 
이렇게 하면 해당 tablespace에 소속된 테이블목록을 볼수 있다.
 
select 'alter table '||table_name||' parallel 1;'
from user_tables
where degree > 1 ;
 
alter table TCSQCSM parallel 1 ;
 
을 사용하면 바꿀수 있다.
 
 
parallel의 기능에 대해서 bug가 있다고 하던데..........................................................
 
그리고 오라클 bug보면 parallel 프로세스끼리 통신을 해야하는데 중간에 어떠한 이유(??)로 인해서 통신을 못하는 경우가 발생한다구 하더라구요.
그러면 parallel query의 실행이 종료되구 에러가 난다구 합니다.
가끔 그러나 봐요... 아주가끔..
 
시스템 사용율이 높거나 OLTP상황에서는 별루 권장하지 않습니다.
 
보통땐 1개의 프로세스가 생성되는데 parallel은 degree에 따라서 아무리 간단한 SQL이라도 프로세스를 degree만큼 생성하거든요.
 
테이블 단위로 parallel은 잘 설정하지 않는게 일반적인데.. 테이블이 어떤 SQL에 포함될지 다 추적할 수 없잖아요.. 그래서 sql에 힌트로 넣는다.
 
통계생성이나 batch작업시 효과를 많이 볼수 있다.
 
 ---퍼왔어요  http://blog.empas.com/matata/4624016
반응형
반응형
 -- 테이블 포맷
SQL> desc long_replace
 Name                    Null?      Type
 ------------------ -------- -----------------------
 LONGTYPE                          LONG
 ID                                        VARCHAR2(20)
 CLOBTYPE                          CLOB

long형 타입의 컬럼은 replace가 되질 않는다. 아래와 같은 메세지를 뿌리게 된다.

SQL> update long_replace set longtype = replace(longtype,'기능','기능불가');
update long_replace set longtype = replace(longtype,'기능','기능불가')
                                           *
ERROR at line 1:
ORA-00932: 일관성 없는 데이터 유형: NUMBER이(가) 필요하지만 LONG임

방법 : 
1. long형 포맷이 아닌 clob형 포맷으로 temp성 테이블을 하나 더 만든다.
2. clob형은 replace가 가능하기때문에 temp성 테이블을 업데이트 시킨다.
3. 실질적인 long형 포맷이 있는 테이블에 temp성 테이블과 비교하여 업데이트를 시킨다.
4. 완료.

SQL> create table temp_replace as select to_lob(longtype) longtype, id, clobtype from long_replace;

Table created.

SQL> update temp_replace set longtype=replace(longtype,'기능','기능불가');

1 row updated.

SQL> update long_replace a
  2  set longtype=(select longtype from temp_replace b where a.id=b.id);

1 row updated.

SQL> commit;

Commit complete.

SQL> select * from long_replace; --> 업데이트가 되었는지 확인.

반응형
반응형
현재 캐릭터셋은 KO16MSWIN949 이다.
그래서 뷁 또는 맗 같은 멀티바이트가 insert 할 수가 있다.

C:\Windows\System32>sqlplus system/******@prod
SQL*Plus: Release 10.2.0.1.0 - Production on 목 1월 6 17:09:02 2011

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


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select * from sys.props$ where name like 'NLS_CH%';

NAME
------------------------------
VALUE$
--------------------------------------------------------------------------------
COMMENT$
--------------------------------------------------------------------------------
NLS_CHARACTERSET
KO16MSWIN949
Character set

SQL> conn scott/tiger@prod

Connected.

SQL> insert into dept values(70,'뷁','맗');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        70 뷁             맗 

5 rows selected.

SQL> conn /as sysdba
Connected.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area  612368384 bytes
Fixed Size                  1220868 bytes
Variable Size             146804476 bytes
Database Buffers          461373440 bytes
Redo Buffers                2969600 bytes
Database mounted.
SQL>
SQL> alter system enable restricted session;

System altered.

SQL> alter database open;

Database altered.

SQL> alter database character set internal_use KO16KSC5601;

Database altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  612368384 bytes
Fixed Size                  1220868 bytes
Variable Size             146804476 bytes
Database Buffers          461373440 bytes
Redo Buffers                2969600 bytes
Database mounted.
Database opened.
SQL> select * from sys.props$ where name like 'NLS_CH%';

NAME
------------------------------
VALUE$
--------------------------------------------------------------------------------
COMMENT$
--------------------------------------------------------------------------------
NLS_CHARACTERSET
KO16KSC5601   -- 변경완료
Character set

SQL> conn scott/tiger@prod

Connected.

SQL> select * from dept;
ERROR:
ORA-29275: partial multibyte character    :  멀티바이트가 포함된 테이블은 에러를 발생시킨다.



no rows selected

SQL> 

다시 위와 같은 방법으로 KO16MSWIN949로 변경하면 멀티바이트가 포함된 테이블도 정상적으로 작동이 된다.

반응형

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

UNDO tablespace 변경  (0) 2011.07.26
MAXDATAFILES, DB_FILES(ORA-01118, ORA-00059)  (0) 2011.03.10
characterset 변경 및 주의할 점.  (0) 2011.01.06
오라클 10.2.0.1.0 설치  (0) 2010.09.08
Oracle Analytic Function(분석함수)  (0) 2010.05.24
리두 로그 삭제  (0) 2010.04.07
반응형
CLOB 같은 경우는 일반적으로 CTAS 가 가능하다.
그러나 LONG형은 불가능하다. 예전에는 export/import를 통하여 데이터를 이전시키는 경우가 있었다.
아래와 같은 명령어로 인하여 COPY가 가능하게 되었다.

copy from scott/tiger@prod create test_long2 using select * from test_long;

scott/tiger@prod LONG형 테이블을 가져올 데이터 베이스의 계정을 말한다.

그러나 이 명령어는 CLOB 포맷의 컬럼은 COPY가 불가능하다.

다음과 같은 메세지가 보여지게 된다.

SQL> scott/tiger@prod

Connected.

SQL> create table test_long
  2  (a varchar2(20),
  3  b number,
  4  c number(10,2),
  5  d clob,
  6  e long)
  7  /

Table created.

SQL> insert into test_long values('aaa',1,2.5,'asdfasdfsadf','asdfasdfasdfasdf');

1 row created.

SQL> commit;

Commit complete.

SQL> conn hr/hr@prod
Connected.
SQL> copy from scott/tiger@prod create test_long2 using select * from test_long;

Array fetch/bind size is 15. (arraysize is 15)
Will commit when done. (copycommit is 0)
Maximum long size is 80. (long is 80)

CPY-0012: Datatype cannot be copied

SQL> copy from scott/tiger@prod create test_long2 using select a,b,c,e from test_long;  --CLOB형 컬럼을 뺐음.

Array fetch/bind size is 15. (arraysize is 15)
Will commit when done. (copycommit is 0)
Maximum long size is 80. (long is 80)
Table TEST_LONG2 created.

   1 rows selected from scott@prod.
   1 rows inserted into TEST_LONG2.
   1 rows committed into TEST_LONG2 at DEFAULT HOST connection.

SQL>

※ 주의해야 할 점.
set long [최대길이수지정]
해주지않으면 지정된 수만큼만 출력되어져 데이터가 짤려서 들어가게 된다.
반응형

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

Range 파티션 테이블 및 테이블 스페이스 삭제 script  (0) 2011.04.14
long형 replace  (0) 2011.01.24
LONG과 CLOB 에 대한 데이터 이전.  (0) 2011.01.04
tablespace 생성 스크립트  (0) 2010.04.30
테이블 read only 설정  (0) 2010.01.27
1년치 날짜 생성.  (0) 2010.01.14
반응형
출처 : http://database.sarang.net/ioseph/board/index.php?work=view&criteria=oracle&subcrit=qna&curpg=0&aid=7906
============================================

굳이 대용량이 아니라고 해도, 현재 사용한 용량을 알고 있어야 디스크를 사서 늘려도 늘릴것이고, 언제쯤 사야하겠다는 예상을 할수 있을텐데 그런 것을 위해 있는 것이 ORACLE의 DBA_FREE_SPACE 뷰이다. 그러나 DBA_FREE_SPACE에는 분명 공간이 있는데 ORACLE이 에러를 내는 경우는 많다. 가끔은 10GB TABLESPACE를 잡아놓고 쓴것은 1GB도 되지 않는데 에러를 내기도 한다. 왜 이런 현상이 생기며, 어떻게 관리해야 하는지 알아보자.

tablespace, datafile, extent에 대한 개념은 설명하지 않는다.

select * from dba_freespace where tablespace_name=\'TEST2\';

현재 Tablespace의 여유 공간은 dba_free_space 뷰를 보면 알수 있다.

[pre]
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_F
------------------------------ ---------- ---------- ---------- ---------- ----------
TEST2 19 52 40960 20 19
TEST2 19 72 40960 20 19
TEST2 19 92 40960 20 19
TEST2 19 112 40960 20 19
TEST2 19 132 40960 20 19
TEST2 19 152 40960 20 19
TEST2 19 172 40960 20 19
TEST2 19 192 40960 20 19
TEST2 19 212 40960 20 19
TEST2 19 232 40960 20 19
TEST2 19 252 40960 20 19
TEST2 19 272 40960 20 19
TEST2 19 292 40960 20 19
TEST2 19 312 40960 20 19
TEST2 19 332 40960 20 19
TEST2 19 352 40960 20 19
TEST2 19 372 40960 20 19
TEST2 19 392 40960 20 19
TEST2 19 412 40960 20 19
TEST2 19 432 40960 20 19
TEST2 19 452 40960 20 19
TEST2 19 472 40960 20 19
TEST2 19 492 43008 21 19
[/pre]
위의 결과에서 보면 이상한 점이 있다. 왜 여러개로 나눠져 있는거고 각 컬럼이 의미하는 것은 뭘까?

우선 행이 나눠져 있는 이유는 할당되었다가 반납된 익스텐트들은 pctincrease가 0일 경우는 자동으로 합쳐지지않는다. 각각은 할당되었다가 반납되어 빈공간(free space)로 잡혀있는 것이다. 첫번째 줄을 보면 52번 블록부터 20개의 블록이 비어있고 두번째 줄을 보면 72번부터 20개의 블록이 비어있다는 것을 알수 있다. 어라! 그럼 52번부터 40개의 블록이 비어있는 것이 아닌가? 

이런식으로 보다보니 52~ 513블록이 모두 빈공간이다. 그럼 하나로 합칠수도 있지 않나?

alter tablespace test2 COALESCE;  --Dictionary Management tablespace 때 만 필요한 작업이다.

select * from dba_free_space where tablespace_name=\'TEST2\';

TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_F
------------------------------ ---------- ---------- ---------- ---------- ----------
TEST2 19 52 944128 461 1

합쳐졌다는 것을 알수 있다.

그럼 쓰고 있는 공간은 어떻게 알수 있나? DBA_EXTENTS뷰를 보면 알수 있다. 오라클은 extent 단위로 관리하기 때문에 USED_SPACE가 아니라 EXTENTS이다.

select (생략) from dba_extents where tablespace_name=\'TEST2\';

OWNER SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_F
------ ------------- --------- ---------- ---------- ---------- ---------- ----------
SYS TEST_TABLE1 0 19 2 102400 50 19
위의 결과를 보니 0번 익스텐트이고 2번블록부터 50개의 블록을 쓰고있다. 따라서 102400바이트를 사용하고 있다. 0번 익스텐트이니까 테이블 스페이스를 만들때 storage 옵션에서 initial값을 1M로 준것이 틀림없다. 

select * from dba_tablespaces where tablespace_name=\'TEST2\';

TABLESPACE_NAME INITIAL_EX NEXT_EXTEN MIN_EXTENT MAX_EXTENT PCT_INCREA MIN_EXTLEN 
---------------- ----------- ---------- ---------- ---------- ---------- ---------- 
TEST2 102400 40960 1 121 0 0 

역시 그렇다. next가 40960으로 되어있는 것도 dba_free_space뷰를 통해 조각나 남아있던 공간들의 크기와 똑같다.

그럼 전체 tablespace의 크기는 사용한 것 102400 + 944128 = 1046528 이라는 계산이 나온다. 실제로는 0번 익스텐트가 2번 블록부터 시작하므로 파일크기는 1046528+2048=1048576이 나올것이다.

select * from dba_data_files where tablespace_name=\'TEST2\';

FILE_NAME FILE_ID TABLESPACE_NAME BYTES BLOCKS 
/db2/oradata/test02.dbf 19 TEST2 1048576 512
그런것을 확인할수 있다.

따라서 dba_free_space뷰를 보고 여유공간이 별로 없다면 곧 데이타 파일을 늘리거나 resize를 하는 방법으로 테이블 스페이스를 늘려야 한다는 사실을 알수 있다. 

그러나 여기서는 테이블 스페이스의 NEXT_EXTENT값이 40k 정도로 작기 때문에 상관이 없지만, 좀 크다는 DB의 NEXT값이 20M라고 했을때, DBA_FREE_SPACE에 39M가 남아있다면 결과적으로는 20M만 남은것과 다르지 않다는 것 에 유의해야 한다.

그보다 더 중요한 것은 PCT_INCREASE 값인데, 0이 아닌값이 설정되어 있으면, 각 익스텐트의 크기가 각각 다르다. 이경우 반납되었다가 다시 할당될때 정확하게 맞아떨어지지 않는다. 다시말해 단편화가 생긴다는 이야기인데, 파일시스템의 단편화는 단지 읽고쓰는 퍼포먼스의 문제이지만, 오라클에서도 같은 결과를 낸다.


그리고 어떤 경우의 위의 경우에 전혀 해당하는 경우가 없고 free_space가 엄청나게 남아있는데도 문제가 생길수 있는 경우가 있다. 바로 MAX extent 값때문인데, 각종 문의 게시판등을 보면 이 문제때문에 엄청나게 고생한다는 사실을 알수있다. 위의 예에서 MAX_EXTENT값은 121이다. 각 익스텐트의 크기는 40K이므로 4,840K의 공간을 사용할수 있다. 그런데 만약 data파일이 4,840k보다 크다면?
그 이후공간은 전혀 사용할수가 없다. 
이 것이 문제가 많이 되는 것은 FREE_SPACE를 보니 전체파일크기에 비해 사용된 량이 별로 되지도 않는데 에러를 낸다는 것이다. 예를 들어 100M가 분명 넘을리 없는 테이블을 위해 테이블 스페이스를 만들었는데 next값이 작아서 채 10M가 되지도 못했는데 에러는 낼수 있다는 것이다.

------------------------------------------------------------------------------------------------
[나의 테스트]

select tablespce_name t_name, file_id, block_id, bytes
from   dba_free_space 
where  tablespace_name = 'USERS' 
order by block_id;

T_NAME FILE_ID BLOCK_ID BYTES
USERS 4   209   65536    8
USERS 4   433   65536    8
USERS 4   441   65536    8
USERS 4   449   65536    8
USERS 4 31177  524288   64
USERS 4 42377 9371648 1144

--tablespace의 여유공간 확인.
select sum(bytes) tot_free_space 
from   dba_free_space 
where  tablespace_name = 'USERS' 
order by block_id; 

TOT_FREE_SPACE
10158080

--사용된 tablespace 공간

select segment_name s_name, tablespace_name t_name, extent_id, file_id, block_id, bytes, blocks
from dba_extents where tablespace_name = 'USERS';

S_NAME T_NAME EXTENT_ID  FILE_ID BLOCK_ID BYTES BLOCKS
REGIONS USERS 0                          4             9   65536           8

select sum(bytes) tot_used_space
from   dba_extents
where  tablespace_name = 'USERS'; 

TOT_USED_SPACE
346292224

select * from dba_tablespaces where tablespace_name = 'USERS';

select 346292224+10158080+(8*8*1024) from dual;  --356515840
--initial 값을 8M를 주었고 8개블록을 추가해주어야하기 때문에 추가로 더해주어야한다.

select tablespace_name, bytes from dba_data_files where tablespace_name = 'USERS'; 
TABLESPACE_NAME BYTES
USERS 356515840
반응형
반응형
몇 일전 DB가 startup이 안된다고 해서 원인을 찾아보았습니다.

아래와 같은 에러가 발생하더군요.
ORA-03113 : end-of-file on communication channel

음..모지?

이 에러는 여러가지의 경우의 수가 있죠..ㅋ

startup을 할때 pfile로 nomount까지 시도해보았지만 역시나 마찬가지 였습니다.

원인은 alert_file 사이즈 초과 문제였습니다.

alert_file을 백업해두고 startup을 하니 되더군요.

간단하게 문제를 해결하였습니다.

그러나 mount 상태까지만 디비가 올라오더군요.

[oracle@feeds bdump]$ sqlplus "/as sysdba"

SQL*Plus: Release 9.2.0.1.0 - Production on Tue Oct 26 14:06:11 2010

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area  235999352 bytes
Fixed Size                   450680 bytes
Variable Size             201326592 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 12 - see DBWR trace file
ORA-01110: data file 12: '/data1/oradata1/aaa.dbf'
             --누군가가 필요없는 데이터 파일이라고 그냥 파일만 지웠다더군요.ㅎ

SQL> select status from v$instance;

STATUS
------------
MOUNTED


SQL> alter database datafile 12 offline;
alter database datafile 12 offline
*
ERROR at line 1:
ORA-01145: offline immediate disallowed unless media recovery enabled


SQL>
SQL> alter database datafile 12 offline drop;

Database altered.

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 14 - see DBWR trace file
ORA-01110: data file 14: '/data1/oradata1/TS_LOG.dbf'


SQL> alter database datafile 14 offline drop;

Database altered.

SQL> alter database open;

반응형

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

temporary tablespace Warning  (0) 2011.03.10
ORA-00059: maximum number of DB_FILES exceeded  (0) 2011.02.21
ORA-03113 : end-of-file on communication channel  (0) 2010.11.03
function 부분 클릭 시 다운현상  (0) 2010.07.02
[kkocxj : pjpCtx]  (0) 2010.04.12
ORA-14400  (0) 2010.04.01
반응형
얼마전(?) 부터 서버의 이상증상이 보였고 이제는 부팅도 안되고 복구도 불가능한 지경까지 이르게 되었습니다.
귀차니즘에 빠졌던 저라 컴퓨터를 꺼버리고 두달정도 그냥 방치해두었다가 이제야 우분투를 다시 설치하게 되었습니다.

우분투는 예전에 설치 한 것보다 좀 더 수월하게 진행이 되었던것 같습니다. 접속 문제 빼고요.
내부/외부에서 접속이 전혀 되질 않아서 고생 좀 했습니다.

이제 오라클 설치에 대해서 또 한번 적어보고자 합니다. 
예전 글은 정리가 잘 되지 않아서 이번에는 제가 한 순서대로 나름 깔끔하게 적어볼려고합니다.(참고 URL)

1. 오라클 설치하는데 필요한 패키지 설치
pgheo@pgheo-desktop:/home$ sudo apt-get install gcc binutils libaio1 lesstif2 lesstif2-dev make rpm libc6 libstdc++5 build-essential

2. 오라클 계정 및 그룹 만들기
pgheo@pgheo-desktop:/home$ sudo groupadd -g 5000 dba
pgheo@pgheo-desktop:/home$ sudo useradd -g dba oracle
pgheo@pgheo-desktop:/home$ sudo passwd oracle
새 UNIX 암호 입력:
새 UNIX 암호 재입력:
passwd: 암호를 성공적으로 업데이트했습니다

3. sysctl.conf 수정
pgheo@pgheo-desktop:/etc$ sudo vi /etc/sysctl.conf
마지막에 아래와 같이 입력.

kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000

저장 후 적용시키기 위해서는 재부팅 또는 아래 명령어 입력.
sudo /sbin/sysctl -p(재부팅 하지 않고 바로 적용시킬때)

4. limits.conf 수정
pgheo@pgheo-desktop:/etc/security$ sudo vi /etc/security/limits.conf
마지막에 아래와 같이 입력.

* soft nproc 2047
* hard nproc 16384
* soft nofile 1024
* hard nofile 65536

5. 오라클 폴더생성 및 권한 주기.
pgheo@pgheo-desktop:/home$ sudo mkdir /oracle
pgheo@pgheo-desktop:/home$ sudo mkdir /oracle/10g
pgheo@pgheo-desktop:/home$ sudo mkdir /oracle/oinstall
pgheo@pgheo-desktop:/home$ sudo chown -R oracle:dba /oracle
pgheo@pgheo-desktop:/home$ sudo chmod 775 -R /oracle

cf. 오라클 설치파일을 미리 올려놓았기 때문에 이동작업을 하였습니다.
pgheo@pgheo-desktop:/home/oracle_installer$ sudo chown oracle:dba *
pgheo@pgheo-desktop:/home/oracle_installer$ sudo mv * /oracle/oinstall

6. 오라클 환경변수 설정(profile)
pgheo@pgheo-desktop:/oracle/oinstall$ sudo vi /etc/profile
마지막에 아래와 같이 입력.
export ORACLE_BASE=/oracle
export ORACLE_HOME=/oracle/10g
export ORACLE_SID=PROD  --> 원하시는 오라클 sid명을 입력하세요.
export PATH=$PATH:$ORACLE_HOME/bin

확인 작업.
pgheo@pgheo-desktop:/oracle/oinstall$ su - oracle
암호:
디렉터리 없음, 루트 디렉터리(/)로 로그인합니다
$ echo $ORACLE_BASE
/oracle
$ echo $ORACLE_HOME
/oracle/10g
$ exit

7. 레드헷 계열 인식(?)
pgheo@pgheo-desktop:/oracle/oinstall$ sudo ln -s /usr/bin/awk /bin/awk
pgheo@pgheo-desktop:/oracle/oinstall$ sudo ln -s /usr/bin/rpm /bin/rpm
pgheo@pgheo-desktop:/oracle/oinstall$ sudo ln -s /lib/libgcc_s.so.1 /lib/libgcc_s.so
pgheo@pgheo-desktop:/oracle/oinstall$ sudo ln -s /usr/bin/basename /bin/basename


pgheo@pgheo-desktop:/oracle/oinstall$ sudo vi /etc/redhat-release
아래 입력하고 저장.

Red Hat Enterprise Linux AS release 3 (Taroon)


8. GUI 글씨가 깨지는 것을 방지.
pgheo@pgheo-desktop:~$ sudo apt-get install ttf-baekmuk(백묵글꼴 설치)

pgheo@pgheo-desktop:~$ cd /usr/share/fonts
pgheo@pgheo-desktop:~$ sudo mkdir -p ko/TrueType
pgheo@pgheo-desktop:~$ sudo cp truetype/baekmuk/*.ttf ko/TrueType

9. 오라클 설치 시작(시스템 reboot 후 oracle 계정으로 접속한다.)
oracle@pgheo-desktop:/oracle/oinstall/database$ runInstaller  -- 설치 과정은 Windows와 같음
설치 중간에 잠시 멈추고 root.sh와 orainsRoot.sh를 설치하라고 나오는데 
나와있는 경로 찾아가서 설치 해주고 계속 진행합니다.

저는 default 디비를 설치하지 않았습니다. 매뉴얼 구축을 위해서 오라클 자체만 설치를 하였습니다.
오라클 매뉴얼 설치는 좀 쉬었다가 적어보도록 하겠습니다.ㅎㅎ
추후 10.2.0.4로 패치도 해볼까 하는데 파일 구하기가 참으로 어렵네요.
반응형

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

MAXDATAFILES, DB_FILES(ORA-01118, ORA-00059)  (0) 2011.03.10
characterset 변경 및 주의할 점.  (0) 2011.01.06
오라클 10.2.0.1.0 설치  (0) 2010.09.08
Oracle Analytic Function(분석함수)  (0) 2010.05.24
리두 로그 삭제  (0) 2010.04.07
serveroutput 단순 예  (0) 2010.02.23
반응형
제품 : ORACLE SERVER <- 참조하세요. 좋은 정보 또 하나 배웠습니다.

작성날짜 : 1995-11-05

ORA-1652 조치 방법
================== 

테이블이나 인덱스 등을 만들 때 자신의 TEMP TABLESPACE가 아닌 곳에서 
ORA-1652(temp tablespace가 부족함) 에러가 발생하는 경우가 있다.

V7.1 에서는 테이블, 인덱스 등을 병렬로 생성할 수 있다. 이를 위하여 실제로
테이블 등이 생성될 공간에 Temporary Segment를 만들게 되는데 이 과정에서
Temporary Segment를 만들 공간이 부족하게 되면 실제의 테이블이 생성되는
테이블스페이스에 대하여 ORA-1652 에러가 발생하게 되는 것이다.

ORA-1652 에러를 해결하는 방법은 에러 메시지에서 보여주는 대로 해당 테이블
스페이스에 Temporary Segment가 생성될 만한 연속된 공간을 마련하여 주는 것이다.

다음과 같은 절차로 해결하여 본다. 

1. 데이타화일을 추가하여 테이블스페이스의 크기를 확장한다.
SQL> ALTER TABLESPACE data ADD DATAFILE 
'/usr/../oracle/data2.dbf' SIZE 100M;

2. 테이블의 storage parameter를 조정하여 현재 남아 있는 영역에 들어갈 수 
있도록 한다.

SQL> ALTER TABLE emp STORAGE(NEXT 1M);


3. 테이블스페이스가 fragmentation이 심한 상태이면 export/import를 이용하여 
테이블스페이스를 재구성한다.

[예제] 다음의 테이블 생성 문장을 보자.
SQL> CREATE TABLE FEATURE
(feature_code varchar2(4) primary key,
feature_desc varchar2(3) );

ORA-01652, 00000, "unable to extend temp segment by 6144 in 
tablespace VESSEL"

테이블스페이스 VESSEL 에 남아 있는 가장 큰 연속된 공간을 확인해 보면

SQL>SELECT MAX(blocks), MAX(bytes)
FROM DBA_FREE_SPACE
WHERE TABLESPACE_NAME = 'VESSEL';

blocks bytes



6143 12,580,864

위의 결과를 보면 현재 VESSEL에 남아 있는 가장 큰 연속된 공간은 6143 블럭인데
오라클은 6144 블럭을 사용하려고 시도하다 이를 할당받지 못하여 이 에러가 발생
하게 된 것이다.
반응형
반응형
상황 :
Orange for oracle 의 Schema Brower에 function 을 클릭하여 
function 내용을 보려고 하였지만 매번 다운 현상이 일어났습니다.
가끔 되다가 몇 번 더 클릭을 하면 또 다시 다운 되버리는군요.ㅠㅠ
왜 function만 클릭하면 다운 되는 건지...짜증이 마구마구 쏟구쳤습니다.ㅋㅋ

원인 찾기 :
데이터베이스의 아무런 에러가 없었으며, 시스템, 네트워크 모두 정상적이였습니다.
아무런 에러가 없으니 답답한 마음으로 정말 많은 걸 뒤져보게 되었네요ㅡㅡ;
sqlplus 에서는 아무 이상없이 확인이 가능했습니다.
Orange 버그 라고 생각되어져서 Toad 및 Sqlgate 등 설치를 해보고 테스트를 해보았지만
역시 function 부분에서 다운이 되었습니다. 여기서부터  DB 문제라고 판단되어졌습니다.

원인 발견 :
DBA_SOURCE, USER_SOURCE 을 확인 해 본 결과 한 컬럼의 길이에 대한 문제를 지적해 보았습니다.
text 컬럼을 length로 확인 해 보니 50정도의 길이가 나와야하는데 1000정도의 길이가 나오고 있었습니다.
확인 결과 50문자 뒤에는 공백이 무수히 많더군요.
예전 시스템 이전 작업 때 만들어 놓은 스크립트가 공백을 모두 포함하고 있어서 
그 공백들이 모두 들어가 버린 것입니다.

해결 :
스크립트의 공백을 제거하고 function을 재생성하였습니다.
아무런 문제 없이 잘 되네요.^^(완죤 기쁘네요..ㅋㅋㅋㅋ)

주의 사항 : 
스크립트를 만들어 주기 위해서 아래와 같은 쿼리문을 실행시켰습니다.
아주 편하게 function에 대한 스크립트가 줄줄이 나오더군요.
select dbms_metadata.get_ddl('FUNCTION', 'function_name') FROM dual;

그래서 이 스크립트를 그대로 돌려버렸습니다. 생성도 아주 잘 되었고요. 허나 지금 발견된 문제가 이 쿼리문 때문이였습니다.
공백을 다 포함한 함수 스크립트가 되어 버린겁니다. 공백을 제거해 주고 생성을 했어야 하는데 그렇지 못한거죠!!
터무니없이 긴 결과값들을 불러오려다가 다운되는 현상이 생긴게 아닐지 짐작을 해봅니다.
반응형

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

ORA-00059: maximum number of DB_FILES exceeded  (0) 2011.02.21
ORA-03113 : end-of-file on communication channel  (0) 2010.11.03
function 부분 클릭 시 다운현상  (0) 2010.07.02
[kkocxj : pjpCtx]  (0) 2010.04.12
ORA-14400  (0) 2010.04.01
ora-27476, ora-06512  (0) 2010.01.26
반응형
제가 구독하고 있는 블로그에서 본 것을 테스트 해본 것 입니다.
다들 아시는 유명한 블로그죠. 매번 좋은 정보를 주어서 감사 할 따름입니다.
테스트 할 자료도 있고, 설명도 잘 되어져 있어서 
공부를 하면서 분석함수에 대해서 조금이나마 가까이 갈수 있었던 기회 같습니다.
조금만 생각하면 응용쿼리 생성 및 튜닝도 가능할 것으로 보입니다. 아직 미흡합니다.ㅎㅎㅎ
관련 파일에는 간단한 설명이 있으며, 이해 안가는 부분도 있지만 나름 이해할려고 노력해봤습니다.


반응형

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

characterset 변경 및 주의할 점.  (0) 2011.01.06
오라클 10.2.0.1.0 설치  (0) 2010.09.08
Oracle Analytic Function(분석함수)  (0) 2010.05.24
리두 로그 삭제  (0) 2010.04.07
serveroutput 단순 예  (0) 2010.02.23
SGA 자동관리 전환  (0) 2010.02.17
반응형

1. RAC [Real Application Cluster]

  1) Application : 클라이언트, 리스너 같은 데이터 베이스로 부터 서비스를 받는 모든 것들.
  2) Cluster : 군집, 집합 : 하나의 데이터 베이스에 여러개의 인스턴스를 띄어 놓아 만들어진 상태

- 싱글 DB


- RAC

- 인스턴스는 각 머신에 있다.
- 1번 인스턴스에서 작업을 하다 인스턴스가 죽었을 경우(Fail over)
- 2번 인스턴스로 투명하게 넘어가서 쓰게 된다. (가용성)


2. RAC 를 쓰는 이유?

1) 가용성
2) 로드 발란스

* RAC 구조

- Interconnect : DATAFILE로 내려가지 않고 메모리 to 메모리로 전송이 가능하게 해준다.
      (Cache Fusion)(OPS 보다 당연히 빠르다.)

- Ethernet + UDP : 가장 보편적으로 사용

- 1Gbit Ethernet : 현재 보편적으로 사용 (초당 125M정도)

- 10Gbit Ethernet : 향후..

- Infiniband : 향후 (초당 2Gbit ~ 96Gbit 까지 적용) 전송량이 많을 때 부하가 생긴다.

- OPS : 메모리에서 다른 메모리로 읽어질 때 중간에 디스크로 내려썼다가 올라온다.
- 한쪽 클라이언트에서 다른 쪽 클라이언트까지 같이 설치해 주어야 한다.
- Shared Storage 
   - Raw Device - 가장 보편적으로 사용 / 쓰기 속도가 좋다 / 관리가 불편
   - Clustered File System : 비싸다. 잘 깨진다는 문제가 있다.
   - ASM : 점점 기능이 좋아지고 있다(11g에서 활용성 높음)

3. 클러스터

1) OS 클러스터
2)ORACLE 클러스터

4. 10g RAC 설치 순서

1) 오라클 클러스터를 먼저 설치
2) 오라클 소프트웨어 설치
3) 오라클 ASM 설치 (10g) [OS 클러스터를 안쓸 경우 ASM 을 무조건 설치해 주어야 한다.]
4) 오라클 DB 설치

5. RAW Device => OS 클러스터를 설치 해 주어야 한다.

$ CRS_STAT -t : [Target 컬럼] online 되어져 있어야 다른 쪽 노드로 넘어갈 수 있다.
                      : [State] 현재 상태

$ CRS_STOP -all : RAC 서비스가 멈춰 있을 경우에는 stat를 먼저 확인해 본 후 offline 되었을 경우.
$ CRS_START -all : 서비스를 내렸다가(STOP) 다시 올려준다.(START)

1) GCS : Global Cache Service
     - 노드간의 DATA, 메세지 전송을 관리하는 서비스
     - LMS Process : Global Cache 동기화, 최대20개까지(10gR1), 최대 36개까지(10gR2)

2) GES : Global Enqueue Service 
     - Global 하게 Lock을 관리
     - 노드간의 Lock 정보를 요청하고 응답하는 것을 관리하는 서비스
     - LMD Process : Global enqueue 동기화(Lock)
     - LCK Process : Library Cache Lock / Pin, Row Cache Lock 동기화

3) CGS : Cluster Group Service
     - 클러스터의 멤버쉽을 관리하는 서비스
     - LMON Process : Global Lock Monitoring Process Recover 등의 작업 수행

4) GRD : Global Resource Directory
     - Global Resource 의 위치 및 상태를 관리하는 분산 DATABASE
     - 모든 BLOCK의 정보는 BLOCK이 속한 MASTER NODE를 GRD 에서 관리
     - BLOCK에 최신 정보가 있다.
     - GRD가 관리하는 정보
        : DBA(Data Block Address) + Location Holder 위치(holding 하고 있는 위치, ex. emp가 1번에 있니?2번에 있니? 없니??)
        + LOCK MODE(Null, Shared, Exclusive) + Role(Local, Global) + SCN + PI(Past Image)

6. show parameter service

하나의 노드가 깨졌을때 OCR 의 정보를 보고 복구를 한다.

RAC는 datafile, controlfile, redologfile 이외에 Voting Disk 와 OCR 이 필요함.

1) OCR : 클러스터 구성에 필요한 메타 정보를 가지고 있다.
             작업 중이던 노드가 죽으면 다른 노드에 넘겨야 한다는 정보가 들어있다.)
2) Voting Disk : Split Brain 현상을 방지하기 위한 파일
        ※ Split Brain : 의학 용어로 좌뇌와 우뇌의 Sync가 맞지 않은 경우, 동기화가 이루어져 있지 않은 경우를 말함
                       일관된 이미지를 보기 위한 것
                       양 쪽의 노드가 동기화, 맞춰주는 것

7. 논리적/물리적으로 백업을 반드시 해야함.
8. OCR은 자동백업
9. Cache Fusion
   1) interconnect 를 통한 효율적인 글로벌 버퍼 동기화 메커니즘
   2) Memory to Memory 동기화.

-> Request Node, Master Node, Holder Node 가 Interconnect 를 통해 Block/Message 를 교환하는 Mechanism


1) Request Node : 필요한 특정 블록을 Master Node 의 LMSn에 요청
2) Master Node : 요청받은 블록(버퍼)의 홀더 노드를 파악한 후 LMSn 에게 요청 노드로의 버퍼 전송을 요청
                         만일 없을 시에는 Block grant message 전달(직접 디스크에서 읽어들이도록 권한 부여)
3) Holder Node : 블럭(버퍼)전송이 가능한 경우, 요청 노드로 버퍼를 전송한다.

※ 노드가 2개 일 경우.

1. A user 가 EMP를 읽으려면 1번 instance GRD를 확인, 없으면 2번 GRD 확인, 없으면 디스크에서 올린다.
2. 이 때 B user 가 EMP를 읽으려고 2번 instance 에서 접근시 LMSn 이 interconnect로 emp를 넘겨준다.
3. 이 경우 둘 다 Shared mode 의 Lock을 갖는다.
4. B user 가 scott의 SAL 을 UPDATE하고 COMMIT 하였을 경우,
    -> B user가 갖고 있떤 Shared mode Lock은 Exclusive 하게 바뀐다.
5. A user 가 가지고 있던 Shared Mode Lock은 Null Mode로 바뀐다.
6. A user 가 다음 EMP를 보고자 할 경우에는 UPDATE 된것을 보아야 한다.(commit 했으니깐..)
    (Null Mode는 다른 노드에서 받아와야 한다는 의미를 내포한다.)
반응형
반응형
테이블 스페이스 생성 스크립트 입니다.
디비이관 작업할 때 유용하게 쓰일 것 같네요.

select  tablespace_name, dbms_metadata.get_ddl('TABLESPACE',tablespace_name)||';' script
from    dba_tablespaces
where  tablespace_name not in ('TEMP','USERS','UNDOTBS1','SYSTEM','SYSAUX');

아래와 같이 스크립트가 생성된다.

 CREATE TABLESPACE "aaa" DATAFILE 
 '/oracle/oradata/Disk4/aaa.dbf' SIZE 104857600
 AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M
 NOLOGGING ONLINE PERMANENT BLOCKSIZE 8192
 EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO
 ;

주의 할 점.

위 스크립트를 그대로 실행시켰을경우. tablespcae 이름이 쌍따옴표를 포함한 "AAA" 으로 등록이 되어지는데 
dba_tablespaces를 보면 AAA로 보여진다. 
추후 drop 을 할려고 무심코 아래와 같은 쿼리문을 날렸는데 에러를 발생시키면 원인 찾기가 참 힘들어 지겠군요.

drop tablespace aaa including contents and datafiles;

ORA-00959: 테이블스페이스 'AAA'이(가) 존재하지 않습니다.

select tablespace_name from dba_tablespaces where tablespace_name = 'aaa';

TABLESPACE_NAME
aaa

변경및 수정할때에도 아래와 같이 지워야 하네요.
drop tablespace "aaa" including contents and datafiles;

--나의 의견.
쌍따옴표를 제거한 후 실행시키는 것이 관리하기에 편하다고 생각합니다.
유용한 스크립트이지만 하나하나 뜯어보고 불필요한 부분에 대해서는 편집이 필요하다고 생각되어집니다.

저는 위 쿼리보다는 아래 쿼리를 사용하고 있습니다.
위 쿼리는 속도도 많이 느리고,  쌍따옴표의 포함 등등 저에게는 좀 안맞는 쿼리인듯 싶네요.

아래 쿼리가 무식하고 더 불편하긴 하지만 저는 나름 편집해서 사용하고 있습니다.(특성에 따라 쿼리를 수정해줘야해서..)

select  
'CREATE TABLESPACE '||tablespace_name||
'DATAFILE 
'''||data1||''' SIZE 33554432 REUSE AUTOEXTEND ON NEXT 16777216 MAXSIZE 16384M,
'''||data2||''' SIZE 33554432 REUSE AUTOEXTEND ON NEXT 16777216 MAXSIZE 16384M,
'''||data3||''' SIZE 33554432 REUSE AUTOEXTEND ON NEXT 16777216 MAXSIZE 16384M,
'''||data4||''' SIZE 33554432 REUSE AUTOEXTEND ON NEXT 16777216 MAXSIZE 16384M 
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 16777216 SEGMENT SPACE MANAGEMENT AUTO;' script
from
(
    select   tablespace_name,
             max(case when rank=1 then file_name end) data1,
             max(case when rank=2 then file_name end) data2,
             max(case when rank=3 then file_name end) data3,
             max(case when rank=4 then file_name end) data4
    from
    (
        select  file_name, tablespace_name, row_number() over(partition by tablespace_name order by file_name) rank
        from    dba_data_files b
        where  tablespace_name not in ('SYSTEM','UNDOTBS1','SYSAUX','TEMP','USERS')
    )
    group by tablespace_name
)
;
반응형

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

long형 replace  (0) 2011.01.24
LONG과 CLOB 에 대한 데이터 이전.  (0) 2011.01.04
tablespace 생성 스크립트  (0) 2010.04.30
테이블 read only 설정  (0) 2010.01.27
1년치 날짜 생성.  (0) 2010.01.14
유용 update문  (0) 2009.12.09
반응형
잘 되던 쿼리문에 몇가지를 추가해주었는데 아래와 같은 에러가 났습니다.

ORA-00600: 내부 오류 코드, 인수 : [kkocxj : pjpCtx], [], [], [], [], [], [], []

쿼리문의 문법 등 전부 확인 하였지만, 이상이 없습니다.

오라클 버그라고 하여 아래와 같이 해결을 보았습니다.

alter session set "_optimizer_push_pred_cost_based" = false; 
(or) alter system set "_optimizer_push_pred_cost_based" = false; 

쿼리문을 다시 실행 시켰습니다.

이상없이 잘 되네요.
반응형

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

ORA-03113 : end-of-file on communication channel  (0) 2010.11.03
function 부분 클릭 시 다운현상  (0) 2010.07.02
[kkocxj : pjpCtx]  (0) 2010.04.12
ORA-14400  (0) 2010.04.01
ora-27476, ora-06512  (0) 2010.01.26
Linux Oracle9i Ora-01031:insufficient privileges  (0) 2008.11.19

+ Recent posts