반응형

EM 환경 재 구성

 

emca -config dbcontrol db -repos recreate

 

기본 암호는 oracle 이다... 몰라서 헤맸다...

 

 

I resolved the issue by creating soft links to the directory...

Let's say your original hostname was as01.corp.purisma.com, and your new hostname is as01. My SID is as01 in this example.

So, you need to change it in two places:

If your ORACLE_HOME is /d0/oracle/product/10.2.0/db_1, then:

Under: /d0/oracle/product/10.2.0/db_1
ln -s as01.corp.purisma.com_as01 as01_as01

Under: /d0/oracle/product/10.2.0/db_1/oc4j/j2ee
ln -s OC4J_DBConsole_as01.corp.purisma.com_as01 OC4J_DBConsole_as01_as01

I was then able to start the enterprise manager by issuing the standard 'emctl start dbconsole' command.

반응형
반응형

- crontab에 등록하면 sql 문이 동작하지 않네요.

->
이런 경우 대부분은 환경 변수관련 문제 입니다.
root로 su -oracle -c /home/oracle/backup.sh
이런식으로 해주시거나.

backup 스크립트에 ORACLE환경 변수를 넣어서 한번 해보세요 ^^

- 실행 SQL 확인

-> 이전에 실행한 SQL문 확인은 v$sql , v$sqlarea, v$sqltext 등에서 확인하실 수 있습니다.

 

v$archive_dest
v$archive_dest_status
v$archive_gap
v$archive_processes
v$archived_log
v$bh
v$buffer_pool
v$buffer_pool_statistics
v$controlfile
v$controlfile_record_section
v$database
v$datafile
v$datafile_header
v$dataguard_status
v$db_object_cache
v$enqueue_stat
v$event_name
v$eventmetric
v$filemetric
v$filestat
v$fixed_table
v$fixed_view_definition
v$instance
v$latch
v$librarycache
v$lock
v$locked_object
v$log
v$log_history
v$logfile
v$logmnr_contents
v$logstdby
v$managed_standby
v$mystat
v$nls_parameters
v$nls_valid_values
v$object_usage
v$open_cursor
v$option
v$parameter
v$pgastat
v$process
v$pwfile_users
v$recover_file
v$reserved_words
v$resource_limit
v$rollname
v$rollstat
v$session
v$session_event
v$session_longops
v$session_wait
v$session_wait_history
v$sessmetric
v$sesstat
v$sga
v$sga_dynamic_components
v$sga_resize_ops
v$sgastat
v$sort_segment
v$sort_usage
v$spparameter
v$sql
v$sql_bind_capture
v$sql_bind_data
v$sql_cursor
v$sql_plan
v$sql_text_with_newlines
v$sql_workarea
v$sqlarea
v$sqltext
v$sqltext_with_newlines
v$standby_log
v$statname
v$sysaux_occupants
v$sysmetric
v$sysmetric_history
v$sysstat
v$system_event
v$tempfile
v$tempseg_usage
v$tempseg_usage
v$tempstat
v$thread
v$timer
v$timezone_names
v$transaction
v$transportable_platform
v$undostat
v$version
v$waitstat

반응형
반응형

- 테이블 이동

(alter table .... move tablespace ...  / alter index .... rebuild tablespace...) -> 일반적인 이동

alter table TP_MIG_X move tablespace TS_DATA_01;
alter table TP_MIG_X move tablespace TS_DATA_01

- 파티션 테이블 이동

alter table TP_MIG_X  move partition SYS_P23  tablespace TS_DATA_01;

반응형

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

ORACLE EM Configuration  (0) 2009.03.08
오라클 환경과 관련된 내용  (0) 2009.03.08
RAC 자원 할당에 관한 질의/응답  (0) 2009.03.08
테이블별 용량 체크 쿼리  (0) 2009.03.08
Oracle 대용량 INSERT 속도개선  (0) 2009.03.08
반응형

