ORACLE Tip2008. 12. 17. 10:52
1. PRIMARY KEY DROP
  alter table <tablename> drop primary key;
 
  Example :
  alter table EMP drop primary key;
 
2. PRIMARY KEY 생성
 alter table <tablename> add constraint <primary key name> primary key(<primary key column list>)
    using index storage(initial 1m next 1m pctincrease 0)
    tablespace <tablespace name>;
      
      
  Example :
   alter table EMP add constraint EMP_PK primary key(EMPNO)
 using index storage(initial 1m next 1m pctincrease 0)
 tablespace USERS;   

Posted by 항아리고미
ORACLE Tip2008. 12. 16. 10:51
1. 개요
 
client/server환경에서는 client의 request는 요청이 되면 바로 처리되므로,
online이고 연결된 작업이라고 볼 수 있다. 이러한 모델은 다음 작업을 진행하기 전에 처리한 작업에 대한 결과를 얻어서 이용하는 경우에 적당하다.
그러나 이러한 경우 어플리케이션이 항상 사용가능한 상태이어야 하기 때문에 network문제 등이 발생하는 경우 전체 어플리케이션이 모두 사용할 수 없게 되는 문제가 발생할 수 있다.
 
Queuing 기법은 프로그램들간의 disconnected/deferred communication으로 client/server환경과는 다른 요구사항에 적용되어질 수 있다. 이 방법을 이용하면 생산자 역할을 하는 프로그램은 queue에 request를 넣고 소비자 역할의 프로그램이 queue의 request를 꺼내 처리하게 된다. Oracle8에서는 이러한 queuing 기법을 기존의 TP-monitor나 다른 message-oriented middleware를 사용하지 않고 직접 사용가능하도록 하고 있다.
 
여기에서는 이러한 Oracle8에서 제공하는 advanced queuing에 대해서 간단한 개념과 예제를 제시한다. 여기에 적힌 예제는 oracle8 8.0.4와 8.1.4에서
성공적으로 수행되었다.
 
2. Advanced Queuing이란?
 
(1) Message
message란 queue에 들어가고 꺼내지는 정보의 가장 작은 단위이다. 이것은 raw type이나 object type인 user data (payload)와 priority 등의 추가적인 제어 정보를 담고 있는 meta data로 구성되어 있다. 하나의 메시지는 오직 하나의 queue에만 위치할 수 있으면 ENQUEUE procedure에 의해 queue에 들어가고 DEQUEUE procedure에 의해 queue에서 읽혀진다.
 
(2) Queue
queue는 메시지들의 저장 장소라고 할 수 있다. User queue와 exception queue라는 두가지 type이 존재하는데 이 중 user queue가 정상적인 message 처리를 위한 것이고 오류로 인해 제대로 처리되지 못한 메시지는 exception queue로 전달된다.
데이타베이스내에 생성될 수 있는 queue의 숫자에는 제한이 없으며, DBMS_AQADM package에 의해서 생성/변경/시작/멈춤/삭제되어 질 수 있다.
 
(3) Queue Tables
queue는 queue table에 저장되어진다. 각각의 queue table은 하나의 데이타베이스 테이블로 구성되며 하나 이상의 queue들을 포함한다. 각각의 queue table에는 하나의 default exception queue이 존재하며 DBMS_AQADM package를 이용하여 생성할 수 있다.
 
(4) Agents
agent는 queue user로 producer와 consumer 두가지 type이 있다. producer는 message를 queue에 전달하는데 이것을 enqueuing이라고 하고, consumer가 queue에서 message를 읽는 것을 dequeuing이라고 한다. 여러명의 producer와 consumer가 하나의 queue를 사용할 수 있으며 하나의 agent는 name, address, protocol에 의해 구분되다. 그런데 이 agent는 실제 database상의 user는 아니며 실제로는 application혹은 program이라고 생각할 수 있다.
 
3. 예제
 
advanced queuing을 사용하기 위해서는 먼저 catqueue.sql을 sys user에서 수행하여야 하는데 이것은 catproc.sql에서도 호출되도록 되어 있으므로 install당시 이미 수행되어져 있는 것이 정상이다.

(1) setup.sql

connect sys/manager
create user scott identified by tiger
default tablespace users
temporary tablespace temp;

grant connect, resource, aq_administrator_role to scott;
execute dbms_aqadm.grant_type_access('scott');
grant execute on dbms_aq to scott ;
grant execute on dbms_aqadm to scott;

connect scott/tiger
create type scott_mesg as object (m1 varchar2(10), m2 varchar2(10));

