반응형

<PARTITION TABLE>
 

 

1. partition table 생성하기

 

create table part_tbl
( in_date number primary key ,
empno   number,
ename   varchar2(20),
job   varchar2(20) )
partition by range (in_date)
(
partition part_tbl_200803  values less than (20080332) tablespace pts_03,
partition part_tbl_200804  values less than (20080432) tablespace pts_04,
partition part_tbl_200805  values less than (20080532) tablespace pts_05,
partition part_tbl_max  values less than (maxvalue) tablespace pts_max
);

 


2. add partition 하기

 

6월 partition을 add하고 싶은 경우 다음과 같이 할 수 있다.

 

alter table part_tbl add partition part_tbl_200806 values less than (20080632) tablespace pts_06;

 

# 단 MAX 파티션 테이블이 있는경우는 add  partition 할 수 없다!
따라서 위 예제에서 생성된 파티션 테이블에서는 add partition 불가!!

 

 

3. 특정 partition 을 삭제하기

 

3월에 해당하는 partition을 없애고 싶은 경우는 다음과 같이 실행한다.

 

alter table part_tbl drop partition part_tbl_200803;

 
만약..
drop된 후에 새로 3월에 해당하는 데이타가 입력되면
4월의 partition이 less then (20080432) 으로 되어 있으므로
4월에 해당하는 partition에 저장된다.

 


3. partition 나누기
 
6월에 해당하는 partition을 생성하려면 MAX partition에 add하는 것으로는 불가능하고 MAX partition을 split 해야 한다.

 

alter table part_tbl split partition part_tbl_max at (20080632)
into (partition part_tbl_200806 tablespace pts_06, partition part_tbl_max tablespace pts_max);

 

+)

into(partition AAA, partition BBB) -> BBB파티션을 AAA 파티션으로 split한다.


위와 같이 하면 기존의 MAX 파티션 테이블에서 6월31일을 이전 데이터는 part_tbl_200806에 옮겨지고
MAX 파티션 테이블에는 6월31일 이후의 데이터가 들어있게 된다.

 


4. partition name을 변경하기

 
partition name 을 바꾸고 싶다면 다음과 같이 실행한다.

 

alter table part_tbl rename partition part_tbl_200805 to part_tbl_200805_new;

 
5. partition의 tablespace를 옮기기

 

partition part_tbl_05을 저장하는 tablespace를 pts_05 에서 pts_new로 바꾸고 싶은 경우는 다음과 같이 실행한다.


alter table part_tbl move partition part_tbl_05 tablespace pts_new nologging;

 

 

6. 특정 partition의 data를 truncate하기

 
 partition의 data를 모두 삭제하려면 truncate하는 방법을 사용할 수가 있는 데,
 truncate는 rollback 이 불가능하며 특정 partition 전체를 삭제하므로 주의하여 사용하여야 한다.

 

alter table part_tbl truncate partition part_tbl_03;

 

 

7. Partition table의 물리적인 속성 변경하기

 
partition table은 특정 partition의 속성만 변경할 수 있고,
table의 속성을 변경하여 전체 partition에 대해 동일한 변경을 할 수 있다.

 
alter table part_tbl storage( next 10M);
 -> part_tbl 의 모든 partition의 next 값이 변경된다.

 
alter table part_tbl modify partition part_tbl_05 storage ( maxextents 1000 );
 -> part_tbl_05 partition의 maxextents 값만 변경한다.

 

 

8. Index의 관리


변경작업을 통해 테이블 파티션이 변경된 경우 해당 테이블에 관련된 인덱스를 rebuild 해야합니다.

 
 1) local 인덱스인 경우

 
DDL작업을 통해 변경된 파티션 테이블에 걸려있는 해당 local 인덱스만  "UNUSABLE" 상태가 된다.
 -> MAX를 Split 한경우는 MAX 파티션과 Split로 새롭게 생성된 파티션의 인덱스 상태만 "UNUSABLE" 된다.

따라서 해당 파티션 인덱스를 반드시 rebuild 해 주어야 합니다.


-- 파티션 상태 확인

select INDEX_NAME, PARTITION_NAME, HIGH_VALUE, STATUS, TABLESPACE_NAME

from user_ind_partitions;

 
-- local Index rebuild 하기

alter index 인덱스이름 rebuild partition 파티션이름;

 
예제)

part_tbl_max 를 part_tbl_200806로 split 했을경우
각각의 파티션에 걸린 인덱스 part_tbl_indx_pk1 는  UNUSABLE 상태가 된다.

 

NDEX_NAME             PARTITION_NAME           HIGH_VALUE    STATUS           TABLESPACE_NAME

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

part_tbl_indx_pk1      part_tbl_200804      '20080432'      USABLE            pts_04

part_tbl_indx_pk1      part_tbl_200805      '20080432'      USABLE            pts_05