1.  시스템이 3대면  최대 process 수는    150 * 3  =  450  인가요?
--> 이론적으로는 그렇지만...(정상적인 서비스의 상황일때...)
사실은 고려해야 하는 사항들이 있습니다.
특별이 로드밸런싱 없이 VIP통해 서비스 한다면 각 노드가 랜덤하게 세션을 받기때문에
한쪽 노드에 세션이 몰릴 수 있는 가능성도 있습니다.
(그래서 9i에서는 업부별 노드접속 파티셔닝을 하는 경우도 있었습니다.)
그리고 1개 또는 2개의 노드가 down되는 최악의 경우 나머지 노드가 모든 세션을 감당해야 하므로
실제 설정해야 하는 최대 process는 조금더 높게 잡으셔야 합니다.

select * from v$resource_limit; 
로 노드별 process의 MAX_UTILIZATION를 모니터링하면서 세개노드를 합한 값을
각 노드의 process 파라미터값으로 결정하시면 됩니다.


2. 시스템이 3대 각 8G memory 면    얼마정도 까지 잡아줘야 할까요?
--> SGA 크기에 따라 서버에서 실행되는 어플리케이션에 따라 적당히 결정.... ㅡㅡ;
top, topas, nmon등으로 확인했을 때의 메모리 사용량은 SGA를 쓰는것으로 알고 있습니다.
(이건 확실하지 않으므로 한번 확인해 보시기 바랍니다.)
한 세션이 실제 OS상에서 차지하는 메모리량을 계산하는 방법을 메타링크에서 본적이 있는데
기억이 나지 않는군요. 보통은 2~3MB 내외입니다. 
용도에 맞게 설정하시고... 시스템 메모리가 많이 남는다고 해서 굳이 꽉꽉 채워서 설정할 필요까지는 없습니다.

 

출처 : http://database.sarang.net/?inc=read&aid=35144&criteria=oracle&subcrit=qna&id=&limit=20&keyword=&page=5

반응형
반응형


TOAD등 툴을 통해 조회하면 쉽지만,

툴은 항상 있다고 보장되는것은 아니지 않는가?

물론 DBA 권한이 있다면 DBA_SEGMENTS를 통해서도 조회 가능하며

전체 테이블 용량도 조회 가능함 ~

select segment_type,segment_name,tablespace_name,to_char(round(bytes/1024/1024,1),'9,999,999') "MBytes"
from user_segments
where segment_type = 'TABLE'
order by segment_type,segment_name;
반응형
반응형

입력되는 테이블을 NoLogging 상태로 만들기

alter table  TFEI_TEMP_SND_RCV_FILE nologging;

append 힌트 사용하기

대용량 데이타를 insert 할 경우는 시간이 매우 많이 걸리게 된다.

 그러다가 temp 사이즈나 데이타 오류로 인해 에러가 나더라도

바로 에러를 밷는것이 아니라 롤백을 모두 한후에야

에러를 나타낸다.
 

총 insert 하는 데 걸리는 시간이 3시간이라면

2시간 진행된 작업이 잘못 됐다는걸 알았다(또는 에러가 났다는걸 알았다)

 

그러면 바로 에러를 뱉어내는 것이 아니라 롤백을 2시간 해주어야 된다

즉..  잘못된 insert 작업을 2시간 하다가 취소하면 2시간 기다려야(롤백하느라) 된다는 것이다..


 

얼마나 짜증나는 일인가???
 

해답이 있다 APPEND 를 쓰면 된다.

 

insert /*+append*/ into aaa

select * from ......



 

append 힌트는 롤백을 쌓지않고 바로 테이블스페이스에 저장하게 된다.

취소할 경우에는 그동안 저장된 데이타만 날리기때문에 취소도 즉시 된다.

 

정말 빠르다~~


 

하지만 단점이 있으니....


 

롤백을 쌓는 insert 의 경우에는 얼마나 작업이 진행됐는지 롤백 세그먼트 크기를

보면서 모니터를 할 수 있다.


 

하지만 append 는 롤백을 쌓지 않기 때문에 얼마나 진행됐는지 확인하기가 쉽지 않다.


 

한가지 힌트가 있다면

insert 되는

테이블의 크기라 1024M 이고 익스텐트를 128M이라면

insert 되는 데이타가 1024M의 용량을 넘었다면 익스텐트를 일으키기 때문에

extend 를 하는지 안하는지를 보면 작업이 어느정도 진행되는지 알수 있다.

 

출처 : 일부 나... 그외

http://shinyoung.kr/514

