'분류 전체보기'에 해당되는 글 2491건

  1. 2008.10.27 예외 문제 해결: System.StackOverflowException
  2. 2008.10.27 복구할 수 없는 StackOverFlow
  3. 2008.10.25 XML의 기본 구조와 문법
  4. 2008.10.25 XML JavaScript DOM (XML 정보 보기)
  5. 2008.10.25 JavaScript DOM을 이용한 Element 추가하기
  6. 2008.10.25 XML JavaScript DOM을 이용해 테이블 만들기
  7. 2008.10.25 JavaScript DOM을 이용해 이미지 동적 생성 하기
  8. 2008.10.25 JavaScript DOM을 이용한 XML 문서 만들기 1
  9. 2008.10.24 XML & JAVASCRIPT로 트리 메뉴(tree menu) 만들기
  10. 2008.10.24 GPS를 이용하여 인기 있는 장소를 알려주는 유흥문화 지도
  11. 2008.10.24 네트워크로 연결된 어머니들
  12. 2008.10.24 지역 검색 기능을 갖춘 행사 계획 도우미 사이트
  13. 2008.10.24 여행일정을 대신 잡아주는 웹싸이트
  14. 2008.10.24 마우스 클릭으로 소원빌기
  15. 2008.10.23 프로그램이 사용하는 포트를 알려준다 - fport
  16. 2008.10.23 아카이브 로그 모드란?
  17. 2008.10.23 오라클 EM 사용 백업 복구 문서 1
  18. 2008.10.23 실시간 ping test 및 open Port 확인 툴
  19. 2008.10.23 os별 오라클 설치 가이드 라인 1
  20. 2008.10.23 데이터베이스 관리 (추천)
  21. 2008.10.23 그리드 컴퓨팅 데이터베이스의 약진 Oracle Database 10g Release 2
  22. 2008.10.23 Oracle Database 11g: DBA와 개발자가 알고 있어야 하는 새로운 기능
  23. 2008.10.23 엑셀 주민등록번호 남여 구분
  24. 2008.10.23 Windows에서 Oracle 10gR2 EM의 인증서 설정 방법 1
  25. 2008.10.23 오라클이 권장하는 백업방법
  26. 2008.10.23 [오라클 백업툴] Oracle Secure Backup
  27. 2008.10.23 [oracle 백업툴]Oracle용 SnapManager
  28. 2008.10.23 [오라클 온라인 백업툴]오라클 온라인 APM™ 1
  29. 2008.10.22 [오라클] ORA-12560 에러 대처법 && sqlplus 사용안될때(댓글참조) 2
  30. 2008.10.22 Oralce sqlplus 접속안될때
01.JAVA/Java2008. 10. 27. 14:39
반응형

StackOverflowException 예외는 메서드 호출이 너무 많이 중첩되어 실행 스택이 오버플로하는 경우에 throw됩니다.

무한 루프 또는 무한 재귀가 없는지 확인하십시오.

메서드 호출이 너무 많은 경우 이는 대부분 너무 깊거나 종료 조건이 없는 재귀를 의미합니다.

예외 처리 코드에는 스택이 필요할 수 있으므로 스택 오버플로 예외는 catch할 수 없습니다. 대신, 일반적인 응용 프로그램에서 스택 오버플로가 발생하면 CLR(공용 언어 런타임)에서 프로세스를 종료합니다.

CLR를 호스팅하는 응용 프로그램에서는 기본 동작을 변경하여 CLR에서 예외가 발생한 응응 프로그램 도메인을 언로드하고 프로세스를 계속하도록 지정할 수 있습니다. 자세한 내용은 ICLRPolicyManager공용 언어 런타임 호스팅을 참조하십시오.

Posted by 1010
01.JAVA/Java2008. 10. 27. 14:19
반응형
복구할 수 없는 StackOverFlow
 

문제 설명
JVM 종료 또는 코어 덤프 직전에 응용 프로그램이 "an irrecoverable stack overflow has occurred. Unexpected Signal 11" 오류 메시지를 표시합니다.  또는 응용 프로그램이 일반 "StackOverFlow Error" 메시지를 표시합니다. 


Unexpected Signal : 11 occurred at PC=0xfb9c22ec
Function name=write (compiled Java code)
Library=(N/A)
Current Java thread:
Dynamic libraries:

0x10000     /opt/bea/jdk131/jre/bin/../bin/sparc/native_threads/java
0xff350000     /usr/lib/lwp/libthread.so.1
0xff380000     /usr/lib/libdl.so.1
0xff200000     /usr/lib/libc.so.1
0xff330000     /usr/platform/SUNW,Ultra-Enterprise/lib/libc_psr.so.1
0xfee00000     /opt/bea/jdk131/jre/lib/sparc/client/libjvm.so
0xff2f0000     /usr/lib/libCrun.so.1
0xff1e0000     /usr/lib/libsocket.so.1
0xfed00000     /usr/lib/libnsl.so.1
0xff1b0000     /usr/lib/libm.so.1
0xff320000     /usr/lib/libw.so.1
0xff190000     /usr/lib/libmp.so.2
0xfede0000     /usr/lib/librt.so.1
0xfedc0000     /usr/lib/libaio.so.1
0xfecc0000     /opt/bea/jdk131/jre/lib/sparc/native_threads/libhpi.so
0xfec80000     /opt/bea/jdk131/jre/lib/sparc/libverify.so
0xfec40000     /opt/bea/jdk131/jre/lib/sparc/libjava.so
0xfec10000     /opt/bea/jdk131/jre/lib/sparc/libzip.so
0xfd810000     /opt/bea/jdk131/jre/lib/sparc/libnet.so
0xaafc0000     /usr/lib/nss_files.so.1
0x6c0c0000     /opt/bea/wlserver6.1/lib/solaris/libmuxer.so
0x6c0a0000     /usr/ucblib/libucb.so.1
0x6bfb0000     /usr/lib/libresolv.so.2
0x6bec0000     /usr/lib/libelf.so.1
0x6bf90000     /opt/bea/jdk131/jre/lib/sparc/libioser12.so
0x6bdc0000     /opt/bea/wlserver6.1/lib/solaris/libjsafe.so

Local Time = Fri Nov  21 16:32:28 2003
Elapsed Time = 6143

# HotSpot Virtual Machine Error : 11
# Error ID : 4F530E43505002BD 01
#
# Please report this error at
# http://java.sun.com/cgi-bin/bugreport.cgi
# Java VM: Java HotSpot(TM) Client VM (1.3.1_07-b02 mixed mode)
#

문제 해결다음 항목을 모두 수행해야 하는 것은 아닙니다.  어떤 경우에는 다음 중 일부만 수행하여도 해결할 수 있습니다.

항목 바로가기:

문제 발생 원인
StackOverFlow 메시지는 대개 JVM 코어 덤프 직전에 나타납니다.  대개 이 메시지는 사용자의 응용 프로그램 코드에 오류가 있음을 나타냅니다. 이 오류 메시지는 사용자/응용 프로그램 코드에서의 재귀적 호출이나 개체의 다차원 배열로 인해 StackOverFlow가 발생할 수 있는 시나리오 중 하나입니다. (java.sun.com에 이 문제에 대한 버그 보고서가 있습니다.)  문제 해결을 위해서는 까다롭겠지만 JVM의 구현 세부 사항을 알아야 합니다.

페이지 맨 위

응용 프로그램 코드 진단

  1. 이러한 문제을 유발하는 것이 응용 프로그램 코드인지 WebLogic인지 확인할 수 있도록 스택 트레이스 기능을 사용할 수 있는지 확인합니다.. 

  2. 응용 프로그램 코드가 의심스러운 경우 java.lang.StackOverflowError 예외가 발생하면 스택 트레이스를 표시하도록 응용 프로그램 코드를 변경할 수 있습니다.

이 방법을 사용하면 이러한 유형의 프로그래밍 오류를 신속하게 탐지할 수 있습니다(다음 프로그램 참조).

Catch ( StackOverflowError e ) {

        System.err.println("Exception: " + e );
        // Here is the important thing to do
        // when catching StackOverflowError's:
        e.printStackTrace();
        // do some cleanup and destroy the thread or unravel if possible.
}

  1. 최근에 변경한 응용 프로그램 코드에서 차이점이 있는지 살펴보고 재귀적으로 호출될 수 있는 항목이 있는지 확인합니다. 

  2. 의심스러운 코드에 디버그 문을 추가합니다.

페이지 맨 위

코어 파일에서 정보 수집
코어 파일은 대개 StackOverFlow가 발생할 때 생성됩니다.  코어 파일에서 주의할 점은 동일한 응용 프로그램 코드 함수가 반복적으로 호출되지만 실제 문제의 함수를 표시하지 않을 수도 있다는 점입니다.  코어 파일이 생성되지 않았다면 파일 권한 문제나 코어 파일 자체의 실제 제한 때문일 수 있습니다.  코어 덤프 파일의 크기는 다음 요소의 영향을 받을 수 있습니다.

  • ulimit -a를 검사하여 코어 파일이 생성될 수 있는 환경인지 확인하십시오.

  • ulimit -c (코어 파일의 크기 제한입니다.  이 부분을 ulimit -c unlimited로 수정하십시오.)

  • 커널 제한(ulimit -c에 대해 엄격한 제한).

  • 사용 가능한 사용자 디스크 공간(디스크 할당량이 있습니까?)

생성된 코어 파일이 있으면 코어 파일에 대해 dbx 또는 gdb를 실행합니다.  다음은 dbx 및 gdb용 명령과 gdb에 의해 생성된 출력 예제입니다. (참고:  DEBUG_PROG는 Java 환경에서 실행할 디버거나 프로파일러를 지정할 수 있는 환경 변수입니다.)
 
 a. dbx:


 $ java -version  (need to use right version of jdk)
$ ls /opt/bin/dbx (need to know dbx location) or "which dbx"
$ export DEBUG_PROG=/opt/bin/dbx (or wherever "dbx" is located)

 For JDK 1.3.X do the following:
       $ <path to java command>/java corefile
 For JDK 1.4.X do the following:
       $ dbx  <path to java command>/java corefile
  
Now you will be in the debugger.  Execute the following commands:
(dbx) where    ("shows a summary of the stack")
(dbx) threads    ("shows the state of the existing threads")
(dbx) quit


b. gdb:

 $ java -version  (need to use right version of jdk)
$ ls /usr/local/bin/gdb (need to know gdb location) or "which gdb"
$ export DEBUG_PROG=/usr/local/bin/gdb  (or wherever "gdb" is located)

 For JDK 1.3.X do the following:
       $ <path to java command>/java corefile
 For JDK 1.4.X do the following:
       $ gdb  <path to java command>/java corefile


Now you will be in the debugger.  Execute the following commands:
(gdb) where        ("shows a summary of the stack")
(gdb) thr    ("switch among threads or show the current thread")
(gdb) info thr        ("inquire about existing threads")
(gdb) thread apply 1 bt    ("apply a command to a list of threads, specifically the backtrace to thread #1")
(gdb) quit


where 명령을 사용하면 실행된 마지막 스레드의 스택 트레이스가 생성되고, thr 명령을 사용하면 현재 스레드가 표시되고, info thr 명령을 사용하면 모든 스레드의 상태가 표시되고, thread apply 1 bt 명령을 사용하면 코어 파일에 포함된 스레드 1의 스택 트레이스를 다른 방식으로 가져올 수 있습니다.  마지막 명령 thread apply # bt에서 #을 실제 스레드 번호로 바꾸어 개별 스레드의 스택 트레이스를 가져오거나 3을 "all"로 바꾸어 모든 스레드의 스택 트레이스를 가져올 수 있습니다.