part_tbl_indx_pk1      part_tbl_200806      '20080632'      UNUSABLE        pts_06

part_tbl_indx_pk1      part_tbl_max            MAXVALUE       UNUSABLE        pts_max

 

해당 파티션 인텍스를 rebuild 해준다.

alter index WEMS_BPEMAAN_PK1 rebuild partition WEMS_BPEMAAN_200806_P6;

alter index WEMS_BPEMAAN_PK1 rebuild partition WEMS_BPEMAAN_MAX;

 

 2)global Index인 경우

 

 - 변경된 해당 파티션 뿐만 아니라 해당 테이블 파티션에 관련된 모든 global 인덱스 상태를 "UNUSABLE"로 만든다.

따라서 인덱스 전체를 반드시 rebuild 해 주어야 합니다.

 

-- global Index rebuild 하기

alter index 인덱스이름 rebuild;

[출처] [oracle] PARTITION TABLE|작성자


반응형
반응형
파티셔닝 기능을 구현중 위와 같은 오류를 발견...

하앍...

먼저 다음의 SQL문을 통해 기능 조회 가능

select * from v$option where parameter = 'Partitioning';


 PARAMETER VALUE 
 Partitioning FALSE 

와 같으면 안됨... TRUE 설정이여만 가능함.

파티셔닝 가능하게 하는 방법

아래와 같이 실행 (오라클 홈 디렉토리에...)

참고로 $ORACLE_HOME 변수가 설정되어야 함...


가동 중지

SQL> shutdown immediate


$ cd $ORACLE_HOME/rdbms/lib
$ make -f ins_rdbms.mk part_on
$ make -f ins_rdbms.mk ioracle

관련 명령이 실행되면서 화면을 가득 채우고 난 뒤 (시간이 좀 걸림...)

관리자 권한으로 ORACLE 접속

$ sqlplus '/as sysdba'


Database closed.
Database dismounted.

재 가동
SQL> startup

SQL> select * from v$option where parameter = 'Partitioning';

만약 TRUE으로 변경되지 않으면 재설치 해야함 -_-...

PERSONAL 과 ENTERPRISE 버젼에서 지원함.

SELECT * FROM V$VERSION; -- 버전 정보 조회
반응형
반응형

PHP로 개발하는데, 혹시 디버깅(debugging)이라는 '용어'를 들으면 print_r()이나 var_dump() 함수가 가장 먼저 떠오르나? 그럼, 뭔가(?) 몹시 외롭게 사투하는 중일 가능성이 높다. PHP에서도 breakpoint를 설정해가면서 진짜 디버깅을 할 수가 있다. 이 대목에서 잠깐, breakpoint가 뭘까? 고개를 갸우뚱하는 사람은 정말 너무 오랫동안 PHP로 웹 개발만, 그것도 다른 개발자들과 담을 쌓고 혼자 살아왔을 가능성이 농후하다. 물론, 가난한 개발자여서 인터랙티브 디버깅(interactive debugging)이 가능한 Zend Studio와 같은 비싼 툴을 살 수가 없었기 때문일 수도 있다. 하지만 관심을 가지고 찾아봤으면 Zend Studio 외에도 삽질만 쫌 하면 구해서 쓸 수 있는 무료 툴들이 있었다. 대표적인 것이 바로 eclipse + xdebug 이다.

 

잠깐, 인터랙티브 디버깅(interactive debugging)의 장점을 생각나는 대로 메모해본다. 소스 코드에서 실행을 멈춰 보고 싶은 행에 중단점(breakpoint)을 설정할 수 있다. 그 지점에서부터 한 줄(행)씩 실행하거나 다음 중단점까지 실행하거나 할 수 있다. 그 와중에 모든 변수들의 값을 관찰할 수 있다. 따로 print_r()이나 var_dump() 함수로 변수값을 화면이나 로그 파일로 찍어내지 않아도 된다. (-> 프로그램 코드가 아주 깨끗해진다.) 마치 비디오 판독작업을 할 때처럼 순간 정지나 슬로비디오로 천천히 들여다 볼 수 있다. 이 기능의 위력을 알게 되면 그동안 print_r()과 var_dump()에만 기대어 살아온 날들이 허무하고 억울하게 느껴지게 된다. 이제부터라도 사용해보도록 하자.

 

Xdebug를 사용하려면, (1) 서버측에서의 설정과 (2) eclipse에서의 설정, 두 가지가 모두 필요하다.

 

 

1. 서버측 설정 : XAMPP

 

윈도 PC에서 apache/mysql/php 서버 환경을 간단하게 구축할 수 있도록 해주는 통합 패키지 xampp의 설치 및 설정은 다음 글 참조.

 

2009년 8월 6일 현재 XAMPP 최신 버전은 1.7.1 임. 기존의 1.6.x 버전대와 몇 가지 달라진 점 때문에, Xdebug 설정이 조금 혼란스러워 졌음. 과거의 방법들은 잊고, 새로운/더 쉬운 방법만 기억하자.

 