또한 프로세스 개수가 넉넉하다면 PARALLEL 옵션을 주면 더욱 좋다 ㅋ

반응형
반응형

SELECTS문에서 한번에 대량의 레코들 취득 하는 경우, BULK COLLECT구를 사용하면

한번에 여러개의 레코드를 취득할수 있으므로 퍼포먼스 향상


Patten 1

 DECLARE
  TYPE empno_tbl_type IS TABLE OF EMP.EMPNO%TYPE INDEX BY BINARY_INTEGER;
  empno_tbl  empno_tbl_type;
BEGIN
  SELECT EMPNO BULK COLLECT INTO empno_tbl FROM EMP;
  IF empno_tbl.COUNT > 0 THEN
    FOR i IN empno_tbl.FIRST..empno_tbl.LAST LOOP
      UPDATE EMP SET SAL = SAL * 1.05 WHERE EMPNO = empno_tbl( i );
    END LOOP;
  END IF;
END;
/




Patten 2

 DECLARE
  TYPE emp_tbl_type IS TABLE OF EMP%ROWTYPE INDEX BY BINARY_INTEGER;
  emp_tbl  emp_tbl_type;
BEGIN
  SELECT * BULK COLLECT INTO emp_tbl FROM EMP;
  IF emp_tbl.COUNT > 0 THEN
    FOR i IN emp_tbl.FIRST..emp_tbl.LAST LOOP
      UPDATE EMP SET SAL = SAL * 1.05 WHERE EMPNO = emp_tbl( i ).EMPNO;
    END LOOP;
  END IF;
END;
/


Patten 3 커서 이용

 DECLARE
  CURSOR emp_cur IS
    SELECT * FROM EMP;
  TYPE emp_tbl_type IS TABLE OF emp_cur%ROWTYPE INDEX BY BINARY_INTEGER;
  emp_tbl  emp_tbl_type;
BEGIN
  OPEN emp_cur;
  FETCH emp_cur BULK COLLECT INTO emp_tbl;
  CLOSE emp_cur;
  IF emp_tbl.COUNT > 0 THEN
    FOR i IN emp_tbl.FIRST..emp_tbl.LAST LOOP
      UPDATE EMP SET SAL = SAL * 1.05 WHERE EMPNO = emp_tbl( i ).EMPNO;
    END LOOP;
  END IF;
END;
/


즉,커서를 이용할시 취득할 데이터 수가 많을듯하면 Limit를 사용하여 일정 레코드 단위로

Fetch하는 것이 성능면에서 좋다.


FETCH emp_cur BULK COLLECT INTO emp_tbl LIMIT 100;

출처 : http://avang.tistory.com/65

참고로 대량의 입력 구문을 만들때도 유용하며

APPEND 힌트를 쓰면 아주 아주 좋다 !!!

반응형
반응형

rem -----------------------------------------------------------------------
rem Filename:   bulkbind.sql
rem Purpose:    Simple program to demonstrate BULK COLLECT and BULK BIND.
rem Notes:      Bulk operations on ROWTYPE only work from and above.
rem Date:       12-Feb-2004
rem Author:     Frank Naude, Oracle FAQ
rem -----------------------------------------------------------------------
set serveroutput on size 50000

DECLARE
  CURSOR emp_cur IS SELECT * FROM EMP;

  TYPE emp_tab_t IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;
  emp_tab emp_tab_t;            -- In-memory table

  rows NATURAL        := 10000;   -- Number of rows to process at a time
  i    BINARY_INTEGER := 0;
BEGIN
  OPEN emp_cur;
  LOOP
    -- Bulk collect data into memory table - X rows at a time
    FETCH emp_cur BULK COLLECT INTO emp_tab LIMIT rows;
    EXIT WHEN emp_tab.COUNT = 0;

    DBMS_OUTPUT.PUT_LINE( TO_CHAR(emp_tab.COUNT)|| ' rows bulk fetched.');

    FOR i IN emp_tab.FIRST .. emp_tab.LAST loop
      -- Manipumate data in the memory table...
      dbms_output.put_line('i = '||i||', EmpName='||emp_tab(i).ename);
    END LOOP;

    -- Bulk bind of data in memory table...
    FORALL i in emp_tab.FIRST..emp_tab.LAST
      INSERT /*+APPEND*/ INTO emp2 VALUES emp_tab(i);

  END LOOP;
  CLOSE emp_cur;
