9I의 SPFILE 사용에 대해서


PURPOSE
-------
Oracle9i부터는 database의 initial parameter를 지정하는 initSID.ora file외에
server parameter file이라고 불리는 spfileSID.ora가 새로 소개되었다.
이 spfile을 사용하게 되면 alter system을 통해 database가 운영 중에
parameter를 수정할 수 있게 되면서 parameter 수정때마다 database를 restart
시켜야 하는 필요을 줄여주고, 앞으로 소개될 dynamic한 server tuning에
중요한 역할을 할 수 있다.

Explanation
-----------

이 문서에서는 이러한 spfile에 대해서 실제 사용하면서 알아두어야 할 다음과
같은 내용에 대해서 정리하였다.


1. spfile을 vi로 직접 변경한 경우의 영향
2. db open시 spfile을 읽었는지 확인하는 방법
3. initSID.ora를 spfileSID.ora로 migration하거나 그 반대의 방법
4. alter system으로 parameter변경시 scope에 대해서
5. v$parameter와 v$spparameter에 대해서 (static parameter 확인)


1. spfileSID.ora 화일을 vi로 직접 변경한 경우의 영향

  spfile이 크기 않은 관계로 vi등으로 읽으면 마치 text 화일처럼 parameter가
  보이는데 이 화일은 실제로는 binary file로 직접 변경하면 안된다.
  특히 이 화일의 header에는 checksum과 기본적인 meta-data 정보등을
  포함하여 manual하게 변경하게 되면 이 checksum의 값이 맞지 않게 되면서,
  이후 startup시 이 화일을 읽지 않고 initSID.ora file을 읽게 된다.

  db를 운영하면서 spfile에 계속 parameter가 변경된 경우라면 이러한 문제로
  tuning등을 통해 변경된 parameter value를 모두 잃게될 수 있는것이다.


2. db open 시 spfile을 읽었는지 확인하는 방법

  db가 open 시에 참조한 initial parameter file이 무엇인지를 확인하기
  위해서는 다음과 같이 조회하면 된다.

     SQL> show parameter pfile

     NAME                            TYPE        VALUE
     ------------------------------ ----------- ---------------------
     spfile                          string      ?/dbs/spfile@.ora 


  여기에서 ?는 ORACLE_HOME을 나타내고 @는 SID를 나타낸다.


3. initSID.ora를 spfileSID.ora로 migration하거나 그 반대의 방법

  spfile을 사용하다가 그 화일의 내용을 initSID.ora에 backup 차원에서
  반영시켜 두거나, 혹은 spfile대신 initSID.ora를 사용하고자 하는 경우,
  또는 반대로 initSID.ora를 참조하여 spfileSID.ora를 생성하고 하는
  경우 다음과 같이 간단히 작업하면 된다.

     SQL>connect / as sysdba
     SQL>create pfile='initORA9i.ora' from spfile='spfileORA9i.ora';
     SQL>create spfile='spfileORA9i.ora' from pfile='initORA9i.ora';

  위 문장에서 화일명 대신 직접 directory까지 절대 path로 지정할 수 있고,
  화일명은 임의로 지정 후 나중에 사용시 initSID.ora나 spfileSID.ora 형태로
  만들어줄 수 있다.
 
  default인 $ORACLE_HOME/dbs directory이고 SID가 붙는 이름 형태이면 간단히,
  다음과 같이 지정하여도 된다.

     SQL>create pfile from spfile;
     SQL>create spfile from pfile;

  sysdba 권한이 없으면 권한 부족 오류가 발생한다.

4. alter system으로 parameter 변경 시 scope에 대해서

  spfile을 사용하게 되면 앞에서도 언급한 것과 같이 spfile을 직접 변경하는
  대신 alter system command를 통해 initial parameter를 수정할 수 있다.

  단 이때 alter system command 뒤에 scope를 지정할 수 있는 데 scope로
  지정가능한 값은 memory/spfile/both 세가지가 된다.
  memory가 이중 default여서 scope를 지정하지 않으면 memory가 된다.

  memory: 변경이 현재 상태에만 영향을 미치며 db가 restartup되면,
          변경 이전값으로 돌아간다.
  spfile: 변경 내용을 spfile에만 저장하고 현재 상태에는 영향을 미치지
          않게 한다.
          static parameter의 경우는 이 scope만이 지정가능하다.
          즉, spfile을 사용하더라도 static parameter에 대해서는 db
          운영중에 바로 값을 변경하여 restartup없이 반영하는 것은 불가능
          한 것이다.
  both:   변경 내용을 현재상태에도 바로 반영하고, spfile에도 반영시켜,
          이후 rebooting시에도 영향을 미치도록 한다.

  지정하는 방법은 다음과 같다.

  SQL>alter system set open_cursors=300;
  SQL>alter system set open_cursors=300 scope=spfile;
  SQL>alter system set open_cursors=300 scope=both;

  단, spfile을 참조하지 않고 init.ora를 참조하여 db가 open한 경우 이러한
  alter system 명령을 통해 initial parameter를 변경하려고 하면
  다음과 같은 오류가 발생한다.

  특히 spfile에 외부의 변경이 가해져 spfile이 참조되지 않은 경우에 주로
  다음 오류를 만날 수 있다.

     ORA-02095: specified initialization parameter cannot be modified


5. v$parameter와 v$spparameter에 대해서 (static parameter 확인)

  initial parameter의 종류에는 db가 운영 중에는 바로 그 값을 변경하여
  반영시킬 수 없고, 다음 startup 후에만 변경된 값이 영향을 주게되는
  parameter가 있다.
  이러한 parameter를 static parameter라고 부른다.

  이 static parameter의 경우는 그래서 alter system으로 변경하더라도,
  scope=spfile 로만 지정 가능한 것이다.
  이러한 static parameter를 scope를 지정 안 해서 memory로 하거나 both로
  하게 되면 4번에서 설명한 ORA-2095 오류가 발생하게 된다.

  그럼 static parameter는 어떻게 확인할 수 있는가?

     SQL>select name, issys_modifiable from v$parameter;

  여기에서 보면, issys_modifiable의 값으로 다음 세 가지가 나타난다.

  FLASE:     static parameter로 scope=spfile로만 값을 변경 가능하다.
             즉 값을 변경해도 이후 startup 시부터 영향을 미치게 된다.
  IMMEDIATE: 값을 변경하면 현재 session부터 바로 영향을 받게된다.
  DEFERRED:  변경된 값이 이후 접속되는 session부터 영향을 준다.

 
  alter system을 통해 parameter를 변경하는 경우 변경된 값이 반영이 잘
  되었는가를 확인하려면 다음과 같이 show parameter나 v$parameter를
  조회하고, 현재 반영은 안 되었더라도 spfile에 저장은 되었는지를 확인하
  려면 v$spparameter를 조회하면 된다.

     SQL>show parameter open_cursors
     SQL>select value from v$parameter where name = 'open_cursors';
     SQL>select value from v$spparameter where name = 'open_cursors';

  즉, scope=spfile로 parameter를 변경한 경우는 v$spparameter에만 변경
  된 값이 나타나고, show parameter나 v$parameter에서는 변경 전 값이
  나타나게 된다.

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by akiss4u

2006/12/28 08:30 2006/12/28 08:30
,
Response
No Trackback , No Comment
RSS :
http://akiss4u.co.kr/blog/rss/response/31

Oracle XDK

Oracle XDK

Oracle XML Developer’s Kit(XDK)는 Java, JavaBeans, C, C++, PL/SQL에 대해 사용할 수 있으며 XML 구문 분석기, XSL 프로세서, XML 클래스 생성기, XML Transviewer Beans, XML 스키마 프로세서가 포함되어 있습니다.