XAMPP 1.7.1 버전에는 xdebug 모듈이 이미 포함되어 있다. xampp\php\ext 디렉토리에 가면 php_xdebug.dll 파일이 있다. 실제로 xdebug 배포 사이트에 가보면, 대체 어떤 파일을 골라서 가지고 와야 하는지, 정말 어수선하고 혼란스럽고 헷갈리고 그래서 급기야 짜증모드로 돌진하게 되곤 한다. 다행인지 XAMPP 패키지에는 이미 적합한 놈이 들어있다. (혹시 참을성에 자신있으신 분은 xdebug 사이트로 가서 적합한 놈을 찾아보시길… http://www.xdebug.org 농담임. 괜히 고생함.)

 

중요한 설정작업: php.ini

 

XAMPP php.ini 파일은 xampp\php 디렉토리 밑에 있다. 그 파일을 열어서 xdebug 관련 부분을 설정해준다.

처음에는 아래와 같이 되어 있다.

 

 

위 부분에서 [Zend] 섹션은 모두 코멘트(;)로 막아준다. 그리고, 아래 [XDebug] 섹션은 모두 코멘트 해제한다.

 

 

xdebug는 Zend Optimizer와 함께 사용할 수가 없다. 보통 디버깅은 테스트 서버에서 수행하게 되므로, 특별히 Zend Optimizer가 없다고 해서 특별히 문제가 생기지는 않을 것이다. 만약 LIVE 서버(실 운영서버)라면 xdebug 모드는 접는 게 좋겠다.

 

주의사항: xdebug 관련 내용을 php.ini 파일에서 찾아보면 위 부분외에도 extension 지정하는 부분이 하나 더 나온다. 기본적으로는 코멘트로 막혀있다. 이 부분은 굳이 풀어주지 않아도 된다. 만약 이 부분을 풀어준다면, Warning 이 뜬다. 물론, eclipse에서 디버깅도 안된다.

   

[추가사항: 2009년 8월 13일]

2009년 8월 10일, XAMPP 1.7.2 버전이 새로 나옴. 패키지에 포함된 PHP 버전도 5.3.0으로 올라가고, Xdebug 모듈도 2.0.5로 올라갔다. 특히, php.ini 에서 xdebug 설정해주는 방법이 몹시 간단해졌다.

   

xdebug 설정을 위해 해줄 작업은 단 한줄의 코멘트를 제거해주는 일로 줄었다.

   

   

이것만 해주면, 아래와 같이 XDebug가 먹힌다.

   

   

추가사항 끝~

   

Xdebug 설정 전에는 php -v 명령을 실행하면 아래와 같이 나온다.

 


 

php.ini 설정을 완료하면, 아래와 같이 "with Xdebug v2.0.4, Copyright (c) 2002-2008, by Derick Rethans" 문구가 보인다.

 

 

모든 게 정상적으로 잘 설정되면, 아래 링크를 눌렀을 때 웹 페이지에서도 아래와 같은 이미지가 보인다. php.ini 파일을 수정했으므로 물론 아파치 서버는 stop시켰다가 새로 start 시켜야 한다.

 

 

뭔가 잘못되었으면, 아래와 같은 이미지가 보인다. "with Xdebug.." 메시지가 없다.

 

 

재미있는 것은 뭔가 잘못된 와중에도 아래와 같이 phpinfo() 출력값의 xdebug 섹션에는 관련 값들이 잘 보이는 경우가 있다.

 

 

이것은, 설정값은 적용되었지만, 정작 중요한 php_xdebug 모듈이 올라가지 않은 상황이다. php.ini 파일의 중간 부분에 있는 ; Windows Extensions 의 extension=php_xdebug.dll 설정라인이 코멘트로 잘 막혀있는지를 다시 확인해보자. 이걸 코멘트 해제하고 밑에서 [XDebug] 섹션도 코멘트 해제하면 서로 충돌해서 안된다. 이건 건들지 말자!

 


 

 

2. eclipse에서의 설정

 

eclipse galileo 버전(3.5)에서는 사실 특별히 뭔가를 새로 설치해주지 않아도 된다. (얼마나 편해졌는지… 혹시 예전 버전에서의 설정법을 알고 싶다면, 이 링크 참조. Eclipse 에 XDebug 플러그인 추가하기)

 

Xdebug를 위해 eclipse에서 해줘야 할 설정작업은 다음과 같다. 좀 많은 건 사실이다.

 

2.1. 우선 eclipse 에서 PHP Project를 하나 만든다.

 

웹 서버와의 연동을 테스트할 것이므로 웹 서버 document_root인 htdocs 밑에 디렉토리가 위치하는 PHP Project를 만드는 게 좋겠다.

 

 

아주 간단한 테스트 파일을 하나 만들자.

 

echo.php

<?php

$w = "hi, ";
echo $w;

$w = $w . "world...<br>\n";
echo $w;

$sum = 0;
for ($i=0; $i<10; $i++) {



$sum = $sum + $i;



printf("%d \t = \t%d <br>\n", $i, $sum);
}

 

 

2.2. Window->Preferences:: PHP ?> PHP Server 설정

 

 

위의 Default PHP Webserver 항목을 더블 클릭으로 누르거나 'Edit' 버튼을 눌러서 아래 화면을 띄운다.

 

 

그 다음 'Path Mapping' 항목을 눌러서, 값을 설정해준다. 웹 서버에서의 경로와 Eclipse 워크스페이스에서의 경로를 서로 맞춰주는 과정이다.

 

 

완료되면, 아래와 같이 보인다.

 

 

 

2.3. Window->Preferences:: PHP ?> PHP Executables 설정

 

 

php.ini 파일의 설정이 잘되었다면, 위와 같이 'Search' 버튼을 눌러서 XAMPP 설치 디렉토리를 지정하고 PHP 실행파일을 검색해본다. 만약 잘 찾았으면 아래와 같이 내용이 짠하고 나타난다.

 

 

만약 자동검색으로 잘 못찾으면, 'Add' 버튼을 눌러서 하나씩 지정해줘도 된다. 자동검색으로는 Zend Debugger 타입만 검색된다. XDebug 타입을 아래와 같이 'Add'해줘야 한다.

 

 

 

2.4. Window->Preferences:: PHP ?> PHP Debug 설정

 

PHP Debugger 타입을 XDebug로 바꾸면, 자동으로 밑의 PHP Executable도 바뀐다.

 

 

이제 대충 설정하는 작업은 마쳤다.

 

 

3. 실행해보기

 

3.1. Script로 디버깅하기

 

메뉴에서 벌레모양 아이콘의 화살표 부분을 누르고 Debug As ?> PHP Script 항목을 누른다.

 

 

퍼스펙티브를 바꿀려고 하는데 맞냐고 아주 친절하게 물어온다. 맞다고 해준다.

 

 

짜잔~ 드디어 디버깅 화면이 보인다.

 

 

위 화면에서 (1)은 중단점(Breakpoint)이다. 디폴트로 1st line이 자동으로 중단점이 된다. 만약 다른 라인에도 중단점을 주고 싶으면 편집창 왼편의 회색부분을 2번 클릭하면 된다.

 

위 화면의 (2)는 변수값을 관찰할 수 있는 영역이다. 현재는 모든 변수값이 초기화되기 전이므로 <Uninitialized>로 나타난다.

 

위 화면의 (3)은 컨트롤 버튼이다. Step Into(F5)는 한 라인씩 진행하되 함수 안으로까지 추적해들어가는 명령이고, Step Over(F6)는 함수를 만나면 안으로 들어가지 않고 그냥 한 라인으로 생각하고 다음 라인으로 넘어간다.

 

 

4행까지 진행한 결과가 위 화면이다. 변수값 $w의 값이 바뀌었고, Console과 Debug 창에 echo $w 결과값이 나타나 있다.

 

그 이후 과정도 이런 식이다. 한 줄씩 실행하면서 관련된 변수값의 변화를 관찰하는 것이다.

 

3.2. Web Page로 디버깅하기

 

메뉴에서 벌레모양 아이콘의 화살표 부분을 누르고 Debug As ?> PHP Web Page 항목을 누른다.

 

 

 

로컬서버인 xampp에서의 경로가 맞는지를 확인하는 창이 아래와 같이 뜬다.

 

 

다시, 친절하게 물어본다. 퍼스펙티브 바뀌는 게 맞냐고? 맞다고 해준다.

 

 

짜잔… 다시 디버깅 화면이 뜬다.

 

다른 건, Script 디버깅 모드와 동일한데, 아래와 같이 웹 브라우저가 뜨면서, 뭔가를 기다리는 모양새가 된다. 현재의 예제는 PHP 코드의 끝까지 실행되어야만 화면에 출력되므로, 사실 디버깅이 끝날 때까지 웹 브라우저는 그냥 계속 기다린다.

 

 

 

4. 보충

 

4.1. eclipse Run/Debug Configurations 화면에 대한 오해

 

처음 eclipse의 Debug Configurations 화면을 보면서, 잠시 막막했던 적이 있다. 아니, 매번 하나씩 이렇게 설정을 New해서 만들어줘야 하나? 그걸 귀찮아서 어떻게 해!!! 그랬다.

 

 

아래 화면처럼 하나씩 직접 입력해서 만들어줘야 하는 줄 알았다. 오해였다. 착각이었다. 이클립스가 그렇게 허술하고 불친절한 툴이 절대 아니다.

 

 

 

그냥, 아래와 같이 Rus As ?> PHP Script / PHP Web Page 를 선택해서 실행해주면 된다. 한 번 실행된 것은 자동으로 Configuration으로 만들어져서, 아래 그림에서와 같이 'echo' 'echo web'이라는 이름으로 빠른 실행이 가능하게 메뉴에 나타나게 된다.

 

 

 

 

 

4.2. Web Page 디버깅시 웹 브라우저가 뜨는 게 귀찮다면? Internal Web browser를 사용!

 

Window->Preferences: General->Web Browser에서 아래와 같이 선택한다.

 

 

그럼, 아래와 같이 디버깅이 마지막 라인까지 도달하면, Internal Browser의 출력값을 확인할 수 있다.

 

 

 

4.3. 참고한 문서들

 

 

 

 

 

 

 

반응형

'Language > PHP' 카테고리의 다른 글

플레쉬 차트 (OFC2JS) - Table2Chart  (0) 2010.01.19
정규표현식 테스트 필요할 때 보조 프로그램  (0) 2010.01.19
PHP 정규표현식  (0) 2010.01.18
XAMPP 설치 가이드  (0) 2009.12.28
xampp  (0) 2009.12.28
반응형
  1. 설치 언어 선택

  • 영어로 선택하고 OK 클릭

 

Next > 클릭

  1. 설치 위치 선택

    기본적으로 c:\xampp 하는 것이 좋음(vista 일때 권한문제 포함)

Next > 클릭

  1. 선택 옵션

    Create a XAMPP desktop icon 체크 (기본 아이콘에 나오도록 설정)

    Create an Apache Friends XAMPP folder in the start menu 체크 (윈도우 시작메뉴에 나오도록 체크)

    SERVICE SECTION

    서비스를 수행하는 Apache 설치

    Install 클릭

    데이터 베이스 서비스를 수행하는 MySQL 설치

     

  2. 설치 완료 화면

    Finish 클릭

 

  1. 서비스 설치가 완료된 화면

  1. XAMPP 환경 설정 부분 (Y) 클릭

 

  1. 서비스를 Start(시작) / Stop(멈춤) 설정을 하는 콘트롤 패널 입니다.

    쉽게 말해서 서비스를 할려면 apache 시작되어야 하고

    데이터 베이스를 사용하기 위해서는 Mysql 시작되어야 합니다.

    Running 정상적으로 서비스 가동중이라는 뜻입니다.

   

 

반응형

'Language > PHP' 카테고리의 다른 글

플레쉬 차트 (OFC2JS) - Table2Chart  (0) 2010.01.19
정규표현식 테스트 필요할 때 보조 프로그램  (0) 2010.01.19
PHP 정규표현식  (0) 2010.01.18
eclipse 설정: Xdebug로 디버깅하기 with XAMPP 서버  (2) 2009.12.28
xampp  (0) 2009.12.28
반응형

###########################
## xampp
###########################

XAMPP는 크로스 플랫폼 웹 서버 자유 소프트웨어 꾸러미이다.
아파치 웹 서버 MySQL, PHP, 펄을 포함하고 있다.
GNU 일반 공중 사용 허가서로 배포되며 자유롭고 쓰기 쉬운 웹 서버이다.
마이크로소프트 윈도, 리눅스, 솔라리스, 맥 오에스 텐 등에서 동작하며 주로 웹 개발에 사용된다.



XAMPP 1.7.3 버젼 특징

  • Apache 2.2.14 (IPv6 enabled) + OpenSSL 0.9.8l
  • MySQL 5.1.41 + PBXT engine
  • PHP 5.3.1
  • phpMyAdmin 3.2.4
  • Perl 5.10.1
  • FileZilla FTP Server 0.9.33
  • Mercury Mail Transport System 4.72

xampp 홈페이지 :  http://www.apachefriends.org/en/xampp.html

Vista 버젼에서는
권한 문제 때문에 C:\Program Files 폴더 보다는

C:\xampp 나 C:\meinverzeichnis\xampp로 하는것을 추천함.

소스포지 다운로드 주소 : http://sourceforge.net/projects/xampp/files/

윈도우즈 버젼...


반응형
반응형

LOB 정보가 기간이 지나 삭제가 필요할때...

LOB 정보가 있는 테이블 : LOB_TABLE
LOB 정보가 있는 필드 : LOB_DATA

-- LOB_TABLE 있는 LOG_DATA 필드의 값을 모두 없는 것으로 처리
UPDATE LOB_TABLE
     SET LOG_DATA = EMPTY_CLOB()
 WHERE 조건

-- LOB 공간 SHRINK 할수 있도록 데이터 압축해 놓기
ALTER TABLE LOB_TABLE
MODIFY LOB(LOB_DATA) (SHRINK SPACE COMPACT);

* 만약 에러가 나면 ROW MOVEMENT ENABLE 설정을 참고 !

-- LOB 공간 실제 SHRINK 하기
ALTER TABLE LOB_TABLE
MODIFY LOB(LOB_DATA) (SHRINK SPACE);
반응형
반응형

1) import 시켜야할 API