END;
/

 

/*

 bulk collection 관련 예제

출처 : http://hany4u.blogspot.com/2008/11/bulk-collect-and-bulk-bind.html

*/

반응형
반응형

Implicit Cursor가 Explicit Cursor에 비해 성능이 뛰어나다는 언급을 여러 번 봤을 것이다.

실제로도 그렇다.
하지만 왜 그런가?

간단한 테스트로 많은 것을 알 수 있다.

우선 다음과 같이 필요한 Object를 생성한다.

  1. @ukja102   
  2.   
  3. drop table t1 purge;   
  4. create table t1(c1 int, c2 char(10));   
  5. insert into t1   
  6. select level'dummy'  
  7. from dual   
  8. connect by level <= 200000;   
  9. commit;   
  10. select count(*) from t1;  

Implicit Cursor를 사용하는 경우와 Exlicit Cursor를 사용하는 경우의 성능을 비교해 보자.

  1. -- Implicit Cursor를 사용하는 경우   
  2. @ukja102   
  3. @mysid   
  4. @mon_on &v_sid   
  5.   
  6. begin  
  7.   for r in (select * from t1) loop   
  8.     null;   
  9.   end loop;   
  10. end;   
  11. /   
  12.   
  13. @mon_off   
  14. spool result1.txt   
  15. @mon_show   
  16. spool off  
  17.   
  18.   
  19. @ukja102   
  20. @mysid   
  21. @mon_on &v_sid   
  22.   
  23. -- Explicit Cursor를 사용하는 경우   
  24. declare  
  25.   cursor v_cursor is  
  26.     select * from t1   
  27.   ;   
  28.      
  29.   v_rec v_cursor%rowtype;   
  30. begin  
  31.   open v_cursor;   
  32.   loop   
  33.     fetch v_cursor into v_rec;   
  34.     exit when v_cursor%notfound;   
  35.   end loop;   
  36.   close v_cursor;   
  37. end;   
  38. /   
  39.   
  40. @mon_off   
  41. spool result2.txt   
  42. @mon_show   
  43. spool off  
여기서 한가지 질문을 던진다.

성능을 어떻게 비교할 것인가?

불행하게도 많은 사람들이 시작시간과 끝시간을 재는 것으로 만족한다. 그러지 말자.

Oracle은 성능을 비교하기 위한 많은 뷰들을 제공한다. 이들을 잘 활용해야 한다.

우선 v$sess_time_model 뷰를 통해 Time 정보를 비교한다. 이 뷰를 이용하면 별도의 코드를 통해 시간을 측정하지 않아도 된다.

  1. -- Implicit Cursor를 사용한 경우   
  2. STAT_NAME                                      VALUE1       VALUE2         DIFF   
  3. ---------------------------------------- ------------ ------------ ------------   
  4. DB time                                        59,773    1,777,125    1,717,352   
  5. sql execute elapsed time                       40,140    1,721,534    1,681,394   
  6. DB CPU                                         51,929    1,683,972    1,632,043   
  7. parse time elapsed                             42,324      256,573      214,249   
  8.   
  9. -- Explicit Cursor를 사용한 경우   
  10. STAT_NAME                                      VALUE1       VALUE2         DIFF   
  11. ---------------------------------------- ------------ ------------ ------------   
  12. DB time                                        29,622    6,051,808    6,022,186   
  13. sql execute elapsed time                       25,827    6,044,618    6,018,791   
  14. DB CPU                                         29,331    6,034,029    6,004,698   
  15. PL/SQL execution elapsed time                      60      558,753      558,693   
  16. parse time elapsed                              1,509      131,440      129,931  
Implicit Cursor가 모든 면에서 Explicit Cursor에 비해 현격한 성능 우위를 보이는 것을 알 수 있다.