XML 구문 분석기

오라클은 Java, C, C++, PL/SQL용 XML 구문 분석기를 제공합니다. 각 구문 분석기는 XML 문서(또는 독립형 DTD)를 애플리케이션에서 처리할 수 있도록 구문 분석하는 독립적인 XML 구성 요소입니다. 이 구문 분석기는 DOM(Document Object Model) 및 SAX(Simple API for XML) 인터페이스, XML name space, 확인 및 미확인 모드, XSL 변환을 지원하며, 모든 오라클 플랫폼에서 사용 가능합니다.


XSL 변환 지원

버전 2부터 XML 구문 분석기에 XSL 스타일시트를 사용하여 XML 데이타를 변환하기 위한 통합 XSL 변환(XSLT) 프로세서가 포함되었습니다. XSLT 프로세서를 사용하면 XML 문서를 XML에서 XML, HTML 또는 다른 텍스트 기반 형식으로 변환할 수 있습니다.

Name Space 지원

Java, C, C++ 구문 분석기는 또한 XML 이름 공간을 지원합니다. name space는 XML 문서의 요소 형식(태그) 또는 속성 사이에 이름 충돌을 해결하거나 방지하는 메커니즘입니다. 이 메커니즘은 포함된 문서의 범위를 확장하는 "범용" name space 요소 형식과 속성 이름을 제공합니다. 이러한 태그는 <oracle:EMP xmlns:oracle="http://www.oracle.com/xml"/> 등과 같은 URI로 지정됩니다. 예를 들어, name space를 사용하면 오라클 <EMP> 데이타 요소와 다른 업체의 <EMP> 데이타 요소 정의와 분명하게 식별할 수 있습니다. 따라서 애플리케이션이 처리할 요소와 속성을 식별할 수 있습니다. Java, C, C++ 구문 분석기는 지정되지 않은 "로컬" 요소 형식과 속성 이름은 물론 범용 요소 형식과 속성 이름을 인식하고 구문 분석하는 방식으로 name space를 지원합니다.

확인 및 미확인 모드 지원

Java, C, C++ 구문 분석기는 확인 모드나 미확인 모드에서 XML을 구문 분석할 수 있습니다. 미확인 모드에서 구문 분석기는 XML이 올바로 구성되었는지 확인하고 DOM API로 조작할 수 있는 객체 트리로 데이타를 구문 분석합니다. 또한 확인 모드에서 구문 분석기는 XML이 올바로 구성되었는지 확인하고 DTD에 대해 XML 데이타를 확인합니다. 이러한 확인에는 속성 이름과 요소 태그가 합법적인지, 중첩된 요소가 포함되었는지 등에 대한 검사가 포함됩니다.

DOM 및 SAX API에 대해

XML API는 대개 2가지 범주, 즉 이벤트 기반 및 트리 기반으로 구분됩니다. 이벤트 기반API(SAX 등)는 콜백을 사용하여 구문 분석 이벤트를 애플리케이션에 보고합니다. 애플리케이션은 사용자 정의 이벤트 처리기를 통해 이 이벤트를 처리합니다. 이벤트에는 요소의 시작 및 끝과 문자가 포함됩니다. 트리 기반 API와 달리 이벤트 기반 API는 대개 XML 문서의 내부 메모리 트리 프레젠테이션을 작성하지 않습니다. 따라서 SAX는 검색 기능과 같이 XML 트리를 조작할 필요가 없는 애플리케이션의 경우에 특히 유용합니다. 트리 기반 API(DOM 등)는 XML 문서의 내부 메모리 트리 프레젠테이션을 작성하고, 애플리케이션이 트리를 탐색하고 처리할 수 있는 클래스와 메소드를 제공합니다. 일반적으로 DOM 인터페이스는 요소 순서 재지정, 요소와 속성 추가 또는 삭제, 요소 이름 변경 등과 같이 XML 트리의 구조를 조작하는 경우에 가장 유용합니다. Oracle9i XDK는 DOM 2.0 및 SAX 2.0 사양을 모두 지원합니다.

다음 그림은 XML 문서와 해당 SAX 및 DOM 프레젠테이션을 보여줍니다.

XML 문서

SAX 이벤트

DOM 트리

<?xml version="1.0"?>   <EMPLIST>     <EMP>      <ENAME>MARTIN</ENAME>     </EMP>     <EMP>      <ENAME>SCOTT</ENAME>     </EMP>   </EMPLIST>

start document start element: EMPLIST start element: EMP start element: ENAME characters: MARTIN end element: EMP start element: EMP start element: ENAME characters: SCOTT end element: EMP  end element: EMPLIST end document

예제: Java XML 구문 분석기

다음 Java 코드는 Java v2용 XML 구문 분석기를 사용하여 XML 문서를 구문 분석한 다음, DOM API를 사용하여 XML 데이타를 조작하고, 마지막으로 XSLT Processor API를 사용하여 데이타를 변환합니다.