① oracle.sql.BLOB

② oracle.sql.CLOB

③ oracle.jdbc.driver.OracleResultSet

2) CLOB

① DB에 CLOB 데이터형 쓰기

       // UPDATE 또는 INSERT 명령으로 DB 에 공간 확보
     String query = "UPDATE TABLE SET CLOB_DATA = EMPTY_CLOB() " ;
     stmt.executeUpdate(query);

     // 그런 다음 다시 요놈을 다시 SELECT
     query = "SELECT CLOB_DATA  FROM TABLE WHERE ~ " ;   

     stmt = dbConn.createStatement();
     rs = stmt.executeQuery(query);

     if(rs.next()) {
          CLOB clob = null;
          Writer writer = null;
          Reader src = null;
          char[] buffer = null;
          int read = 0;  

          clob = ((OracleResultSet)rs).getCLOB(1);        
          writer = clob.getCharacterOutputStream();

          // str -> DB에 넣을 내용
          src = new CharArrayReader(str.toCharArray());
          buffer = new char[1024];
          read = 0;
          while ( (read = src.read(buffer,0,1024)) != -1) {
               writer.write(buffer, 0, read); // write clob.
          }
          src.close();        
          writer.close();
     }

     dbConn.commit();
     dbConn.setAutoCommit(true);


 ② DB에서 CLOB 데이터형 읽기

      // SELECT
     String query = "SELECT CLOB_DATA  FROM TABLE WHERE ~ " ;   

     stmt = dbConn.createStatement();
     rs = stmt.executeQuery(query);

     if(rs.next()) {

          StringBuffer output = new StringBuffer();
          Reader input = rs.getCharacterStream("CLOB_DATA");
          char[] buffer = new char[1024];
          int byteRead = 0;
          while((byteRead=input.read(buffer,0,1024))!=-1){
               output.append(buffer,0,byteRead);
          }
         

          // contents -> CLOB 데이터가 저장될 String
          String contents = output.toString();


     }

     dbConn.commit();
     dbConn.setAutoCommit(true);