그 이유가 무엇인지 가장 쉽게 알 수 있는 방법은?
Statistics을 봐야 한다. v$sesstat 뷰를 통해 본 차이는 다음과 같다.

  1. -- Implicit Cursor인 경우                                                                                  
  2. NAME                                           VALUE1       VALUE2         DIFF   
  3. ---------------------------------------- ------------ ------------ ------------   
  4. table scan rows gotten                             62      914,002      913,940   
  5. session pga memory max                      1,826,388    2,154,068      327,680   
  6. session uga memory max                      1,282,300    1,544,264      261,964   
  7. session pga memory                          1,826,388    1,957,460      131,072   
  8. session logical reads                             275        3,249        2,974   
  9.   
  10. -- Explicit Cursor인 경우   
  11. NAME                                           VALUE1       VALUE2         DIFF   
  12. ---------------------------------------- ------------ ------------ ------------   
  13. table scan rows gotten                             62   69,366,045   69,365,983   
  14. session pga memory max                      1,498,708    1,891,924      393,216   
  15. session pga memory                          1,498,708    1,891,924      393,216   
  16. session uga memory max                      1,151,372    1,413,336      261,964   
  17. session logical reads                              72      200,261      200,189  
차이가 무엇인가?
놀랍게도 일량(Reads)의 차이가 절대적이라는것을 알 수 있다. logical reads가 10배 정도 차이나며 그 차이로 인해 성능의 차이가 왔다.

이 차이는 어디서 온 것인가?
Fetch Array Size에서 온 것이다. 한번에 많은 로우를 Fetch하면 Block을 방문해야할 횟수가 줄어들며 그만큼 Logical Reads가 줄어든다. Implicit Cursor를 사용하는 경우에 Oracle은 내부적으로 10개를 한번에 Fetch한다. 반면에 Explicit Cursor를 사용하는 경우에는 한번에 한 개의 Row만 Fetch한다. 그 결과로 Logical Reads가 대략 10배의 차이가 나게 된다. 그 만큼 성능이 느린 것이다.

Explicit Cursor를 Implicit Cursor보다 빠르게 하는 유일한 방법은 Bulk Collection을 사용하는 것이다. 아래와 같이...

  1. @ukja102   
  2. @mysid   
  3. @mon_on &v_sid   
  4.   
  5. declare  
  6.   cursor v_cursor is  
  7.     select * from t1   
  8.   ;   
  9.      
  10.   type c1tab is table of t1.c1%type;   
  11.   type c2tab is table of t2.c2%type;   
  12.      
  13.   c1t c1tab;   
  14.   c2t c2tab;   
  15.      
  16. begin  
  17.   open v_cursor;   
  18.   fetch v_cursor bulk collect into c1t, c2t; -- Do it bulk!!!   
  19.   close v_cursor;   
  20. end;   
  21. /   
  22.   
  23. @mon_off   
  24. spool result3.txt   
  25. @mon_show   
  26. spool off  
결과는 다음과 같다.
  1. -- Implicit Cursor를 사용한 경우   
  2. STAT_NAME                                      VALUE1       VALUE2         DIFF   
  3. ---------------------------------------- ------------ ------------ ------------   
  4. DB time                                        59,773    1,777,125    1,717,352   
  5. sql execute elapsed time                       40,140    1,721,534    1,681,394   
  6. DB CPU                                         51,929    1,683,972    1,632,043   
  7. parse time elapsed                             42,324      256,573      214,249   
  8.   
  9. -- Explicit Cursor + Bulk Collection을 사용한 경우   
  10. STAT_NAME                                      VALUE1       VALUE2         DIFF   
  11. ---------------------------------------- ------------ ------------ ------------   
  12. DB time                                        28,024    1,503,542    1,475,518   
  13. DB CPU                                         18,620    1,489,167    1,470,547   
  14. sql execute elapsed time                       24,547    1,493,775    1,469,228   
  15. PL/SQL execution elapsed time                      59        5,512        5,453   
  16. parse time elapsed                              1,302        4,793        3,491  