import org.w3c.dom.*; import java.util.*; import java.io.*; import java.net.*; import oracle.xml.parser.v2.*; public class XSLTransform  {    public static void main (String args[]) throws Exception    {       DOMParser parser;       XMLDocument xml, xsldoc, out;       URL xslURL;       URL xmlURL;       try        {          if (args.length != 2)           {             // Pass in the names of the XSL and XML files             System.err.println("Usage: java XSLTransform                  xslfile xmlfile");             System.exit(1);          }          // Parse XSL and XML documents          parser = new DOMParser();          parser.setPreserveWhitespace(true);                    xslURL = createURL(args[0]);          parser.parse(xslURL);          xsldoc = parser.getDocument();                    xmlURL = createURL(args[1]);          parser.parse(xmlURL);          xml = parser.getDocument();          // Instantiate the stylesheet          XSLStylesheet xsl = new XSLStylesheet(xsldoc, xslURL);          XSLProcessor processor = new XSLProcessor();          // Display any warnings that may occur          processor.showWarnings(true);          processor.setErrorStream(System.err);          // Process XSL          DocumentFragment result = processor.processXSL(xsl, xml);          // Create an output document to hold the result          out = new XMLDocument();          // Create a dummy document element for the output document          Element root = out.createElement("root");          out.appendChild(root);          // Append the transformed tree to the dummy document element          root.appendChild(result);                    // Print the transformed document          out.print(System.out);       }       catch (Exception e)       {          e.printStackTrace();       }    } }

Java용 XML 클래스 생성기

Java용 XML 클래스 생성기는 XML DTD 또는 XML 스키마로부터 Java 소스 파일을 생성합니다. 이 기능은 애플리케이션이 적합한 DTD나 스키마 또는 구성할 웹 양식의 백엔드 및 XML 문서를 기반으로 하는 다른 애플리케이션으로 XML 메시지를 보낼 때 유용합니다. 이 클래스를 사용하면 Java 애플리케이션이 입력 DTD나 스키마를 따르는 XML 문서를 생성, 확인, 출력할 수 있습니다. 클래스 생성기는 Java용 Oracle XML 구문 분석기와 함께 작동되는데, 이 구문 분석기는 DTD나 스키마를 구문 분석하고 분석된 문서를 클래스 생성기로 전달합니다.

예제: Java용 XML 클래스 생성기

다음 예제에서는 Java용 XML 클래스 생성기를 사용하여 DTD를 처리하고 DTD 요소의 클래스를 생성하는 방법을 보여줍니다. 또한 프로그래밍 방식으로 요소 클래스의 메소드를 사용하여 유효한 XML 문서를 생성하는 방법을 보여줍니다.

입력 DTD

다음 DTD 파일은 employee.dtd라는 직원 데이타이며 클래스 생성기의 입력으로 사용됩니다. 이 DTD에서는 XML 문서 루트가 EMP, 행 요소가  EMP_ROW로 지정되어 있으며, EMP는 하나 이상의 EMP_ROW로 구성됩니다. 각 EMP_ROW에는 직원 번호에 대한 필수 속성인 EMPNO와 직원 이름에 대한 ENAME, 업무 유형에 대한 JOB, 관리자에 대한 MGR 등과 같은 여러 옵션 속성이 있습니다. 요소 정의에서 옵션 속성 다음에는 "?"가 붙습니다. EMPNO, ENAME 및 기타 EMP_ROW 요소 정의는 요소가 일반 문자 데이타(PCDATA)를 가지고 있음을 나타냅니다.

<!-- DTD for Employee Data -->  <!ELEMENT EMP (EMP_ROW)*>  <!ELEMENT EMP_ROW (EMPNO, ENAME?, JOB?, MGR?, HIREDATE?, SAL?,COMM?, DEPTNO?)>  <!ATTLIST EMP_ROW ROWNO CDATA #REQUIRED>  <!ELEMENT EMPNO (#PCDATA)>  <!ELEMENT ENAME (#PCDATA)>  <!ELEMENT JOB (#PCDATA)>  <!ELEMENT MGR (#PCDATA)>  <!ELEMENT HIREDATE (#PCDATA)>  <!ELEMENT SAL (#PCDATA)>  <!ELEMENT COMM (#PCDATA)>  <!ELEMENT DEPTNO (#PCDATA)>
DTD 처리를 통해 Java 클래스 생성

다음 샘플 코드는 DTD를 처리하고 DTD의 요소에 대해 해당 클래스를 생성합니다. 위의 DTD(employee.dtd)에서 클래스 생성기를 실행하면 각 요소(EMP, EMP_ROW, EMPNO, ENAME 등)에 대해 Java 클래스가 생성됩니다. 그런 다음 Java 애플리케이션이 이 클래스에 정의된 메소드를 사용하여 직원 데이타가 포함된 유효한 XML 문서를 생성할 수 있습니다.

import java.io.*; import java.net.*; import oracle.xml.parser.*; import oracle.xml.classgen.*; import org.w3c.dom.Element; public class SampleMain {   public SampleMain()   {   }   public static void main (String args[])    {      // validate arguments     if (args.length < 1)      {       System.out.println("Usage: java SampleMain "+                    "[-root <rootName>] <fileName>");       System.out.println("fileName\t  Input file, XML document or " +                    "external DTD file");       System.out.println("-root <rootName>  Name of the root Element " +                    "(required if the input file is an external DTD)");       return ;     }     try // to open the External DTD File     {       // instantiate the parser       XMLParser parser = new XMLParser();       if (args.length == 3)         parser.parseDTD(fileToURL(args[2]), args[1]);               else         parser.parse(fileToURL(args[0]));               XMLDocument doc = parser.getDocument();       DTD dtd = (DTD)doc.getDoctype();       String doctype_name = null;       if (args.length == 3)       {         doctype_name = args[1];       }       else       {         // get the Root Element name from the XMLDocument         doctype_name = doc.getDocumentElement().getTagName();       }       // generate the Java files…       ClassGenerator generator = new ClassGenerator();       // set generate comments to true       generator.setGenerateComments(true);       // set output directory       generator.setOutputDirectory(".");       // set validating mode to true       generator.setValidationMode(true);       // generate java src       generator.generate(dtd, doctype_name);     }     catch (Exception e)      {       System.out.println ("XML Class Generator: Error " + e.toString());       e.printStackTrace();     }   }   static public URL fileToURL(String sfile)    {     File file = new File(sfile);     String path = file.getAbsolutePath();     String fSep = System.getProperty("file.separator");     if (fSep != null && fSep.length() == 1)       path = path.replace(fSep.charAt(0), '/');     if (path.length() > 0 && path.charAt(0) != '/')       path = '/' + path;     try      {       return new URL("file", null, path);     }     catch (java.net.MalformedURLExceptione)     {       // Can only happen if the file       // protocol were not recognized       throw new Error("unexpected MalformedURLException");     }   } }
Java 클래스로부터 유효한 XML 문서 생성

다음 Java 코드는 생성된 메소드가 어떻게 사용되는지 보여줍니다. 여기에서는 emp_row1 및 emp_row2라는 2개의 행 요소가 생성되며, 각 열의 요소도 생성됩니다(empno1, ename1 등). XML 문서 트리를 작성하기 위해 다양한 데이타 요소를 각 행 요소에 트리 노드로 할당하여 그룹화합니다. 그런 다음 각 행 요소를 문서 루트 요소 EMPLIST에 노드로 추가합니다. 이 예제에서 클래스 생성기에 의해 생성되는 클래스 이름은 대문자입니다.

import oracle.xml.classgen.*; import oracle.xml.parser.*; public class CreateEmployees {   public static void main (String args[])      {       try        {         EMP EMPLIST = new EMP();         DTD dtd = EMPLIST.getDTDNode(); // get static from base document         // New employee emp_row1         EMP_ROW emp_row1 = new EMP_ROW(1); // create row and set ROWNO          EMPNO empno1 = new EMPNO("7654");          ENAME ename1 = new ENAME("MARTIN");         JOB job1 = new JOB("SALESMAN");         MGR mgr1 = new MGR("7698");         HIREDATE hiredate1 = new HIREDATE("1981-09-28 00:00:00.0");         SAL sal1= new SAL("1250");         COMM comm1= new COMM("1400");         DEPTNO deptno1 = new DEPTNO("30");                  // New employee emp_row2         EMP_ROW emp_row2 = new EMP_ROW(2); // create row and set ROWNO          EMPNO empno2 = new EMPNO("7788");          ENAME ename2 = new ENAME("SCOTT ");         JOB job2 = new JOB("ANALYST ");         MGR mgr1 = new MGR("7566");         HIREDATE hiredate2 = new HIREDATE("1987-04-19 00:00:00.0");         SAL sal2= new SAL("3000");         COMM comm2= new COMM("");         DEPTNO deptno2 = new DEPTNO("20");         emp_row1.addnode(empno1); // Add data as tree nodes to emp_row1         emp_row1.addnode(ename1);          ...          emp_row2.addnode(empno2); // Add data as tree nodes to emp_row2         emp_row2.addnode(ename2);          ...                  EMPLIST.addNode(emp1); // Add emp_row1 as tree node to                                 // EMPLIST doc root          EMPLIST.addNode(emp2); // Add emp_row2 as tree node to                                // EMPLIST doc root          EMPLIST.validateContent();         EMPLIST.print(System.out);       }     catch (Exception e)     {         System.out.println(e.toString());         e.printStackTrace();     }   } }
Java 애플리케이션에 의해 생성되는 XML 문서

위의 Java 애플리케이션은 다음과 유사한 XML 문서를 생성합니다.

<?xml version="1.0"?> <!DOCTYPE EMP SYSTEM "employee.dtd"> <EMP>   <EMP_ROW ROWNO = "1">     <EMPNO>7654</EMPNO>     <ENAME>MARTIN</ENAME>     <JOB>SALESMAN</JOB>     <MGR>7698</MGR>     <HIREDATE>1981-09-28 00:00:00.0</HIREDATE>     <SAL>1250</SAL>     <COMM>1400</COMM>     <DEPTNO>30</DEPTNO>   /EMP_ROW>   <EMP_ROW ROWNO = "2">     <EMPNO>7788</EMPNO>     <ENAME>SCOTT</ENAME>     <JOB>ANALYST</JOB>     <MGR>7566</MGR>      <HIREDATE>1987-04-19 00:00:00.0</HIREDATE>      <SAL>3000</SAL>      <COMM></COMM>     <DEPTNO>20</DEPTNO>   </EMP_ROW> </EMP>
Java용 XML SQL 유틸리티

Java용 XML SQL 유틸리티는 다음과 같은 작업을 수행하는 Java 클래스 세트로 구성되어 있습니다.

  • 데이타베이스로 질의하고 결과로부터 XML 문서(텍스트 또는 DOM)를 생성합니다.
  • 데이타베이스 테이블에 XML 데이타를 사용합니다.
  • 질의 결과로부터 XML 생성

    다음 그림과 같이 XML SQL 유틸리티는 SQL 질의를 처리하고 결과를 XML 문서로 반환합니다.

    결과 XML 문서 구조는 질의 결과를 반환하는 데이타베이스 스키마의 내부 구조를 기반으로 합니다. 열은 최상위 요소로 매핑됩니다. 스칼라 값은 텍스트로만 구성된 컨텐트를 가진 요소로 매핑되고, 객체 형식은 하위 요소로 나타나는 속성을 가진 요소로 매핑됩니다. 또한 컬렉션은 요소 목록으로 매핑되고, 객체 참조 및 참조 제약 조건은 XML IDREF로 매핑됩니다.

    이 유틸리티는 XML 문서의 문자열 프레젠테이션이나 요소의 내부 메모리 XML DOM 트리를 생성합니다. 요청자에게 XML 문서를 반환하는 경우 문자열 프레젠테이션이 가장 좋습니다. XML을 프로그래밍 방식으로 조작하는 경우, 예를 들어, XSLT 프로세서를 사용하여 XML을 변환하거나 DOM 메소드를 사용하여 XML을 검색하거나 수정하는 경우에는 DOM 프레젠테이션을 사용해야 합니다.

    또한 XML SQL 유틸리티를 사용하여 질의할 기본 테이블의 스키마를 기반으로 하는 DTD를 생성할 수 있습니다. 생성된 DTD를 Java용 XML 클래스 생성기의 입력으로 사용할 수 있습니다. 이 클래스 생성기는 DTD 요소를 기반으로 하는 클래스 세트를 생성합니다. 그런 다음 이 클래스를 사용하여 웹 기반 양식의 인프라를 생성하는 Java 코드를 작성할 수 있습니다. 이 인프라를 기반으로 웹 양식은 사용자 데이타를 캡처하고 데이타베이스 스키마와 호환되는 XML 문서를 생성합니다. 그 다음 추가로 처리하지 않고도 이 데이타를 직접 해당 데이타베이스 테이블이나 객체 뷰에 작성할 수 있습니다. 이 방법에 대한 자세한 내용은 애플리케이션 간 데이타 교환을 참조하십시오.

    예제: 질의 결과로부터 XML 생성

    다음은 XML SQL 유틸리티를 사용하여 질의로부터 XML 문서를 생성하는 간단한 예제입니다. 다음 질의를 유틸리티로 전달하면:

    SELECT EMPNO, ENAME FROM EMP WHERE EMPNO = 7654;

    다음과 같은 XML 문서를 생성합니다:

    <?xml version="1.0"?>  <ROWSET>    <ROW id="1">      <EMPNO>7654</EMPNO>      <ENAME>MARTIN</ENAME>    </ROW>  </ROWSET>

    XML 문서의 형식에 유의하십시오. 기본적으로, ROWSET은 XML 문서 요소의 요소 이름입니다. ROW는 질의 결과에서 각 행의 요소 이름이며, EMPNO 및 ENAME과 같은 데이타는 ROW 노드에서 중첩된 요소로 나타날 수도 있습니다. 데이타는 일반적으로 요소로 표시되고 속성은 필요한 경우 데이타를 제한하는 데 사용됩니다. 애플리케이션은 서로 다른 태그 세트가 필요로 하며 XSL 스타일시트는 동적으로 변환을 수행할 수 있습니다.

    예제: 질의 결과로부터 XML 생성 및 데이타 구성

    XML SQL 유틸리티의 API를 사용하여 XML 문서에 나타나는 데이타를 제한할 수도 있습니다. 예를 들어, 반환할 최대 행 개수, 생략할 행 개수, 사용할 XSL 스타일시트 등을 지정할 수 있습니다.

    다음 Java 코드는 데이타베이스를 질의하여 결과를 포함한 XML 파일을 생성합니다. 질의는 간단한 select EMPNO, ENAME from EMP입니다.

    import java.sql.*; import java.math.*; import oracle.xml.sql.query.*; import oracle.jdbc.*; import oracle.jdbc.driver.*; public class xmlquerydb {   public static void main(String args[]) throws SQLException   {     String tabName = "emp";     String user = "scott/tiger";     DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());     //initiate a JDBC connection     Connection conn =        DriverManager.getConnection("jdbc:oracle:oci8:"+user+"@");     // initialize the OracleXMLQuery     OracleXMLQuery qry = new OracleXMLQuery(conn,"select EMPNO,          ENAME from "+tabName );     // structure the generated XML document     qry.setMaxRows(2);  // set the maximum number of rows to be returned     qry.setRowsetTag("ROOTDOC"); // set the root document tag     qry.setRowTag("DBROW"); // sets the row separator tag     qry.setStyleSheet("emp.xsl"); // sets the stylesheet          // get the XML document in string format     String xmlString = qry.getXMLString();          // print out the XML document     System.out.println(" OUTPUT IS:\n"+xmlString);    } }

    결과 XML 파일은 EMP 테이블에서 찾은 처음 2행을 반환합니다.

    <?xml version="1.0"?>  <ROOTDOC>    <DBROW id="1">      <EMPNO>7876</EMPNO>      <ENAME>ADAMS</ENAME>    </DBROW>    <DBROW id="2">      <EMPNO>7499</EMPNO>      <ENAME>ALLEN</ENAME>    </DBROW>  </ROOTDOC>
    테이블에 XML 쓰기

    다음 그림과 같이 XML SQL 유틸리티를 사용하여 Oracle8i 객체 관계형 데이타베이스 테이블에 XML 데이타를 쓸 수 있습니다.

    Oracle8i 테이블에 XML 문서를 저장하면 문서 구조가 보존됩니다. 요소 태그 이름은 테이블의 열 이름으로 매핑되고, 텍스트로만 구성된 컨텐트가 있는 요소는 스칼라 열로 매핑되며, 하위 요소가 포함된 요소는 객체 형식으로 매핑됩니다. 또한 요소 목록은 컬렉션으로 매핑됩니다. 텍스트 주석이나 설명처럼 구조화되지 않은 데이타는 기본 데이타베이스 테이블로 매핑될 수 없으므로 이러한 종류의 데이타는 데이타베이스에 CLOB로 저장해야 합니다. 자세한 내용은 Oracle8i 및 interMedia 설명서를 참조하십시오.

    예제: 테이블에 XML 쓰기

    다음 Java 코드는 XML 파일 emp.xml의 데이타를 EMP 테이블에 삽입합니다. 이 예제는 XML 문서가 EMP 테이블 구조와 일치한다고 가정합니다.

    import oracle.xml.sql.dml.*; import java.sql.*; import oracle.jdbc.driver.*; import oracle.jdbc.*; import java.net.*; public class xmlwritedb {   public static void main(String args[]) throws SQLException   {     String tabName = "EMP"; // Table into which to insert XML data     String fileName = "emp.xml"; // XML document filename     DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());     // Initialize a JDBC connection     Connection conn =        DriverManager.getConnection("jdbc:oracle:oci8:scott/tiger@");     // Insert XML data from file (filename) into      // database table (tabName)     OracleXMLSave save = new OracleXMLSave(conn, tabName);     URL url = save.createURL(fileName);     int rowCount = save.insertXML(url);     System.out.println(" successfully inserted "+rowCount+                        " rows into "+ tabName);     conn.close();   } }

    XML 문서를 데이타베이스 테이블에 쓰려고 하지만 XML 데이타가 기본 테이블 구조와 일치하지 않는 경우 데이타베이스에 쓰기 전에 XML 문서를 변환해야 합니다. 자세한 내용은애플리케이션간 데이타 교환를 참조하십시오.

    XSQL 서블릿

    XSQL 서블릿은 SQL 질의를 처리하고 결과를 XML로 출력하는 도구입니다. 이 프로세서는 Java 서블릿으로 구현되었으며 내장 SQL 질의가 포함된 XML 파일을 입력으로 사용합니다. 대부분의 작업은 Java용 XML 구문 분석기와 XML SQL 유틸리티를 사용하여 수행됩니다.

    Java 서블릿을 지원하는 모든 웹 서버에서 이 서블릿을 실행할 수 있습니다. 다음 그림은 클라이언트에서 서블릿으로, 다시 클라이언트로 데이타가 이동하는 방식을 보여줍니다. 이벤트 순서는 다음과 같습니다.

    1. 사용자가 브라우저를 통해 URL을 입력하면 브라우저는 이 URL을 해석하여 Java 웹 서버를 통해 XSQL 서블릿으로 전달합니다. 이 URL에는 대상 XSQL 파일(.xsql) 이름이 있으며, 옵션으로는 값, XSL 스타일시트 이름 등과 같은 매개변수가 포함되어 있습니다. 다른 방법으로는 브라우저와 Java 웹 서버를 생략하여 명령줄에서 XSQL 서블릿을 실행하는 방법이 있습니다.
    2. 서블릿은XSQL 파일을 Java용 XML 구문 분석기로 전달합니다. 이 구문 분석기는 XML을 분석하여 XML 컨텐트에 액세스하는 API를 생성합니다.
    3. 서블릿의페이지 프로세서 구성 요소는 이 API를 사용하여 XML 매개변수와 SQL 문(<query></query> 태그 사이의 내용)을 XML SQL 유틸리티에 전달합니다. 또한 페이지 프로세서는 모든 XSL 처리 문을 XSLT 프로세서에 전달합니다.
    4. XML SQL 유틸리티는 SQL 질의를 기본 Oracle8i 데이타베이스로 보내고, 이 데이타베이스는 질의 결과를 유틸리티에게 반환합니다.
    5. XML SQL 유틸리티는 질의 결과를 XML 형식의 텍스트로 XSLT 프로세서에게 반환합니다. 결과는 최초의 <query> 태그와 동일한 위치에 있는 XML 파일에 저장됩니다.
    6. 필요한 경우, 질의 결과와 기타 XML 데이타는 지정된 XSL 스타일시트를 사용하는 XSLT 프로세서에 의해 변환됩니다. 이 데이타는 HTML 또는 스타일시트에 정의된 기타 형식으로 변환될 수 있습니다. XSLT 프로세서는 최초의 URL 요청이 시작된 클라이언트 유형에 따라 서로 다른 스타일시트를 선택적으로 적용합니다. 이 HTTP_USER_AGENT 정보는 HTTP 요청을 통해 클라이언트에서 얻을 수 있습니다.
    7. XSLT 프로세서는 완성된 문서를 사용자에게 표시하도록 다시 클라이언트 브라우저에게 전달합니다.



    예제: XSQL 서블릿

    다음은 직원 테이블 EMP를 질의하는 간단한 XSQL 파일입니다. 이 질의의 기본 기능은 테이블의 모든 직원 행을 반환하는 것입니다. 옵션으로, 브라우저에서 XSQL 서블릿을 호출할 때 find= URL 매개변수를 추가하여 검색 범위를 좁힐 수 있습니다. 예를 들어, 검색 값으로 'T' 문자를 지정하면 ENAME에 T 문자가 포함된 행만 반환합니다. 또한 sort= URL 매개변수를 지정하여 반환된 행을 정렬할 수 있습니다. 예를 들어, EMPNO를 지정하면 행이 직원 번호순으로 정렬됩니다.

    <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="rowcol.xsl"?>   <query connection="demo"      find="%"     sort="ENAME"     null-indicator="yes" >     SELECT *  FROM EMP         WHERE ENAME LIKE '%{@find}%'             ORDER BY {@sort}   </query>

    또한 XSQL 파일은 반환된 결과를 XSL 스타일시트 rowcol.xsl을 사용하여 처리하도록 지정할 수 있습니다. 이 스타일시트는 다음과 같습니다.

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">   <xsl:template match="/">     <html>       <body class="page">         <xsl:apply-templates/>             </body>     </html>   </xsl:template>     <xsl:template match="ROWSET">       <center>       <table border="0" cellpadding="4">       <xsl:choose>         <xsl:when test="ROW">           <!-- present headings: row[1] columns +-->             <xsl:for-each select="ROW[1]">             <tr>               <xsl:for-each select="*">                 <th align="left">                   <xsl:attribute name="class">                   </xsl:attribute>                   <xsl:value-of select="name(.)"/>                 </th>               </xsl:for-each>             </tr>           </xsl:for-each>           <xsl:apply-templates/>         </xsl:when>         <xsl:otherwise>           <tr><td>No Matches</td></tr>          </xsl:otherwise>       </xsl:choose>       </table>       </center>     </xsl:template>     <!-- present rows and columns +-->     <xsl:template match="ROW">         <tr>           <xsl:attribute name="class">           </xsl:attribute>           <xsl:for-each select="*">             <td>               <xsl:attribute name="class">               </xsl:attribute>               <xsl:apply-templates select='.'/>             </td>           </xsl:for-each>         </tr>   </xsl:template> </xsl:stylesheet>

    아래 그림은 XSQL 서블릿이 XSQL 파일 emp.xsql 및 rowcol.xsl 스타일시트를 사용하여 생성한 HTML 페이지입니다. 이 서블릿은 다음 URL을 사용하여 실행되었습니다.

    http://localhost/xsql/demo/emp.xsql?find=T&sort=EMPNO

    EMPNO

    ENAME

    JOB

    MGR

    HIREDATE

    SAL

    COMM

    DEPTNO

    7654

    MARTIN

    SALESMAN

    7698

    1981-09-28 00:00:00.0

    1250

    1400

    30

    7788

    SCOTT

    ANALYST

    7566

    1987-04-19 00:00:00.0

    3000

    20

    73369

    SMITH

    CLERK

    7902

    1980-12-17 00:00:00.0

    800

    20

    7844

    TURNER

    SALESMAN

    7698

    1981-09-08 00:00:00.0

    1500

    0

    30


    XML Transviewer Java Beans

    XML Transviewer Beans는 Java 애플리케이션 또는 애플릿용 XML 구성 요소 세트입니다. 이 시각적 및 비시각적 Java 구성 요소를 Oracle JDeveloper에 통합하면, 개발자는 XML 기반 데이타베이스 애플리케이션을 신속하게 작성하고 배포할 수 있습니다. 사용할 수 있는 bean은 다음과 같습니다.

  • DOM Builder Bean
  • XML Source Viewer Bean
  • XML Tree Viewer Bean
  • XSL Transformer Bean
  • DOM Builder Bean

    DOM Builder Bean은 bean 인터페이스를 사용하여 Java XML 구문 분석기를 캡슐화하고 비동기 구문 분석이 가능하도록 기능을 확장합니다. 리스너를 등록하면 Java 애플리케이션은 대형 문서나 연속적인 문서를 구문 분석하고 호출 프로그램으로 즉시 제어를 반환할 수 있습니다.

    XML Source Viewer Bean

    XML Source View Bean은 컬러 강조 XML/XSL 구문을 통해 XML 및 XSL 파일 보기를 향상시켜줍니다. 이 기능은 편집 애플리케이션을 사용하여 XML 문서를 수정할 때 유용합니다. DOM Builder Bean과 쉽게 통합할 수 있으므로 지정된 DTD에 대해 사전 또는 사후 구문 분석 및 확인이 가능합니다.

    XML Tree Viewer Bean

    XML Tree View Bean은 XML 문서를 시각적으로 표시하므로 사용자는 마우스를 사용하여 선택한 브랜치(branches)를 숨기거나 표시하는 방식으로 쉽게 트리를 조작할 수 있습니다.

    XSL Transformer Bean

    XSL Transformer Bean을 사용하면 XSL 스타일시트를 적용하여 XML 문서를 XML, HTML, DDL을 포함한 거의 모든 텍스트 기반 형식으로 변환할 수 있습니다. 다른 bean과 통합하면 애플리케이션이나 사용자가 곧바로 변환 결과를 볼 수 있습니다. 또한 이 bean을 서버측 애플리케이션 또는 서블릿의 기반으로 사용하면 질의 결과를 XML로 표시하는 XML 문서를 브라우저에 표시되도록 HTML로 렌더링할 수 있습니다.

    XML 스키마 프로세서

    XML 스키마 프로세서는 XML 파일을 구문 분석하고 확인하며 DTD에서 제공되는 이상의 기능을 제공합니다. W3C는 "XML 스키마는 공유 어휘를 표현하고 사람들이 정한 규칙을 시스템이 수행할 수 있도록 한다"라고 정의합니다. Oracle XML 스키마 프로세서는 W3C XML Schema Working Draft의 다음 3가지 조항을 지원합니다:

    Part 0: Primer XML Schema

    Part 1: Structures XML Schema

    Part 2: Datatypes

    또한 XML 스키마는 Oracle9i 데이타베이스에서 네이티브(native) XML 지원의 핵심으로, 개발자가 Java와 SQL을 사용하여 쉽고 편리하게 복잡한 XML e-business 데이타를 조작할 수 있도록 합니다. 따라서 오라클 고객은 최신 개방형 XML 표준의 장점을 활용할 수 있습니다.

    Oracle9i 제품군

    Oracle9i는 SQL을 통해 데이타베이스에 XML을 저장하고 기존 데이타베이스 데이타를 XML로 렌더링할 수 있습니다. Oracle9i의 XML 지원 범위는 다음과 같습니다.

  • XML 생성을 위해 Oracle9i 커널과 연결되는 기본 제공되는 네이티브(native) 함수. 확장성이 뛰어난 3개의 새로운 PL/SQL 함수(SYS_XMLGEN, SYS_XMLAGG, DBMS_XMLGEN)는 데이타베이스 내부에서 XML을 생성하기 위해 XDK에 대한 대안을 제공합니다.
  • 네이티브(native) XML 형식 지원. 다량의 복잡한 XML을 저장하고 검색할 필요가 있는 애플리케이션의 경우, Oracle9i는 새로운 데이타 형식인 XMLType을 도입하여 XML을 고유하게 저장하며 매우 빠르고 편리하게 XML 문서를 액세스하고 검색할 수 있습니다.
  • UriType 형식은 URI 참조를 데이타베이스에 저장하고 질의할 수 있습니다. SYS.UriType은 URL이 가리키는 데이타에 액세스하는 기능을 제공하는 추상적인 객체 형식입니다. SYS.HttpUriType 및 SYS.DBUriType은 UriType의 하위 형식입니다. HttpUriType은 HTTP URL을 저장할 수 있고 DBUriType은 내부 데이타베이스 참조를 저장할 수 있습니다.
  • 새로운 Oracle Text XML –오라클 텍스트 질의에서 XPath 식을 활용하는 새로운 HASPATH 및 INPATH 연산자가 포함된 검색 기능. Oracle Text를 사용하면 XML을 일반 텍스트로 인덱싱하거나, 더 정교한 검색을 원하는 경우 "Oracle WITHIN title"처럼 문서 항목으로 인덱싱하는 방식으로 Oracle9i에 저장된 XML 문서를 검색할 수 있습니다. 여기에서 "title"은 문서의 항목입니다.
  • Oracle Advanced Queuing(AQ)은 XML을 사용하여 e-business 통합 인프라를 제공합니다. 특히 AQ는 XML을 사용하여 iDAP(Internet Data Access Presentation)라는 프레젠테이션을 정의합니다. iDAP와 함께 AQ 기능은 HTTP, SMTP, FTP와 같은 인터넷 전송 프로토콜을 통해 실행될 수 있습니다. AQ는 XML 데이타 형식 페이로드를 지원하며 XML 메시지의 내용을 기반으로 서브스크립션을 정의할 수 있습니다.
  • 이 기능들은 특히 B2B 및 B2C eBusiness, 패키지 애플리케이션, 인터넷 컨텐트 관리 분야를 지원합니다. 개발자는 이 기능들을 사용하여 기존의 관계형 컨텍스트나 순수 XML 컨텍스트에서 XML을 사용하면서 Oracle9i Database의 고유 확장성, 관리성, 신뢰성의 장점을 충분히 활용할 수 있습니다.

    데이타베이스의XML

    데이타베이스에XML 문서를 저장하는 기본적인 방법은 다음과 같습니다:

    • XML 문서를 CLOB 또는 BLOB에 태그와 함께 변경되지 않은 단일 객체로 저장.
    • XML 문서를 데이타로 저장하고 태그가 없는 상태로 객체 관계형 테이블에 배포.
    • 뷰를사용하여 XML 문서와 데이타 결합.

    XML 문서의 구조에 따라 이 방법 중 하나를 선택할 수 있습니다.

    XML 문서를 CLOB 또는 BLOB로 저장

    XML 문서가 전체 문서를 교체해야 업데이트되는 정적 컨텐트를 가지고 있는 경우, 변경되지 않은 XML 문서를 CLOB 또는 BLOB에 저장하는 것은 좋은 방법입니다. 이러한 예로는 기사, 광고, 책, 계약서 등과 같이 텍스트로 작성된 문서를 들 수 있습니다. 이 문서들의 특징은 문서 중심이라는 점이며 모두 데이타베이스에서 제공됩니다. 이러한 종류의 문서를 Oracle9i에 변경되지 않은 상태로 저장하면, 업계에서 입증된 데이타베이스의 이점과 파일 시스템 스토리지에 대한 신뢰성을 얻을 수 있습니다. XML 문서를 데이타베이스 외부에 저장해도 Oracle9i 기능을 사용하여 BFILES, URL 및 텍스트 기반 인덱싱을 통해 문서의 인덱스, 질의 및 효과적인 검색이 가능합니다.

    XML 문서를 데이타로 저장

    XML 문서 구조가 잘 정의되어 있고 다른 방법으로 업데이트하거나 사용할 수 있는 데이타가 포함된 경우, 이 문서는 데이타 중심입니다. 대개 XML 문서에는 복잡한 구조를 가진 요소나 속성이 포함되어 있습니다. 이러한 문서의 예로는 판매 주문서나 견적서, 항공 스케줄 등을 들 수 있습니다. Oracle9i에는 객체 관계형 확장과 함께 객체 형식, 객체 참조 및 컬렉션을 사용하여 데이타베이스의 데이타 구조를 캡처하는 기능이 있습니다. 또한 XML 데이타를 객체 관계형 형식으로 저장 및 보존하는 2가지 옵션은 다음과 같습니다.

    • 관계형테이블에 요소의 속성을 저장하고 XML 요소의 구조를 캡처할 객체 뷰를 정의합니다.
    • 객체 테이블에 구조화된 XML 요소를 저장합니다.

    일단 객체 관계형 형식으로 저장하면 필요한 경우에 SQL을 사용하여 쉽게 데이타를 업데이트, 질의, 재배치하고 서식을 변경할 수 있습니다.

    XML SQL 유틸리티는 기본 객체 관계형 스토리지로 매핑하는 방식으로 XML 문서를 저장하는 기능을 제공합니다. 반대로 객체 관계형 데이타를 XML 문서로 가져오는 기능도 제공합니다.

    XML 문서가 구조화되어 있지만 XML 문서 구조가 기본 데이타베이스 스키마 구조와 호환되지 않는 경우, 데이타베이스에 데이타를 쓰기 전에 알맞은 형식으로 변환해야 합니다. XSL 스타일시트를 사용하거나 프로그래밍 방식으로 이러한 목적을 달성할 수 있지만 필요한 경우 데이타 중심 XML 문서를 변경되지 않은 단일 객체로 저장해야 하는 경우가 있습니다. 또한 다른 방법으로는, 다양한 XML 문서 구조와 일치하는 객체 뷰를 정의하고 대체 트리거를 정의하여 알맞은 변환을 수행하고 기본 데이타를 업데이트할 수 있습니다.

    뷰를사용하여 XML 문서와 데이타 결합

    마지막으로, 구조화된 XML 데이타와 그렇지 않은 데이타가 결합된 경우 전체를 보고 실행하려면 뷰를 사용하면 됩니다. 뷰를 사용하면 다양한 방식으로 저장된 XML 데이타를 즉석에서 결합하여 객체를 생성합니다. 따라서 구조화된 데이타(직원 데이타, 고객 데이타 등)를 객체 관계형 테이블의 특정 위치에 저장하고 구조화되지 않은 관련 데이타(설명이나 주석 등)를 CLOB에 저장할 수 있습니다. 데이타 전체를 검색해야 하는 경우, 단순히 뷰의 select 문에서 type 생성자를 사용하여 다양한 데이타로부터 구조체를 생성하면 됩니다. 이렇게 하면 XML SQL 유틸리티가 뷰에서 생성된 데이타를 단일 XML 문서로 가져올 수 있습니다.

    Oracle Internet File System

    Oracle Internet File System XML 프레임워크는 대개 구문 분석에 의존합니다. 즉, 저장소에 파일을 삽입할 때 순서대로 해체합니다. 올바로 구문 분석된 경우에 이 요소들을 데이타베이스에 속성으로 저장하고 나중에 다시 조립할 수 있습니다. 또한 XML 파일을 사용하여 사용자 계정 생성과 같은 시스템 구성 작업을 수행할 수도 있습니다. 마지막으로, XML 파일은 구문 분석을 수행하지 않고도 저장될 수 있습니다. 오라클 인터넷 파일 시스템에 포함된 구문 분석 프레임워크는 새로운 문서 형식을 식별하고 이 문서에 구성 가능한 구문 분석 로직을 적용하는 기능을 지원하므로 광범위하게 사용할 수 있습니다.

    XML만 사용해서도 많은 개발 작업을 수행할 수 있습니다. 전체 API가 개방되고 문서화되었기 때문에 개발자는 고급 파일 시스템과 컨텐트 관리 기능을 쉽게 사용할 수 있습니다. 다음은 오라클 인터넷 파일 시스템으로 가능한 개발 프로젝트 중 몇 가지 예입니다.

    • XML 지원 확장을 통해 새로운 XML 애플리케이션을 생성합니다.
    • XML을 사용하는 문서 처리 제품을 작성합니다.
    • 업무에 따라 문서를 조작하는 사용자 정의 구문 분석기와 렌더링 프로그램을 생성합니다.
    • 그래픽이 포함된 워드 파일을 PDF로 렌더링하고 XML 스프레드시트가 포함된 워드 파일을 HTML 파일로 렌더링하는 사용자 정의 구문 분석기를 작성합니다.
    • 특정 파일 형식에 대해 새로운 프레젠테이션 방법을 호출합니다.
    • 파일의 사용자 정의 속성을 기반으로 파일을 여러 사용자 정의 렌더링 프로그램중 하나와 연결하는 사용자 정의 구문 분석기를 작성합니다.
    • XML을 사용하여 보안 체계를 설계하고 구현합니다.
    • 여러 애플리케이션과 폴더에 새로운 사용자 계정을 추가하는 작업을 간소화하는 XML 템플리트를 생성합니다.
    크리에이티브 커먼즈 라이센스
    Creative Commons License
    이올린에 북마크하기(0) 이올린에 추천하기(0)

    Posted by akiss4u

    2006/09/08 15:07 2006/09/08 15:07
    ,
    Response
    No Trackback , No Comment
    RSS :
    http://akiss4u.co.kr/blog/rss/response/29

    Temp tablespace 재생성방법

    Temp tablespace 재생성방법

    --------------------------------------

    1. 임시 temp tablespace생성

    CREATE TEMPORARY TABLESPACE TEMP_imsi TEMPFILE

      '/pgm/temp_imsi.dbf' SIZE 50M AUTOEXTEND OFF

    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

    2. default temp tablespace를 조회/변경

    1)조회

    select * from database_properties

    where property_name = 'DEFAULT_TEMP_TABLESPACE';

    à temp

    2) 변경

    alter database default temporary tablespace temp_imsi;

    3. temp table spacedrop

    4. temp(원하는 사이즈로) 재생성

    CREATE TEMPORARY TABLESPACE TEMP TEMPFILE

      '/data/oradata/CAPIS/temp01.dbf' SIZE 2000M AUTOEXTEND OFF

    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

    5. default tablespace를 재변경

    1)변경

    alter database default temporary tablespace temp;

    2)조회

    select * from database_properties

    where property_name = 'DEFAULT_TEMP_TABLESPACE';

    à temp

    크리에이티브 커먼즈 라이센스
    Creative Commons License
    이올린에 북마크하기(0) 이올린에 추천하기(0)

    Posted by akiss4u

    2006/08/09 17:55 2006/08/09 17:55
    ,
    Response
    No Trackback , No Comment
    RSS :
    http://akiss4u.co.kr/blog/rss/response/27

    ORelly 책모음

    -오릴리 책 모음입니다-

    O`Reilly`s CD bookshelf

    IT관련 서적의 최고라고 불리우는 오릴리 시리즈 중 JAVA, XML, Oralce Book shelf입니다. 즉, 책을 HTML형식으로 모두 만들어 놓은것 입니다. 참고자료로 사용하세요

    크리에이티브 커먼즈 라이센스
    Creative Commons License
    이올린에 북마크하기

    Posted by akiss4u

    2006/05/09 09:50 2006/05/09 09:50
    , , , , , , , , ,
    Response
    4 Trackbacks , No Comment
    RSS :
    http://akiss4u.co.kr/blog/rss/response/9

    Lock 걸린 세션 sqlplus에서 죽이기

    우선 실제 어떤 object가 lock이 걸려있는지 확인한다.
    SELECT do.object_name, do.owner, do.object_type,do.owner, vo.xidusn, vo.session_id, vo.locked_mode FROM v$locked_object vo , dba_objects do WHERE vo.object_id = do.object_id;

    Lock을 걸고 있는 SID와 Serial을 찾는다.
    select a.sid, a.serial#,a.username,a.process,b.object_name
    ,decode(c.lmode,2,'RS',3,'RX',4,'S',5,'SRX',8,'X','NO') "TABLE LOCK"
    ,decode (a.command,2,'INSERT',3,'SELECT',6,'UPDATE',7,'DELETE',12,'DROP TABLE',26,'LOCK TABLE','UNknown') "SQL"
    ,decode(a.lockwait, NULL,'NO wait','Wait') "STATUS"
    from v$session a,dba_objects b, v$lock c where a.sid=c.sid and b.object_id=c.id1 and c.type='TM';

    위에서 구한 SID와 Serial#를 이용하여 그 세션을 Kill한다.
    ALTER SYSTEM KILL SESSION '57,37416';
    크리에이티브 커먼즈 라이센스
    Creative Commons License
    이올린에 북마크하기(0) 이올린에 추천하기(0)

    Posted by akiss4u

    2006/05/08 16:04 2006/05/08 16:04
    , ,
    Response
    No Trackback , No Comment
    RSS :
    http://akiss4u.co.kr/blog/rss/response/4

    SQL tuning(Wait status 해결방안)

    SQL Tuning Method
    (Wait event 발생 시 문제 object를 파악하여 수정 가능케 함)

    우선 현재 가장 wait가 많이 걸리는 event를 파악함

    set pages 999
    set lines 90

    column c1 heading 'Event|Name'             format a30
    column c2 heading 'Total|Waits'            format 999,999,999
    column c3 heading 'Seconds|Waiting'        format 999,999
    column c4 heading 'Total|Timeouts'         format 999,999,999
    column c5 heading 'Average|Wait|(in secs)' format 99.999

    ttitle 'System-wide Wait Analysis|for current wait events'

    select
      event                         c1,
      total_waits                   c2,
      time_waited / 100             c3,
      total_timeouts                c4,
      average_wait    /100          c5
    from
      sys.v_$system_event
    where
      event not in (
      'dispatcher timer',
      'lock element cleanup',
      'Null event',
      'parallel query dequeue wait',
      'parallel query idle wait - Slaves',
      'pipe get',
      'PL/SQL lock timer',
      'pmon timer',
      'rdbms ipc message',
      'slave wait',
      'smon timer',
      'SQL*Net break/reset to client',
      'SQL*Net message from client',
      'SQL*Net message to client',
      'SQL*Net more data to client',
      'virtual circuit status',
      'WMON goes to sleep'
      )
    AND
    event not like 'DFS%'
    and
      event not like '%done%'
    and
      event not like '%Idle%'
    AND
    event not like 'KXFX%'
    order by
      c2 desc
    ;

    이 쿼리를 22번 서버에 적용 시 다음과 같은 결과를 얻을 수 있음

    Mon May 08                                                                       page    1
                                   System-wide Wait Analysis
                                    for current wait events

                                                                       Average
    Event                                 Total  Seconds        Total      Wait
    Name                                  Waits  Waiting     Timeouts (in secs)
    ------------------------------ ------------ -------- ------------ ---------
    SQL*Net message to dblink           807,153        5            0      .000
    SQL*Net message from dblink         807,153    1,990            0      .000
    db file sequential read             390,253    1,974            0      .010
    log file parallel write             164,575      917      164,205      .010
    SQL*Net more data from client       150,271    3,931            0      .030
    log file sync                       120,478    1,633          142      .010
    control file parallel write         105,916    2,562            0      .020
    control file sequential read         82,874        9            0      .000
    SQL*Net more data from dblink        51,683      266            0      .010
    db file scattered read               34,370      106            0      .000
    direct path write                    31,568    1,166            0      .040
    direct path read                     22,469      332            0      .010
    db file parallel write               18,640    2,735            0      .150
    wakeup time manager                  10,099  301,709       10,099    29.880
    latch free                            2,405        2           80      .000
    log file sequential read              2,292       13            0      .010
    async disk IO                         1,834       71            0      .040
    rdbms ipc reply                       1,033        6            0      .010
    log buffer space                        966      218           32      .230
    library cache pin                       953    1,435          477     1.510
    enqueue                                 662      106           17      .160
    SQL*Net more data to dblink             611        0            0      .000
    log file single write                   588        8            0      .010
    log file switch completion              496      120           32      .240
    buffer busy waits                       413        2            0      .000
    db file single write                    176        2            0      .010
    log file switch                         129      118          107      .920
    LGWR wait for redo copy                 128        0            0      .000
    undo segment extension                   28        0           27      .000
    control file single write                22        1            0      .020
    process startup                          19        2            0      .080
    library cache load lock                   5        0            0      .000
    switch logfile command                    4        1            0      .200
    reliable message                          3        2            2      .750
    db file parallel read                     2        0            0      .020
    instance state change                     2        0            0      .000
    refresh controlfile command               1        0            0      .000
    control file heartbeat                    1        4            1     4.010

    38 rows selected.

    현재는 크게 문제가 될만한 이벤트를 찾을 수 없음

    async disk IO
    control file parallel write
    control file sequential read
    db file parallel write
    db file scattered read
    db file sequential read
    direct path read
    direct path write
    log file parallel write
    log file sync

    위와 같은 이벤트에 wait시간이 길어 지면 조속한 조취가 필요함
    (실제로 DB가 느려졌다고 느끼게 됨, 다들 이벤트는 성격상 wait가 길어 질 수 있음)

    이제 여기서 혹 문제가 되는 이벤트가 발생할 시 우선 그 이벤트의 핸들 주소를 알아내야 한다.

    SELECT distinct p1raw
    FROM sys.v_$session_wait
    WHERE event = 'library cache pin'
    AND state = 'WAITING'
    ;

    즉, 문제가 되는 이벤트의 상태로 p1raw(Handle Address)를 추출한다.

    이렇게 추출된 Address를 이용하여 현재 이벤트를 생기게 한 원인 object(쿼리)를 찾는다.

    tti "Object that is Blocking"
    COL owner format a8
    COL object format a70

    SELECT kglnaown AS owner, kglnaobj as Object
    FROM sys.x$kglob
    WHERE kglhdadr=(SELECT distinct p1raw
    FROM sys.v_$session_wait
    WHERE event = 'library cache pin'
    AND state = 'WAITING')
    ;

    또는 현재 block을 한 session ID와 wait 상태의 session ID를 보고싶을 땐 다음과 같은 쿼리를 사용한다.
    이를 이용하여, SID를 찾아 그 session만 급하게 kill할 수도 있다.

    SELECT s.sid||','||s.serial# SID_SERIAL, kglpnmod "Mode Held", kglpnreq "Request"
    FROM sys.x$kglpn p, sys.v_$session s
    WHERE p.kglpnuse = s.saddr
    AND kglpnhdl = (SELECT distinct p1raw
    FROM sys.v_$session_wait
    WHERE event = 'library cache pin'
    AND state = 'WAITING')
    ;

    크리에이티브 커먼즈 라이센스
    Creative Commons License
    이올린에 북마크하기(0) 이올린에 추천하기(0)

    Posted by akiss4u

    2006/05/08 14:32 2006/05/08 14:32
    ,
    Response
    No Trackback , No Comment
    RSS :
    http://akiss4u.co.kr/blog/rss/response/2