3) BLOB

① DB에 BLOB 데이터형 쓰기

      // UPDATE 또는 INSERT 명령으로 DB 에 공간 확보
     String query = "UPDATE TABLE SET BLOB_DATA = EMPTY_BLOB() " ;
     stmt.executeUpdate(query);

     // 그런 다음 다시 요놈을 다시 SELECT
     query = "SELECT BLOB_DATA  FROM TABLE WHERE ~ " ;   

     stmt = dbConn.createStatement();
     rs = stmt.executeQuery(query);

     if(rs.next()) {

          BLOB blob = null;
          BufferedOutputStream out = null;
          BufferedInputStream in = null;
          byte[] buf = null;
          int bytesRead= 0;  

          blob = ((OracleResultSet)rs).getBLOB(1);
          out = new BufferedOutputStream(blob.getBinaryOutputStream());

          // str -> DB에 넣을 내용
          in = new BufferedInputStream(new StringBufferInputStream(str));
          int nFileSize = (int)str.length();
          buf = new byte[nFileSize];
         
          while ((bytesRead = in.read(buf)) != -1){
               out.write(buf, 0, bytesRead);

          }

          in.close();
          out.close();
     }

     dbConn.commit();
     dbConn.setAutoCommit(true);


 ② DB에서 BLOB 데이터형 읽기

      // SELECT
     String query = "SELECT CLOB_DATA  FROM TABLE WHERE ~ " ;   

     stmt = dbConn.createStatement();
     rs = stmt.executeQuery(query);

     if(rs.next()) {

          BLOB blob = ((OracleResultSet)rs).getBLOB(1);

          BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream());
          int nFileSize = (int)blob.length();
          byte[] buf = new byte [nFileSize];   
          int nReadSize = in.read(buf, 0, nFileSize);
          in.close();

           // contents -> BLOB 데이터가 저장될 String

          String contents = new String(buf);
     }

     dbConn.commit();
     dbConn.setAutoCommit(true);