Bulk Collection과 함께 Explicit Cursor를 사용한 경우 오히려 성능이 더 뛰어나다. 그 이유는?
  1. -- Implicit Cursor인 경우                                                                                  
  2. NAME                                           VALUE1       VALUE2         DIFF   
  3. ---------------------------------------- ------------ ------------ ------------   
  4. table scan rows gotten                             62      914,002      913,940   
  5. session pga memory max                      1,826,388    2,154,068      327,680   
  6. session uga memory max                      1,282,300    1,544,264      261,964   
  7. session pga memory                          1,826,388    1,957,460      131,072   
  8. session logical reads                             275        3,249        2,974   
  9.   
  10. -- Explicit Cursor + Bulk Collection인 경우   
  11. NAME                                           VALUE1       VALUE2         DIFF   
  12. ---------------------------------------- ------------ ------------ ------------   
  13. session pga memory max                      1,498,708   21,618,260   20,119,552   
  14. session uga memory max                      1,151,372    1,478,800      327,428   
  15. table scan rows gotten                             62      200,062      200,000  
Bulk Collection을 사용한 경우 한번에 필요한 Row를 Fetch하기 때문에 일량은 현격하게 주는 반면에 많은 양의 메모리(20M)를 사용한다. 그만큼 성능은 개선되었지만 그 대가는 메모리가 되는 셈이다.

위의 테스트 결과는 많은 것을 말해 준다.

  • 왜 성능 차이가 나는지는 알아야 하며, 또 알 수 있다.
  • 성능의 개선에는 대가가 따르며, 그 대가가 무엇인지도 알 수 있다.
  • 성능을 측정하는 다양한 뷰를 잊지 말라. 단순히 시간이나 일량만 보지 말라.
  • 자동화하라. Toad나 Orange같은 툴을 사용하지 말고 SQL*Plus를 이용해 [Enter]한번으로 결과가 나오게끔 하라

테스트에 사용한 스크립트는 아래에서 볼 수 있다.

<script language=javascript src="http://wiki.ex-em.com/hilite/Scripts/shCore.js">크리에이티브 커먼즈 라이선스
Creative Commons License

 

 

출처 : http://ukja.tistory.com/156

반응형
반응형

어느날 갑자기 만나게 된 에러 코드 ora-29275..
머가 안맞을까.. 싶었는데.
아마도 암호화 시킨 문자들이 해당 CHARACTERSET 으로는 표현이 안되나보다. (2BYTE 문자... 한글이겠지?)
포멧전에는 잘 되었던건데..

그래서 찾아보니..
오라클 서버의 CHARACTERSET 과 클라이언트의 CHARACTERSET 값이 다를 경우 발생한다.


그래서.. CHARACTERSET 을 변경 해 줘야 하는데..
우선,

서버와 클라이언트의 CHARACTERSET 이 다른지 비교를 해 보자.


1. 서버의 CHARACTERSET

SQL> select parameter, value from nls_database_parameters where parameter like '%CHARACTERSET%'

PARAMETER                                        VALUE
------------------------------------------------------------
NLS_NCHAR_CHARACTERSET             AL16UTF16
NLS_CHARACTERSET                         KO16KSC5601 


위와 같은 결과 값이 나온다.

우리가 확인해야 할 부분은 NLS_CHARACTERSET 의 값인 KO16KSC5601
서버에서 사용중인 CHARACTERSET 은  KO16KSC5601 이다.


그러면 이제는 클라이언트의 CHARACTERSET 을 알아보자.



2. 클라이언트의 CHARACTERSET

실행>regedit 
레지스트리 창을 띄워서 "NLS_LANG" 검색을 한다. 
대충 위치가..
KEY_LOCLA_MACHINE\SOFTWARE\ORACLE\어딘가에..
      NLS_LANG 값이 KOREAN_KOREA.KO16MSWIN949 이거로 되어있다.


3. 서버와 클라이언트의 CHARACTERSET 비교, 변경
나의 경우를 보면 서버는 KO16KSC5601 , 클라이언트는 KO16MSWIN949 로 되어있는것을 확인 할 수 있다.
두개의 CHARACTERSET 이 다르기때문에 나타나는 에러코드였으므로, CHARACTERSET 을 변경해준다.
단 주의해야 할 점은,
서버의 CHARACTERSET 을 변경하게 되면 서버에 접속하는 모든 클라이언트의 CHARACTERSET 을 변경해줘야 한다.
그러므로 왠만하면, 클라이언트를 서버에 맞추는것을 추천한다!!
그래서 레지스트리의 값을 서버의 CHARACTERSET 으로 변경해주고, 다시 실행하면 OK!!!
 
 
반응형

+ Recent posts