/* 기존 환경 삭제 */
exec dbms_aqadm.stop_queue(queue_name =>'SCOTT.AS_Q',wait=>FALSE);
exec dbms_aqadm.drop_queue(queue_name => 'SCOTT.AS_Q');
exec dbms_aqadm.drop_queue_table(queue_table=>'SCOTT.AS_TABLE', force=>TRUE);

/*생성 및 구동 */
exec dbms_aqadm.create_queue_table
          (queue_table => 'SCOTT.AS_TABLE',
            queue_payload_type=> 'scott.scott_mesg',
            storage_clause => 'storage (initial 1m next 1m pctincrease 0 )',
            multiple_consumers=> TRUE,
            comment => 'demo queue table' );
exec dbms_aqadm.create_queue (queue_name => 'SCOTT.AS_Q',
                                                          queue_table => 'SCOTT.AS_TABLE',
                                                          comment => 'demo queue');
exec dbms_aqadm.start_queue (queue_name => 'SCOTT.AS_Q');


(2) enq.sql 

set serverout on
declare
enqueue_options dbms_aq.enqueue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle raw(16);
recipients dbms_aq.aq$_recipient_list_t;
message scott.scott_mesg;

begin
    enqueue_options.visibility := DBMS_AQ.IMMEDIATE;
    message:= scott_mesg('Hello !', 'World !!!');

    recipients(1) := sys.aq$_agent('app01','SCOTT.AS_Q',NULL);
    message_properties.recipient_list := recipients;

    dbms_aq.enqueue (queue_name => 'scott.as_Q',
          enqueue_options => enqueue_options,
          message_properties => message_properties,
          payload => message,
              msgid => message_handle );
    dbms_output.put_line('Message enqueued.');
end;
/

(3) deq.sql
 

set serveroutput on
declare
dequeue_options dbms_aq.dequeue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle raw(16);
message scott.scott_mesg;