출처 : http://lambert.egloos.com/3069062
반응형
반응형

/**
 CLOB 자료를 오라클 DB에 넣기 위한 자바 소스 파일
 
 1. CLOB 자료형인 column을 오라클의 empty_clob()을 이용해 초기화를 해야 한다.
    : 또는 CLOB column의 기본값을 empty_clob()으로 하던가..
    
 2. setAutoCommit(false)를 꼭 해야 한다.
 
 3. select clob_column from table where pk = value for update
    : for update를 이용해 CLOB column을 lock한다.
    : stream을 이용해 CLOB column을 업데이트 하는동안 다른 process의 접근을 막는다.
    : 또한 stream을 이용해 자료를 넣기 전까지는 실제로 commit되지 말아야 하기 때문에
      2번의 auto commit을 false로 했던 것이다. (이것때문에 하루 보냄 ㅜㅜ;;)
    : 모두 쓰고 나서는 commit() <-- 옵션
    : setAutoCommit(true) <-- 옵션
      
 4. 여기서 특이한 점은 오라클의 jdbc 드라이버의 OracleResultSet과 CLOB을 이용한다는 것이다.
    : java.sql.ResultSet과 java.sql.Clob을 이용하면 오라클 JDBC 드라이버가 해석시에 에러를 발생시킨다.
    : 아마도 오라클 jdbc 드라이버의 문제점이 아닐까 하는 생각이 든다.
    : 아니면 표준과 싸우는 오라클인가? ㅡㅡ;;
    
 5. 나머지 부분은 Stream을 이용한 input과 output이므로 언급을 생략하겠다.
*/