다음 예제는 gdb 디버거를 이용하여 코어 파일(위의 명령 포함)을 분석한 것입니다.  이 예제 코어는 응용 프로그램의 사용자 native 코드 오류로 인해 야기된 것입니다.  (굵게 서식이 지정된 항목을 참조하십시오.)  이 스택 트레이스에서 signal handler가 호출되기 전 마지막 줄을 살펴보십시오.  원시 라이브러리 libhello.so에 포함된 displayHelloWorld 함수를 볼 수 있습니다.


    $ export DEBUG_PROG=/usr/local/bin/gdb
    $ java core

    GNU gdb 5.0
    Copyright 2000 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "sparc-sun-solaris2.8"...
    (no debugging symbols found)...
    Core was generated by `/wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/bin/../bin/sparc/native_threads'.
    Program terminated with signal 9, Killed.
    Reading symbols from /usr/lib/libthread.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libthread.so.1
    Reading symbols from /usr/lib/libdl.so.1...(no debugging symbols found)...done.
    Loaded symbols for /usr/lib/libdl.so.1
    Reading symbols from /usr/lib/libc.so.1...(no debugging symbols found)...done.
    Loaded symbols for /usr/lib/libc.so.1
    Reading symbols from /usr/platform/SUNW,UltraAX-i2/lib/libc_psr.so.1...
    (no debugging symbols found)...done.
    Loaded symbols for /usr/platform/SUNW,UltraAX-i2/lib/libc_psr.so.1
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    Reading symbols from /usr/lib/libCrun.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libCrun.so.1
    Reading symbols from /usr/lib/libsocket.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libsocket.so.1
    Reading symbols from /usr/lib/libnsl.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libnsl.so.1
    Reading symbols from /usr/lib/libm.so.1...(no debugging symbols found)...done.
    Loaded symbols for /usr/lib/libm.so.1
    Reading symbols from /usr/lib/libw.so.1...
     warning: Lowest section in /usr/lib/libw.so.1 is .hash at 00000074
    (no debugging symbols found)...done.
    Loaded symbols for /usr/lib/libw.so.1
    Reading symbols from /usr/lib/libmp.so.2...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libmp.so.2
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/native_threads/libhpi.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/native_threads/libhpi.so
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libverify.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libverify.so
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libjava.so...(no debugging symbols found)...done.
Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libjava.so
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libzip.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libzip.so
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libnet.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libnet.so
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libfilelock.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libfilelock.so
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libioser12.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libioser12.so
    Reading symbols from /usr/lib/nss_nis.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/lib/nss_nis.so.1
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libstackdump.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libstackdump.so
    Reading symbols from /usr/lib/libmd5.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libmd5.so.1
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libmuxer.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libmuxer.so
    Reading symbols from /usr/ucblib/libucb.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/ucblib/libucb.so.1
    Reading symbols from /usr/lib/libresolv.so.2...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libresolv.so.2
    Reading symbols from /usr/lib/libelf.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libelf.so.1
    Reading symbols from /home/usera/wls70/solaris/projectWork/lib/libhello.so...
    (no debugging symbols found)...done.
    Loaded symbols for /home/usera/wls70/solaris/projectWork/lib/libhello.so

(gdb) where

    #0  0xff369764 in __sigprocmask () from /usr/lib/libthread.so.1
    #1  0xff35e978 in _resetsig () from /usr/lib/libthread.so.1
    #2  0xff35e118 in _sigon () from /usr/lib/libthread.so.1
    #3  0xff361158 in _thrp_kill () from /usr/lib/libthread.so.1
    #4  0xff24b908 in raise () from /usr/lib/libc.so.1
    #5  0xff2358f4 in abort () from /usr/lib/libc.so.1
    #6  0xfe3c6904 in __1cCosFabort6Fl_v_ ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #7  0xfe3c59f8 in __1cCosbBhandle_unexpected_exception6FpnGThread_ipCpv_v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #8  0xfe20a8bc in JVM_handle_solaris_signal ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #9  0xff36b82c in __sighndlr () from /usr/lib/libthread.so.1
    #10 <signal handler called>
    #11 0xe9f90420 in Java_HelloWorld_displayHelloWorld ()
       from /home/usera/wls70/solaris/projectWork/lib/libhello.so

    #12 0x90aec in ?? ()
    #13 0x8dc54 in ?? ()
    #14 0x8dc54 in ?? ()
    #15 0x8dc54 in ?? ()
    #16 0x8ddbc in ?? ()
    #17 0x8dde0 in ?? ()
    #18 0x8dc54 in ?? ()
    #19 0x8dc54 in ?? ()
    #20 0x8dde0 in ?? ()
    #21 0x8dc78 in ?? ()
    #22 0x8dc54 in ?? ()
    #23 0x8ddbc in ?? ()
    #24 0x8dc54 in ?? ()
    #25 0xfe5324f0 in __1cMStubRoutinesG_code1_ ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #26 0xfe0cbe9c in
__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #27 0xfe1f6dc4 in __1cJJavaCallsMcall_virtual6FpnJJavaValue_nLKlassHandle_nMsymbolHandle_4pnRJavaCallArguments_pnGThread__v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #28 0xfe1fcd94 in __1cJJavaCallsMcall_virtual6FpnJJavaValue_nGHandle_nLKlassHandle_nMsymbolHandle_5pnGThread__v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #29 0xfe21b708 in __1cMthread_entry6FpnKJavaThread_pnGThread__v_ ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #30 0xfe216208 in __1cKJavaThreadDrun6M_v_ ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #31 0xfe213ed0 in _start ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so

    (gdb) thr

    [Current thread is 1 (LWP    14        )]

    (gdb) info thr
      16 LWP    13          0xff29d194 in _poll () from /usr/lib/libc.so.1
      15 LWP    12          0xff29f008 in _lwp_sema_wait () from /usr/lib/libc.so.1
      14 LWP    11          0xff29f008 in _lwp_sema_wait () from /usr/lib/libc.so.1
      13 LWP    10          0xff29bc2c in _so_accept () from /usr/lib/libc.so.1
      12 LWP    9          0xff29bc2c in _so_accept () from /usr/lib/libc.so.1
      11 LWP    8          0xff29d194 in _poll () from /usr/lib/libc.so.1
      10 LWP    7          0xff29d194 in _poll () from /usr/lib/libc.so.1
      9 LWP    6          0xff29f008 in _lwp_sema_wait () from /usr/lib/libc.so.1
      8 LWP    5          0xff29f008 in _lwp_sema_wait () from /usr/lib/libc.so.1
      7 LWP    4          0xff29f008 in _lwp_sema_wait () from /usr/lib/libc.so.1
      6 LWP    3          0xff29d194 in _poll () from /usr/lib/libc.so.1
      5 LWP    2          0xff29e958 in _signotifywait () from /usr/lib/libc.so.1
      4 LWP    1          0xff29d194 in _poll () from /usr/lib/libc.so.1
      3 LWP    16          0xff29c4fc in door_restart () from /usr/lib/libc.so.1
      2 LWP    15          0xff369774 in private___lwp_cond_wait ()
       from /usr/lib/libthread.so.1
    * 1 LWP    14          0xff369764 in __sigprocmask ()
       from /usr/lib/libthread.so.1
    (gdb) thread apply 1 bt

Thread 1 (LWP    14       ):
    #0  0xff369764 in __sigprocmask () from /usr/lib/libthread.so.1
    #1  0xff35e978 in _resetsig () from /usr/lib/libthread.so.1
    #2  0xff35e118 in _sigon () from /usr/lib/libthread.so.1
    #3  0xff361158 in _thrp_kill () from /usr/lib/libthread.so.1
    #4  0xff24b908 in raise () from /usr/lib/libc.so.1
    #5  0xff2358f4 in abort () from /usr/lib/libc.so.1
    #6  0xfe3c6904 in __1cCosFabort6Fl_v_ ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #7  0xfe3c59f8 in __1cCosbBhandle_unexpected_exception6FpnGThread_ipCpv_v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #8  0xfe20a8bc in JVM_handle_solaris_signal ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #9  0xff36b82c in __sighndlr () from /usr/lib/libthread.so.1
    #10 <signal handler called>
    #11 0xe9f90420 in Java_HelloWorld_displayHelloWorld ()
       from /home/usera/wls70/solaris/projectWork/lib/libhello.so    #12 0x90aec in ?? ()
    #13 0x8dc54 in ?? ()
    #14 0x8dc54 in ?? ()
    #15 0x8dc54 in ?? ()
    #16 0x8ddbc in ?? ()
    #17 0x8dde0 in ?? ()
    #18 0x8dc54 in ?? ()
    #19 0x8dc54 in ?? ()
    #20 0x8dde0 in ?? ()
    #21 0x8dc78 in ?? ()
    #22 0x8dc54 in ?? ()
    #23 0x8ddbc in ?? ()
    #24 0x8dc54 in ?? ()
    #25 0xfe5324f0 in __1cMStubRoutinesG_code1_ ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #26 0xfe0cbe9c in __1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #27 0xfe1f6dc4 in __1cJJavaCallsMcall_virtual6FpnJJavaValue_nLKlassHandle_nMsymbolHandle_4pnRJavaCallArguments_pnGThread__v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #28 0xfe1fcd94 in __1cJJavaCallsMcall_virtual6FpnJJavaValue_nGHandle_nLKlassHandle_nMsymbolHandle_5pnGThread__v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #29 0xfe21b708 in __1cMthread_entry6FpnKJavaThread_pnGThread__v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #30 0xfe216208 in __1cKJavaThreadDrun6M_v_ ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #31 0xfe213ed0 in _start ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so

    (gdb) quit


페이지 맨 위

스레드 덤프 수집JVM이 실행될 때 JVM의 스레드 덤프를 대개 5-10초 간격으로 주기적으로 수집할 수 있습니다.  이 정보를 사용하여 재귀적 코드를 찾아 수정할 수 있습니다.  스레드 덤프를 수집하려면 Java 프로세스 ID(PID)에서 다음 과정을 수행해야 합니다.

Unix 유형의 플랫폼:

  1. 크래시가 발생하기 직전에 kill -3을 수행합니다.
  2. kill -3 <jvm-pid>는 java 스레드를 덤프합니다.

Windows 플랫폼:

  1. JVM PID에서 kill -3을 수행합니다. 

  2. JVM이 실행되는 창에서 <Ctrl> <Break> 키를 눌러도 됩니다.

JRockit JVM의 경우:

  1. JRockit JVM의 경우 모든 플랫폼에서 위의 사항을 적용합니다.

이 작업은 루트 java 프로세스에서 수행해야 합니다. 

  1. 프로세스의 트리 구조(부모-자식 ASCII 다이어그램)를 얻으려면 --forest 옵션을 사용합니다. 

예를 들어, 사용자 "usera"가 시작한 프로세스를 찾으려면   ps -lU usera --forest를 실행합니다.

Linux에서 JRockit을 사용하여 스레드 덤프를 얻는 특정 예제는 다음을 참조하십시오. http://e-docs.bea.com/wls/docs70/cluster/trouble.html#602852

페이지 맨 위

JVM을 중지하여 스레드 덤프 가져오기
다음 플래그를 설정하여 코어가 발생하기 직전에 서버의 스레드 덤프를 생성할 수 있습니다.

Sun JVM
이 옵션은 SUN JVM에서 -XX:+ShowMessageBoxOnError입니다. (이 옵션은 SUN 웹 사이트에 공식적으로 설명되어 있지 않습니다.)  JVM 크래시가 발생하면 프로그램은 다음과 같은 메시지를 표시합니다. Do you want to debug the problem?  이 때 JVM의 스레드 덤프를 가져올 수 있습니다. 

JRockit JVM
jRockit에서 이에 해당하는 옵션은 8.1 SP2 버전에 포함된 버전부터 사용할 수 있도록 지원될 예정입니다.  JRockit의 옵션은   -Djrockit.waitonerror입니다.

페이지 맨 위

재귀적 JSP 오류 페이지 및 태그
어떤 경우에는 다음과 같은 JSP의 재귀적 호출 문제로 인해 발생하기도 합니다.

JSP 오류 페이지:

  1. jsp_error 페이지에서 <%@ page errorPage="jsp_error"%> 태그가 있는지 확인하십시오. 이 태그로 인해 무한정 재귀가 발생할 수 있습니다. 

  2. 이 태그를 제거하고 발생 가능성이 있는 모든 예외의 스택 트레이스를 출력하십시오.

이러한 방법으로 오류 페이지에서 발생하는 문제를 찾을 수 있습니다. 

  1. 이 문제가 해결된 다음 이 페이지로 보내진 원래의 오류를 확인할 수 있습니다.


JSP 태그:

  1. 이 태그를 검사하여 잘못된 jsp/servlet login/auth/error 보고 코드가 있는지 판별합니다. 

  2. 이 코드에 문제가 있는 경우 해당 코드를 수정하면 재귀 및 크래시 문제를 해결할 수 있습니다.


WebLogic JSP Form Validation 태그:

  1. WebLogic JSP Form Validation 태그를 사용하는 경우 StackOverFlow 예외를 유발하는 무한 루프가 발생할 수 있으므로 <wl:form> 태그에 동일한 페이지를 action 속성을 설정하지 않아야 합니다. 

페이지 맨 위

스택 크기 조정
또 다른 해결 방법은 JVM에 -Xss 인수를 사용하여 스레드 스택의 크기를 늘리는 것입니다.  그러나 이 방법은 재귀적 호출인 경우에는 도움이 되지 않으며 문제 해결을 지연시킬 뿐입니다.  각 Java 스레드는 두 개의 스택, 즉 Java 코드용 스택과 C 코드용 스택을 가지고 있습니다. 이 옵션은 스레드에서 C 코드가 사용할 수 있는 최대 스택 크기를 지정된 값으로 설정합니다.  -Xss 플래그의 자세한 사용 방법은 다음 페이지의 Non-Standard Options 항목을 참조하십시오. http://java.sun.com/j2se/1.3/docs/tooldocs/solaris/java.html

페이지 맨 위

알려진 Sun 관련 문제점
java.util 패키지에서 getProperty를 호출할 때 StackOverFlow 문제가 발생할 수 있습니다.  java.util.Properties.getProperty(Properties.java:475)에서 java.lang.StackOverflowError를 일으키는 재귀적 호출이 발견되었습니다.  이 문제는 모든 플랫폼의 버전 1.3.1 또는 1.4.1 JDK에서 발생합니다.  이것은 Properties()의 클래스 생성자를 사용하는 JDK의 문제입니다.  Sun, #4906193에 다음과 같은 버그 리포트가 기록되어 있습니다. 

코드에서 다음 명령을 사용하지 마십시오.

Properties p = new Properties(System.getProperties());

대신 다음 명령을 사용하십시오.

Properties p = new Properties();
p = System.getProperties();

이렇게 하면 재귀적 호출 스택 트레이스를 방지할 수 있습니다. 


이 문제는 일부 웹 응용 프로그램(응용 프로그램의 로그인 부분)에서 일정 기간 동안 발생했으며 트레이스가 쉽지 않았습니다.  다음은 잘못된 코드에 대한 주석이 포함된 예제 코드입니다.  다음의 간단한 프로그램에서 문제의 행에서 리마크를 제거하고 아래 두 행을 리마크로 막으면(로직은 동일) 재귀적 스택 트레이스가 나타납니다.

import java.util.Properties;

public class stacktest {

public static void main(String args[]) {

    int max = 500000;  // or some other large number depending on the stack size

    for ( int i = 0; i < max; i++ ) {
      //Properties p = new Properties(System.getProperties());
      // un-comment the line above and comment the following two lines
      // out to see the recursive stacktrace
      // containing "java.util.Properties.getProperty(Properties.java:475)"
      Properties p = new Properties();
      p = System.getProperties();

      p.put("blah", "blah");
      System.setProperties(p);
    }
    System.out.println("Went through "+max+" iterations, now get a property");
    String s = System.getProperty("some property other than blah");
  }

}

페이지 맨 위 

추가 도움말이 필요하십니까?

패턴대로 작업했지만 추가 도움말이 필요한 경우 다음과 같이 할 수 있습니다.

  1. http://support.bea.com/의 AskBEA에서 "StackOverFlow error"로 문제를 조회하여 게시된 다른 해결 방법을 찾아봅니다.
  2. http://newsgroups.bea.com/ 사이트에서 BEA 뉴스그룹에 보다 자세한 내용을 질문합니다.

이렇게 해도 문제를 해결할 수 없는 경우 유효한 유지보수 계약이 되어 있다면 http://support.bea.com/에 로그인하여 Support Case를 신청할 수 있습니다.


고객 의견

이 지원 진단 패턴 "복구할 수 없는 StackOverFlow"가 도움이 되셨습니까? 여러분에게 꼭 필요한 정보나 지원 진단 패턴에 새로 추가하길 바라는 항목이 있으면 저희에게 알려주시기 바랍니다.


책임의 한계에 대한 고지:

BEA Systems, Inc.는 사용자와 BEA 간의 유지 보수 및 지원 계약 내용에 따라 이 웹 사이트에 기술 팁과 패치를 제공합니다. BEA에서 허가한 소프트웨어와 함께 이 정보 및 코드를 사용할 수 있지만 BEA는 기술 팁 및 패치와 관련하여 어떠한 명시적이거나 암시적인 보증도 하지 않습니다.

이 문서에 참조된 상표는 해당 소유자의 자산입니다. 자세한 상표 정보에 대해서는 제품 설명서를 참조하십시오.

Posted by 1010
반응형
XML 문서의 기본 구조

<?xml version="1.0" encoding="EUC-KR"?>

 

루트 엘리먼트로써 문서내에서 유일해야 하며, 나머지 구성요소는 루트 엘리먼트내에 위치해야 합니다.

<root></root>


루트 엘리먼트 자식 수준의 데이터를 xml문서라고 합니다.
        <name>홍길동</name>
        <age>30</age>
        <address>서울시 영등포구</address>

 


XML문서의 종료
    1. Well-Formed XML Document : XML 1.0 문법 준수
    2. Valid XML Document : DTD, Schema 문법 준수


 

인코딩
     1. ASCII : 7bit
     2. ISO Latin-1 : 8bit, 서유럽 문자코드 포함
     3. KS C5601 : 한국 공업표준, 2바이트 사용 -> 완성형 한글 표현
     4. EUC-KR : 영어(KS C5636) + 한글(KC C5601)
     5. Unicode
         1) UTF-8 : ASCII 문자(1바이트), 다른 문자(2바이트 이상), 한글 3바이트
         2) UTF-16 : 모든 문자 2바이트

 


엘리먼트 (Element)
   1. 시작태그와 끝태그는 항상 쌍을 이룹니다.
   2. 단독(빈)태그는 끝에 "/" 를 표시합니다.
   3. "<" 는 태그명으로 사용 불가능 합니다.
   4. "<" 와 ">" 사이에 공백사용이 불가능 합니다.
   5. 태그 중첩 사용이 불가능 합니다.
   6. 태그는 모든 문자로 시작 가능하지만, 숫자나 "." 사용 불가능 합니다.
   7. ":" 는 태그명으로 사용을 자제하는게 좋습니다.
   8. 대소문자를 구별합니다.

 


엘리먼트 (Element) 종류
   1. 내용을 가지는 Element (시작태그&끝태그)
       - <title>제목</title>
       - <head>
             <meta />
      </head>

   2. 내용을 가지지 않는 Element (시작태그) : 단독태그, 빈태그
       - <br />
       - <img />

   

 

엘리먼트 (Element)의 내용으로 올 수 있는 종류
    1. 문자 데이터
    2. 자식 엘리먼트
    3. 엔티티 & 문자참조 : <name>&nbsp;</name>

        ※ 문자 데이터와 엔티티는 전혀 틀리며, 이 때 name은 엔티티를 가진다고 합니다.
    4. CDATA Section : 해석되지 말아야 하는 데이터 집합으로 이 안에 태그등이 와도 태그로 인식하지 않습니다.
    5. 주석
    6. 공백 문자열 : 일반 문자 데이터와 틀립니다. (스페이스, 탭, 엔터 등)

 


속성 (Attribute)
   - 시작 엘리먼트에 포함되어야 합니다.
   - 속성명="속성값" or 속성명='속성값',
속성값은 " 나 ' 로 감싸줘야 합니다.
   - 속성명 명명법 : 엘리먼트명과 동일합니다

Posted by 1010
반응형

지각조퇴결석사유서.xml 문서 만들기

<?xml version="1.0" encoding="EUC-KR"?>
<?xml-stylesheet type="text/xsl" href="지각조퇴결석사유서.xsl"?>
<지각조퇴결석사유서>

 <과정>ASP.NET</과정>

 <기간>30일 완성</기간>
 <사유정보 번호="1">
  <성명>홍길동</성명>
  <주민번호>111111-1111111</주민번호>
  <구분 종류="지각"/>
  <날짜>2006.03.11</날짜>
  <사유>감기몸살로 -_-;;</사유>
 </사유정보>
 <사유정보 번호="2">
  <성명>아무게</성명>
  <주민번호>222222-2222222</주민번호 >
  <구분 종류="결석"/>
  <날짜>2006.04.15</날짜>
  <사유>
   <![CDATA[
   <strong>2007-06-28 12:30, coex megabox</strong><BR>
<BR>트렌스포머를 보러갔다.<BR>
<BR>처음부터 많은 기대를 하고 있었고 개방일만을 눈빠지게 기다리고 있던터라<BR>
<BR>개봉을 하자마자 달려가서 보았다.<BR>
<BR>아무튼 진부한 스토리라도 비주얼에 너무 정신을 빼앗기다 보니<BR>
<BR>스토리가 부실해도 상당히 재미있었다.<BR>
<BR>가장 기억에 남는 대사는 샘의 해피타임정도?<BR>]]>
  </사유>
 </사유정보>
 <사유정보 번호="3">
  <성명>테스트</성명>
  <주민번호>111111-1111111</주민번호>
  <구분 종류="지각"/>
  <날짜>2006.05.24</날짜>
  <사유>개인 사정</사유>
 </사유정보>
</지각조퇴결석사유서>


지각조퇴결석사유서.html 파일 만들기

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
  <script language="javascript">
   var xmlDoc;
   function startXml()
   {
    xmlDoc=new ActiveXObject("microsoft.XMLDOM");    
    xmlDoc.async=false;    
    xmlDoc.load("지각조퇴결석사유서.xml");
    document.getElementById("txtOutput").value=xmlDoc.xml;
   }
   
   function XmlInfo()
   {
    var result="";
    //루트 엘리먼트
    result += "Root Element : " + xmlDoc.documentElement.nodeName+"\n\n";
    //루트 엘리먼트의 첫번째 자식 엘리먼트
    result+="첫번째 자식 : "+xmlDoc.documentElement.firstChild.nodeName+"\n\n";
    //루트 엘리먼트의 마지막 자식 엘리먼트
    result+="마지막 자식 : "+xmlDoc.documentElement.lastChild.nodeName+"\n\n";
    //루트 엘리먼트의 두번째 자식 엘리먼트 (첫번째 방식)
    result+="두번째 자식 : "+xmlDoc.documentElement.childNodes.item(1).nodeName+"\n\n";
    //루트 엘리먼트의 두번째 자식 엘리먼트 (두번째 방식)
    result+="두번째 자식 : "+xmlDoc.selectNodes("//기간").item(0).nodeName+"\n\n";
    //사유정보 3번째의 이름 (첫번째 방식)
    result+="3번째 이름 : "+xmlDoc.documentElement.lastChild.firstChild.text+"\n\n";
    //사유정보 3번째의 이름 (두번째 방식)
    result+="3번째 이름 : "+xmlDoc.documentElement.childNodes(4).firstChild.text+"\n\n";
    //사유정보 3번째의 이름 (세번째 방식)
    result+="3번째 이름 : "+xmlDoc.selectNodes("//사유정보").item(2).firstChild.text+"\n\n";
    //사유 갯수
    result+="사유 갯수 : "+xmlDoc.selectNodes("//사유정보[구분 and @번호]").length+"개\n\n";
    //지각 갯수
    result+="사유 갯수 : "+xmlDoc.selectNodes("//구분[@종류='지각']").length+"개\n\n";
    //속성접근
    result+="2번째 종류 : "+xmlDoc.selectNodes("//사유정보").item(1).childNodes(2).attributes(0).value+"\n\n";

    alert(result);
   }  
  </script>
 </head>
 <body onload="startXml();">
  <h3>지각조퇴결석 사유서</h3>
  <textarea cols="120" rows="15" id="txtOutput"></textarea>
  <p></p>
  <button onclick="XmlInfo()" ID="Button1">XML 정보 보기</button>
 </body>
</html>

Posted by 1010
반응형

createElement.html 파일 만들기

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>
  <title></title>
  <script language="javascript">
   function Add()
   {
    var table1=document.getElementById("table1");
    var tr=document.createElement("tr");
    var td1=document.createElement("td");
    td1.innerText=document.all.txtName.value;
    var td2=document.createElement("td");
    td2.innerText=document.all.txtAddress.value;
   
    tr.appendChild(td1);
    tr.appendChild(td2);
    alert(table1.innerHTML);//테이블의 시작과 끝까지의 모든것.
    if(table1.firstChild.lastChild.childNodes.length==1)
    table1.firstChild.removeChild(table1.firstChild.lastChild);
    table1.firstChild.appendChild(tr);
   }
  </script>
 </head>
 <body>
  <h3>주소록</h3>
  <table border="1" width="300" id="table1">
   <tr>
    <th>이름</th>
    <th>주소</th>
   </tr>
   <tr>
    <td align="center" colspan="2">등록된 회원이 없습니다.</td>
   </tr>
  </table>
  <br />
  이름 : <input type="text" size="10" name="txtName" />
  주소 : <input type="text" size="10" name="txtAddress" />
  &nbsp;<button onclick="Add()">추가하기</button>
 </body>
</html>

Posted by 1010
반응형

cd.xml 파일 만들기

<?xml version="1.0" encoding="EUC-KR"?>
<compactdiscs>
 <compactdisc>
  <artist type="individual">OST</artist>
  <title numberoftracks="3">연애시대 OST</title>
  <tracks>
   <track>1. 첫번째 노래</track>
   <track>2. 두번째 노래</track>
   <track>3. 세번째 노래</track>
  </tracks>
  <price>9000</price>
 </compactdisc>
 <compactdisc>
  <artist type="band">코요테</artist>
  <title numberoftracks="5">코요테5집</title>
  <tracks>
   <track>1. 첫번째 노래</track>
   <track>2. 두번째 노래</track>
   <track>3. 세번째 노래</track>
   <track>4. 네번째 노래</track>
   <track>5. 다섯번째 노래</track>
  </tracks>
  <price>8000</price>
 </compactdisc>
 <compactdisc>
  <artist type="band">SeeYa</artist>
  <title numberoftracks="4">SeeYa2집</title>
  <tracks>
   <track>1. 첫번째 노래</track>
   <track>2. 두번째 노래</track>
   <track>3. 세번째 노래</track>
   <track>4. 네번째 노래</track>
  </tracks>
  <price>8500</price>
 </compactdisc>
</compactdiscs>


cdList.html 파일 만들기

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>  
  <title></title>
  <script language="javascript">
  function XmlInfo()
  {
   //XML로드
   var xmlDoc=new ActiveXObject("microsoft.XMLDOM");
   xmlDoc.async=false;
   xmlDoc.load("cd.xml");
   
   //원본 출력
   document.all.txtOut.value=xmlDoc.xml;
   
   //결과 출력(테이블)
   var result="";
   result+="<h3>CD List</h3>";
   result+="<table border='1'><tr><th>artist</th><th>title</th><th>tracks</th><th>price</th></tr>";
   
   //최상위 루트엘리먼트
   var root=xmlDoc.documentElement;
   
   for(i=0; i<root.childNodes.length; i++)
   {
    //artist
    result+="<tr><td>";
    result+=root.childNodes(i).childNodes(0).text+"<br/>";
    result+="("+root.childNodes(i).firstChild.attributes(0).value+")</td>";
   
    //title
    result+="<td>";
    result+=root.childNodes(i).childNodes(1).text+"<br/>";
    result+="("+root.childNodes(i).childNodes(1).attributes(0).value+")</td>";
   
    //tracks
    result+="<td>";
    var tracks=root.childNodes(i).childNodes(2);
    for(j=0; j<tracks.childNodes.length; j++)
    {
     result+=tracks.childNodes(j).text+"<br/>";//track    
    }
    result+="</td>";
   
    //price
    result+="<td>";
    result+=root.childNodes(i).lastChild.text;
    result+="</td>";
    result+="</tr>";
   }
   result+="</table>";
   iFrameDoc.document.write(result)
  }
  </script>
 </head>
 <body>
  <h3>CD.xml</h3>
  <textarea cols="80" rows="15" name="txtOut"></textarea>
  <p></p>
  <button onclick="XmlInfo()">DOM 표현 확인</button>
  <p></p>
  <iframe id="iFrameDoc" width="600" height="350"></iframe>

 </body>
</html>

Posted by 1010
반응형

imgDOM.html파일 만들기

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>
  <title></title>
  <script language="javascript">
   var num=1;
   var index=1;
     
   function Init()
   {
    document.onmousedown=Create;
    document.oncontextmenu=function(){return false;}
   }
   
   function Create()
   {
    if(event.button==1)
    {
     /*
     //1. CSS 이용
     document.getElementById("layer1").style.left=event.x - 25;
     document.getElementById("layer1").style.top=event.y - 25;
     document.getElementById("layer1").style.display="block";
     */

     
     //2. DOM 이미지 동적 생성 및 Body 추가
     var img=document.createElement("img");
     img.setAttribute("src","images/img"+num+".gif");//(속성명, 속성값)
     num++;
     if(num>7)num=1;
     img.style.position="absolute";
     img.style.left=event.x - 25;
     img.style.top=event.y - 25;
     document.body.appendChild(img);
    }
    else if(event.button==2)
    {
     if(document.body.childNodes.length>2)
      document.body.removeChild(event.srcElement);      
    }
    else if(event.button==4)
    {
     event.srcElement.style.zIndex=index;
     index++;
    }
   }

  </script>

 </head>
 <body onload="Init();">
  <div id="layer1" style="display:none;"><img src="images/img1.gif" /></div>
 </body>
</html>

Posted by 1010
반응형

createXML.html 파일 만들기

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>
  <title></title>
  <script language="javascript">
   function XMLCreate()
   {
    var xmlDoc=new ActiveXObject("microsoft.XMLDOM");
   
    //1. 선언문 <?xml version='1.0' encoding='euc-kr'?>
    var PInode=xmlDoc.createProcessingInstruction("xml", "version='1.0' encoding='euc-kr'");
   
    //2. 루트엘리먼트 <compactdiscs></compactdiscs>
    var rootNode=xmlDoc.createElement("compactdiscs");
   
    //3. 엘리먼트
    var compactdiscNode=xmlDoc.createElement("compactdisc");
    var titleNode=xmlDoc.createElement("title");
    var priceNode=xmlDoc.createElement("price");
   
    //4. 텍스트 노드
    var titleTextNode=xmlDoc.createTextNode("연애시대OST");
   
    var priceTextNode=xmlDoc.createTextNode("8000");
   
    //5. 구조화(트리구조)
    xmlDoc.appendChild(PInode);
    xmlDoc.appendChild(rootNode);
   
    rootNode.appendChild(compactdiscNode);
   
    compactdiscNode.appendChild(titleNode);
    compactdiscNode.appendChild(priceNode);
   
    titleNode.appendChild(titleTextNode);
    priceNode.appendChild(priceTextNode);
   
    //속성
    titleNode.setAttribute("numberoftracks", "3");
   
    //출력
    document.all.txtResult.value=xmlDoc.xml;
   
   }
  </script>
 </head>
 <body>
  <h3>XML 만들기</h3>
  <button onclick="XMLCreate()">만들기</button>
  <br/>
  <textarea cols="80" rows="20" name="txtResult"></textarea>
 </body>
</html>


Posted by 1010
반응형
2006/12/19 02:37
<!doctype html public "-//w3c//dtd xhtml 1.0 strict//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
<html>
<head>
<title> javascript와 xml을 이용한 트리만들기 </title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<script language="javascript">
<!--
   var XMLConst =
   {
       ELEMENT_NODE                    :1,
       ATTRIBUTE_NODE                    :2,
       TEXT_NODE                        :3,
       CDATA_SECTION_NODE                :4,
       ENTITY_REFERENCE_NODE            :5,
       ENTITY_NODE                        :6,
       PROCESSING_INSTRUCTION_NODE        :7,
       COMMENT_NODE                    :8,
       DOCUMENT_NODE                    :9,
       DOCUMENT_TYPE_NODE                :10,
       DOCUMENT_FRAGMENT_NODE            :11,
       NOTATION_NODE                    :12
   }
   var favoriteGen =
   {
       xmlDoc            : null,
       Tree    : null,

       importXML     : function()
       {
           
           if (document.implementation && document.implementation.createDocument)
           {
               xmlDoc = document.implementation.createDocument("", "", null);
               xmlDoc.onload = favoriteGen.generateXML;
           }
           else if (window.ActiveXObject)
           {
               xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
               xmlDoc.onreadystatechange = function () {
                   if (xmlDoc.readyState == 4) favoriteGen.generateXML()
               };
           }
           else
           {
               alert('브라우저가 스크립트를 지원하지 않습니다.');
           }
           
           xmlDoc.load("tree.xml");        
       },
       generateXML : function()
       {
           if(xmlDoc != null)
           {
               if(xmlDoc.hasChildNodes())
               {
                   var xChildNodes = "";
                   
                   // 이크.. 참.. 별게 다 틀리네.
                   if(document.all)
                       xChildNodes = xmlDoc.childNodes[1].childNodes;
                   else
                       xChildNodes = xmlDoc.childNodes[0].childNodes;

                   for(var i=0 ; i < xChildNodes.length ; i++)
                   {
                       var node = xChildNodes[i];
                       
                       if(node.nodeType == XMLConst.ELEMENT_NODE)
                       {
                           var title = getAttribute(node,"title");
                           
                           if(node.nodeName == "folder")
                           {
                               // recursive
                               var folderNode = getFolder("true",title);
                               favoriteGen.Tree.appendChild(folderNode);

                               favoriteGen.generateXML_R(node,folderNode);
                           }
                           else
                           {
                               var url = getAttribute(node,"url");
                               var docNode = getDoc(title,url);
                               favoriteGen.Tree.appendChild(docNode);
                           }
                       }
                   }
               }
           }
       },
       generateXML_R : function(pNode,pAppendNode)
       {
           if(pNode.hasChildNodes())
           {
               var xChildNodes = pNode.childNodes;

               for(var i=0 ; i < xChildNodes.length ; i++)
               {
                   var node = xChildNodes[i];
                   
                   if(node.nodeType == XMLConst.ELEMENT_NODE)
                   {
                       var title = getAttribute(node,"title");
                       
                       if(node.nodeName == "folder")
                       {
                           // recursive
                           var folderNode = getFolder("true",title);
                           pAppendNode.appendChild(folderNode);

                           favoriteGen.generateXML_R(node,folderNode);
                       }
                       else
                       {
                           var url = getAttribute(node,"url");
                           var docNode = getDoc(title,url);
                           pAppendNode.appendChild(docNode);
                       }
                   }
               }
           }
       }
   };
   function getFolder(pIsOpen,pText)
   {
       var div                 = document.createElement("div");
       
       var isOpenAtt            = document.createAttribute("isOpen");
       isOpenAtt.value            = "true";
       
       var classNameAtt        = document.createAttribute("class");
       classNameAtt.value        = "folder_node_visible";

       div.setAttributeNode(isOpenAtt);
       div.setAttributeNode(classNameAtt);
       
       /* IE 이상하네... attribute 등록으로 onClick event가 안먹네 */
       var spanHTML            = "<span class=\"folder_open\" onClick=\"setOpen(this);\">[폴더]" + pText + "</span>";
       
       div.innerHTML = spanHTML;

       return div;
   }
   function getDoc(pText,pUrl)
   {
       var div                 = document.createElement("div");
       
       var classNameAtt        = document.createAttribute("class");
       classNameAtt.value        = "doc_node_visible";
       
       div.setAttributeNode(classNameAtt);
       div.innerHTML            = "[문서]<a href=\"" + pUrl + "\">" + pText + "</a>";
       
       return div;
   }
   function setOpen(pObj)
   {
       var folderNode = pObj.parentNode;
       var isOpen = getAttribute(folderNode,"isOpen");
       
       if(folderNode.hasChildNodes())
       {
           var xChildNodes = folderNode.childNodes;

           for(var i=0 ; i < xChildNodes.length ; i++)
           {
               var node = xChildNodes[i];
               
               if(node.nodeType == XMLConst.ELEMENT_NODE)
               {
                   if(node.nodeName == "DIV")
                   {
                       var className = getAttribute(node,"class");
                       if(isOpen == "true")
                       {
                           if(className.substr(0,3) == "doc")
                               setAttribute(node,"class","doc_node_hidden");
                           else
                               setAttribute(node,"class","folder_node_hidden");
                       }
                       else
                       {
                           if(className.substr(0,3) == "doc")
                               setAttribute(node,"class","doc_node_visible");
                           else
                               setAttribute(node,"class","folder_node_visible");
                       }
                   }
               }
           }
       }
       setAttribute(pObj,"class",(isOpen=="true" ? "folder_closed" : "folder_open"));
       setAttribute(folderNode,"isOpen",(isOpen=="true" ? "false" : "true"));
   }

   function getAttribute(pNode,pAttributeName)
   {
       var attributes = pNode.attributes;

       var attNode = attributes.getNamedItem(pAttributeName);

       return attNode != null ? attNode.nodeValue: null;
   }
   function setAttribute(pNode,pAttributeName,pValue)
   {
       var attributes = pNode.attributes;

       var attNode = attributes.getNamedItem(pAttributeName);

       if(attNode != null)
           attNode.value = pValue;
   }

//-->
</script>
<style type="text/css" media="all">
.folder_node_visible
{
   margin-top:3px;
   margin-left:20px;
   display:block;
   font-size:12px;
}
.doc_node_visible
{
   margin-top:3px;
   margin-left:20px;
   padding:2px 2px 2px 20px;
   /*background:url("/image/doc.gif") no-repeat;*/
   cursor:pointer;
   display:block;
   font-size:12px;
}
.folder_node_hidden
{
   margin-left:20px;
   display:none;
   font-size:12px;
}
.doc_node_hidden
{
   margin-left:20px;
   padding:2px 2px 2px 20px;
   /*background:url("/image/doc.gif") no-repeat;*/
   cursor:pointer;
   display:none;
   font-size:12px;
}
.folder_closed
{
   padding:2px 2px 2px 20px;
   /*background:url("/image/closed.gif") no-repeat;*/
   cursor:pointer;
   display:block;
   font-size:12px;
}
.folder_open
{
   padding:2px 2px 2px 20px;
   /*background:url("/image/open.gif") no-repeat;*/
   cursor:pointer;
   display:block;
   font-size:12px;
}
</style>
</HEAD>

<BODY>
   <div id="treeView" name="treeView"></div>
   <script language="javascript">
       favoriteGen.Tree = document.getElementById("treeView");
       favoriteGen.importXML();
   </script>
</BODY>
</HTML>


tree.xml

<?xml version="1.0" encoding="utf-8" ?>
<tree>
   <folder title="포탈">
       <doc url="http://www.daum.net" title="다음"/>
       <doc url="http://www.naver.com" title="네이버"/>
       <doc url="http://yahoo.co.kr" title="야후"/>
       <doc url="http://empas.com" title="엠파스"/>
       <folder title="검색">
           <doc url="http://www.google.co.kr" title="구글"/>
       </folder>
   </folder>
   <doc url="http://mar.gar.in" title="마가린"/>
   <doc url="http://blog.mar.gar.in" title="마가린 블로그"/>
   <doc url="http://sodumarvin.tistory.com" title="소두마빈 블로그"/>
</tree>



출처 : http://sodumarvin.tistory.com/5
Posted by 1010
반응형

새롭게 출시된 휴대형 지도프로그램을 이용하면 샌프란시스코에서 금요일 저녁에 어디로 나가야 할지 정하기가 쉬워진다. 센스네트워크(Sense Networks)사의 시티센스(Citysense) 라는 제품은 현재 도시가 얼마나 바쁜지 알려주며 어디가 가장 바쁜지 위치정보를 제공한다. 가입할 필요도 없이 사용자는 블랙베리폰*에 본 프로그램을 다운로드 하고 나면 넓은 지역에 걸쳐서 바쁘게 돌아가고 있는 도시의 지도를 한눈에 볼 수 있게 된다. 또 구글과 같은 사이트와 연결을 하여 많은 사람들이 밀집해 있는 곳의 장소에 대한 정보도 찾아볼 수 있다. 지난 수년 동안 수집해온 GPS정보와 무선 위치정보 데이터를 이용하여 센스네트워크사의 기술에 대한 기반을 세울 수 있었다. 이번에는 유흥문화에 대한 편의를 위한 기기이지만 다음 버전에서는 어디서 사람들이 밀집해 있는지에 대한 정보뿐만 아니라 어디서 사람들이 모여 즐기기를 선호하는지에 대한 정보까지 제공할 것이다. 그렇게 되면 고객은 자신들과 비슷한 취향을 가진 사람들이 주로 어디에 있는지를 고객의 과거 기록을 이용하여 찾아줄 것이다. 결과적으로 대부분의 사람들은 각자의 기기에 모두 다르게 생긴 지도를 하나씩 가지게 될 것이다.

* 블랙베리폰 : 미국 스마트폰 시장의 41%를 차지하는 블랙베리는 개인휴대정보단말기(PDA)와 휴대폰의 기능을 결합한 단말기로 강력한 인터넷 접속과 이메일 기능으로 블랙베리 증후군까지 나올 정도로 인터넷 접속이 강력한 스마트 폰이다. 전 세계 135개국에서 사용되는 블랙베리의 사용층은 현재 1400만명을 넘는다고 한다.

홈페이지: www.citysense.com
연락처: contact@citysense.com
자료출처 : Springwise.com

 

Posted by 1010
반응형

놀이터에서 수다 떠는 대신에 커뮤니티에서 활동

일상적인 가정생활에서 웹 2.0이 지닌 역할은 점점 더 확대된다. 무엇보다도 다른 사용자들과의 교류에 대한 요구가 강하다. 점점 더 많은 어머니들이 평가를 할 수 있는 게시판을 정기적으로 이용하여 자신들의 경험과 의견을 다른 어머니들과 온라인상에서 공유하게 된다. 이러한 성장으로 인하여 지속적으로 새로운 플랫폼(서버) 생겨나고 있으며 흥미로운 홍보공간도 형성되고 있다.

넷맘스(Netmons)는 독일어로 된 최초의 어머니 커뮤니티로서 현재 급속하게 성장하고 있다. 첫 6개월 동안에 20만 명 넘는 회원들이 가입했다. 이 프로젝트는 가상의 세계 뿐만 아니라, 현실 세계에서도 작동하고 있다. 그리하여 가령 많은 대도시에는 대규모의 넷맘스 모임들이 있는데 이들은 가족 단위로 소풍을 함께 가고, 유아 모임을 갖거나 어린이 축제를 개최하기도 한다.

매밀리(Mamily)는 아직 초기단계에 머물러있다. 이곳에서는 임신, 출산, 영향섭취, 사춘기, 그리고 인간관계와 관련된 주제에 대해서 자극을 받거나 조언을 구할 수 있다.

미국 내에서는 마이스페이스-매너(Myspace-Manner)에서 어미니 네트워크의 수가 지속적으로 증가하고 있다. 맘-정크션(Mom-Junction) 포털은 카페맘(Cafe-Mom), 목시맘(Moxie-Mom), 그리고 더 맘스 버즈(The Moms Buzz)와 함께 어머니들을 위한 가장 성공적인 커뮤니티에 속한다. 이들 포털이 탄생한지 1년 밖에 되지 않았다. 현재 광고제휴를 맺은 파트너로는 야후나 온라인 사진인화업체인 셔터플라이(Schutterfly) 등이 있다.

홈페이지: www.netmoms.de
(기타: www.mamily.de, www.momjunction.com, www.cafemom.com, www.moxie-moms.com)
자료출처 : Die Geschäftsidee

 



Posted by 1010
반응형
아주 간단한 모임자리라도 계획을 해 본 사람이면 그게 그렇게 쉽지 않다는 것을 알 것이다. 여기 전화를 돌려야 하고 장소를 물색해야 하고 예약을 하고 스케줄 조정을 해야 하기 때문이다. 이번해 6월에 문을 연 센터드(Center'd)에서는 모든 일들을 유기적으로 연결해서 장소 물색, 시간 맞추기, 서비스 제공업체 선정, 초대장 보내기, 자원봉사자 관리, 주관 및 연락을 포함한 것들을 행사 규모에 상관없이 쉽게 계획할 수 있도록 도와준다. 신뢰를 이용하는 방법으로서 센터드에서는 모든 사용자들이 실명으로 등록하고 사이트에서 활동할 수 있도록 했다. 센터드에서 프로파일을 볼 수 있는 권한을 부여하긴 하지만 말이다. 기업과 개인 모두 참여할 수 있고 사이트의 자신이 사는 지역 검색, 인맥 쌓기 기능 그리고 상호작용하는 계획 도구를 이용할 수 있다. 센터드의 사용자들은 자신이 사는 곳의 식당을 찾고, 리뷰를 읽을 수 있고 또한 친구들이 그곳을 좋아하는 지 알 수 있고 사이트 내에서 행사를 계획할 수 있다. 센터드에서는 또한 사이트의 평가점수와 리뷰를 합산해서 다른 사람들은 어떻게 생각하는지 쉽고 빠르게 알 수 있도록 한다. 여론조사 도구를 통해 행사가 언제 어디서 열렸으면 좋을지에 대한 사람들의 의견을 수렴할 수 있고 작업 관리 그리고 자원봉사 지원 기능을 통해 누가 무엇을 할지 쉽게 조정할 수 있다. 사용자들은 또한 자신의 지역에서 공공 행사를 검색할 수 있고 이런 행사를 자신의 달력에 추가 표시할 수 있고 달력 공유를 선택하면 친구들이 같은 달력을 볼 수 있게 된다. 마지막으로 사용자들은 이 사이트에서 식당 리뷰 또는 새로운 사용자를 가입하게 할 경우 사이트에서의 활동에 대한 점수를 획득한다. 곧 이런 포인트가 쌓이면 아주 멋진 물건으로 바꿀 수 있다고 센터드에서 말한다. 사이트 이용은 무료다.

물론 행사에 초점을 맞춘 사이트가 이미 있지만 옐프같은 지역 검색 기능, 에비트같은 초대 기능, 그리고 페이스북 같은 인맥 쌓기 기능을 추가함으로써 센터드에서는 차별화를 꾀했다. 이전에 팻도어(FatDoor)라는 것에서 진화한 형태인 이 캘리포니아에 기반을 둔 사이트는 현재 시험 운영 중이다. 따라서 아직은 어떻게 수익을 창출할지 알 수 없다. 하지만 지역 광고와 프리미엄 기능들을 볼 때 믿음직한 아이템인 듯하다. 여러분이 사는 곳에도 시도해 볼만한 아이템이다.

웹사이트 : www.centerd.com
이메일주소 : feedback@centerd.com
자료출처 : Springwise.com

 


Posted by 1010
반응형

당신도 아마도 다음과 같은 문제를 분명히 겪어보았을 것이다. 중요한 여행이 예정되어있는 상황에서 얼마 지나지 않아 이것저것 찾고 계획하느라 분주하게 보낸 경험을 해보았을 것이다. 하지만 온라인 서비스업체인 트립잇(TripIt)은 이 문제를 해결할 수 있는 다른 길이 있다고 외치고 있다. 그들의 임무는 인터넷의 도움으로 여행일정을 단순화시키는 일이다.

2007년 가을 이후로 트립잇은 인터넷에서 온라인 여행계획가로서 서비스를 제공해왔다. 이 업체가 제공하는 상품은 항공권, 호텔, 그리고 렌트카를 예약하는 문제를 온라인으로 해결하려는 고객들을 겨냥하고 있다. 예전에는 수많은 메일을 출력해야만 했던 문제가 존재했었다. 하지만 트립잇은 이제 이러한 문제를 말끔히 해결해준다.

트립잇 서비스를 이용하는 것은 매우 간편하다. 가입 후 사용자는 메일로 받은 예약확인서들을 plans@tripit.com으로 전달한다. 예약확인서를 전달해주는 양이나 그 출처는 여기서 상관이 없다. 몇 분 후에 트립잇은 모든 연관된 예약정보를 요약하여 개인을 위한 여행일정을 돌려보내준다. 뿐만 아니라, 사진, 일기예보, 지도 그리고 도시정보도 여기에 추가된다.
그러면 여행자는 여행일정을 개인적으로 확장시키거나 메모를 해두고, 사진을 고르거나 이러한 정보를 다른 여행 동반자에게 전달해줄 수도 있다. 트립잇은 고객을 위해서 심지어 이벤트와 음식점에서 자리예약까지 맡아서 처리한다.
최근에 들어 트립잇은 여행 중 휴대폰 문자 안내서비스도 제공해준다. 그냥 문자로 “출국”이라고 입력해서 문자를 보내주기만 하면 다시 한번 정확한 시간을 알려준다.

홈페이지 : www.tripit.com
자료출처 : Die Geschaeftsidee(독일어)



Posted by 1010
반응형

점점 더 많은 사람들이 특별한 체험을 해보고 싶어 이를 찾아나선다. 뮌헨 출신의 창립자인 파브리스 슈미트(Fabrice Schmidt)는 독일에서 이 틈새시장을 발견하여 2003년 8월에 마이데이스 유한회사(Mydays GmbH)를 설립하였다. 그는 일종의 이벤트 광장을 창설하였는데 이를 통해 현재까지 30만 명의 꿈을 실현시켜주고 매년 매상에서 기록을 갱신하고 있다.

어떤 창업 아이디어는 해외에서 쇼핑할 때 떠올리게 된다. 2003년 1월에 런던에서 여행하는 도중에 공과대학을 졸업한 파브리스 슈미트(42세)는 우연히 영국의 성공적인 체험제공업체인 레드 레터 데이스(Red Letter days)의 한 상점에 들어서게 됐다. “그곳 가게에서는 최대 300여가지의 스릴이 넘치는 체험을 직접 예약할 수 있었어요. 영국의 전설적인 보비 찰톤(Bobby Charlton)으로부터 축구 훈련 받기부터 엘리자베스(Elisabeth) 여왕과의 특별한 만남까지 온갖 체험이 다 있었지요”라고 하며 슈미트는 아직까지 당시의 감격을 잊지 못하고 있다. 이 영국 회사의 마케팅 담당자와의 대화를 하고서 런던의 관광객으로 온 그에게는 다음과 같은 사실이 분명해졌다. “이런 것은 인터넷 사이트를 이용한다면 독일에서도 가능할 것이다!”

체험제공을 위한 인터넷사이트
당시 그의 거주지이자 근무지였던 프랑크푸르트(Frankfurt am Main)로 귀국하고서 파브리스 슈미트는 뮤지션 마케팅 담당자로서의 일자리를 그만두고 자신의 사업구상을 발전시켜나갔다. 그것은 바로 인터넷 사이트에서 개인고객을 위한 특별한 체험들을 묶어서 이를 매개해주기도 하면서 전문 이벤트주최자들에게도 자신들의 상품을 전세계에 내놓을 수 있는 기회를 제공해주는 일이었다.

첫단계: 수요조사
하지만 프랑크푸르트에 설립한 마이데스 유한회사가 자립해서 운영되기에 앞서 그는 자신의 사업아이디어가 시장에서 지닌 유용성을 시험해보가로 했다. 그리하여 그는 2003년 7월에 프랑크푸르트에 소재한 시장연구소 “인사이트 유럽(insight europe)”에 시장조사를 의뢰하였다. 결과는 다음과 같았다. “독특한 선물 아이디어와 연계시켜 소망하는 체험을 실현시켜주는 일에 대해서 조사대상자들 사이에서 매우 긍정적인 반응이 나왔습니다.”라고 설립자는 말한다.
슈미트에 의하면 전적으로 자신의 사비로 충당한 초기비용은 대략 100,000 유로였다고 한다. 이중에서 그는 유한회사를 위해 출자총액으로 25,000 유로를 지불했다. 그리고 인터넷 포털인 www.mydays.de의 제작과 프로그래밍을 위해 20,000 유로를 투자했다. 또 그만큼의 액수를 체험광고 모집인 2명의 초봉으로 지출했다. “저희들은 흥미로운 체험이 담긴 가능한 한 큰 규모의 포트폴리오를 최대한 빠른 시일 내에 제작하려고 했거든요”라고 하며 슈미트는 이와 같은 투자 이유를 밝힌다.
그리고 전단지 인쇄 등 초기마케팅전략과 광고에이전트를 위한 보수 지급으로 인해 15,000 유로가 들었다. 나머지 15,000 유로는 프랑크푸르트의 보른하임(Bornheim)에 40 평방미터에 이르는 자신의 첫번째 사무실을 차리는데 투자했다.

초반부터 긍정적인 반응
회사를 설립하자마자 파브리스 슈미트는 자신의 체험장을 널리 홍보하기 위해서 적절한 협력파트너를 물색하였다. 이 과정에서 그는 AOL, 티-온라인(T-Online), 라이코스(Lycos)와 같은 주로 거대인터넷포털업체들과 연락을 취했다. “반응은 초반부터 매우 긍정적이었어요”라고 하며 그는 설립과정의 첫단계를 회상한다. 예를 들어 엔터테이먼트 포털인 빌트(Bild.de)가 슈미트의 체험포털에 링크를 걸어주기까지 불과 몇 주밖에 걸리지 않았다. 이어서 AOL과 라이코스와의 링크교환도 이루어졌다.
더 나아가 그는 구글 앳 워드스(Google@words)에도 광고를 띄웠다. 슈미트에 의하면 이것은 이미 이익을 가져다주는 단계에 이르렀다고 한다. 누군가가 구글에서 선물해줄 만한 특정한 것을 찾는 과정에서 검색엔진에 ‘선물’이라는 검색어를 입력할 경우 “곧바로 저희 회사의 광고가 화면 우측 가장자리에 나타나게 됩니다”라고 그는 설명한다.
이와 병행하여 마이데이스 직원 2명은 독특한 체험이벤트를 진행해줄 주최자를 모집했다. “처음에는 많은 사람들이 회의적이었어요. 이는 무엇보다도 독일에 이와 같은 종류의 마케팅업체가 당시까지만 해도 아직 존재한 적이 없었기 때문이었지요”라고 설립자는 말한다. 그럼에도 불구하고 그는 그의 팀과 함께 2003년 성탄절까지 50여명이 넘는 체험장을 위한 이벤트주최자를 모집하는데 성공했다. “많은 주최자들이 마이데이스를 통한 시장의 거대한 확장에 대해서 기대를 걸었던 것이 결정적인 이유였지요”라고 슈미트는 해명한다. 대부분의 이벤트주최자들은 행사를 당시까지만 해도 오직 지역적으로 국한시켜서 진행해왔었다.

4년 후에 직원 60명으로 증가
창립 이후 4년이 지난 현재 마이데이스에는 11개의 카테고리별로 분류된 500여개에 이르는 체험상품이 제공된다. 전차 운전부터 시작해서 흥미진진한 여행과 “어둠 속의 식사(Dinner in the dark)”까지 그 종류는 천차만별이다.
“저희 사이트는 매월 1천5백만 개의 조회수를 기록하고 있어 그 영향력은 이미 광범위하게 미치고 있습니다”라고 하며 설립자는 기뻐한다.
슈미트는 당시에 60여명의 직원을 헤아리는 회사의 본부를 2004년 2월에 뮌헨(München)에 소재한 젠들링(Sendling)에 있는 1,000 평방미터에 달하는 사무실로 이전시켰다.

“체험매니저”들 체험상품을 찾아나서다
고객이 선물해주고 싶은 특별한 아이디어 또는 소망하는 체험을 인터넷 포털이나 전화 핫라인으로 골랐다면 그는 상품권을 교부받게 된다. 이때 이벤트주최자의 이름이나 체험을 하게 되는 가능한 날짜는 일단 숨겨진다. “그렇게 함으로써 저희는 고객이 어쩌면 마이데이스를 우회해서 이벤트 주최측과 직접 연락을 취하는 것을 방지하고 있어요.”라고 슈미트는 설명한다.
우선 고객이 상품권을 지불하고서 마지막으로 예약코드를 이용해서 이를 마이데이스 사이트에 적용시키는 다음 단계에 이르고 나서야 고객은 소원 성취를 위한 주최자의 이름과 가능한 날짜를 알 수 있다. “고객이 날짜를 골랐다면 고객은 마지막으로 예약확인증을 받게 되는데 이것은 곧 체험을 위한 티켓이 되는 셈이지요.”
흥미진진한 체험을 개발하고 이를 찾아내는 일은 수고를 많이 요하는 조사와 창의적인 과정의 일부라고 파브리스 슈미트는 강조한다. “텔레비전 방송, 신문 또는 친구나 지인 집단이 저희 아이디어의 주요 원천이 되고 있어요.” 조사한 아이디어에 근거를 두고서 소위 체험메니저들은 이제 가능한 이벤트주최자를 찾아나서게 된다. “이때 저희들은 고려 대상이 될만한 모든 제공자들의 내적인 진지함과 소질 검사를 실시하는데, 능력증명서, 자격증, 그리고 인가서 등을 보내달라고 주문하고 있어요”라고 설립자는 설명한다. 조건이 맞아떨어지면 마지막으로 주최자가 내놓고 있는 상품이나 체험을 관련 사진과 텍스트 형태의 정보와 함께 마이데이스 사이트에 올리게 된다.

선물 아이디어는 여성이 더 선호한다
개인고객 중에서 핵심이 되는 목표층은 연령대가 24세에서 34세 사이이고 유동적이며 체험지향적인 그룹이다. “친구나 가족을 위한 체험선물을 찾는 사람들 가운데 남성보다는 여성이 압도적으로 더 많다”라는 사실을 설립자는 관찰했다. 이에 반해 남성들은 그보다는 자신을 위한 특별한 만족을 자기가 직접 찾아나선다고 한다.
하지만 사업자 고객들도 ―대부분 창조적인 분야의 사업들의 경우― 자신들의 고객에게 제공해주려는 혜택이나 직장인을 위한 독창적인 이벤트 계획 차원에서 그동안 마이데이스를 이용해왔다. 다른 고객들과는 대조적으로 세번째 목표층이 되는 체험 제공자들은 다른 누구보다도 이 이벤트 시장에 정통해 있다.

작년에 비해 매출이 70퍼센트 증가
마이데이스 체험의 가격 범위는 잠수시범체험을 위한 25 유로부터 시작해서 우주인 훈련을 위한 23,000 유로까지 이른다. “고객이 마이데이스를 통해서 특별한 체험을 얻게 되면 저희는 판매가에서 10퍼센트 이하의 수수료를 챙깁니다”라고 슈미트는 밝힌다.
설립자는 현재까지의 사업발전에 대해 매우 만족스러워 하고 있다. “마케팅, 인력, 그리고 기술발전을 위한 비용이 계속해서 증가하고 있긴 합니다. 대신에 2007년의 매출이 작년에 비해 대략 70 퍼센트 정도 더 증가할 것입니다”라고 슈미트는 말한다. 그에 따르면 마이데이스는 현재까지 “매년 10만 여개가 넘는 체험”을 매개시켜준다. 천만 유로 매출 기록을 능가한지 이미 오래다고 그는 자랑스럽게 말한다.
현재 그의 프로그래머들은 “주최자가 사진 및 정보 텍스트와 함께 데이터뱅크에 저장되어있는 자신의 체험상품을 직접 설정할 수 있도록” 조치하는 작업에 종사하고 있다고 설립자는 설명한다. 이 문제를 해결할 경우 설정의 전 과정이 훨씬 더 신속하게 이루어질 것이며 지금까지 이 일을 떠맡아왔던 체험메니저들의 부담을 상당히 경감시킬 수 있을 것이다. “이제 저희 최종 고객들은 더 많은 체험 중에서 고를 수 있게 될 것입니다”라고 슈미트는 말한다.


업체명 : 마이데이스 유한회사
주소 : Zielstattstr. 21-23 81379 München
전화 : (089) 76 77 60 0
팩스 : (089) 76 77 60 15
이메일 : fabrice.schmidt@mydays.de
홈페이지 : www.mydays.de
자료출처 : Die Geschaeftsidee 잡지


Posted by 1010
91..개발관련프로그램2008. 10. 23. 17:41
반응형

프로그램이 사용하는 포트를 알려준다 - fport

 

제작사 :
http://www.foundstone.com

 

fport는 Windows NT4, Windows 2000 and Windows XP 를 지원한다.

fport 는 열려진 모든 TCP/UDP 포트에 대하여 그 포트를 점유하는 응용프로그램의 연결상황을 알려줍니다.(어떤 프로그램이 어떤 포트를 사용하는지)
이 프로그램은 'netstat -an'명령어의 결과로 나타나는 정보와 같은 정보를 제공하면서, 그 포트들과 연결되어(mapped) 실행되는 프로세스를 PID와 프로세스이름과 경로를 같이 보여준다. Fport는 알려지지 않은 열린포트과 그것들과 관련된 응용프로그램이 무엇인지 빨리 알 수있도록 하는데 사용된다.


사용법 :
DOS 환경모드('시작'-'실행'-'cmd')에서 fport.exe 가 존재하는 폴더로 이동하여 'fport' 입력


C:\>fport
FPort v2.0 - TCP/IP Process to Port Mapper
Copyright 2000 by Foundstone, Inc.
http://www.foundstone.com
Pid   Process            Port  Proto Path
392   svchost        ->  135   TCP   C:\WINNT\system32\svchost.exe
8     System         ->  139   TCP
8     System         ->  445   TCP
508   MSTask         ->  1025  TCP   C:\WINNT\system32\MSTask.exe
392   svchost        ->  135   UDP   C:\WINNT\system32\svchost.exe
8     System         ->  137   UDP
8     System         ->  138   UDP
8     System         ->  445   UDP
224   lsass          ->  500   UDP   C:\WINNT\system32\lsass.exe
212   services       ->  1026  UDP   C:\WINNT\system32\services.exe


프로그램에는 5개의 스위치가 있으며, 스위치들은 '/'나 '-'를 이용하여 사용된다.

 

스위치 사용법 :
        /?     사용법보기
        /p     포트번호로 정렬하기
        /a     응용프로그램으로 정렬하기
        /i      PID로 정렬하기
        /ap   응용프로그램의 경로로 정렬하기



다운로드:  http://www.foundstone.com/resources/termsofuse.htm?file=fport.zip




출처 : http://kr.blog.yahoo.com/clark7877/22392.html?p=1&pm=l&tc=40&tt=1224751216

Posted by 1010
02.Oracle/DataBase2008. 10. 23. 17:31
반응형

우리가 오라클데이터베이스에 접속을해서 DML이나 DDL등의 명령어로 작업을 수행하면,
모든 작업의 기록이 리두로그 파일에 저장이 됩니다.
 
작업의 양이 많아지면 리두로그파일에 기록하는 내용도 굉장히 많아지게 되겠죠.
그렇게 되면 데이터를 기록하기 위해서 리두로그파일을 늘려야 하는 일이 발생을 합니다.
 
그런데 오라클 리두로그파일은 계속 증가하는 것이 아니라 몇 개의 리두로그 파일을 만들어 놓고
번갈아 가면서 기록하는 구조로 되어 있습니다
.
 
이렇게 번갈아 가면서 기록을 하게 되면 새로운작업의 내용이 예전의 작업내용을 덮어쓰므로
예전의 작업한 내용을 잃게 된다는 단점이 있습니다.
 
 
그래서 예전의 작업한 내용에 데이터 손실이 발생하면 복구하기 어렵다는 단점이 있습니다.
 
이런 단점을 해결하기 위한 방법이 리두로그파일의 내용을 다른 디렉토리에 자동으로 복사해서 저장하도록 운영하는 방법입니다.  

이렇게 운영하는 방법을 아카이브 로그 모드(Archive Log Mode)라고 합니다.
 
 
오라클데이터베이스는 기본적으로 No Archive Log Mode고요.. Archive Log Mode로 운영하기 위해서는 따로 설정을 해주어야 합니다.
 


PFILE을 수정하여 데이타베이스를 archivelog mode로 설정하기


NO ARCHIVE LOG 상태의 데이터베이스를 ARCHIVE LOG 모드 상태로 변경하기 위해서는 다음과 같은 순서로 작업해야 합니다.
 
1) INIT<SID>.ORA 파라미터 파일을 수정한다.

2) 데이터베이스 인스턴스를 종료(SHUTDOWN)한다.

3) 데이터베이스 인스턴스를  MOUNT한다.(OPEN하지 않습니다)

4) 데이터베이스를 ARCHIVE LOG 모드로 변경한다.

5) 데이터베이스 인스턴스를 OPEN한다.
 
 
 
1) INIT<SID>.ORA파일의 parameter 수정  
 
INIT<SID>.ORA 파일에서 아래 부분을 수정하고, 주석(#)을 제거하고 저장합니다.
 
# 아카이브 프로세스를 오라클 시작과 함께 실행하도록 설정
# log switch 발생시 자동으로 archive를 수행 합니다
LOG_ARCHIVE_START = TRUE
 
# 아카이브 로그 파일을 저장할 디렉토리 설정
LOG_ARCHIVE_DEST = "C:\oracle\ora92\database\archive"  
 
# 아카이브 로그 파일의 이름 설정
LOG_ARCHIVE_FORMAT = %S.ARC
 
※ LOG_ARCHIVE_FORMAT 옵션
 - %S : redo 로그 시퀀스 번호를 표시하여 자동으로 왼쪽이 0으로 채워져 파일 이름 길이를 일정하게 만든다.
 - %s : redo 로그 시퀀스 번호를 표시하고, 파일 이름 길이를 일정하게 맞추지 않는다.
 - %T : redo 스레드 넘버를 표시하며, 자동으로 왼쪽이 0으로 채워져 파일 이름 길이를 일정하게 만든다.
 - %t : redo 스레드 넘버를 표시하며, 파일 이름 길이를 일정하게 맞추지 않는다.
 
     
 
2) 데이터베이스 인스턴스를 종료
 
-- SQLPLUS 실행
SQLPLUS /nolog
 
-- SYSDBA 권한으로 접속 합니다.
SQL>CONN SYS/MANAGER AS SYSDBA
 
 
SQL> SHUTDOWN IMMEDIATE
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.
 
 
3) 데이터베이스 인스턴스를  MOUNT
SQL> STARTUP MOUNT pfile=C:\oracle\ora92\database\INITORA9I.ORA
데이터베이스가 마운트되었습니다.
 
 
4) DATABASE를  ARCHIVE LOG MODE로 전환.
SQL> ALTER DATABASE ARCHIVELOG;
데이타베이스가 변경되었습니다.
 
 
5) DATABASE OPEN
SQL> ALTER DATABASE OPEN;
 
 
 
6) ARCHIVE LOG MODE가 정상적으로 설정되어 있는지 확인한다.
 
SQL> ARCHIVE LOG LIST
데이터베이스 로그 모드              아카이브 모드
자동 아카이브             사용
아카이브 대상            C:\oracle\ora92\database\archive
가장 오래된 온라인 로그 순서     16
아카이브할 다음 로그   18
현재 로그 순서           18
 
 
7) 강제로 로그 스위치를 발생시켜서 아카이브 로그 파일이 저장되는지 확인 합니다.
SQL> ALTER SYSTEM SWITCH LOGFILE;
시스템이 변경되었습니다.
 
C:\oracle\ora92\database\archive 디렉토리에 파일이 생성되었는지 확인 합니다.
 



ARCHIVELOG MODE에서 NO ARCHIVELOG MODE로 전환하기


먼저, 위에서 setting 했던 INIT<SID>.ORA 파일에서 설정했던 부분을 (#)으로 주석처리 합니다.
 
 
#LOG_ARCHIVE_START = TRUE
#LOG_ARCHIVE_DEST = "C:\oracle\ora92\database\archive"  
#LOG_ARCHIVE_FORMAT = %S.ARC
 

-- 데이터베이스 종료
SQL> SHUTDOWN IMMEDIATE
 
 
-- 데이터베이스 인스턴스를  mount
SQL> STARTUP MOUNT pfile=C:\oracle\ora92\database\INITORA9I.ORA
 
 
-- 데이터베이스를  no archive log mode로 전환.
SQL> ALTER DATABASE NOARCHIVELOG;
 
 
--  database open
SQL> ALTER DATABASE OPEN;
 
 
-- 아카이브 로그 모드 상태 확인
SQL> ARCHIVE LOG LIST
데이터베이스 로그 모드              아카이브 모드가 아님
자동 아카이브             사용 안함
아카이브 대상            C:\oracle\ora92\RDBMS
가장 오래된 온라인 로그 순서     17
현재 로그 순서           19
   


SPFILE(서버 파라미터 파일)을 수정하여 데이타베이스를 archivelog mode로 설정하기


 Oracle9i 이상의 경우 서버 파라미터 파일을 사용 할 경우 아래와 같은 과정을 거쳐서 아카이브 로그모드로 변경해야 합니다.
 
 
1) 파라미터 설정
 
-- sqlplus 실행
SQLPLUS /nolog
 
-- SYSDBA 권한으로 접속 합니다.
SQL>CONN / AS SYSDBA
 
-- LOG_ARCHIVE_START 파라미터 변경
SQL>ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE;
 
-- LOG_ARCHIVE_DEST 파라미터 변경
SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST='C:\oracle\ora92\database\archive' SCOPE=SPFILE;
 
-- LOG_ARCHIVE_FORMAT 파라미터 변경
SQL>ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%S.ARC' SCOPE=SPFILE;
 
 
2) DB Shutdown
SQL>SHUTDOWN IMMEDIATE
 
 
3) Mount 상태로 Startup
SQL> startup mount
 
 
4) 아카이브 로그 모드 활성화
SQL>ALTER DATABASE ARCHIVELOG;
 
 
5) 데이타베이스 오픈
SQL> ALTER DATABASE OPEN;
 
 
6) 아카이브 로그 모드가 정상적으로 설정되어 있는지 확인한다.
SQL> archive log list;
데이터베이스 로그 모드              아카이브 모드
자동 아카이브             사용
아카이브 대상            C:\oracle\ora92\database\archive
가장 오래된 온라인 로그 순서     17
아카이브할 다음 로그   19
현재 로그 순서           19
 

Posted by 1010
90.개발관련문서2008. 10. 23. 16:22
반응형


다운받아 보삼..
Posted by 1010
91..개발관련프로그램2008. 10. 23. 16:17
반응형



개발시 필요함...
Posted by 1010
02.Oracle/DataBase2008. 10. 23. 16:10
반응형



Installing and Upgrading

Installation guides for Oracle Database 11g and accompanying products on various platforms are collected here.

  • Full Installation Guides describe a wider variety of scenarios with more detail.
  • Client Installation Guides describe installing Oracle database client software on hosts where the database server is not installed.
  • Supplementary Installation Guides describe installing products that are included with the database but installed separately.

Essentials

Licensing Information HTML PDF
Readme HTML PDF
Universal Installer and OPatch User's Guide for Windows and UNIX HTML PDF
Upgrade Guide HTML PDF

Linux Installation Guides

Release Notes for Linux HTML PDF
Quick Installation Guide for Linux x86 HTML PDF
Quick Installation Guide for Linux x86-64 HTML PDF
Installation Guide for Linux HTML PDF
Client Quick Installation Guide for Linux x86 HTML PDF
Client Quick Installation Guide for Linux x86-64 HTML PDF
Client Installation Guide for Linux HTML PDF
Clusterware Installation Guide for Linux HTML PDF
Real Application Clusters Installation Guide for Linux and UNIX HTML PDF

Microsoft Windows Installation Guides

Release Notes for Microsoft Windows HTML PDF
Quick Installation Guide for Microsoft Windows (32-Bit) HTML PDF
Quick Installation Guide for Microsoft Windows x64 HTML PDF
Installation Guide for Microsoft Windows HTML PDF
Client Quick Installation Guide for Microsoft Windows (32-Bit) HTML PDF
Client Quick Installation Guide for Microsoft Windows x64 HTML PDF
Client Installation Guide for Microsoft Windows HTML PDF
Clusterware Installation Guide for Microsoft Windows HTML PDF
Real Application Clusters Installation Guide for Microsoft Windows HTML PDF

Solaris Installation Guides

Release Notes for Solaris Operating System HTML PDF
Quick Installation Guide for Solaris Operating System (SPARC) HTML PDF
Installation Guide for Solaris Operating System HTML PDF
Client Quick Installation Guide for Solaris Operating System (SPARC) HTML PDF
Client Installation Guide for Solaris Operating System HTML PDF
Clusterware Installation Guide for Solaris Operating System HTML PDF
Real Application Clusters Installation Guide for Linux and UNIX HTML PDF

HP-UX Installation Guides

Release Notes for HP-UX HTML PDF
Quick Installation Guide for HP-UX Itanium HTML PDF
Quick Installation Guide for HP-UX PA-RISC (64-Bit) HTML PDF
Installation Guide for HP-UX HTML PDF
Client Quick Installation Guide for HP-UX Itanium HTML PDF
Client Quick Installation Guide for HP-UX PA-RISC (64-Bit) HTML PDF
Client Installation Guide for HP-UX HTML PDF
Clusterware Installation Guide for HP-UX HTML PDF
Real Application Clusters Installation Guide for Linux and UNIX HTML PDF

AIX Installation Guides

Release Notes for AIX 5L Based Systems (64-Bit) HTML PDF
Quick Installation Guide for AIX 5L Based Systems (64-Bit) HTML PDF
Installation Guide for AIX 5L Based Systems (64-Bit) HTML PDF
Client Quick Installation Guide for AIX 5L Based Systems (64-Bit) HTML PDF
Client Installation Guide for AIX 5L Based Systems (64-Bit) HTML PDF
Clusterware Installation Guide for AIX Based Systems HTML PDF
Real Application Clusters Installation Guide for Linux and UNIX HTML PDF

Supplementary Installation Guides

Products installed separately from the database.

Examples Installation Guide HTML PDF
Gateway for APPC Installation and Configuration Guide for AIX 5L Based Systems (64-Bit), HP-UX PA-RISC (64-Bit), Solaris Operating System (SPARC 64-Bit), and Linux x86 HTML PDF
Gateway for APPC Installation and Configuration Guide for Microsoft Windows HTML PDF
Gateway for IMS, VSAM, and Adabas Installation and Configuration Guide for AIX 5L Based Systems (64-Bit), HP-UX PA-RISC (64-Bit), Solaris Operating System (SPARC 64-Bit), Linux x86, and Linux x86-64 HTML PDF
Gateway for IMS, VSAM, and Adabas Installation and Configuration Guide for Microsoft Windows HTML PDF
Gateway Installation and Configuration Guide for AIX 5L Based Systems (64-Bit), HP-UX PA-RISC (64-Bit), HP-UX Itanium, Solaris Operating System (SPARC 64-Bit), Linux x86, and Linux x86-64 HTML PDF
Gateway Installation and Configuration Guide for Microsoft Windows HTML PDF
Warehouse Builder Installation and Administration Guide for Windows and UNIX HTML PDF
Posted by 1010
02.Oracle/DataBase2008. 10. 23. 15:46
반응형

12. 데이터베이스 관리

12.1 데이터베이스 기동과 종료

데이터베이스의 기동

  • SHUTDOWN
  • NOMOUNT - 1단계 : 데이터베이스 인스턴스 기동
  • MOUNT - 2단계 : 인스턴스를 위한 컨트롤 파일 열림(OPEN)
  • OPEN - 3단계 : 컨트롤 파일에 기술된 모든 파일 열림(OPEN)

(1) 1단계 : 데이터베이스 NOMOUNT 단계

  • 데이터베이스의 파라미터 파일을 읽는다.
  • TRACE 파일 및 ALERT 파일을 연다. 생성 정보를 alert(SID).log 파일에 기록한다.
  • 오라클 데이터베이스에서 이용되는 공유 메모리 구조인 SGA(System Global Area)를
    할당한다.
  • 백그라운드 프로세스를 생성한다.
  • 데이터베이스는 생성된 메모리 구조화 프로세스들과 아직 연결되어 있지 않다.

(2) 2단계 : 데이터베이스 MOUNT 단계

  • 데이터베이스를 구성하는 정보가 모두 있는 컨트롤 파일의 정보를 읽어서 디스크에
    데이터파일이나 리두로그 파일 등이 올바로 존재하는지 또한 각 파일이 현재
    사용가능한지를 점검한다.
  • 데이터베이스의 백업이나 복구 시점에 많이 이용된다. 만약 데이터파일이나
    로그 파일에 문제가 발생하여 데이터베이스가 시작되지 않는다면 이 단게에서
    복구 작업을 수행한 이후에 데이터베이스를 기동한다.
  • 데이터 파일명 변경, 리두로그 파일 추가,삭제,이름변경, 아카이브 모드 옵션의
    변경, 전체 데이터베이스의 복구, 백업하여 데이터베이스 재생성, 불완전 데이터베이스
    복구 등이 가능하다.
  • MOUNT 단계에서는 일반 사용자가 데이터베이스에 접속할수 없다.

(3) 3단계:데이터베이스 OPEN 단계

  • 컨트롤 파일에 기술된 모든 데이터 파일 및 리두로그 파일 등을 연다.
  • 일반 사용자가 데이터베이스를 이용할 수 있는 상태다.
  • 만약 종료 시점에 테이블 스페이스가 오프라인이었다면 데이터베이스를 기동하여도
    해당 테이블스페이스는 오프라인 상태다.
  • 인스턴스가 데이터베이스를 연 이후에 하나 이상의 롤백 세그먼트를 확보한다.

윈도우 NT 기반에서 데이터베이스 기동 방법

  • 제어판의 서비스를 이용하여 오라클 서비스를 기동

유닉스 기반에서 데이터베이스 기동방법

1) 먼저 유닉스에서 오라클을 기동할 수 있는 구너한이 있는 사용자 ID 로 로그인한다.
대개 oracle User
2) 현재 오라클 SID 를 확인 한다.
env |grep ORACLE_SID
ORACLE_SID=ARTDOM
3) SVRMGRL 를 실행하여 오라클을 기동시킨다.
[ 9i 이후엔 svrmgrl ( oracle server manager) 가 지원되지 않는다. ]

sqlplus ' /as sysdba'
    SQL*Plus: Release 10.1.0.4.0 - Production on Tue Jun 24 16:22:44 2008
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.

    Connected to an idle instance.

    SQL>startup
    ORACLE instance started.

    Total System Global Area 1174405120 bytes
    Fixed Size                  1329584 bytes
    Variable Size             316913232 bytes
    Database Buffers          855638016 bytes
    Redo Buffers                 524288 bytes
    Database mounted.
    Database opened.
    SQL>

4) sqlplus 를 통한 접속 테스트

sqlplus scott/manager

    SQL*Plus: Release 10.1.0.4.0 - Production on Tue Jun 24 16:24:36 2008
    
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.1.0.4.0 - 64bit Production
    With the Partitioning, OLAP and Data Mining options
    
    scott@ARTDOM>select * from tab ;
    
    TNAME                          TABTYPE  CLUSTERID
    ------------------------------ ------- ----------
    DEPT                           TABLE
    EMP                            TABLE
    BONUS                          TABLE
    SALGRADE                       TABLE
    PLAN_TABLE                     TABLE
    CHAINED_ROWS                   TABLE
    CHECK_NEXT                     TABLE
    BIG_TABLE                      TABLE
    CHECK_PART                     TABLE
    CHECK_TRAN                     TABLE
    C_1                            TABLE
    CHECK_RENAME_FILES             TABLE
    CHECK_PART2                    TABLE
    CHECK_PART3                    TABLE
    DEPT_SAL                       TABLE
    MV_DEPT                        TABLE
    CHECK_DDL                      TABLE
    SCOTT_DBA_SEGMENTS             TABLE
    SCOTT_TABLES                   TABLE
    CHECK_VAR                      TABLE
    CHECK_ORANGE                   TABLE
    BIGEMP                         TABLE
    
    22 rows selected.

5) 오라클 필수 백그라운드 프로세스 확인을 통한 확인 [ smon ]
ps -ef|grep ora_ |grep sm
oracle 442430 1 0 16:22:46 - 0:00 ora_smon_ARTDOM

데이터베이스 종료

(1) SHUTDOWN NORMAL

  • 정상적으로 데이터베이스를 종료하는 방법으로 데이터베이스에 연결된
    모든 사용자의 세션이 종료될 때까지 기다린다.
    [ 사용자 세션이 하나라도 존재하면 Down 이 진행 되지 않는다. ]
  • 새로운 사용자의 연결은 허용하지 않는다.
  • 다음 데이터베이스를 기동할 때 별도의 복구 작업이 필요하지 않다.

(2) SHUTDOWN IMMEDIATE

  • 데이터베이스를 관리할 때 가장 많이 사용하는 정지 옵션이다.
  • 현재 커밋되지 않은 SQL 문장을 롤백시킨다.
  • 현재 데이터베이스에 접속한 사용자가 접속을 해제하기를 기다리지 않는다.
  • 만약 데이터베이스 롤백 정보가 많다면 데이버테이스를 정지하는 데 시간이
    많이 소요된다.
  • 잘못된 애플리케이션에 의해 부득이 데이터베이스를 정지시켜야 하는 경우에
    사용된다.
  • 다음 데이버테이스를 기동할 때 별도의 복구 작업이 필요하지 않다.
    다만 해당 시점에 작업하였던 부분이 롤백되었으면 다시 실행하도록 해야 한다.

(3) SHUTDOWN TRANSACTION

  • 데이터베이스를 종료하려면 현재 작업중인 모든 트랜잭션이 정상적으로 수행되어
    종료될때까지 기다린다. [ 접속 세션의 commit/rollback 까지 대기 후 Down ]
  • 모든 작업이 정상적으로 수행되었으므로 별도로 작업해야 할 부분이 필요하지 않다.
  • 다음 데이터베시으를 기동할 때 별도의 복구 작업이 필요하지 않다.

(4) SHUTDOWN ABORT

  • 트랜잭션에 대해 정리되지않으므로 일반적으로 이용하지 않는다.
  • 현재 연결되 모든 세션을 강제로 종료시킨다.
  • 커밋되지 않은 트랜잭션은 롤백되지 않는다.
  • 백업과 복구 작업이 필요한 경우에 사용한다.
  • 다음 데이터베이스를 기동할 때 별도의 복구 작업이 필요하다.

12.2 유용한 데이터베이스 모니터링 스크립트

12.3 데이타베이스 운영 시 정기적으로 점검해야 할 사항

매일 점검해야 할 항목

(1) 모든 데이터베이스 인스턴스가 기동되었는지 확인 한다.
(2) alert Log 를 확인 한다.
(3) 데이터베이스가 성공적으로 백업되었는지 확인 한다.
(4) 데이터베이스의 아카이브 로그 파일이 성공적으로 백업되었는지 확인한다.
(5) 데이터베이스 성능을 위해 충분한 리소스가 존재하는지 확인 한다.

1) 테이블 스페이스에 충분한 공간이 있는지 확인한다.

현실에 맞지 않다 - 책 내용

more "space.sql"
  select tablespace_name,
         sum(blocks) as free_blk, trunc(sum(bytes)/(1024*1024)) AS FREE_M,
         max(bytes)/(1024) as big_chunk_k, count(*) as num_chunks
  from dba_free_space
  group by tablespace_name  ;

Tablespace Free 공간 체크 Script

방법1. MAXBYTES - BYTES + FREE

select AA.*, (AA."Allocation" - AA."Used" + BB."Free" ) "Free Size", BB."Free"
  from
  (select a.tablespace_name "TABLESPACE_NAME",  sum(a.maxbytes)/1024/1024 "Allocation", sum(a.bytes)/1024/1024 "Used"
  from dba_data_Files a
  group by a.tablespace_name ) AA,
  (select b.tablespace_name, sum(b.bytes)/1024/1024 "Free"
  from dba_free_space b
  group by b.tablespace_name ) BB
  where AA.TABLESPACE_NAME = BB.TABLESPACE_NAME(+) ;

방법2. MAXBYTES - SEGMENT SIZE

select a.tablespace_name , a.bytes - b.bytes "FREE(M)"
  from
  ( select tablespace_name,   sum(maxbytes)/1024/1024 bytes from dba_data_files group by tablespace_name ) a,
  ( select tablespace_name,   sum(bytes)/1024/1024 bytes from dba_segments group by tablespace_name) b
  where a.tablespace_name = b.tablespace_name;

방법3. MAXBYTES - EXTENT SIZE

select a.tablespace_name , a.bytes - b.bytes "FREE(M)"
   from
   ( select tablespace_name,   sum(maxbytes)/1024/1024 bytes from dba_data_files group by tablespace_name ) a,
   ( select tablespace_name,   sum(bytes)/1024/1024 bytes from dba_extents group by tablespace_name) b
   where a.tablespace_name = b.tablespace_name;

2) 롤백 세그먼트를 확인한다.

more "rbs_usage.sql"
col today format a20 new_value curr_time
col today noprint
select to_char(sysdate,'YYYY/MM/DD HH24:MI:SS') today from dual ;

prompt =========================================================
prompt == rollback segment storage and status                 ==
prompt => DAte : [ &CURR_TIME ]
prompt =========================================================

set linesize 120
col rb_seg for a10
col status for a10
col tbs_nm for a10
col ini_kb for 9,999,999
col nxt_kb for 9,999,999
col tot_kb for 9,999,999

col ext for 999
col xt  for 99

select a.segment_name as rb_seg,
       a.status, c.xacts as xt,
       b.initial_extent/1024 as ini_kb,
       b.next_extent/1024 as nxt_kb,
       b.extents as ext,
       b.bytes/1024 as tot_kb,
       a.tablespace_name as tbs_nm
from dba_rollback_segs a, dba_segments b, v$rollstat c
where a.owner = b.owner
and   a.segment_name = b.segment_name
and   a.segment_id = c.usn
order by a.segment_name ;

3) 과도하게 증가한 세그먼트가 존재하는지 확인 한다.

3_1)우선 ananlyze 진행 한다.

sys@ARTDOM>begin
    dbms_utility.analyze_schema('SCOTT','ESTIMATE',NULL,5);
    end ;
    /
  PL/SQL procedure successfully completed.

3_2) 실행 안됨

select e.owner, e.segment_type, e.segment_name, count(*) as nr_extents,
          s.max_extents, to_char(sum(e.bytes)/(1024*1024),'999,999.90') AS MB
    from dba_extents e, dba_segments
    where e.segment_name = s.segment_name
    group by e.owner, e.segment_type, e.segment_name, s.max_extents
    having  count(*) > 10  or ( s.max_extents - COUNT(*) ) < 20 )
    order by count(*) desc ;

4) 스페이스-바운드 오브젝트를 식별한다. [ 의미 없음 ]

SELECT A.TABLE_NAME, A.NEXT_EXTENT, A.TABLESPACE_NAME
FROM ALL_TABLES A,
( SELECT TABLESPACE_NAME, MAX(BYTES) AS BIG_CHUNK
  FROM DBA_FREE_SPACE
  GROUP BY TABLESPACE_NAME ) F
WHERE F.TABLESPACE_NAME = A.TABLESPACE_NAME
AND   A.NEXT_EXTENT > F.BIG_CHUNK ;

ALTER TABLE <owner>.table STORAGE ( MAXEXTENTS UNLIMITED);

5) CPU, 메모리, 디스크 리소스가 충분한지 확인한다.

6) 데이터베이스 메뉴얼을 하루에 한 시간씩 탐독한다.

주 단위로 점검해야 할 항복

(1) 잘못된 규칙에 의해 오브젝트가 존재하는지 확인 한다.

more "check_next.sql"
  select segment_name, segment_type, dt.tablespace_name, ds.next_extent
  from dba_tablespaces dt, dba_segments ds
  where dt.tablespace_name = ds.tablespace_name
  and dt.next_extent != ds.next_extent
  and ds.owner ='&OWNER';

PK 가 존재 하지 않는 테이블 체크

more "check_pk_exist.sql"
  select table_name from all_tables where owner='&OWNER'
  minus
  select table_name from all_constraints where owner='&&OWNER'
  and constraint_type ='P';

(2) 보완관리가 잘 유지되고 있는지 확인 한다.

(3) Net8에 관련된 로그는 에러나 이슈 사항이 없는지 확인한다.

(4) 모든 alert 로그 파일을 보관한다.

월 단위로 점검해야 할 항목

(1) 데이터베이스의 비정상적인 현상이 발생하는지 확인한다.
(2) 튜닝해야할 부분이 있는지 확인한다.
(3) I/O 경합이 존재하는지 확인
(4) 단편화(Fragmentation)이 존재하는지 확인

12.3 데이터베이스 문제 발생 및 해결 방법

롤백 세그먼트 EXTENT 에러

RBS 사용 현황 체크 - User 별

select s.username, s.sid, s.serial#, rn.name,     rs.curext
           ,rs.curblk,  t.used_ublk, t.used_urec
    from    v$transaction   t
           ,v$session       s
           ,v$rollname      rn
           ,v$rollstat      rs
    where  t.addr     = s.taddr
    and    t.xidusn   = rn.usn
    and    rn.usn     = rs.usn  ;

SHAPSHOT TOO OLD 에러(ORA-1555)

발생 원인

  • 데이터베이스에 롤백 세그먼트 크기나 개수가 적당하게 설정되어 있어도
    OLTP 업무에 배치작업이 기동되어 과도하게 롤백 세크먼트를 사용할 경우 발생한다.
  • 데이터베이스에 변경을 가하는 트랜잭션은 많고 롤백 세그먼트는 크기도 작고,
    개수도 적은 경우에 발생한다.
    해결 방법
    1) 큰 롤백 세그먼트 생성
    CREATE ROLLBACK SEGMENT vldb_rbs 
             STORAGE( INITIAL 100M NEXT 5M )
             TABLESPACE VLDB_RBS ;

    2) 평상시에 OFFLINE 상태 유지

    ALTER ROLLBACK SEGMENT Vldb_rbs OFFLINE ;

    3) 배치작업 수행 시 ONLINE 상태로 변경

    ALTER ROLLBACK SEGMENT vldb_rbs ONLINE ;

    4) 각 작업문장이나 세션에서 롤백 세그먼트 지정

    SET TRANSACTION USE ROLLBACK SEGMENT vldb_rbs ;

    5) 작업 후 OFFLINE 으로 변경함

    ALTER ROLLBACK SEGMENT vldb_rbs OFFLINE ;

문서에 대하여

Posted by 1010
02.Oracle/DataBase2008. 10. 23. 15:32
반응형

그리드 컴퓨팅 데이터베이스의 약진 Oracle Database 10g Release 2


Oracle Database 10g Release 2의 비전
Oracle Database 10g Release 2의 해부
Oracle Database 10g Release 2의 첫인상

ORACLE DATABASE 10g Release 2의 첫 인상


장희정│한국오라클 TSC본부 DB팀


Oracle Database 10g Release 2를 처음 접한 이후 6개월여가 지났다. 그간 Oracle Database 10g Release 2에 대한 자료 및 테스트 등을 통해 생각했던 주목할 만한 몇 가지 기능을 OTN의 고정 필자인 Tom Kyte의‘My First Day with the New Release’ 글을 참고하여 소개하고자 한다.


Conditional Compilation


Oracle Database 10g Release 2에서는 PL/SQL 부문으로 여러 새로운 기능들을 제공하고 있다. 그 중 필자가 처음 주목한 것은 Conditional Compilation이다.


Conditional Compilation은 컴파일러가 의도에 따라 코드의 실행 여부를 결정할 수 있도록 하는 기능이다. 언뜻 들어서는 그저 그런 기능 같지만, 사실은 매우 유용한 기능이다.


Conditional Compilation을 이용하면,


• 현재 애플리케이션의 디버그 코드를 그대로 둘 수 있고, 이 코드를 원하는 대로 동작하게 하거나 동작하지 않도록 할 수 있다.


• C에서 하는 것처럼 Assertion을 프로그래밍할 수 있다. 예를 들어, 각 서브프로그램은 인풋 값을 테스트할 수 있고, 그 값이 특정 조건을 만족하는지 검증할 수 있다. 이런 테스트들이 전체 개발 기간 동안은 Active 상태이고, 프로덕 션 단계에서는 Inactive 상태일 수 있는 것이다. 그러나, 코드가 남아 있으므로 프로덕션 환경에서의 버그를 디버깅할 때 간단하게 활성화시킬 수 있다.


. 버전에 구애 받지 않는 코드를 작성할 수 있다. 버전 X용 코드 세트와 버전 Y용의 다른 코드 세트를 컴파일하면 되 므로, 두 세트의 코드를 가지지 않아도 된다. 새로운 DBMS_DB_VERSION 패키지를 살펴보라.


<리스트1>은 Conditional Compilation이 어떻게 구현될 수 있는지를 간략하게 보여 준다.


<리스트 1> Conditional PL/SQL Compilation 예


SQL> create or replace procedure p
2 as
3 begin
4 $IF $$debug_code $THEN
5 dbms_output.put_line‘( Our debug code’);
6 dbms_output.put_line‘( Would go here’);
7 $END
8 dbms_output.put_line‘( And our real code here’);
9 end;
10 /
Procedure created.

여기서 어떻게‘debug’코드가 프린트 되지 않고, $$debug_code 값이 정의되지 않은 채 코드가 컴파일되는지 주목하기 바란다.


SQL> exec p
And our real code here
PL/SQL procedure successfully completed.

간단하게 debug_code 값을 변경함으로써 디버그 코드를 활성화시킬 수 있다.


SQL> alter procedure P compile“
2 plsql_ccflags =‘ debug_code:true’reuse settings;
Procedure altered.
SQL> exec p
Our debug code
Would go here
And our real code here
PL/SQL procedure successfully completed.

Database Transport


Oracle Database 10g Release 1에서 서로 다른 플랫폼간의Transportable Tablespace를소개한다음, 이번 Oracle Database 10g Release 2에서 이를 한 단계 더 발전시켰다. Oracle Database 10g Release 2 부터는 동일한 Endian(바이트 순서)을 갖는 전 플랫폼에서 전체 데이터베이스를 트랜스포트할 수 있다. 예를 들어, Apple Macintosh에서 HP-UX로, 또는 Solaris x86에서 Open VMS로 단지 개개의 테이블스페이스를 트랜스포트하는 것이 아니라 전체 데이터베이스를 통째로 트랜스포트할 수 있다.


Native XQuery 지원


Oracle Database 10g Release 2는 W3C가 지정한 XML 질의용 표준인 XQuery를 지원한다. 이 기능은 XMLQuery와 XMLTable의 두 가지 기능으로 구현되어 있다. XMLQuery는 SQL 클라이언트에서 XQuery 언어를 사용해 해당 데이터와 관련된 XML 뷰를 질의하거나 Oracle XML DB 리파지토리 문서를 질의할 수 있도록 해준다. XMLTable은 XQuery의 결과를 관련 로우와 칼럼으로 매핑해 주므로, SQL을 사용해 그 매핑 결과에 대해 질의할 수 있다.


Direct SGA Access


데이터베이스가 응답이 없거나 혹은 시스템 성능이 너무 느린 경우, DBA가 가장 먼저 하고자 하는 일은 데이터베이스에 SYSDBA로 접속하여 Wait Event를 체크하는 일일 것이다. 그러나, 인스턴스가 행(hang) 상태라면 로그인도 못하는 지경일 수 있고, 로그인에 성공했다 하더라도 문제 해결을 위한 질의가 제대로 수행되지 못하는 경우가 상당하다.


Oracle Database 10g Release 2의 OEM Grid Control은 사용자의 요청에 따라 Direct SGA Attach 가 가능하므로 프로세스로부터 데이터를 수집할 수 있다. 이러한 메모리 액세스 모드는 SQL이 불가능할 정도로 인스턴스가 심각한 상태라 하더라도 성능 데이터 등을 모니터링할 수 있도록 한다. 이러한 Direct SGA Access 기능은Oracle Enterprise Manager를통해<화면1>과 같이 활용할 수 있다.


<화면 1> Direct SGA Access 기능의 활용



Asynchronous Commit


일반적으로 Java, C, Visual Basic 애플리케이션에서 COMMIT을 실행하면, Wait, 특히, Log File Sync Wait이 발생하게 된다. 이 Wait은 Transaction Permanence를 위해 Log Writer Process가 디스크에 리두를 플러시시킬 때까지 클라이언트가 기다리기 때문이다. 그리고 이것은 일반적인 것으로 커밋을 수행하면, 그 데이터는‘Permanent’해야 하기 때문이다.


그러나 모든 법칙에는 예외가 있기 마련이다. 센서나 네트워크를 통해서 들어오는 기록들을 가능한 빨리 처리해야 하는 시스템이라면, 얘기가 달라진다. 이런 프로그램의 목표는 여러 레코드들을 일괄로 묶은 뒤 INSERT하고 Commit 한 뒤, 계속해서 이런 작업을 반복하는 것이다. 커밋이 완벽하게 수행될 때까지 기다린다면, 기대만큼 빠 르게 실행될 수 없을 것이므로, 이런 프로그램은 그런 방식을 원하지 않을 것이다.


이 제 Oracle Database 10g Release 2에서 Asynchronous Commit을 이용해 보자.‘ commitbut- don’t wait’이나‘commit, and please do wait’ 을지정할수있다. 그러나, commit-but-don’t wait을 사용한다면, 드물게나마‘Commited’데이터가 분실될 수 있음을 예상해야 한다. commit-but-don’t wait을 이용하는 중에 시스템이 중단되면, 그 데이터는 커밋되지 않았을 수 있다. 그렇기 때문에, 사용자가 업무 성격에 따라 판단하여 commit-but-don’t wait을 사용하는 것이 필요하다. 참고로, 쏟아져 들어오는 데이터를 데이터베이스에 신속하게 기록하는 것이 애플리케이션의 최대 목적인 경우가 있다면, 이런 애플리케이션에서는 commitbut- don’t wait을 사용하는 것이 적합할 뿐 아니라 성능 측면에서 절대적으로 필요할 수 있다. <리스트 2>는 이런 예를 보여주는 Java 루틴이다.


<리스트 2> commit-but-don’t wait - Asynchronous Commit


public class instest
{
static public void main(String args[]) throws Exception
{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection
conn = DriverManager.getConnection
“( jdbc:oracle:thin:@desktop:1521:ora10gr2”,
“scott”,”tiger”);
conn.setAutoCommit( false )
Statement sql_trace =
conn.createStatement();
sql_trace.execute
“( truncate table t”);
System.out.println“( Table truncated”);
sql_trace.execute
“( begin“ +
“ dbms_monitor.session_trace_enable( WAITS=>TRUE );”+
“end;”);
// create table t(x char(2000))
// create index t_idx on t(x)
PreparedStatement pstmt =
conn.prepareStatement
“( insert into t(x) values(?)”);
pstmt.setString( 1“, x”);
PreparedStatement commit =
conn.prepareStatement
“( commit work write batch nowait”);
//“ ( commit work write immediate wait”);
for( int i = 0; i < 1000; i++ )
{
pstmt.executeUpdate();
commit.executeUpdate();
}
conn.close();
}
}

<리스트2>에서 COMMIT WORK WRITE BATCH NOWAIT나 COMMIT WORK WRITE IMMEDIATE WAIT이 어떻게 사용되고 있는지 보자. 전자가 새로운 기능으로, 커밋이 끝날 때까지 기다리지 않고 커밋하는 방법을 보여 주고 후자는 이전에 수행되던 형태이다. 필자가 <리스트 2>에서 (CREATE TABLE은 INSERT 문 앞에서 참조를 위한 커멘트이다) 테스트 프로그램을 실행 했을 때, WAIT 옵션에서는 로그 파일 동기화를 위한 wait 으로 오랜 시간이 걸렸지만, NOWAIT 옵션에서는 wait time이 전혀 없었다. 그 결과는 <리스트 3>와 같다.


<리스트 3> WAIT와 NOWAIT 결과 비교


Event Waited On          Times Waited    Max. Wait Total Waited
----------------------- --------------- ---------- ------------
log file sync (nowait)             19       0.02         0.04
log file sync (wait)             1017       0.04         1.43

<리스트 3>의 결과를 보면, 로드 중간에 주기적으로 커밋을 필요로 하는 고속의 데이터 로드 프로그램에서는 상당한 차이가 나타날 수 있음을 예상할 수 있다.


Transport AWR Data


데이터베이스의 성능 문제를 분석하기 위해 AWR 데이터는 매우 중요하다. 하지만 운영 중인 데이터베이스에서 AWR 데이터를 분석하는 것이 불가능할 수 있는데, 이러한 경우 AWR 데이터를 별도의 저장소에 로드하고 성능 분석을할수있도록하는기능을Oracle Database 10g Release 2에서 제공하고 있다


Oracle Database 10g Release 2에 새로 추가된 DBMS_SWRF_INTERNAL 패키지가 바로 이기능을 가능하게 하는데, AWR_EXTRACT 프로시저를 이용하면 AWR 데이터를 Data Pump dmp 파일로 다운로드 할수있다.


s1 begin
2 DBMS_SWRF_INTERNAL.AWR_EXTRACT (
3 dmpfile =>‘ awr.dmp’,   // data pump export 파일 명
4 dmpdir =>‘ AWR_DIR’,    // dmp 파일이 기록되는
디렉토리 오브젝트
5 bid => 302,            // 시작 snapshot ID
6 eid => 305             // 끝 snapshot ID
7 );
8* end;

이제 awr.dmp 파일을 새로운 위치로 이동하고, DBMS_SWRF_INTERNAL 패키지의AWR_LOAD 프로시저를 이용하여 로드할 수 있다.


1 begin
2 DBMS_SWRF_INTERNAL.AWR_LOAD (
3    SCHNAME =>‘ AWRUSER’,
4    dmpfile =>‘ awr’,
5    dmpdir =>‘ AWR_DIR’
6 );
7* end;

AWRDIR 디렉토리 오브젝트에 정의된 디렉토리로 부터 awr.dmp 파일을 이용하여 AWR 데이터를 로드하는데, 이때 로드는 직접 SYS 스키마로 바로 로드되지 않고 중간에 스테이징용 스키마에 로드된다. 이후 스테이징 작업이 완료되면, 최종적으로 SYS 스키마로 데이터를 이동시키는 작업이 필요하다.


1 begin
2 DBMS_SWRF_INTERNAL.MOVE_TO_AWR (
3 SCHNAME =>‘ AWRUSER’
4 );
5* end;

이와 같은 방법으로 AWRUSER 스키마에서 SYS 스키마로 AWR 데이터를 이동한 후 성능 분석 작업을 하 면 되는 것이다.


AWR 데이타를 다른 데이터베이스로 이동하여 분석하는 것이 갖는 가장 큰 장점은 운영 데이터베이스에 영향 을 주지 않고 분석 작업을 수행할 수 있다는 것이다. 또한, 여러 데이터베이스로부터 수집된 AWR 데이터를 중앙집중적으로 관리할 수 있다는 장점도 있다


Transparent Data Encryption


이제Oracle Database 10g Release 2의 혁신적인 기능인 Transparent Data Encryption에 대해 살펴보자. 이것은 데이타를 쉽게 암호화할 수 있는 기능으로, 이 기능 덕분에 애플리케이션에서 더 이상 암호화 키를 다루지 않아도 된다. Transparent Data Encryption 기능은 데 이터베이스 레벨에서 칼럼 등에 대한 암호화 설정으로 자동 암호화 및 복호화를 지원한다. 데이터는 디스크에 저장될 때 암호화되어 저장되므로, 누군가가 데이터베이스를 훔치는 경우에 데이타는 보호될 수 있다. 아직 Transparent Data Encryption을 완전히 경험해 본 것은 아니지만, 잠깐 살펴본 결과 그 특징과 사용법을 소개하면 다음과 같다.


제일 먼저 해야 할 일은‘Wallet’을 설정하는 것이었다. 이 Wallet에 암호화 키가 저장될 것이고, 그 다음 이 파일은 패스워드로 보호될 것이다.


간단한 예제를 살펴보자. Oracle 홈에서‘wallet’이라는 디렉토리를 만들고, 다음 사항을 sqlnet.ora 파일에 기술한다.


WALLET_LOCATION=
(SOURCE=(METHOD=FILE)
(METHOD_DATA=
(DIRECTORY=/home/ora10gr2/wallet)
)
)

그 다음에는 Wallet을 열기만 하면 된다.


SQL> alter system
2 set encryption wallet open
3 identified by foobar;
System altered.

위작업은Transparent Data Encryption 기능을 사용하려면, 데이터베이스 오픈 후 반드시 해야 하는 작업이다.


이제 암호화 키를 셋업하도록 하자.


SQL> alter system
2 set encryption key
3 identified by foobar;
System altered.

여기서는 시스템이 키를 만들도록 했지만, 고유의 키를 만들 수도 있다. 이렇게 하면 이 시스템에서 또 다른 시스템으로 쉽게 데이터를 옮길 수 있다.


이상으로 간단한 셋업이 끝났고 이제 데이터를 암호화를 위한 작업을 시작해보자.


SQL> create table t
2 ( c1 varchar2(80),
3 c2 varchar2(80) encrypt )
4 tablespace test;
Table created.
SQL> insert into t values
2 ‘( this_is_unencrypted’,
3 ‘this_is_encrypted’);
1 row created.

이제 데이터는 암호화되어 디스크상에 저장되고, 권한 있는 사용자는 데이터 질의 시 데이터의 암호가 해제되어 리얼 데이터를 확인할 수 있게 된다.


SQL> select *
2 from t;
C1                            C2
--------------------------- -----------------------
this_is_unencrypted           this_is_encrypted

그렇다면, 데이터가 암호화되었다는 건 어떻게 확인 할 수 있을까? 오라클 데이터파일에서 특정 문자열과 grep을 사용해 그 문자열을 찾을 수 있는지 없는지 알아 보았다. 먼저, 암호화된 데이터가 들어 있는 블록이 디스 크에 저장되어 있는지부터 확인해 보았다.


SQL> alter system checkpoint;
System altered.

그 다음에 문자열들을 찾아보았다.‘ this_is’를 포함 하고 있는 암호화된 dbf 데이터파일에서 문자열을 찾아보 았다.


$ strings -a encrypt.dbf|grep this_is
this_is_unencrypted

보다시피,‘ this_is_unencrypted’문자열만 나타났다. 다른 문자열은 저장되기 전에 이미 암호화 되었기 때문에 볼 수가 없는 것이다.


이 간단한 예제는 새로운 암호화 기능의 빙산의 일각 에 불과하다. Transparent Data Encryption은 외부의 테이블 언로드, 데이터 펌프 등과도 잘 작동하며, Oracle Wallet Manager 같은 GUI 툴을 통해 Wallet과 Passwrd를관리할수있다. 또, 키 손상된 것 같으면, 명령어를 이용해 데이터를 리키 할(re-key) 수있다. 개인적으로 Transparent Data Encryption은 Oracle Database 10g Release 2에서 가장 훌륭한 기능 중 하나라고 생각한다.


Autotrace


Oracle Database 10g Release 2의 Autotrace 기능은 DBMS_XPLAN 패키지를 사용해 Explain Plan을 디스플레이 한다. 그래서, 이전 릴리즈에 비하여 더욱 상세한 Explain Plan을 제공한다. Oracle9i Database Release 2 이상부터는 DBMS_XPLAN 패키지를 사용 해 이러한 플랜을 구할 수 있었으나, Autotrace가 DBMS_XPLAN을 사용함으로써 작업이 한결 쉬워졌다. 이DBMS_XPLAN 아웃풋에서특징적인부분은플랜의 하단에 Predicate Information(where절 부분)이 추 가된 것으로, 오라클 데이터베이스가 where 절 구문을 어느 단계에서 어떻게 사용할 것인지 정확하게 보여주는 것으로, 상당히 훌륭한 기능이라고 생각한다<리스트 4>.


<리스트 4> Autotrace with DBMS_XPLAN


SQL> set autotrace traceonly explain
SQL> select *
2 from emp, dept
3 where emp.deptno = dept.deptno
4 and emp.job =‘ CLERK’;
Execution Plan
-------------------------------------------------------------
Plan hash value: 877088642
----------------------------------------------------------------
| Id | Operation | Name| Rows| Bytes | Cost (%CPU) | Time |
----------------------------------------------------------------
|0 |SELECT STATEMENT        | | 4 | 468 | 7 (15) | 00:00:01 |
|* 1 | HASH JOIN            | | 4 | 468 | 7 (15) | 00:00:01 |
|* 2 | TABLE ACCESS FULL| EMP | 4 | 348 | 3 (0)  | 00:00:01 |
| 3 | TABLE ACCESS FULL| DEPT | 4 | 120 | 3 (0)  | 00:00:01 |
-----------------------------------------------------------------
Predicate Information (identified by operation id):
-----------------------------------------------------------------
1 - access“( EMP”.”DEPTNO”=”DEPT”.”DEPTNO”)
2 - filte“r( EMP”.”JOB”=’CLERK’)
Note
--------
  - dynamic sampling used for this statement

DBMS_OUTPUT


DBMS_OUTPUT이 Oracle Database 10g Release 2에서 업그레이드되었다. 버퍼 사이즈를 무제한으로(100 만 바이트까지!) 정의할 수 있을 뿐 아니라 255 Character 이상의 라인도 프린트할 수 있다. 현재 최대 라인 길이는 32K이다. 다음은 DBMS_OUTPUT의 실제 활용 예 이다.


SQL> set serveroutput on -
> size unlimited
SQL> begin
2 dbms_output.put_line
3 ( rpad‘( *’,2000,’*’) );
4 end;
5 /
************************
...
************************
PL/SQL procedure successfully completed.

Oracle DataGuard Fast-Start Failover


Oracle Database 10g Release 2의 또 다른 신기능은 관리자가 일련의 명령어를 실행하거나 버튼을 누르지 않 아도 되는 스탠드바이 데이터베이스의 자동 페일오버이 다. Oracle Data Guard가 Production(Active) Server와 스토리지, 네트워크의 장애 발생시 스탠드바이 데이터베이스를 자동으로 페일오버하는 것이다.


Data Pump 압축


Oracle Database 10g Release 1이처음나왔을때희 소식은 완전히 새로 만들어진 Export (EXP), Import (IMP) 유틸리티와 EXPDP, IMPDP의 새로운 Oracle Data Pump 유틸리티였다. 하지만, EXPDP와 IMPDP 툴은 엑스포트 중에 DMP 파일들을 압축할 수 없다는 한 가지 단점이 있었다. EXPDP의 경우, 먼저 DMP 파일을 만든 후 이를 압축해야 했다. 예전의 EXP 툴에서는 지정된 파이프에 데이터를 기록하고, 그 파이프 에 기록된 데이터를 압축하도록 명령할 수 있었던 것에 비 하면, 이것은 분명 원하지 않던 단점이었다. 그러나, 이제 그런 번거로움이 없어졌다.


다행히도Oracle Database 10g Release 2에서는 이전 툴과 비교해 훨씬 쉽게 DMP 파일을 만들면서 부분 압축할 수 있게 되었다. EXPDP 스스로 덤프 파일에 씌 어진 모든 메타 데이터를 압축할 것이고, IMPDP는 자동 으로 압축 해제할 것이다. 또한, Oracle Database 10g Release 2에서처음으로Windows 플랫폼에서의DMP 파일 부분 압축이 가능하게 되었다.


LOG ERRORS


Log Errors는 Oracle Database 10g Release 2의 Delete, Insert, Merge 및 Update 문에서 볼 수 있는 새로운 구문이다. Log Errors는 많은 로우의 벌크 처리 시 실행에 실패한 로우들을 저장할 수 있도록 해준다. 이 전에는 문장 전체를 에러 처리함으로써 성공한 로우 데이 터에 대해서 재작업을 해줘야 하는 비효율성이 있었다.


예를들어, Insert Into T Select A,B,C From T2 Log Errors Into Errlog(‘ Bad_Rows_For_T’) Reject Limit Unlimited 같은 문장을 만들 수 있다.


이 문장은 조건에 위배되는 로우도 Bad_Rows_For _T 테이블에 로깅할 수 있도록 해준다. 이를테면, 너무 긴 칼럼 값 때문에 생긴 에러, Constraint Violation(Not Null, unique, referential, check constraint), 트리거실행중발생한에러, Type Conversion 에러, 파티 션 매핑 에러 등을 로깅할 수 있다. 에러가 발생하면, 이 에 러를 야기한 로우는 오라클 에러 번호, 에러 메시지 텍스트, 작업 유형(Insert, Update 또는 Delete) 그리고 Update 및 Delete 작업 중 실패한 로우의 RowID와 함께‘bad’테이블에 로그된다.


필자는 Oracle Database 10g Release 2의 여러 새 기능들 중 이 기능을 특히 좋아하게 될 것 같다. 각각의 로우를 일일이 처리하는 대신 벌크 작업을 수행하면 속도 와 자원 활용 면에서 큰 혜택을 볼 수 있을 것이다. 그리고, 실패한 로우의 에러 로깅은 이전부터 늘 요구되는 기능이 었는데, 이제 Log Errors로 완전히 해결되었다.


Restore Points


Oracle Database 10g Release 2에는Restore Point 를 설정할 수 있는 기능이 있다. Oracle Database 10g Release 1에서 데이터베이스를 플래시백할 수 있는 기능이 처음 소개되었지만, SCN(System Change Number) 과 플래시백할 시점을 알아내야 했다. 그러나, Oracle Database 10g Release 2에서는 먼저 Restore Point‘ X’를 생성하고, 손상을 입힐 만한 일, 예를 들어 애플리케이션의 업그레이드 같은 일을 수행 한 뒤, 업그레이드가 실패한 경우 간단하게Flashback Database To Restore Point‘ X’를 실행하면 작업 전의 상태로 돌아가는 것이다. 이제 더 이상 플래시백을 위한 SCN을 찾기 위 해 Select문을 실행하거나 플래시백 시점을 추정할 필요가 없게 된 것이다.


요약


이상은 Oracle Database 10g Release 2의 새 기능들 중 일부를 간략하게 훑어본 것이다. 위의 기능들과 언급하 지 못한 심도 깊고 다양한 Oracle Database 10g Release 2의 신기능들을 독자 여러분들이 직접 체험할 수 있기를 바란다.


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

출처명: 한국오라클'

Posted by 1010
02.Oracle/DataBase2008. 10. 23. 15:29
반응형

Oracle Database 11g:
DBA와 개발자가 알고 있어야 하는 새로운 기능

저자 - Arup Nanda Oracle ACE Director

Data Guard

Active Data Guard가 어떻게 실시간 쿼리를 통해 스탠바이 환경에 대한 투자를 가치 있게 만들면서, 물리적 스탠바이 데이터베이스를 스냅샷 스탠바이로 변환해, 아카이브 로그 및 많은 새로운 향상된 기능을 인프라에 적용하는지 자세한 정보를 알아 보겠습니다.

Download Oracle Database 11g 다운로드

Oracle Database 11g에는 책 한 권을 채울 수 있을 만큼 많은 Data Guard의 향상된 기능이 있습니다. 따라서 모든 향상된 기능을 자세히 밝히기는 불가능합니다. 대신 가장 흥미롭다고 생각되는 것을 중심으로 설명하도록 하겠습니다.

보다 간편하진 스탠바이 데이터베이스 생성

이제 시작합니다. 먼저 물리적 스탠바이 데이터베이스의 생성입니다. Oracle Database 11g에서, 이 프로세스는 RMAN 커맨드 하나면 족할 정도로 무척 간편해졌습니다. 이전에는, 2대의 머신 사이에 Data Guard를 설정하려면, Grid Control 마법사 인터페이스를 사용했습니다. 이 글을 작성하고 있는 시점 에서는, Oracle Enterprise Manager Grid Control 11g는 아직 사용할 수 없고, Database Control도 Data Guard를 위한 마법사를 가지고 있지 않습니다. 그러나 SQL 커맨드 사용 경험의 유무에 상관없이, Oracle Database 11g에, Data Guard 환경을 설정하는 것은 어렵지 않습니다. 이는 너무 단순해 여기서 모든 단계를 설명할 수 있습니다.

prolin11로 명명된 기본 데이터베이스가 prolin1이라는 서버에서 운영되고 있다고 가정합니다. 스탠바이 데이터베이스는 prolin2라는 서버에 설정하려고 합니다. 스탠바이 데이터베이스 인스턴스의 명칭은 pro11sb입니다. 단계는 다음과 같습니다:

  1. 이미 가지고 있는 경우가 아니라면, 우선, prolin1에 spfile을 생성합니다.
    SQL> create spfile from pfile;
    
    이 단계는 필수적인 것은 아니지만, 프로세스를 쉽게 해주는 이점이 있습니다. 데이터베이스 생성 후, spfile을 사용하기 위하여 prolin11 데이터베이스를 다시 시작합니다

  2. 스탠바이 재실행 로그 생성은 필수적인 것은 아니지만, 그렇게 하는 것이 좋습니다. 스탠바이 재실행 로그는 기본 데이터베이스에 발생하는 변화를 거의 실시간으로 스탠바이에 반영되도록 하는데, 이것이 Real Time Apply (RTA)라는 개념입니다. 따라서, 우리는 여기서 기본 데이터베이스에 스탠바이 재실행 로그를 생성할 것입니다 (스탠바이 재실행 로그는 기본 데이터베이스에 생성된다는 것을 잊지 마십시오. RMAN이 이 일을 할 것입니다):
    SQL> alter database add standby redo logfile group 4 
      2> (‘+DG1/sby_redo01.rdo') size 50M;
    SQL> alter database add standby redo logfile group 5 
      2> (‘+DG1/sby_redo02.rdo') size 50M;
    SQL> alter database add standby redo logfile group 6 
      2> (‘+DG1/sby_redo03.rdo') size 50M;
    SQL> alter database add standby redo logfile group 7 
      2> (‘+DG1/sby_redo04.rdo') size 50M;
    
    이를 통해 4개의 스탠바이 재실행 로그 그룹이 생성됩니다.

  3. prolin2 서버의 listener.ora 파일에 pro11sb를 위한 입력을 합니다:
    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (GLOBAL_DBNAME = pro11sb) 
          (ORACLE_HOME = /opt/oracle/product/11g/db1)
          (SID_NAME = pro11sb) 
        )
      )
     
    LISTENER =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = prolin2)(PORT = 1521))
      )
    
  4. 리스너를 실행하려면 재로딩합니다
  5. prolin1에서, $ORACLE_HOME/network/admin: 하부의 tnsnames.ora 파일에 pro11sb 데이터베이스를 위한 입력을 합니다 :
    PRO11SB =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = prolin2)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SID = pro11sb)
        )
      )
    
  6. prolin2에서, Oracle Home/dbs 디렉토리에 1 라인을 포함하는 initodba11sb.ora 파일을 생성합니다:
    db_name=prolin11
    
    이는 스탠바이 인스턴스를 위한 초기화 파일로 기능할 것입니다; 파라미터의 나머지는 우리가 나중에 보게 될 RMAN 커맨드에 의해 자동 입력됩니다.

  7. prolin2에서, $ORACLE_BASE/admin 디렉토리 갑니다. 여기에 pro11sb라는 이름의 디렉토리를 생성한 다음, 스탠바이 인스턴스에 대한 감사 파일을 보유하기 위하여 pro11sb 내에 adump라는 이름의 디렉토리를 생성합니다.

  8. prolin1의 $ORACLE_HOME/dbs 디렉토리 하부에서, 흔히 orapworadba11로 명명되는 인스턴스 패스워드 파일을 볼 수 있습니다. 이 파일을 볼 수 없다면 (가능성은 희박하지만), 이를 생성합니다. 다음 그 파일을 prolin2의 $ORACLE_HOME/윤 하부로 복사합니다. 이를 orapwodba11sb 파일로 복사합니다. 이렇게 하면 기본 데이터베이스의 sysdba 연결 패스워드를 스탠바이에도 적용할 수 있습니다.

  9. prolin2에서, NOMOUNT 상태의 인스턴스 pro11sb를 실행합니다:
    $ sqlplus / as sysdba
    SQL> startup nomount
    
    이는 인스턴스를 실행하지만 아무것도 마운팅하지 않습니다.

  10. 이제 모든 초기화 준비가 완료되었으므로, 스탠바이 데이터베이스를 생성할 강력한 RMAN 스크립트를 호출합니다. prolin1에서, RMAN을 가동해 다음 스크립트를 실행합니다. 이를 파일에 저장하고 RMAN 프롬프트에서 스크립트를 실행하는 것은 매우 쉽습니다.
    connect target sys/oracle123@prolin11
    connect auxiliary sys/oracle123@pro11sb
     
    run {
       allocate channel c1 type disk;
       allocate auxiliary channel s1 type disk;
     
       duplicate target database
            for standby
            from active database
            dorecover
            spfile
            parameter_value_convert 'prolin11','pro11sb'
            set db_unique_name='pro11sb'
            set db_file_name_convert='/prolin11/','/pro11sb/'
            set log_file_name_convert='/prolin11/','/pro11sb/'
            set control_files='/oradata/pro11sb/control01.ctl'
            set fal_client='pro11sb'
            set fal_server='prolin11'
            set standby_file_management='AUTO'
            set log_archive_config='dg_config=(prolin11,pro11sb)'
            set log_archive_dest_2='service=prolin11 LGWR ASYNC valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=pro11sb'
            set log_archive_dest_state_2='enable'
            set log_archive_format='pro11sb_%t_%s_%r.arc'
       ;
      sql channel c1 "alter system archive log current";
      sql channel s1 "alter database recover managed standby database using current logfile disconnect";
    }
    
    이 스크립트는 스탠바이 데이터베이스를 생성하고, 적절한 파라미터를 스탠바이 데이터베이스를 위한 spfile에 배치하고, 스탠바이 데이터베이스를 위한 진단 데스티네이션을 생성하고, 스탠바이를 다시 시작합니다. 이 작업의 정확한 구조를 이해하려면, 여기서 RMAN 커맨드의 아웃풋을 볼 필요가 있습니다.

    아래의 2 라인은 기본 및 스탠바이 인스턴스에 연결됩니다:

    connect target sys/oracle123@prolin11;
    connect auxiliary sys/oracle123@pro11sb;
    
    패스워드 파일을 스탠바이 호스트에 복사했기 때문에, SYS 패스워드는 동일하게 남아 있으며 따라서 스탠바이 인스턴스에 연결은 (마운팅 데이터베이스가 없지만) 성공적입니다. 다음으로, 다음과 같은 라인들이 실행됩니다:
    duplicate target database for standby from active database
         spfile
            parameter_value_convert 'prolin11','pro11sb'
            set 'db_unique_name'='pro11sb'
            set 'db_file_name_convert'='/prolin11/','/pro11sb/'
            ... and so on ...
    
    duplicate target database 커맨드는 우선 원격 서버에 있는 SQL*Net를 통해 기본 데이터베이스의 이미지를 복사함으로써 기본 데이터베이스로부터 스탠바이를 생성합니다. 복사가 완료되면, 내부적으로 커맨드를 발령하여 (switch clone datafile all;), 스탠바이 데이터베이스를 클론으로 만듭니다. 스크립트의 세트 커맨드가 스탠바이 인스턴스를 위한 SPFILE의 파라미터를 설정하며, 이 데이터베이스가 스탠바이 데이터베이스가 됩니다. 다시 말하지만, RMAN 아웃풋은 배후 활동에 대한 모든 정보를 제공합니다.
물리적 스탠바이 데이터베이스를 구축하는 것이 매우 쉽다는 것을 알아 두십시오. 이는 스크립트를 실행하는 것만큼이나 간단합니다!

Active Data Guard

물리적 스탠바이 데이터베이스를 사용하여 Data Guard 환경을 구현할 때 오랫동안 장애로 남아 있던 것 중의 하나는 스탠바이 데이터베이스의 수동성이었습니다. Oracle Database 10g 및 그 이전에는, 물리적 스탠바이 데이터베이스를 복구 프로세스를 멈춘 후에만, 읽기 전용 (말하자면, 리포팅 부담을 줄이기 위해)으로 개방했습니다. 이들 제품에서, Data Guard가 DR 솔루션의 일부이었다면, 뒤처지는 것이 두려워 오랫동안 복구 프로세스를 멈출 수 없었을 것이며, 따라서 물리적 스탠바이 데이터베이스는 읽기 전용을 위한 것이 아니라면, 당연히 무용지물이었을 것입니다

Oracle Database 11g로, 이제 상황이 변했습니다: 물리적 스탠바이 데이터베이스를 읽기 전용 모드로 개방하고 복구 프로세스를 다시 시작할 수 있습니다. 이는 기본 데이터베이스를 지속적으로 사용하면서 리포팅을 위해 스탠바이를 사용할 수 있다는 것을 의미합니다. (이전 버전의 경우와 마찬가지로, 스탠바이에서 백업도 할 수 있습니다.) 이것이 어떻게 이루어지는지 살펴 보겠습니다.

우선, 스탠바이 복구 관리를 취소합니다:

SQL> alter database recover managed standby database cancel;

Database altered.
다음, 데이터베이스를 읽기 전용으로 개방합니다:
SQL> alter database open read only;
 
Database altered.
여기까지는, 프로세스가 11g 이전 버전과 동일합니다. 이제, 11g의 정점을 살펴 보도록 하겠습니다: 스탠바이 데이터베이스가 읽기 전용으로 개방되어 있는 동안, 복구 프로세스 관리를 다시 시작할 수 있습니다.
SQL> alter database recover managed standby database disconnect;
 
Database altered.
이제 스탠바이 데이터베이스는 복구 관리 모드로 배치되어, 개방되어 있는 동안, 로그 파일을 적용합니다. 어떻게 이를 확인할 수 있을까요? 간단합니다; 단지 기본 데이터베이스의 최장 시퀀스 번호를 스탠바이의 그 것과 비교하면 됩니다. 기본 데이터베이스에서, 로그 변환을 하여 최장 시퀀스 번호를 확인합니다:
SQL> alter system switch logfile;
 
System altered.

SQL> select max(Sequence#) from v$log;
 
MAX(SEQUENCE#)
--------------
            79
로그 변환은 스탠바이가 읽기 전용 모드로 개방되어 있는 동안 진행됩니다. 스탠바이의 최장 시퀀스를 확인합니다:
SQL> select max(Sequence#) from v$log;
 
MAX(SEQUENCE#)
--------------
            79
이것 역시 79로 기본과 같습니다. 이는 로그 애플리케이션이 여전히 작업 중이라는 것을 보여줍니다. 여기서 이는 단순히 로그가 적용되고 있다는 것만을 보여주는 것이 아니냐는 의문이 생길 수 있습니다. 기본에서 진행되는 변화가 이 모드에서 보일까요? 확인해 보겠습니다. 기본에서, 테이블을 생성합니다:
SQL> create table test2 (col1 number);
 
Table created.
...그리고 나서 몇 개의 로그 변환을 하고 이들 로그가 스탠바이에 적용될 때까지 기다립니다. 다음으로 스탠바이 데이터베이스를 확인합니다:
SQL> desc test2
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------------------
 COL1                                               NUMBER
Presto! 테이블이 스탠바이에 생성되고, 쿼리가 가능해졌습니다.

이 경우, 기본에서 생긴 변화를, 네트워크가 사용 가능하다면, 스탠바이에 즉각 나타나게 해주는 Real Time Apply를 사용할 수 있었다는 것을 기억하십니까? RTA는 ADG에 필수적인 것은 아니지만, 기본에 생긴 최근의 변화를 보고자 할 때, ADG가 보다 유용한 것이 되도록 해줍니다

보안과 관련해선, 걱정할 것이 없습니다. 데이터베이스는 읽기 전용 모드에 있기 때문에, 아무것도 여기에 쓸 수 없습니다. 만약 audit_trail 파라미터가 기본에서 DB로 설정되어 있다면 (Oracle Database 11g에서의 디폴트), 스탠바이에서도 동일하지만, 일기 전용이기 때문에, 감사 추적을 쓸 수는 없습니다

알림 로그에 나타난 라인을 보십시오:

AUDIT_TRAIL initialization parameter is changed to OS, as DB is NOT compatible for database opened with read-only access
아하! 감사 추적은 멈추지 않습니다; 오히려, 데이터베이스가 개방되었을 때, OS 파일로 자동 전환됩니다. 스탠바이 데이터베이스를 활성화하면, audit_trail은 DB로 자동 재설정됩니다.

스냅샷 스탠바이

일반적 시나리오를 생각해 보겠습니다: 새로운 애플리케이션을 데이터베이스에 배치 중이고, 데이터베이스 성능의 영향에 대해 알고 싶다고 합시다. Oracle Database 11g에는, SQL 구문을 캡처하고 이를 재생하는 완벽한 툴이 있지만 (Database Replay), 그 영향력을 직접 실행해 보고 확인해 볼 필요가 있습니다. 테스트 시스템을 캡처하더라도, 프로덕션 시스템에서 재생하는 것은 불가능합니다. 우선, 배치가 되지 않습니다, 또한, 배치된다고 하더라도, 애플리케이션으로 다른 테이블을 변경할 수 없습니다. 그러면 애플리케이션의 영향력을 확인하려면 어떻게 해야 할까요?

완벽한 답은 물리적 스탠바이 데이터베이스를 업데이트가 가능한 스냅샷 스탠바이 데이터베이스로 임시 변환할 수 있는 Oracle Database 11g입니다. 이 모드에서, 애플리케이션을 운영할 수 있고—많은 테이블 변경 가능—그 영향력을 평가할 수 있습니다. 영향력을 평가한 후, 데이터베이스를 정상적 복구가 진행되고 있는 스탠바이로 변환할 수 있습니다. 이는 정해진 지점으로 플래시백하여 모든 변화를 원상 복구하는 플래시백 데이터베이스 기능을 사용하여 데이터베이스 복구 지점을 생성함으로써 가능합니다. 이 작업이 어떻게 진행되는지 알아보겠습니다:

우선, 이미 진행되고 있는 경우가 아니라면, 스탠바이에서 복구를 시작합니다:

SQL> alter database recover managed standby database disconnect;

Database altered.
복구가 몇 개의 로그 파일을 선정할 때까지 기다립니다. 그리고 복구를 중단합니다.
SQL> alter database recover managed standby database cancel;
 
Database altered.
여기서, 스냅샷 스탠바이 데이터베이스를 생성할 수 있습니다. 이것은 플래시백 로깅을 가능하게 하기 때문에, 플래시 복구 영역을 구성하지 않으면, 다음과 같은 메시지를 받게 됩니다:
ORA-38784: Cannot create restore point 'SNAPSHOT_STANDBY_REQUIRED_01/12/2008
00:23:14'.
ORA-38786: Flash recovery area is not enabled.
이를 피하기 위해서는, 미리 플래시 복구 영역을 생성해야 합니다. 이미 그렇게 하지 않았다 하더라도, 걱정할 필요는 없습니다. 지금 생성하면 되기 때문입니다:
SQL> alter system set db_recovery_file_dest_size = 2G;
 
System altered.
 
SQL> alter system set db_recovery_file_dest= '/db_recov';
 
System altered.
이제 절차를 마쳤으므로, 다음과 같은 간단한 커맨드를 사용해 스탠바이 데이터베이스를 스냅샷 스탠바이로 변환할 수 있습니다:
SQL> alter database convert to snapshot standby;

Database altered.
이제 데이터베이스를 리사이클링합니다:
SQL> shutdown immediate
ORA-01507: database not mounted
...
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
이제 데이터베이스가 읽기/쓰기 작업을 위해 개방되었습니다:
SQL> select open_mode, database_role
  2  from v$database;
 
OPEN_MODE  DATABASE_ROLE
---------- ----------------
READ WRITE SNAPSHOT STANDBY
이제 데이터베이스를 변경할 수 있습니다. 여기가 Database Replay를 사용하여 캡처한 작업을 재생할 최적의 지점입니다. 이제 데이터베이스에서 시스템을 변경하고 변화의 영향력을 보기 위하여 몇 차례 재생할 수 있습니다. 이것은 프로덕션 데이터베이스의 복사본이므로, 재생은 해당 작업을 정확하게 재현합니다.

테스트가 완료되면, 스냅샷 스탠바이 데이터베이스를 정상적인 물리적 스탠바이 데이터베이스로 변환합니다. 다음과 같은 단계를 거칩니다:

SQL> connect / as sysdba
Connected.	
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
 
...
Database mounted.
SQL> alter database convert to physical standby; 
 
Database altered.
이제 끄고, 데이터베이스를 마운팅하고 복구 관리를 시작합니다.
SQL> shutdown
ORA-01507: database not mounted
 
 
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
...
Database mounted.
Start the managed recovery process:
SQL> alter database recover managed standby database disconnect;
이제 스탠바이 데이터베이스가 복구 관리 모드로 복귀했습니다. 당연히, 데이터베이스가 스냅샷 스탠바이 모드에 있으면, 기본의 아카이브 로그가 적용되지 않습니다. 이것은 지금 적용되며 작업 완료까지 몇 분 걸립니다.

스냅샷 스탠바이 데이터베이스는 스탠바이 데이터베이스를 사용하여 프로덕션 데이터베이스의 변화를 사전에 정확히 예상할 수 있습니다. 그러나 이게 전부가 아닙니다. 또 다른 장점이 있습니다. 기본에서 생긴 변화를, 네트워크가 사용 가능하다면, 스탠바이에 즉각 나타나게 해주는 Real Time Apply를 사용할 수 있었다는 것을 기억하십니까? 누군가 기본 데이터베이스에서 대규모 업데이트를 하거나 일부 코드를 변경하는 등 실수를 한다면 어떻게 될까요? 이전 버전에서, 이 같은 실수가 스탠바이로 확산되는 것을 방지하기 위하여, 신중하게 스탠바이 데이터베이스에서 딜레이를 사용합니다. 그러나 딜레이로 인해, 스탠바이가 올바로 작동하지 않거나 프로덕션의 활성 카피로 사용될 수 없을 수 있습니다.

더 이상은 필요 없습니다. 스탠바이 데이터베이스를 플래시백할 수 있기 때문에, 딜레이를 유지하고 있을 필요가 없습니다. 문제가 있다면, 언제든지 이전 상태로 플래시백할 수 있습니다.

물리적 스탠바이에서 논리적 스탠바이로의 변환

이제 물리적 스탠바이 데이터베이스를 논리적인 것으로 쉽게 변환할 수 있습니다. 다음 단계를 거칩니다:

  1. 스탠바이 데이터베이스는 어딘가로부터 데이터 딕셔너리 정보를 가져올 필요가 있습니다. 딕셔너리 정보는 기본의 재실행 스트림에 배치되어야 합니다. 따라서, 기본 데이터베이스에서, 다음과 같이 하여 딕셔너리를 위한 LogMiner 테이블을 만듭니다:
    SQL> begin 
      2    dbms_logstdby.build;
      3  end;
      4  /
     
    PL/SQL procedure successfully completed.
    
  2. 스탠바이에서, 복구 관리 프로세스를 멈춥니다
    SQL> alter database recover managed standby database cancel;
    
    Database altered.
    
  3. 이제, 스탠바이에 커맨드를 입력해 이를 논리적인 것으로 변환합니다:
    SQL> alter database recover to logical standby pro11sb;
     
    Database altered.
    
    1 단계를 실행하지 않았다면, 위의 커맨드는 딕셔너리 정보가 없기 때문에, 멈춰 있을 것입니다. 이 경우 여기서 1 단계를 실행하면 됩니다. RTA를 실행했다면, 정보는 스탠바이 데이터베이스에 즉각 정보가 나타날 것입니다.
  4. 기본의 몇 가지 로그 변환을 통해 아카이브 로그를 생성해 스탠바이로 보내야 합니다:
    SQL> alter system switch logfile;
     
    System altered.
    
  5. 잠시 후, 스탠바이에서, 데이터베이스 변경 커맨드가 완료되는 것을 볼 수 있습니다. 이제 스탠바이가 논리적인 것으로 변했습니다. 알림 로그에서 다음과 같은 것이 나타납니다:
    RFS[12]: Identified database type as 'logical standby'
    
  6. Recycle the database:
    SQL> shutdown
    ORA-01507: database not mounted
    ORACLE instance shut down.
    SQL> startup mount
    ORACLE instance started.
     
    Total System Global Area 1071333376 bytes
    ...
    Database mounted.
    SQL> alter database open resetlogs;
     
    Database altered.
    
  7. 이제 논리적 스탠바이로 되었으므로, SQL Apply 프로세스를 시작해야 합니다
    SQL> alter database start logical standby apply immediate;
    
SQL> alter database start logical standby apply immediate; 논리적 스탠바이 데이터베이스가 이제 완전 작동합니다! 일단 물리적 스탠바이를 논리적인 것으로 변환하면, 다음에서 설명할 특수 구문 ("keep identity")을 사용하지 않는 한 ,이를 다시 물리적인 것으로 변환할 수 없습니다.

롤링 업데이트

DBA의 업무에서 어려운 점은 업그레이드를 위해 꽤 오랜 시간 데이터베이스를 내려야 하는 정당성을 밝히는 것입니다. Oracle Database 11g에서는, 롤링 업데이트를 통해 어떠한 유형의 스탠바이 데이터베이스라도 가지고 있다면, 이 일은 매우 쉬어집니다:

  1. 스탠바이를 업그레이드합니다.
  2. 애플리케이션을 스탠바이로 옮깁니다.
  3. 기본을 업그레이드합니다.
  4. 애플리케이션을 다시 본래의 기본으로 옮깁니다.
이것이 논리적 스탠바이라면, 스탠바이가 단지 기본의 SQL을 적용하면 되기 때문에, 프로세스가 매우 간편합니다. SQL이 적용되면, 업그레이드는 해당 데이터베이스에서 쉽게 이루어집니다. 복구를 멈추고, 스탠바이를 업그레이드하고, 복구를 진행한 후, 스탠바이를 기본으로 변환할 수 있습니다. 나중에, 본래의 기본을 업그레이드 할 스탠바이로 만들 수 있습니다. 마지막으로, 역할을 바꿔, 본래의 기본을 새로운 기본으로 만들 수 있습니다.

그러나, 많은 스탠바이 데이터베이스는 사용 및 관리의 간편성을 위해 본질적으로 물리적입니다. 스탠바이가 논리적이 아니라 물리적이라면, 단계는 거의 흡사합니다. 스탠바이를 임시로 논리적으로 변환한 후 다시 물리적으로 변환하는 것입니다. 여기서 중요한 것은 영구적이 아니라 임시로라는 것입니다. 따라서, 다음과 같이 "keep identity"구문을 가진 변환 커맨드를 입력합니다:

SQL> alter database recover to logical standby keep identity;
 
Database altered.
보다 자세한 내용은 문서에서 확인할 수 있습니다.

기타 개선 사항

Data Guard 프로세스 자체에 몇 가지 중요한 개선 내용이 있습니다:

재실행 압축

Data Guard는 기본의 아카이브 로그를 스탠바이 데이터베이스 서버로 옮겨 이를 해당 데이터베이스에 적용한다는 전제를 가지고 있습니다. 기본과 스탠바이 사이의 시간 지체의 핵심 요소의 하나는 아카이브 로그를 옮기는 시간입니다. 이는 재실행 스트림을 압축하면 어느 정도 줄일 수 있습니다.

Oracle Database 11g에서는 TRUE로 설정된 파라미터 압축을 사용하여 SQL*Net를 통해 스탠바이 서버 전체를 경유하는 재실행 스트림을 압축할 수 있습니다. 이는 오로지 갭 해소 중에 옮겨지는 로그를 위한 것입니다. 이 문서의 앞부분에 제시된 사례에서 압축을 할 때 사용할 수 있는 커맨드는 다음과 같습니다.

alter system set log_archive_dest_2 = 'service=pro11sb LGWR ASYNC 
valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=pro11sb compression=enable'

네트 타임 아웃

Data Guard 환경은 데이터베이스 인스턴스 연결을 통해 재실행 데이터를 스탠바이 서버로 보내 작동시킨다. 인스턴스가 시간 내 응답하지 않으면, 로그 전송 서비스는 지정된 타임 아웃 값을 기다린 후 중단합니다. 이 타임 아웃 값은 Oracle Database에 net_timeout이라는 파라미터를 사용해 설정할 수 있습니다. 최대 보호 모드에서, 로그 전송 서비스는 중단 전 20회의 재시도를 합니다.

그러나 우선 로그 전송에서 얼마만큼의 딜레이가 존재하는지 알아야 합니다. 새로운 뷰 v$redo_dest_resp_histogram에 막대 그래프 모양으로 시간이 나타납니다:

SQL> desc v$redo_dest_resp_histogram
 Name                   Null?    Type
 ---------------------- -------  --------------
 DEST_ID                         NUMBER
 TIME                            VARCHAR2(20)
 DURATION                        NUMBER
 FREQUENCY                       NUMBER
 
뷰는 해당 버킷에서 전송 시간 측정 결과를 보여줍니다. 작동 후 며칠 후 뷰를 조사해 보면, 타임 아웃에 설정에 대한 구상을 할 수 있을 것입니다. 다음과 같이 하여 타임 아웃 값을 설정할 수 있습니다:
alter system set log_archive_dest_2 = 'service=pro11sb LGWR ASYNC 
valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=pro11sb compression=enable net_timeout=20'
다시 한 번 말하지만, 이는 앞에서 제시한 사례와 관련된 것입니다. 파라미터 값의 "net_timeout=20" 구문을 기억해 두십시오.

동적 변경 가능 파라미터

논리적 스탠바이 데이터베이스 환경 운영 프로세스에서, 프로세스를 튜닝하고 일부 파라미터 값을 조정할 필요가 있습니다. Oracle Database 11g에서, 이들 대부분의 파라미터는 온라인에서 업데이트할 수 있습니다. 뷰 dba_logstdby_parameters를 쿼리하면 이를 알 수 있습니다.

col name format a30
col value format a10
col unit format a10
col setting a6
col setting format a6
col dynamic format a7
select *
from dba_logstdby_parameters
order by name
/

NAME                           VALUE      UNIT       SETTIN DYNAMIC
------------------------------ ---------- ---------- ------ -------
APPLY_SERVERS                  5                     SYSTEM YES
EVENT_LOG_DEST                 DEST_EVENT            SYSTEM YES
                               S_TABLE
LOG_AUTO_DELETE                TRUE                  SYSTEM YES
LOG_AUTO_DEL_RETENTION_TARGET  1440       MINUTE     SYSTEM YES
MAX_EVENTS_RECORDED            10000                 SYSTEM YES
MAX_SERVERS                    9                     SYSTEM YES
MAX_SGA                        30         MEGABYTE   SYSTEM YES
PREPARE_SERVERS                1                     SYSTEM YES
PRESERVE_COMMIT_ORDER          TRUE                  SYSTEM NO
RECORD_APPLIED_DDL             FALSE                 SYSTEM YES
RECORD_SKIP_DDL                TRUE                  SYSTEM YES
RECORD_SKIP_ERRORS             TRUE                  SYSTEM YES
RECORD_UNSUPPORTED_OPERATIONS  FALSE                 SYSTEM YES
칼럼 DYNAMIC이 값을 동적으로 변경 가능한지를 보여 준다는 사실을 기억해 두십시오. 거의 모든 파라미터는 동적입니다. 예를 들어, 스탠바이를 멈추지 않고 파라미터 APPLY_SERVERS를 변경하려면, 다음과 같이 합니다.
SQL> begin
  2     dbms_logstdby.apply_set('APPLY_SERVERS',2);
  3  end;
  4  /
이는 apply_servers 값을 2로 설정하는데, 이는 스탠바이를 멈추지 않고 할 수 있습니다.

SQL Apply 이벤트 테이블

Oracle Database 10g에서, SQL Apply와 관련된 이벤트는 알림 로그에 작성되는데, 알림 혹은 리포팅 확인을 위하여 스크립트를 작성하는 편이 좋기 때문에, 그다지 유용한 것이 못됩니다. Oracle Database 11g에서, 이벤트는 디폴트로 SYSTEM 스키마의 새로운 테이블 LOGSTDBY$EVENTS에 작성되도록 되어 있습니다. 다음은 샘플 쿼리입니다:

select event_time, error
from system.logstdby$events
order by 1;
The output:
EVENT_TIME                    ERROR
----------------------------- -------------------------------------------------
13-JAN-08 11.24.14.296807 PM  ORA-16111: log mining and apply setting up
13-JAN-08 11.24.14.320487 PM  Apply LWM 2677727, HWM 2677727, SCN 2677727
14-JAN-08 07.22.10.057673 PM  APPLY_SET: APPLY_SERVERS changed to 2
14-JAN-08 07.22.11.034029 PM  APPLY_SERVERS changed to 2
14-JAN-08 07.45.15.579761 PM  APPLY_SET: EVENT_LOG_DEST changed to DEST_ALL
14-JAN-08 07.45.16.430027 PM  EVENT_LOG_DEST changed to DEST_ALL
여러 가지 이유로, 이 이벤트를 테이블에 가지고 있는 것이 좋습니다. 예를 들면, 조작 및 리포팅이 간편해집니다. 그러나 때로는, 특히 오류 및 메시지 알림 로그를 스캐닝하기 위한 모니터링 툴을 구현했다면, 이를 알림 로그에서 보는 것도 괜찮습니다. 이는 논리적 스탠바이 데이터베이스 적용 파라미터 "event_log_dest"를 "DEST_ALL"로 설정하면 가능해집니다:
begin
   dbms_logstdby.apply_set('EVENT_LOG_DEST','DEST_ALL');
end;
이는 동적으로 이루어지며, 이벤트는 테이블과 알림 로그 모두에 전달됩니다. 이 커맨드를 입력한 후, 알림 로그를 확인할 수 있습니다. 많은 SQL Apply 이벤트와 더불어 최소한 다음의 2 라인이 보일 것입니다:
LOGSTDBY: APPLY_SET: EVENT_LOG_DEST changed to DEST_ALL
LOGSTDBY status: EVENT_LOG_DEST changed to DEST_ALL

결론

우선, 우리는 활성 기본 데이터베이스로부터 물리적 스탠바이 데이터베이스를 구현하는 것이 별 것 아니라는 것을 알게 되었습니다. 또한, 물리적 스탠바이를 논리적으로 변환하는 것이 매우 간단하다는 것도 알게 되었습니다. 이 사실로부터 누릴 수 있는 최대의 장점은 스탠바이 데이터베이스를 어떤 방식으로든 비즈니스 지원을 위해 사용할 수 있다는 것입니다. Active Data Guard 기능은 스탠바이 데이터베이스를 개방해 아카이브 로그가 적용되는 동안 쿼리를 허용합니다. 스냅샷 스탠바이 데이터베이스는 데이터베이스에서 프로덕션 데이터베이스 로딩을 허용한 후 정상적 복구 관리 프로세스를 다시 시작하도록 처음 시작했던 지점으로 플래시백합니다. 이들 2가지 기능은 스탠바이 서버의 프로세싱 기능을 활용할 수 있도록 허용하기 때문에 11g로의 업그레이드를 위한 강력한 촉매 역할을 할 것입니다.

"Oracle Database 11g: DBA와 개발자가 알고 있어야 하는 새로운 기능" 홈페이지로 돌아가기


Arup Nanda Arup Nanda (arup@proligence.com)는 Starwood Hotel and Resorts의 데이터베이스 시스템 매니저로 12년이 넘는 기간 동안 오라클 DBA로 활동해 왔으며 2003년 오라클 매거진에 의해 "올해의 DBA"로 선정되었습니다. Arup은 오라클 관련 이벤트 및 저널의 발표자, 기고자로서 적극적으로 활동하고 있으며 뉴욕 오라클 사용자 그룹 실행 위원회 회원이자 Oracle ACE 디렉터입니다. 그는<RMAN Recipes for Oracle Database 11g: A Problem Solution Approach>를 포함하는 4권의 책을 공저하였습니다.
Posted by 1010
98..Etc/Etc...2008. 10. 23. 14:04
반응형
=IF(OR(MID(A1,7,1)="1",MID(A1,7,1)="3"),"남자",IF(OR(MID(A1,7,1)="2",MID(A1,7,1)="4"),"여자","모름"))
Posted by 1010
02.Oracle/DataBase2008. 10. 23. 13:55
반응형

10gR2 em 을 사용해서
archivelog 모드로 전환하려고 할 때,
호스트 인증서에 OS의 사용자 이름과 암호를 정확히 입력했는데도
아래 오류 메세지가 발생해서 진행이 안되네요...

RemoteOperationException: ERROR: Wrong password for user

해결 방법을 찾았네요...

관리도구 -> 로컬보안정책 메뉴에 들어가서

보안설정>로컬정책>사용자 권한 할당까지 들어가서

일괄작업으로 로그온 정책에 사용하는 계정을 추가하니깐 되네요...

Posted by 1010
02.Oracle/DataBase2008. 10. 23. 12:01
반응형

Oracle Secure Backup

파일 시스템과 오라클 데이터베이스를 위한 고성능 테이프 백업 관리를 이용하여 데이터 보호 환경의 비용과 복잡성을 절감할 수 있습니다.

보도 자료

Oracle Secure Backup은 분산 UNIX, Linux, Windows, NAS(Network Attached Storage) 환경의 오라클 데이터베이스 및 파일 시스템을 위한 테이프 데이터 보호 기능을 제공합니다. 데이터 보호 및 백업 도메인 액세스 기능을 제공하는 Oracle Secure Backup은 SSL(Secure Socket Layer), 데이터 암호화 등의 검증된 보안 테크놀로지를 기반으로 구현되었습니다. Oracle Secure Backup은 Oracle Enterprise Manager(EM)과 통합되어 있으며, 테이프를 이용하여 전체 오라클 환경을 보호하고자 하는 오라클 고객에게 이상적인 솔루션입니다:

  • 테이프 드라이브 당 비용이 저렴하므로 다른 테이프 백업 제품과 비교하여 혁신적인 비용 절감 효과를 제공합니다.
  • 오라클 데이터베이스의 Recovery Manager(RMAN)과 통합된 기능을 제공합니다 (Oracle 9i 이상 지원).
  • 최적화된 데이터베이스 백업 기능을 제공하므로 성능 개선, 테이프 사용량 절감이 가능합니다.
  • 오라클 데이터베이스의 테이프 백업을 위한 데이터 암호화 기능을 제공합니다.
  • 이기종 환경의 파일 시스템 데이터 보호 기능:
    • Oracle Home, 바이너리
    • 오라클 애플리케이션 제품의 설정 파일
  • Data Guard, Real Application Clusters (RAC), Automatic Storage Management (ASM) 환경의 최적화된 지원 제공

Oracle Secure Backup은 엔터프라이즈 테이프 백업 소프트웨어의 비용과 복잡성을 절감하고 오라클 고객의 ROI를 보장합니다. 단일 벤더 제품을 이용하여 오라클 데이터베이스의 디스크/테이프 백업 환경을 구현함으로써, 멀티 벤더 솔루션에 수반되는 복잡성을 제거하고 문제 해결 과정의 오류와 번거로운 절차를 피할 수 있게 합니다. Oracle Secure Backup은 전체 오라클 환경을 위한 안정적인 테이프 데이터 보호 환경을 제공합니다.


튜토리얼
오라클이 권장하는 전략
Bullet 테이프 백업의 암호화
Bullet 파일 시스템 백업의 스케줄링
Bullet Backup and restoring file system data
Bullet Managing media and devices using EM
Bullet User-level Access Control
Bullet

Installation on Windows

Oracle Secure Backup Express
bullet

Oracle Database, Oracle Application 제품군과 함께 무료 제공되는 Oracle Secure Backup Express는 하나의 테이프 드라이브를 장착한 단일 서버 보호를 위한 솔루션입니다. 두 개 이상의 테이프 드라이브가 필요한 경우 Oracle Secure Backup 정식 버전 라이센스를 구매하고 간단하게 업그레이드할 수 있습니다.

bullet 데이터 시트
 

뛰어난 확장성의 클라이언트/서버 아키텍처를 기반으로 하는 Oracle Secure Backup은 관리 포인트를 단일화함으로써 네트워크 서버의 테이프 백업 관리를 중앙집중화하는 효과를 제공합니다.

중앙 관리 서버는 Oracle Secure Backup의 카탈로그, 작업 스케줄러, 작업 설정을 유지하며 서버 인증을 위한 CA(Certificate Authority) 역할을 수행합니다. 관리 서버에 의해 관리되는 모든 호스트와 테이프 디바이스는 관리 도메인의 일부로 포함됩니다. 도메인 내의 호스트는 백업 요구사항과 테이프 드라이브 액세스를 기준으로 하나 또는 그 이상의 역할(role)에 할당됩니다.

백업해야 할 데이터가 위치한 각 호스트에는 클라이언트 역할이 할당되며, 서버에 테이프 드라이브가 직접 연결되어 있는 경우에는 미디어 서버 역할도 함께 수행합니다. 테이프 디바이스는 다수의 서버에 의해 분산, 공유되거나 전용으로 할당될 수 있습니다. 공유 테이프 환경에서, Oracle Secure Backup은 테이프 리소스 사용률의 극대화를 위한 다이내믹 테이프 드라이브 공유 기능을 제공합니다.

관리 도메인은 한 대의 서버 또는 수 TB의 데이터를 저장한 수백 대의 이기종 서버로 구성될 수 있습니다.

Posted by 1010
02.Oracle2008. 10. 23. 11:59
반응형

Oracle Secure Backup

파일 시스템과 오라클 데이터베이스를 위한 고성능 테이프 백업 관리를 이용하여 데이터 보호 환경의 비용과 복잡성을 절감할 수 있습니다.

보도 자료

Oracle Secure Backup은 분산 UNIX, Linux, Windows, NAS(Network Attached Storage) 환경의 오라클 데이터베이스 및 파일 시스템을 위한 테이프 데이터 보호 기능을 제공합니다. 데이터 보호 및 백업 도메인 액세스 기능을 제공하는 Oracle Secure Backup은 SSL(Secure Socket Layer), 데이터 암호화 등의 검증된 보안 테크놀로지를 기반으로 구현되었습니다. Oracle Secure Backup은 Oracle Enterprise Manager(EM)과 통합되어 있으며, 테이프를 이용하여 전체 오라클 환경을 보호하고자 하는 오라클 고객에게 이상적인 솔루션입니다:

  • 테이프 드라이브 당 비용이 저렴하므로 다른 테이프 백업 제품과 비교하여 혁신적인 비용 절감 효과를 제공합니다.
  • 오라클 데이터베이스의 Recovery Manager(RMAN)과 통합된 기능을 제공합니다 (Oracle 9i 이상 지원).
  • 최적화된 데이터베이스 백업 기능을 제공하므로 성능 개선, 테이프 사용량 절감이 가능합니다.
  • 오라클 데이터베이스의 테이프 백업을 위한 데이터 암호화 기능을 제공합니다.
  • 이기종 환경의 파일 시스템 데이터 보호 기능:
    • Oracle Home, 바이너리
    • 오라클 애플리케이션 제품의 설정 파일
  • Data Guard, Real Application Clusters (RAC), Automatic Storage Management (ASM) 환경의 최적화된 지원 제공

Oracle Secure Backup은 엔터프라이즈 테이프 백업 소프트웨어의 비용과 복잡성을 절감하고 오라클 고객의 ROI를 보장합니다. 단일 벤더 제품을 이용하여 오라클 데이터베이스의 디스크/테이프 백업 환경을 구현함으로써, 멀티 벤더 솔루션에 수반되는 복잡성을 제거하고 문제 해결 과정의 오류와 번거로운 절차를 피할 수 있게 합니다. Oracle Secure Backup은 전체 오라클 환경을 위한 안정적인 테이프 데이터 보호 환경을 제공합니다.


튜토리얼
오라클이 권장하는 전략
Bullet 테이프 백업의 암호화
Bullet 파일 시스템 백업의 스케줄링
Bullet Backup and restoring file system data
Bullet Managing media and devices using EM
Bullet User-level Access Control
Bullet

Installation on Windows

Oracle Secure Backup Express
bullet

Oracle Database, Oracle Application 제품군과 함께 무료 제공되는 Oracle Secure Backup Express는 하나의 테이프 드라이브를 장착한 단일 서버 보호를 위한 솔루션입니다. 두 개 이상의 테이프 드라이브가 필요한 경우 Oracle Secure Backup 정식 버전 라이센스를 구매하고 간단하게 업그레이드할 수 있습니다.

bullet 데이터 시트
 

뛰어난 확장성의 클라이언트/서버 아키텍처를 기반으로 하는 Oracle Secure Backup은 관리 포인트를 단일화함으로써 네트워크 서버의 테이프 백업 관리를 중앙집중화하는 효과를 제공합니다.

중앙 관리 서버는 Oracle Secure Backup의 카탈로그, 작업 스케줄러, 작업 설정을 유지하며 서버 인증을 위한 CA(Certificate Authority) 역할을 수행합니다. 관리 서버에 의해 관리되는 모든 호스트와 테이프 디바이스는 관리 도메인의 일부로 포함됩니다. 도메인 내의 호스트는 백업 요구사항과 테이프 드라이브 액세스를 기준으로 하나 또는 그 이상의 역할(role)에 할당됩니다.

백업해야 할 데이터가 위치한 각 호스트에는 클라이언트 역할이 할당되며, 서버에 테이프 드라이브가 직접 연결되어 있는 경우에는 미디어 서버 역할도 함께 수행합니다. 테이프 디바이스는 다수의 서버에 의해 분산, 공유되거나 전용으로 할당될 수 있습니다. 공유 테이프 환경에서, Oracle Secure Backup은 테이프 리소스 사용률의 극대화를 위한 다이내믹 테이프 드라이브 공유 기능을 제공합니다.

관리 도메인은 한 대의 서버 또는 수 TB의 데이터를 저장한 수백 대의 이기종 서버로 구성될 수 있습니다.

Posted by 1010
02.Oracle2008. 10. 23. 11:58
반응형
http://www.netapp.com/kr/products/management-software/snapmanager-oracle-ko.html


SnapManager® 소프트웨어로 Oracle® 데이터베이스의 백업, 복원, 복구, 복제 등에 수반되었던 오래 걸리고 복잡한 수작업들을 자동으로 손쉽게 처리할 수 있습니다.

Oracle 기반의 어플리케이션은 비즈니스 지원에 필수적이며 하루 24시간 내내 가용성이 보장되어야 합니다. 관리자는 중요 Oracle 기반 비즈니스 프로세스를 지원하기 위해 효율성을 극대화할 수 있는 툴을 필요로 합니다.

Oracle 어플리케이션 제품군용 SnapManager의 백업, 복원, 복구, 복제 기능으로 Oracle 데이터베이스를 자동으로 손쉽게 관리할 수 있습니다. NetApp의 축적된 기술을 활용하여 공간 낭비를 최대한 줄이면서 즉각적으로 Snapshot™ 복사본과 Oracle 데이터베이스의 복제본을 만들 수 있습니다.

여러 Oracle 데이터베이스를 통합하고 Oracle 데이터 관리를 완전 자동화합니다.

성능 저하 없이 백업 빈도를 증가시켜 데이터와 비즈니스를 확실히 보호하십시오. 데이터베이스 크기에 관계 없이 오류가 발생한 데이터베이스를 분 단위로 완전한 운영 상태로 복원합니다.

QA, 개발, 테스트 및 기타 필요에 따라 완전한 데이터베이스 복제본을 몇 초 내에 생성합니다.

SnapManager 소프트웨어로 Oracle 데이터베이스 관리를 자동화하고 단순화하는 방법을 자세히 알아보십시오 (PDF).

Posted by 1010
02.Oracle2008. 10. 23. 11:54
반응형
http://www.bakbone.co.kr/products/application_data_protection/oracle/

오라클 온라인 APM™
 
오라클 DB가 증가함에 따라 이 중요한 비즈니스 자산들을 보호해야 할 필요가 대두되었습니다.  특정 DB의 온라인 백업/복구 솔루션은 사용자 데이터의 보호와 유지가 관건입니다.  오라클 APM은 오라클 DB의 빠른 온라인 백업을 통하여 어플리케이션의 가용성을 증가시킵니다. 오라클 APM은 핫 백업, 단일 시스템에서의 다중 DB서버 지원, 사용하기 쉬운 사용자 인터페이스, 로 테이블 백업 지원 등 광범위하고 다양한 기능들이 포함되어 있습니다. 
 
핫 백업
넷볼트의 오라클 온라인 APM 사용으로 데이터베이스는 백업이 진행되는 동안이라도 온라인 상태로서 엑세 스가 가능하며 다운타임, 제로를 보장합니다. 
 
다중 DB서버 지원
넷볼트의 오라클 온라인 APM은 사용 가능한 서버들 모두 디스플레이합니다.  APM은 오라클서버 일부 또는 전부에 대해 백업 및 복구를 허용합니다. 
 
선택가능한 DB 백업작업
오라클 온라인 APM에만 필요로 하는 백업. 사용의 편리함, 포인트 앤드 클릭의 사용자 인터페이스는 개별 테이블 스페이스, 트랜젝션 로그 및 컨트롤 과 초기화 파라메터 파일 백업 및 복구의 정확한 튜닝을 제공합니다. 
 
로 테이블스페이스(Raw Tablespace) 지원
UNIX환경에서, 오라클 온라인 APM은 사용자 개입없이 로 및 테이블스페이스의 백업이 가능합니다. 
Posted by 1010
02.Oracle/DataBase2008. 10. 22. 15:33
반응형
원인:
관리도구의 서비스에서 OracleServiceORCL 이 정지가 되어있는 상태에서 오라클에 접속하게 되면 아래의 현상이 발생한다
 
C:\>sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.1.0 - Production on Mon Dec 13 16:33:47 2004
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
ERROR:
ORA-12560: TNS:protocol adapter error

Enter user-name:
 
 
해결 방법:
1. 관리도구의 서비스에서 OracleServiceORCL을 시작한다.
2. 명령어로 시작한다
 
1번의 경우 서비스에서 OracleServiceORCL을 선택하고 위에 있는  ▶ 버튼을 클릭하면 시작된다.
 
2번의 경우는 아래와 같이 할 수 있다.
C:\>oradim -startup -sid ORCL -usrpwd oracle -starttype srvc -pfile c:\oracle\ora92\database\initORCL.ora
 
-sid ORCL  (오라클 SID를 입력)
-usrpwd oracle  (password)
-pfile c:\oracle\ora92\database\initORCL.ora (pfile의 경로를 쓰시면 됩니다.)


출처 : http://nanamix.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-ORA-12560-%EC%97%90%EB%9F%AC-%EB%8C%80%EC%B2%98%EB%B2%95
Posted by 1010
02.Oracle/DataBase2008. 10. 22. 15:16
반응형
DBMS를 기동

sqlplus '/ as sysdba'
sql>startup



만약 DB가 클라이언트랑 다른 머신에서 동작한다면...
listener기동해야합니다.
lsnrctl start
Posted by 1010