begin
    dequeue_options.consumer_name := 'app01';
    dequeue_options.wait := 2;

    dbms_aq.dequeue (queue_name => 'SCOTT.AS_Q',
                  dequeue_options => dequeue_options,
                                      message_properties => message_properties,
                                      payload => message,
                                      msgid => message_handle );
    dbms_output.put_line('message1 : ' || message.m1 || ',
                                                message2 : ' || message.m2);
end;
/

SQL> @enq
Message enqueued.
PL/SQL procedure successfully completed


SQL> @deq
message1 : Hello !, message2 : World !!!
PL/SQL procedure successfully completed.
 

Posted by 항아리고미
ETC Tip2008. 12. 15. 16:59

Ftp 로 SUN System에 접속을 하면 목록이 안보일 때가 있다.

그럴때는 /etc/rc2.d/S72inetsvc에 아래와 같은 것을 추가 해주고 Restart하면 된다.

# vi /etc/rc2.d/S72inetsvc

LANG=C;export LANG  <===  추가

* Restart 방법
# /etc/rc2.d/S72inetsvc stop
# /etc/rc2.d/S72inetsvc start

Posted by 항아리고미
ORACLE Tip2008. 12. 15. 10:43
EXP-00091: Exporting questionable statistics.
Export terminated successfully with warnings.
 
questionable statistics 란?
1. exp 받는 동안 row error가 있는 경우
2. client char set이나 nchar char set이 server char set이나 nchar char set
과 맞지 않는 경우
3. exp시 query 옵션이 사용된 경우
4. partitions, subpartions만 exp 받는 경우

위의 4가지 경우인 경우 위의 warning 이 나타납니다.
위의 4가지인 경우 기존의 통계정보와 달라질 수 있기 때문에 recalculate가 필요합니다.
oracle 9버전부터 export시 default로 기존의 통계정보를 export받는데
export 받기 전 정상적으로 analyze가 되지 않았다면 위에 해당하는 에러가 발생하게 됩니다.

 
answer1>
통계정보를 무시하고 export 할려고 한다면..옵션절에 statistics = none 로 써
주시고 export받으면 됩니다.
answer2>
imp받으실때 statistics=safe로 받으면 됩니다.
여러 exp 파일이 있는 경우 저 warning이 났는지 안났는지 모르기때문에 safe 옵션을 쓰면 재계산이 필요한 경우는 해주고 안필요하면 안하고 넘어가게 됩니다.

Posted by 항아리고미
ORACLE Tip2008. 12. 13. 10:40
SQLPLUS 에서 숫자 크기가 너무 클경우 출력 숫자 크기를 늘려주는 방법.
 
SET NUMFORMAT 999999999999999.99
SET NUM 15

Posted by 항아리고미


- 참치맛살롤(1인분)
주재료 : 밥1공기, 김(1장), 캔참치(1/2), 크래미맛살1줄, 치즈(2장)
부재료 : 양상추, 마요네즈, 날치알
밥양념 : 식초(1), 설탕(1/2), 소금(0.2)
캔참치양념 : 고추장(1), 다진양파(2)

캔참치의 기름을 꼭 자내고, 고추장과 양파를 넣어 버무려준다.
김발위에 김, 밥, 랩을 씌우고 뒤집어서 김위에 상추, 치즈, 참치, 맛살 올리고 돌돌 말아준다음
썰어서 날치알 올리고 마요네즈, 돈가스소스 혹은 데리야끼소스 뿌려주믄 땡.

> 김밥을 싫어라 하는 신랑이 때문에
> 떡국과 함께 준비함.
> 예상외로 신랑이는 맛나다 하고 아빠는 머 그럭저럭 이라 함.
> 한줄 남겨놨다가 언니네 줬는데..  형부가 맛나게 다 드셨다고.. ㅋㅋ

Posted by 항아리고미
ORACLE Tip2008. 12. 12. 10:39
--- Problem
사용자는 다음과 같은 상황에서 session 을 kill 하려는 시도를 하게 된다.
1. os 에는 process 가 존재하지 않지만, v$session 에는 active 로 존재하고 있을 경우
2. shadow process 는 살아 있는데, client machine 을 rebooting 한 경우
3. session 이 걸고 있던 lock 을 release 해야 할 경우
4. OS 나 Oracle 의 자원을 지나치게 많이 사용하여 성능을 저하시키는 process
그런데, alter system kill session ('sid, serial#'); 후에 다음과 같은 에러가 발생할 경우가 있다.
 
ORA-00030: User session ID does not exist.
// *Cause:  The user session id no longer exists, probably because the
//          session was logged out.
// *Action: Use a valid session ID.
 
--- 원인과 대책
kill session을 할 수 없는 이유는 PMON이 이미 이 session을 delete하고 있는 중이기 때문이다.
즉, PMON 이 dead session 을 clean-up 하고 있는 중에는 serial number의 값이 증가한다.
문제는 PMON이 process를 kill하는 시간인데, transaction의 크기에 따라, PMON의 rollback 시간이 결정된다.
먼저 PMON은 dead process를 찾아내어, 이 process가 사용한 resource를 release하는 시도를 한다. 
PMON은 계속 이 작업을 시도하다가 마침내, free buffer의 부족으로 더 이상 resource를 free-up 하지 못하게 된다.
이 때, 이 process를 delete하고 있다는 message를 trace file에 출력하는데, 이것은 process를
delete하는 데
필요한 resource(data cache 내의 free buffer)의 부족으로 위의 작업이 지연되고 있다는 의미이다.
PMON이 process 를 clean-up 할 때 걸리는 시간은, 5분에서 24 시간까지 소요 될 수 있다.
문제는 이 process가 hold 하고 있는 lock으로 인해 특정 작업이 수행되지 못하는 데 있다. 
MTS 를 사용할 때는 configuration MTS setting, sqlnet.expire_time 사용)에 따라 다르지만,
clean-up 작업을 하는데 72 시간이 소요된 경우도 있다.
아직까지는 PMON이 작업을 마칠 때까지 기다리는 방법 또는 db를 restartup하는 방법 밖에는 없다.
 
--- PMON 의 작업
PMON은 network failure 나 기타의 원인으로 생긴 old process connection을 clean-up 하는 역할을 한다.
그런데, PMON 은 clean-up 해야 하는 connection 중에 정해진 개수 만큼의 transaction 을 rollback 할 수 있는데,
이 값은 initSID.ora 의 cleanup_rollback_entries(default = 20) 에 의해 결정된다.
예를 들어, 1000 개의 uncommitted update가 있다면, 일정한 시간마다 cleanup_rollback_entries
의 개수 만큼의
record 만 rollback 할 수 있으므로 이 작업 동안에 lock 은 그대로 유지된다.

PMON 은 위의 작업 이외에 DB maintenance 역할이 있으므로, 위의 rollback 이 비교적 빠르게 처리되지 못할 수도 있다.
이러한 rollback을 빠르게 처리하기 위하여 cleanup_rollback_entries 를 늘릴 수도 있다.
그러나, 그 만큼 일정시간 동안 PMON 의 작업이 많아지게 되므로, 다른 사용자들의 작업 요청이 느려지게 되는
trade-off 가 있으므로, 신중히 고려한 후에 수정하는 것이 바람직하다.
alter system kill session 에 의해서도 위와 같이 rollback 이 이루어지는데, 이 session 이 완전히 clean-up 되기
전까지 v$session, v$process에 남아 있게된다.
 
--- ALTER SYSTEM KILL SESSION 을 하기 전에 ...
kill session 을 원할 경우는 다음의 순서대로 작업하는 것이 좋다.
 