import java.io.*;
import java.net.*;
import java.sql.*;

import oracle.sql.*;
import oracle.jdbc.driver.*;

public class ClobTest {
 public static void main(String[] argv) {
 
  String drv = "oracle.jdbc.driver.OracleDriver";
  String dburl = "jdbc:oracle:thin:@192.168.3.30:1521:GRDB21";
  String user = "scott";
  String password = "tiger";
 
  Connection conn = null;
  Statement st;
  ResultSet rs;
 
  try {
         Class.forName(drv);         
         System.out.println("Drive Loading...");
            conn = DriverManager.getConnection(dburl, user, password);
            System.out.println("Connecting...");
            st = conn.createStatement();
            
            // 입력할 텍스트 만들기
            StringBuffer sb = new StringBuffer();
            String clobTest = "한글 테스트입니다\nIt is difficult\n";
            for (int i = 0; i < 300; i++)
    sb.append(clobTest);
   
   
   
   // 1. CLOB 데이터 입력하기 위해, empty_clob() 생성
            try {
             st.executeUpdate("insert into test_clob values ('02', empty_clob())");
            } catch (Exception ee) {
             ee.printStackTrace(System.out);
            }
   
   // 2. setAutoCommit을 false로 꼭 해야 한다.
   conn.setAutoCommit(false);
   
   
   // 3. CLOB column에 대한 lock을 얻는다.
   rs = st.executeQuery("select desc2 from test_clob where code = '02' for update");
   if (rs. next()) {
   
    // 4. 오라클의 함수들을 사용하기 위해 cast 하였다.
    CLOB cl = ((OracleResultSet)rs).getCLOB("desc2");
    
    // 스트림을 이용한 값 저장
    BufferedWriter writer = new BufferedWriter(cl.getCharacterOutputStream());
    writer.write(sb.toString());
    writer.close();
   }
   conn.commit();
   conn.setAutoCommit(true);
                
   // 입력한 값 읽어 오기     
   rs = st.executeQuery("select * from test_clob where code = '02'");
   
   if (rs.next()) {
    String code = rs.getString("code");
    
    // CLOB column에 대한 스트림을 얻는다.
    Reader rd = rs.getCharacterStream("desc2");
    
    sb = new StringBuffer();
    char[] buf = new char[1024];
    int readcnt;
    while ((readcnt = rd.read(buf, 0, 1024)) != -1) {
     // 스트림으로부터 읽어서 스트링 버퍼에 넣는다.
     sb.append(buf, 0, readcnt);
    }
    rd.close();
    
    System.out.println("code : " + code);
    System.out.println("desc2 : " + sb.toString());
   }
 
 
  }
  catch (Exception e) {
   e.printStackTrace(System.out);
  }
 }
}

출처 : http://djnine.tistory.com/
반응형
반응형

9. Transparent Application Failover(TAF) 테스트

   

※ Oracle TAF는 데이터베이스 연결에 장애가 발생한 경우 클러스터의 다른 노드로 재연결하기 위한 페일오버 메커니즘을 제공합니다.

    페일오버 과정은 사용자 관점에서 투명하게 수행됩니다. 오라클은 페일오버된 인스턴스에서 쿼리를 재실행하고 결과를 사용자에게

    반환합니다.

※ 테스트를 수행하기에 앞서 발생한 문제 먼저 해결 하겠습니다. 저같은 경우 모든 설치를 마치고 TAF 테스트는 다음 날 수행했는데

    컴을 껐다 키니까 애플리케이션 리소스가 실행 되어 있지 않았습니다. 간단한 절차지만 애플리케이션 리소스 실행하고 상태먼저 확인

    하고 시작하겠습니다.

   

(crs_stat 수행 해 보니 rac1 노드의 리소스만 ONLINE 상태임을 알 수 있다.)

   

   

(상태확인을 함에 있어서도 깔끔하지 않고 찝찝하기 짝이없다 ㅋㅋ)

   

이제 애플리케이션 리소스 시작시키자!! oracle 계정으로 수행^^

   

srvctl stop instance -d devdb -i devdb1

     srvctl stop asm -n rac1

     srvctl stop nodeapps -n rac1

   

     srvctl start instance -d devdb -i devdb1

     srvctl start asm -n rac1

     srvctl start nodeapps -n rac1

   

srvctl stop instance -d devdb -i devdb2

     srvctl stop asm -n rac2

     srvctl stop nodeapps -n rac2

   

     srvctl start instance -d devdb -i devdb2

     srvctl start asm -n rac2

     srvctl start nodeapps -n rac2

   

       devdb : database name

                    devdb1/devdb2 : instance name

     rac1/rac2 : hostname

   

   

(rac1 뿐 아니라 rac2 의 애플리케이션 리소스들도 ONLINE 상태가 됬다.)

   

   

(이 얼마나 깔끔하고 아름다운 광경인가...ㅋㅋㅋㅋㅋ)

   

   

     9-1. 새로운 데이터베이스 서비스의 생성

   

자!! 이제 본론으로 들어가 보겠습니다~~~~~ 라고 이야기 했습니다만 새로운 DB 생성을 위해 DBCA를 실행한 순간 또

다시 DISPLAY 에러 강림하심...

   

   

(앞서 설명한데로 root 계정으로 # xhost + 실행하고 oracle 계정으로 export DISPLAY=:0.0 실행 후 dbca 실행)

   

   

(짜잔~~~^^ 이제 본격적으로 시작!! Oracle Real Application Cluster database 선택 후 Next)

   

   

(Services Management 선택 후 Next)

   

   

(Next)

   

   

(Add를 클릭하고 서비스 추가하자)

   

   

   

(Add a Service에 CRM 이라고 입력하고 OK)

   

   

(devdb1은 Preferred 선택, devdb2는 Available 선택, TAF Policy는 Basic 선택 후 Finish~)

   

   

   

(OK~~)

   

   

(Service 설치 중~)

   

   

(다른 거 설치할 것 없으니까 No~~클릭)

   

   

   

(tnsnames.ora 파일에 위와 같이 CRM 네임 엔트리를 생성한 것을 알 수 있다.)

   

   

   

(CRM이 devdb1 인스턴스에 붙어 있다. devde1에서 장애 발생시 CRM이 devdb2에 붙게 된다. 잠시후 확인)

   

   

   

     9-2. CRM 서비스를 이용하여 첫 번째 세션에 연결

   

   

(CRM이 devdb1에 붙어있고, failover 방식은 Basic 이며 fail over는 발생하지 않았음을 알 수 있다.)

   

   

     9-3. 다른 세션에서 인스턴스를 셧다운

   

   

(새로운 터미널을 열고 위와 같이 장애상황 발생 설정)

   

   

   

     9-4. 세션이 페일오버 되었는지 확인

   

   

(CRM이 devdb2에 붙었고 failed_over 컬럼이 YES 즉, fail over가 수행 되었음을 확인 할 수 있다.)

   

   

     9-5. CRM 서비스를 preferred instance로 페일백

   

※ devdb1이 다시 시작된 이후에도 CRM 서비스는 preferred instance로 페일백 처리되지 않습니다. 따라서 수동으로 서비스를

    devdb1으로 이전해 주어야 한다.

   

   

(rac2 노드의 devdb2 인스턴스에 붙어있는 CRM!!)

   

   

   

(위와 같이 rac1-> srvctl relocate service -d devdb -s crm -i devdb2 -t devdb1 명령어로 페일백 시켜준다.)

   

   

(다시 devdb1으로 컴백한 CRM을 확인!!)

   

   

   

 

출처 : http://blog.naver.com/chosuky?Redirect=Log&logNo=100091891048 [출처] VMware를 이용한 Oracle Enterprize Linux에 Oracle RAC 10g 설치(5)|작성자 초수키

[출처] VMware를 이용한 Oracle Enterprize Linux에 Oracle RAC 10g 설치(5)|작성자 초수키

반응형
반응형

8. RAC 데이터베이스 환경 확인

   

  8-1. 애플리케이션 리소스의 상태 확인

   

   

   

  8-2. Oracle Clusterware의 상태 확인(rac1, rac2)

   

 

   

  8-3. RAC 인스턴스 목록 확인

   

   

   

  8-4. 연결 테스트(각 노드의 인스턴스와 서비스에 연결할 수 있는지 확인)

   

 

 

 

   

   

  8-5. 데이터베이스 설정의 확인

   

   

   

   

  8-6. 온라인 리두 로그파일 그룹 생성

   

 

   

  8-7. 플래시 복구 영역의 공간 사용 현황 점검

   

   

   

[출처] VMware를 이용한 Oracle Enterprize Linux에 Oracle RAC 10g 설치(4)|작성자 초수키

[출처] VMware를 이용한 Oracle Enterprize Linux에 Oracle RAC 10g 설치(4)|작성자 초수키

반응형

+ Recent posts