1. kill the user process first
2. wait for 3 - 4 minutes
3. query v$session
4. if any information find in v$session, query v$lock
   like
   select count(*) from v$lock where SID ='sid';
 
위의 count(*) 가 0 이 아니라면, 아직 PMON 이 rollback을 끝내지 못한 경우이므로 다시 얼마 후에 v$lock 을 조회하여
lock 의 개수가 감소하였는지 반복적으로 확인한다.
만약, 이 값이 전혀 변하지 않았다면, ALTER SYSTEM KILL SESSION 을 수행하고 v$session,
v$lock을 query 하여
변화가 있는지 확인하여 변화가 있다면, 좀 더 기다린다.
그래도, v$lock 의 count(*) 가 0 이 되지 않을 경우, 마지막으로 수행할 수 있는 유일한 방법은 instance 를 restartup 하는 것이다.
 
Posted by 항아리고미
ORACLE Tip2008. 12. 11. 10:38
-- 테스트 테이블 생성
SQL>CREATE TABLE test_str(
        val varchar2(10));
 
 
-- 테이블에 아래와 같이 특수문자를 인서트 할경우
SQL> INSERT INTO test_str VALUES('Q&A');
a의 값을 입력하십시오:
--
이런 문장이 나옵니다..  
--
특수문자를 갖는 데이터를 인서트 하기 위해서는 다음과 같은 세 가지 해결 방법이 있습니다.

 
▒ 첫번째 방법

   SQL*Plus에서
SET DEFINE OFFSET SCAN OFF를 실행하여
   
Substitution Variable(&)을 Turn Off시킨다.
 
 
   SQL>
SET DEFINE OFF
   SQL>
INSERT INTO test_str VALUES('Q&A');
   1 개의 행이 만들어졌습니다.
   
   SQL>SELECT * FROM test_str;
        VAL
        ------
        Q&A
 

 
▒ 두번째 방법

   SET
DEFINE ON 상태로 유지 시키면서 Substitution Variable을
   다른
Non-Alphanumeric 문자나 Non-White Space 문자(*, % 등등)로 대체시킨다.
 
 
   SQL>
SET DEFINE %
   SQL>
INSERT INTO test_str VALUES('Q&A');
   1 개의 행이 만들어졌습니다.
 

 
▒ 세번째 방법

   SET ESCAPE ON 상태에서(DEFINE은 &로, SCAN은 ON 상태로 유지)
   
특수 문자 앞에 ESCAPE 문자인 BACKSLASH('')를 붙인다.
 
 
   SQL>
SET ESCAPE ON
   SQL>
SHOW ESCAPE
        ESCAPE "" (hex 5c)
   SQL>
INSERT INTO test_str VALUES ('Q&A');
   1 개의 행이 만들어졌습니다.

Posted by 항아리고미
ORACLE Tip2008. 12. 10. 10:36
-- spool 뜰때 라인뒤의 공백을 제거합니다.
SQL>SET TRIMSPOOL ON

 
-- header가 display되지 않고 데이터만 display됩니다.
SQL>SET HEADING OFF           


--  pagesize의 default는 14이며 그대로 하면 14줄마다 1줄씩 공백이  생기므로
-- 그런 현상을 방지하기 위해 크게 지정합니다.
SQL>SET PAGESIZE 1000     


-- linesize도 record 길이만큼 지정하여 아래로 구분되지 않도록 합니다.
SQL>SET LINESIZE  300        


-- 명령이 display되지 않도록 합니다.
SQL>SET ECHO OFF              


-- 조회 결과가 화면에 나오지 않도록 합니다.  
SQL>SET TERM OFF   
Posted by 항아리고미
ORACLE Tip2008. 12. 9. 10:46
1. Toad 9 데이터 그리드에서 한글 깨짐 문제

Toad로 oracle 10g 에서 데이타를 읽어 오는데 DATA 그리드 부분에서 한글이 깨져서 ??? 로 보일 때.


REGEDIT 실행,

아래 경로에 작성하여 주면 된다. 나의 경우 아래 경로에 값이 존재 하지 않아 추가 해주었다.

키이름은 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
문자열값
NLS_LANG
값 데이타
KOREAN_KOREA.KO16MSWIN949

작성하고 toad 새로 실행하니 바로 한글이 올바르게 표현 되었다.

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 
이 경로에서 정상적으로 동작하지 않을 경우엔 \CLIENT_1 인가?  하위경로에 만들어 주면 된다...


2. Toad 9 버젼에서 엑셀로 저장시 한글 깨짐 문제

  
Toad9 버젼을 사용중 select한 데이터를 엑셀로 보내고자 했는데 한글이 깨질경우
   Save Grid Contents 윈도우의 Write Wide Strings 옵션에 체크를 해주면 된다.

  

  
Posted by 항아리고미