2005년 12월 27일 화요일

레코드를 랜덤하게 가져오기

http://blog.naver.com/flydrago 님의 블로그 에서 담아 왔습니다.
랜덤 select 쿼리라는게 뭘 말하시는건지

아래 문장은 all_objects 에서 임의의 30% row를 리턴해 줍니다.



select * from all_objects sample(30)







MOD함수를 사용해서



SELECT ABS(MOD(DBMS_RANDOM.RANDOM, 26)) + 65
FROM dual



이렇게 하면 되지 않을까요?

원하시는 답인지 모르겠네요.





******************************

select *

from ( select a.empno, a.ename,b.deptno

from emp a,dept b

where a.deptno = b.deptno

and a.ename like '%'

order by dbms_random.value )

where rownum <= 4





*************************************************

select * from emp sample(1); 1%이내



select * from emp sample(1)

where rownum <= 5;

1%이내에서 5개만가져오기

그외 패키지이용방법등이 있습니다.



MSSQL Version

SELECT top 10 * from authors order by NewID()

MySQL Version

2005년 12월 26일 월요일

php4.311+apache2.055+tomcat5.0.28

버전이 너무 마음대로라 연동에 관련된 재대로된 문서를 찻기가 무지 힘들었다.


http://mpcon.org/apacheguide/prerequisites.php
http://salt.air-nifty.com/salt/2005/11/apace__tomcat__3c8e.html

2005년 12월 19일 월요일

유닉스 커멘드

출력 라인 수 카운트 하기
ps -ef | grep apache | wc -l
출력 라인 문자수 카운트 하기
ps -ef | grep apache | wc -c
출력 라인 단어수 카운트 하기
ps -ef | grep apache | wc -w

2005년 12월 7일 수요일

트랜드 지향

프로그래밍이 직업이 된지도 4년 이라는 시간이 지났다.
멋모르고 공부해 트랜드만 따라 가다 보니 껍데기 개발자로 전락하고 있는듯한 느낌이 자꾸든다.
간만에 Thread관련 사이트를 보다 OS별 커널과 자바 Thread간 매핑 관계에 대한 의문이 생겼다.
http://nttcom.hot.co.kr/docs/jm/jm15.html

2005년 12월 5일 월요일

2005년 11월 17일 목요일

- TABLE rename tips

- TABLE rename tips



you can copy a table using CREATE TABLE .. AS SELECT statement.

(but it DOESN'T COPY table key, index, column default)

After that, use DROP TABLE.



CREATE TABLE new_table AS SELECT * FROM old_table;

DROP TABLE old_table;



http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/statements_73a.htm#2062898



Especially Oracle 9i supports RENAME TO clause.



ALTER TABLE old_table RENAME TO new_table;



http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/statements_32a.htm#2086662

2005년 11월 16일 수요일

프로세스 ID로 실행중인 SQL알아 보기

http://blog.naver.com/tkpolee/80010740220에서 퍼온 내용입니다.

먼저 시스템 자원현황을 살펴보기 위해서 unix에서 top을 실행한다.

# top

load averages: 1.54, 1.47, 2.07 12:24:08
1461 processes:1457 sleeping, 2 stopped, 2 on cpu
CPU states: % idle, % user, % kernel, % iowait, % swap
Memory: 9216M real, 211M free, 9434M swap in use, 7976M swap free

PID USERNAME THR PRI NICE SIZE RES STATE TIME CPU COMMAND
17334 oracle 1 51 0 2510M 2488M sleep 36:46 2.24% oracle
29538 root 5 55 0 4808K 3632K sleep 3:50 1.48% save
29536 root 5 53 0 8048K 6864K sleep 3:34 1.47% save
29537 root 5 60 0 4768K 3648K sleep 0:22 1.35% save
24582 root 1 0 0 414M 1288K sleep 150.0H 0.86% rtf_daemon
9781 oracle 11 58 0 2510M 2481M sleep 933:20 0.74% oracle
6993 oracle 1 20 0 2509M 2485M cpu9 83.3H 0.57% oracle
2208 oracle 1 50 0 2515M 2492M sleep 0:01 0.52% oracle
2211 oracle 1 0 0 2592K 1712K cpu8 0:00 0.36% top
476 tuxkigum 11 50 0 2524M 2491M sleep 45:13 0.32% oracle
470 tuxkigum 12 2 0 2522M 2491M sleep 45:24 0.12% oracle
474 tuxkigum 12 58 0 2524M 2490M sleep 41:19 0.10% oracle
25911 kamzone 11 14 2 2510M 2486M sleep 2:00 0.10% oracle
8824 xwnts 39 23 12 322M 51M sleep 82:17 0.10% java
17692 oracle 1 25 0 2515M 2491M sleep 111:29 0.09% oracle



이중에서 cpu의 사용량이 많은 프로세스(17334)에 대해서 어떤 SQL이 사용되고 있는지

살펴보자. 아래의 SQL을 cpu_overhead.sql로 저장하고 실행한다.

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

-- programed by Lee Chang Kie --

ttitle 'Cpu Overhead SQL Check'
clear screen
set verify off
set pagesize 200
set linesize 110
set embedded off
set feedback off

col col0 format a25 heading "Sid-Serial"
col col1 format a10 heading "UserName"
col col2 format a10 heading "Schema"
col col3 format a10 heading "OsUser"
col col4 format a10 heading "Process"
col col5 format a10 heading "Machine"
col col6 format a10 heading "Terminal"
col col7 format a20 heading "Program"
col col8 format 9 heading "Piece"
col col9 format a8 heading "Status"
col col10 format a64 heading "SQL"

!rm -f ./cpu_overhead.lst

spool cpu_overhead.lst

Select A.sid||','||A.serial# col0,
A.username col1,
A.schemaname col2,

A.osuser col3,
A.process col4,
A.machine col5,
A.Terminal col6,
upper(A.program) col7,
C.piece col8,
A.status col9,
C.sql_text col10
From v$session A, v$process B, v$sqltext C
Where B.spid = '&1'
and A.paddr = B.addr
and C.address = A.sql_address
order by C.piece;

spool off

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

[KAMCO:/oracle/app/oracle/product/806/work]# sqlplus internal

SQL*Plus: Release 8.1.7.0.0 - Production on Fri Mar 4 13:01:40 2005

(c) Copyright 2000 Oracle Corporation. All rights reserved.


Connected to:
Oracle8i Enterprise Edition Release 8.1.7.4.0 - Production
With the Partitioning option
JServer Release 8.1.7.4.0 - Production

SQL> @cpu_overhead



그러면 다음과 같이 프로세스 번호를 입력하라고 뜰 것이다.

Enter value for 1:



top명령을 실행했을 때 가장 상위에 나타는 프로세스ID(17334)를 입력한다.

그러면 아래와 같이 부하를 가중시키는 SQL이 검출될 것이다.

필요시 힌트, 인덱스정책, 실행계획등이나 트레이스를 떠서 필요한 튜닝을

수행해야 할 것이다.



Cpu Overhead SQL Check

Sid-Serial UserName Schema OsUser Process Machine Terminal

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

Program Piece Status SQL

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

664,9791 KAMCO KAMCO tuxkigum 23914 KAMCO

SVZIPSND@KAMCO (TNS 0 ACTIVE SELECT A.LOAN_NO LOAN_NO,A.LOAN_TYPE LOAN_TYPE,NVL(A.SANGYE_DATE

V1-V3)



664,9791 KAMCO KAMCO tuxkigum 23914 KAMCO

SVZIPSND@KAMCO (TNS 1 ACTIVE ,' ') SANGYE_DATE,NVL(A.RUPT_DATE,' ') RUPT_DATE,NVL(A.SANSIL_DAV1-V3)

.

2005년 11월 9일 수요일

EditorList Plugin

이클립스에서 복수의 파일을 에디팅하고 있을 경우 파일명을 목록으로 정리해서 이동하기 쉽도록 해주는 플러그인

https://sourceforge.net/project/showfiles.php?group_id=67968

Window>Show View>other>Basic>EditorList

2005년 11월 7일 월요일

Bugdel PlugIn

AOP적인 접근방법으로 디버그로그를 소스에 적지 않고도 디버깅 가능하도록 만들어진 플러그인

bugdel_1.5.0
http://www.csg.is.titech.ac.jp/%7Eusui/bugdel/index-e.shtml
이클립스 3.1

2005년 10월 28일 금요일

mixi&#38306;連モジュ&#12540;ル

일본의 최대 커뮤니티 사이트 믹시를 이용하기 편하도록 플러그인을
개발하고 있는 분의 사이트

http://www.nitoyon.com/vc/
http://www.nitoyon.com/program/mb/

2005년 9월 20일 화요일

Linux Ant 설정하기

1.http://ant.apache.org/에서 ant download
2.linux 머신 /usr/local/에 upload
3.tar xvfz apache-ant-1.6.5-bin.tar.gz
4./home/loginUser/bash_profile편집
#ANT
export ANT_HOME=/usr/local/apache-ant-1.6.5
export PATH=$ANT_HOME/bin:$PATH
추가.(자바 홈이나 path는 없으면 않되겠죠//)
5.다른 터미널 열어서 ant -version으로 확인

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/tools/ant/launch/Launcher
이런 Exception이나면 예전 버전이 인스톨 되어있을 가능성 이 있으므로.

rpm -qa | grep ant
검색
rpm -e antxxxxx
삭제.

2005년 9월 12일 월요일

둘째

2005년 9월12일 10시
둘째 지우가 태어 났다.한국에서.
아버지로써 부끄럽지 않은 인생을 살아 가고 싶다..
지우야 건강하게 항상 즐겁게 살아갈수 있었으면 좋겠다

2005년 8월 31일 수요일

flex관련링크

http://blog.naver.com/enzolove/120016177784

http://cafe.naver.com/reference.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=195

http://cafe.naver.com/flashover.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=102

Linux Top command RSS 와 swap 자바 메모리 관계

김풍주 님의 글을 그대로 옮겨 왔습니다.
http://siyeon.com/servlet/com.siyeon.blog.Action

어떤 문제인지 구체적으로 언급이 없어서 o/s 관점에 대해서 언급합니다.

1. top 실행
2. shift - f를 후에 swap부분을 toggle
3. shitt - w를 한 후에 저장
4. 종료
5. top p b

지속적으로 관찰하는데 있어 swap를 지켜 보세요

만약 2~3일 정도 운영상태에서도 아래 문서의 마지막 그림과 같으면 정상이라고
보셔도 괜찮습니다. ( heap size가 512mb라면.. )



http://javaservice.com/~java/bbs/read.cgi?m=unix&b=unix&c=r_p&n=1103851815&p=1&s=t



참고 :

[siyeon@www siyeon]$ ps -efww | grep java
root 4497 1 0 2004 ? 00:00:00 java
root 4500 4497 0 2004 ? 00:00:00 java
root 4501 4500 0 2004 ? 00:00:01 java
siyeon 9479 8887 0 23:39 pts/2 00:00:00 grep java
[siyeon@www siyeon]$ top p 4497 b > meta_data <-- 하루 정도 실행
[siyeon@www siyeon]$ cat meta_data

11:39pm up 409 days, 8:50, 1 user, load average: 0.00, 0.02, 0.00
1 processes: 1 sleeping, 0 running, 0 zombie, 0 stopped
CPU states: 0.1% user, 0.1% system, 0.0% nice, 0.0% idle
Mem: 1031276K av, 993060K used, 38216K free, 0K shrd, 60348K buff
Swap: 1052248K av, 23368K used, 1028880K free 546212K cached

PID USER PRI NI SIZE SWAP RSS SHARE STAT %CPU %MEM TIME COMMAND
4497 root 25 5 14404 10M 3916 2552 S N 0.0 0.3 0:00 java

11:39pm up 409 days, 8:50, 1 user, load average: 0.00, 0.02, 0.00
1 processes: 1 sleeping, 0 running, 0 zombie, 0 stopped
CPU states: 0.0% user, 0.0% system, 0.0% nice, 100.0% idle
Mem: 1031276K av, 993064K used, 38212K free, 0K shrd, 60348K buff
Swap: 1052248K av, 23368K used, 1028880K free 546216K cached

PID USER PRI NI SIZE SWAP RSS SHARE STAT %CPU %MEM TIME COMMAND
4497 root 25 5 14404 10M 3916 2552 S N 0.0 0.3 0:00 java

11:40pm up 409 days, 8:50, 1 user, load average: 0.00, 0.02, 0.00
1 processes: 1 sleeping, 0 running, 0 zombie, 0 stopped
CPU states: 0.9% user, 0.7% system, 0.0% nice, 98.2% idle
Mem: 1031276K av, 993064K used, 38212K free, 0K shrd, 60348K buff
Swap: 1052248K av, 23368K used, 1028880K free 546216K cached

PID USER PRI NI SIZE SWAP RSS SHARE STAT %CPU %MEM TIME COMMAND
4497 root 25 5 14404 10M 3916 2552 S N 0.0 0.3 0:00 java

11:40pm up 409 days, 8:50, 1 user, load average: 0.00, 0.02, 0.00
1 processes: 1 sleeping, 0 running, 0 zombie, 0 stopped
CPU states: 0.0% user, 0.0% system, 0.0% nice, 100.0% idle
Mem: 1031276K av, 993072K used, 38204K free, 0K shrd, 60356K buff
Swap: 1052248K av, 23368K used, 1028880K free 546216K cached

PID USER PRI NI SIZE SWAP RSS SHARE STAT %CPU %MEM TIME COMMAND
4497 root 25 5 14404 10M 3916 2552 S N 0.0 0.3 0:00 java

11:40pm up 409 days, 8:50, 1 user, load average: 0.00, 0.02, 0.00
1 processes: 1 sleeping, 0 running, 0 zombie, 0 stopped
CPU states: 0.3% user, 0.1% system, 0.0% nice, 99.4% idle
Mem: 1031276K av, 993084K used, 38192K free, 0K shrd, 60356K buff
Swap: 1052248K av, 23368K used, 1028880K free 546220K cached

PID USER PRI NI SIZE SWAP RSS SHARE STAT %CPU %MEM TIME COMMAND
4497 root 25 5 14404 10M 3916 2552 S N 0.0 0.3 0:00 java

11:40pm up 409 days, 8:51, 1 user, load average: 0.00, 0.02, 0.00
1 processes: 1 sleeping, 0 running, 0 zombie, 0 stopped
CPU states: 0.3% user, 0.3% system, 0.0% nice, 99.2% idle
Mem: 1031276K av, 993088K used, 38188K free, 0K shrd, 60360K buff
Swap: 1052248K av, 23368K used, 1028880K free 546224K cached

PID USER PRI NI SIZE SWAP RSS SHARE STAT %CPU %MEM TIME COMMAND
4497 root 25 5 14404 10M 3916 2552 S N 0.0 0.3 0:00 java
[siyeon@www siyeon]$ grep 'load average' meta_data | awk '{print $1}' | nl > time
[siyeon@www siyeon]$ grep '4497' meta_data | awk '{print $6}' | nl > swap
[siyeon@www siyeon]$ join time swap | awk '{print $2, $3}' > data
[siyeon@www siyeon]$ cat data
11:39pm 10M
11:39pm 10M
11:40pm 10M
11:40pm 10M
11:40pm 10M
11:40pm 10M
[siyeon@www siyeon]$



위 data를 그래프로 그려 본다...
(memory 부분에서 size는 일관성 있게 해 줄것)
awk에서 column부분은 각자 시스템의 환경에 맞게 구성해 보세요.
위 부분은 swap부분을 추출했는데 rss부분도 추출해 같이 비교를 해 보세요.





To : http://javaservice.com/~java/bbs/read.cgi?m=dbms&b=jdbc&c=r_p&n=1110357251&p=1&s=t#1110357251

2005년 7월 27일 수요일

PHP 를 이용한 SCP,SFTP

A PHP condition & Sample when Using sFtp/scp in PHP script Writtened by Jinsuk,yoon
feedback : udanax@joyon.com


it able to open a SSH connection to use SFTP / SCP without any problems
You need first Extension libssh2, PECL libraries

reference
http://docs.php.net/en/ref.ssh2.html
http://pecl.php.net
http://sourceforge.net/projects/libssh2/)


sftp와 scp를 사용하기위한 PHP환경과 예제입니다.
먼저 sftp와 scp를 사용하기 위해서는 SSH Connection이 가능해야하기때문에, libssh2, PECL라이브러리를 확장하세요. (system()명령으로도 가능은 하지만, 여러가지 고려함에..)

아래의 샘플을 통하여, php스크립트를 통해 원격으로 서버대서버로 sftp프로토콜을 사용하여 파일전송을 할수있습니다.



Example


define('SFTP_ADDR', '211.233.83.189');

$start_time = microtime(true);



// establish connection to FTP over SSH
$connection = ssh2_connect(SFTP_ADDR, 22);
$sftp = ssh2_sftp($connection);


$src_file = '/usr/local/www/data.src';
$dst_sftp_file = 'ssh2.sftp://' . $sftp . '/www/data.dst';
$dst_scp_file = '/www/data.dst';


//use SFTP wrapper
copy($src_file, $dst_sftp_file);


//use SCP
ssh2_scp_send($connection, $src_file, $dst_scp_file);

print 'Total Time: ' . microtime(true) - $start_time;




Expected result:
----------------
Expected: FAST file transfer, over 3MB/sec

Actual result:
--------------
Result: SLOW file transfer, around 30KB/sec

Feedback : udanax@joyon.com

2005년 7월 22일 금요일

CVS 커밋 발생시점에 소스 export 하기

지금 개발 하고 있는 환경이 주로 PHP를 이용한 개발 이라 CVS에서 소스를 가져와서 수정하고 SFTP로 테스트 서버에 전송 확인한 후에
CVS에 커밋을 하는 작업이 발생한다.

이제껏 자바 개발의 경우 소스를 CVS에 커밋 한다고 해도 매번 컴파일작업이 발생하기 때문에 개발 효율은 그리 높지 않았다.
PHP의 생산성은 자바와는 비교가 되지 않을 정도 이지만 위에서 언급한 CVS커밋 작업과 서버에전송작업이 업무 효율을 떨어뜨리는 원인이 되고 있었다.

PHP의 경우 commit한 것을 wep page를 통해 확인 하기 때문에 CVS 와 아파치 DocumentRoot를 연결해 두면 작업한 소스를 CVS 에 커밋 하는 것만으로 확인이 가능해 진다.

이하는 이를 위한 설정 이다.

CVSROOT위치 /home/cvs/
모듈명 bin
아파치 DocumentRoot /home/apache/doc

bin모듈에 소스를 커밋 하면 /home/apache/doc/bin 에 변경한 것이 반영되도록 한다.

[root@xxxx root]# cd /home/cvs
[root@xxxx cvs]# ls
bin CVSROOT cvstest test

만들어 주어야 하는 파일
auto_update.pl
binUpdate.sh

[root@xxxx CVSROOT]# view auto_update.pl
#!/usr/bin/perl
#cvs path
$cvs = '/usr/bin/cvs';
$usage = "usage: auto_update.pl WORKDIR [MODE]";
# process arguments
die $usage, "
" unless $workdir = $ARGV[0];
$chmod = $ARGV[1] ? "; chmod -R $ARGV[1]" : "";
# main update process which must be executed in background.
$cmd = "(cd $workdir; $cvs -q update $chmod) &";
system($cmd);
# last message.
$date = `date`; chomp($date);
$mesg = "$workdir automatically updated at $date";
print "$mesg
";

[root@xxxx CVSROOT]# view binUpdate.sh
#!/bin/sh
/home/cvs/CVSROOT/auto_update.pl /home/apache/doc


수정해 주어야 하는 파일
loginfo에 이하의 내용을 추가해 주면 된다.

bin /home/cvs/CVSROOT/binUpdate.sh bin


[root@xxxx CVSROOT]# view loginfo
# The "loginfo" file controls where "cvs commit" log information
# is sent. The first entry on a line is a regular expression which must match
# the directory that the change is being made to, relative to the
# $CVSROOT. If a match is found, then the remainder of the line is a filter
# program that should expect log information on its standard input.
#
# If the repository name does not match any of the regular expressions in this
# file, the "DEFAULT" line is used, if it is specified.
#
# If the name ALL appears as a regular expression it is always used
# in addition to the first matching regex or DEFAULT.
#
# You may specify a format string as part of the
# filter. The string is composed of a `%' followed
# by a single format character, or followed by a set of format
# characters surrounded by `{' and `}' as separators. The format
# characters are:
#
# s = file name
# V = old version number (pre-checkin)
# v = new version number (post-checkin)
# t = tag or branch name
#
# For example:
#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog
# or
#DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog

bin /home/cvs/CVSROOT/binUpdate.sh bin


---------주의 사항---------
퍼미션 관련 에러에 조심하기만 하면 아무 문제 없이
커밋한 소스를 아파치DocumentRoot 에 밀어주게 된다.

아파치 DocumentRoot의 유저 가 xxx라면
cvs의 그룹에 xxx를 등록해 주면 된다.

[root@xxx CVSROOT]# vi /etc/group
xxx:x:502:cvs사용유저1 ,cvs사용유저1,cvs사용유저2
cvs:x:503:cvs사용유저1,cvs사용유저1,cvs사용유저2,xxx


/home/apache/doc/에서
cvs checkout bin을 먼저 실행해 bin을 체크 아웃 해두는 것도 잊지 말아야 한다.
checkout시 bin 에 lock관련 정보를 write할수 없다는 에러가 발생하면 chgrp -R bin해주면 되겠죠...

2005년 7월 20일 수요일

다국적 언어 처리

황정철님 블로그
http://blog.naver.com/hjc1108.do?edirect=Log&logNo=60011201293
네이버 검색결과
http://search.naver.com/search.naver?where=nexearch&query=ASCII+ORACLE+US7ASCII+jdbc+utf-8&hw=1

2005년 6월 29일 수요일

1년 7개월 ...

출근 마지막 날이다.
의료보험증 과 회사 열쇠 사원증을 반납하고 개발실에 돌아 와 있다.
1년 7개월 ...본사에 출근한 날짜를 따져 보면 1개월도 않된다.
신카와사키에 히타치 > 카치도키에 스미쇼 > 신주쿠에 산토리 > 록봉기에 엠펙토리...

이렇게 1년 7개월이 지나 갔다.
최선을 다해 좋은 시스템을 만들어 보고자 했던 의욕과 나름대로 자바에 대해 프로그래밍에 대해 조금은 자만해 있었던 자신의 모습이 1년 7개월이 지난 지금 어떤 모습을로 변해 있는가..

좋은 시스템을 만든다는 것이 참 어렵고도 힘든일 이라는걸 깨닫게 되었다.
이전 2년간 대기업에서 사내 시스템을 개발하다보니 익숙해진 환경과 능숙한 업무분석에 스케쥴에 어느정도 여유가 있었다.나름대로 프로세스 개선과 업무분석에 대한 효율적인 방향개선에 대한 노력등을 할수 있었다.

전직한후 1년 7개월간 매번 다른 맴버들과 새로운 업무 프로세스,프로세스에 대한 개념조차 없는 발주처,빡빡한 스케쥴
개발 프로세스 개선이나 품질향상에 시간을 기울일만한 여유가 없는 프로젝트가 대부분이었다.그 속에서도 최선을 다해보려 애썻지만 결국은 지치고 말았다.

내일부터는 줄곳 한자리에서 개발하는 회사로 첫 출근을 한다.
1년 7개월 전처럼 효율적인 업무를 할수 있는 자신으로 돌아 갈수 있었으면 한다.

2005년 5월 26일 목요일

Jboss ア&#12540;キテクチャ

http://h50146.www5.hp.com/products/software/oe/linux/summary/reference/pdfs/jbossarch1_0.pdf

2005년 5월 25일 수요일

excitの韓&#22269;語&#32763;&#35379;

韓国語で書いた内容をexciteで翻訳してみると文法などをきちんとして書いた部分は8割ぐらい一致してるが、部分的に辞書に載ってない単語とか使うとかなり誤解を招くような内容になってしまう。
飯田さん、間違った翻訳で誤解しないでください。

2005년 5월 24일 화요일

PHP Eclipse 관련 사이트

7월 부터는 PHP로 개발 하게 될꺼 같다.
PHP관련 개발 환경이나 참고가 될만한 사이트 링크

PHP
http://jp2.php.net/

PHPeclipse
http://www.phpeclipse.de/tiki-view_articles.php
http://www.xored.com/trustudio

한국
http://www.php.pe.kr/
http://www.nzeo.com/
http://www.tood.net/

일본
http://phpyaru.seesaa.net/
http://www.itnavi.com/EclipseDePHP.htm
http://read.seesaa.net/article/3268508.html

PHP리모트 디버깅
http://www.geocities.jp/maple4estry/eclipse_php.html

2005년 5월 13일 금요일

정규표현식 기본

String stbID = "864612b87667e60a260c14860Aac6a7";
String ids = "123456789";
assert(Pattern.matches("^[a-zA-Z0-9]*$", stbID );
영문 대소문자 숫자 위치 길이 상관없음

System.out.println(Pattern.matches("^[0-9]*$", ids );
숫자만 길이 상관없음

2005년 5월 10일 화요일

골든위크 중 작업

일본은 4월 말부터 5월초 에 골든위크라는 연휴가 있다.
올해는 4월 30일(토)부터 한주를 쉬고 5월 9일 출근을 했다.

골든위크 중에 예전에 같이 프로젝트를 했던 회사 사장님의 부탁으로 모바일 스이카 (핸드폰 교통카드 라 하면 맏을까?)프로젝트에 불을 끄러 갔었다.4일 동안 힘든일이었지만 JR관련 정보들을 알수 있어서 많은 도움이 되었다.

JR EAST하루 사용자는 얼마나 될까?
동경인구가 2000만이라고 한다면 출퇴근 인구를 1000만정도
동경역은 145만명정도라니까 신주쿠역 하나만으로도 하루 평균 100만 정도는 되지 않을까?

그 많은 사용자들이 사용하는 정보(어느 역에서 타서 어느역에서 내리고 요금은 얼마이며 정기구간네 에 요금 얼마는 어떻게 뺴고,,등등등,.,)를 어떻게 관리하고 있을까?

하루동안 설명을 들어서 그리 자세한곳 까지는 알수 없었지만 정말 많은 도움이 되었다.상상만 하던 시스템이 이렇게 구성되어 있구나 하는걸 알게 되서 감격..참고로 최종 데이터 처리단은 메인프레임 으로 구성되어 있답니다.(유닉스로 이행을 검토 중이라는..)

2005년 4월 27일 수요일

기본 설계와 설계자의 중요성

VOD시스템 개발을 시작한지 3개월 가까이 시간이 흘렀다.

2월 말경에 정리된 기본설계서 에는 테이블이 많아야 35개 이상을 넘지 않았다.실제 첫 사용자 리뷰가 있었던 4월 20일에 완성된 시스템은 테이블이 72개 였다.설계에 참여 하고 있는 인원 10여명,
실제 코딩하고 있는 인원 10여명 도합 20여명에 사람들이 움직이고 있다.아주 소규모에 프로젝트는 아닌데 스케쥴 관리,품질관리가 엉망이다.
단적인 예를 들자면

CDN비슷한 기능을 하는 시스템을 설계중인 사람에게서 한시간 가량에 설계설명이 있었다.참고 서류가 없었다.회의에 참석한 5명에 인원은 CDN이 뭐 하는 것인지도 모르는 사람들이다.

기본 설명도 없이 작은 화이트 보드에 갈겨 나가는 설계 설명.
설명을 하는 사람은 1달째 CDN을 설계하고 있다.CDN을 어느정도 알고 있는 것이다.CDN에 관해 처음 들어 보는 사람들이 과연 그의 설명을 이해 할수 있었을까?적어도 나는 이해 할수 없었다.인터넷에서 다운 받은 CDN자료에서 설계자가 생각하고 있는 부분이 실제로는 CDN의 기능이 아니다는 것만은 확실히 이해를 했지만..

코딩에 참여할 인원들은 이미 지쳐 있다.한결같이 다른 시스템을 맏고 싶어 하지 않는다.

왜일까?코더들이 나빠서?
절대 아니다.

명확하지 않은 기본설계 ,실제로 코딩에 들어갈수 없을 정도로 품질이 나쁘다.하지만 시간이 없으니 시작한다.
하나의 펑션을 만들기 위해 적게는 10번에서 30번도 질문을 하지 않으면 않된다.설계자도 지쳐가고 코더도 지쳐 가고 품질은 떨어지고 시간은 점점 촉박해 지기만 한다.사람들은 주말을 희생하고 퇴근 시간도 희생하기 시작한다.다들 지쳐가고 뭘 하고 있는지도 모를때쯤
어찌 어찌 부분적인 서브펑션은 완성된다.

하지만 기본설계가 엉망이다 보니 외부 인터페이스가 전혀 맏지를 않는다.
테스터도 어디부터 어디까지 데이터를 준비 하고 어떤데이터를 기준으로 기능이 OK인가 아닌가를 판단 하지 못한다.
주말을 희생해 가며 작업한 코더들은 이미 지쳐 있다.


이제껏 XP 개발 방법을 프로젝트에 적용해 오면서 문서작성에 대해
냉소적이었다.쓸데없는 문서.현실과 동떨어진 설계..
설계 레뷰를 하는 시간을 따로 정해야 할듯한데..
어찌 할꼬..

2005년 4월 24일 일요일

jboss.monitor

엔티티빈 별 상황을 확인 할수 있다.

http://xxx.xxx.xxx.xxx:8080/jmx-console/
화면에서
jboss.monitor
name=BeanCacheMonitor
name=EntityLockMonitor

EntityLockMonitor 선택

java.lang.String printLockMonitor()
MBean Operation.
invoke버튼을 누르면..

EJB NAME Total Lock Time Num Contentions Time Outs
TCnttBrdDistNumHis 0 0 0
TCnttBrdStudio 0 0 0
VCtaCtryRanking 0 0 0
TCttSrmtHis 0 0 0
출력 된다.

2005년 4월 19일 화요일

www.codeproject.com ToDoList

한날 님(http://hannal.com/blog/index.php)
의 블로그에 올라와 있는걸 보고 다운받아서 사용해 보았다.

http://www.codeproject.com/tools/
프리툴들이 소스코드 까지 공개되어있는 좋은 사이트..
자바만 하다보니 자카르타나 소스포지 에만 너무 관심을 가졌나보다.
가끔 코드그루 도 보기는 하지만..
기술적 편식은 좋지 않은데...

2005년 4월 12일 화요일

일본인 친구

어제는 전 사원 회의 가 있어서 오래간만에 일년전 프로젝트를
같이한 친구들을 만날 기회가 있었다.(100명 가까운 사원에 외국인이 나뿐인 회사라..)

집에서 식사도 같이 할정도로 다들 좋은 친구들 이다.
그런데 대뜸 한놈이 독도를 돌려줄 생각은 없냐고,
니 생각은 어떠냐고 묻길래 한번 웃어줬다.
독도는 원래 한국 땅이 었고 지금도 한국 땅이니까 돌려 줘야 한다는 말 자체가 맏지 않다고 예기 해 줬다.
그 친구 말로는 자기들은 독도가 있는줄도 몰랐단다.학교에서 그런 내용은 배우지 못했다고.
CNN에 일본이 유엔 상임안보리 이사국 진출 찬반 조사하는 Pool에 나도 반대 한다는 입장에
투표를 했다고 예기 하니까 왜 반대를 하느냐고,진출해도 될만큼 사죄도 많이 하고 금전적으로
보상도 많이 하지 않았냐고..아직도 사죄가 부족하냐고..그렇게 묻는 친구말이 조금은 서글프게
들리는건 ...

점차 우익 성향화 되어 가고 있는 일본,,
전후 일본은 미국 군정하에서 억압을 받았었다.
전쟁에 패배 했다는 굴욕감과 폐배 의식이 전일본인에 팽배 해 있었다.
일본에서 어학연수시절 도서관에서 읽었던 세계2차 대전 당시 일본 내에서 유통되고 있던 서적들의
내용은 상당부분 검열당해 실질적 전장에서 일어나고 있는 일들을 내부국민들은 알수 없는 상황이 었다.
(근레에 걸프전이나 이라크 전에서도 전장에 정보는 상당부분 검열을 받고 있다.)

어제 질문 해왔던 친구들은 왜 자기 할아버지가 나쁜지 과연 무었을 반성해야 하는 지 전혀 알지도 알려고 하지도 않는다.
알려고 하지 않는 그친구가 나쁜 것이 아니라
알아야 한다고 가르치지 않은 일본의 교육이 문제가 인것이다.
(아마 패전에 대한 기억은 지워버리고 싶은 과거 이기 때문이 아닐까.)

그런 과거에 대한 제한된 교육을 받은 대부분에 일본인들은 무엇이 나쁜 일이 었는지도 모르는체
가끔 언론에서 보여주는 관료들의 사과 발언과 보상금으로 얼마얼마를 지원했다는 정보를 접하게 된다.
당연히 억울 하게 일본이 당하고 있다는 생각이 들게 되는..
모르던 사람이 잘못 생각하기 시작하면 끝도 없이 다른 방향으로 달리기 시작하게 되는건
어찌 보면 당연한 일이 아닐까.하지만 그것을 묵인하고 용인해서는 절대 않된다.

「反日&#12539;親北」韓&#22269;の暴走―「韓流ブ&#12540;ム」ではわからない

방금 서점에서 「反日・親北」韓国の暴走―「韓流ブーム」ではわからない 을 읽다 구역질이 날뻔 했습니다.
과연 이사람이 대학에서 국제 관계를 연구하고 수업을 진행할 만한 자질을 같춘 사람인가 하는 의문이 들정도로
편향되고 편협한 이론으로 가득한 책을 읽으면서 과연 이 책을 읽은 일본인들이 생각하는 한국 과 일본의 관계에 대해
어떤 생각을 하게 될까 하는 의문이 들었다.
한번 만나 보고 싶은 사람이다.
일본 생활을 오래 하면 이렇게 되는가?
진정 한국과 일본의 관계를 생각 한다면 좀더 지협적이고 편향되지 않는 의식을 가져야 하지 않을까.조언을 하고 싶을 정도다.

http://www.amazon.co.jp/exec/obidos/ASIN/4093875502/ref=pd_rhf_p_4/249-4867692-2861944

2005년 4월 10일 일요일

결국은 일요일 출근

일이 과연 바쁜가?

금요일 간만에 친구들과 한잔 하고 카와사키 가서 자고..
토요일 11시에 출근.
능률은 오르지 않으나 업무 진행
사양서 문제 발견(2주 전부터 예기 해왔던 문제가 아직도 그대로,,
해결 방안을 그때 예기 해 줬건만...)
고민 ,을 담당자 는 출근 않해 있어서 PM에게 물어봄,
결정권 없으므로 딴부분 코딩하라고 함.
따른부분 코딩 ..
1시간 경과 결국 문제의 부분과 커플링..
2시간 다른 부분 코딩.(위험 부담 발생 코드가 얽히기 시작)

단념하고 리펙토링 시작
20 시 퇴근
일요일 출근 해달라는 요구가 을 윗선에서 발생
일요일 11시 출근
PM은 쉼.
정 단에 사람 2명이 자리를 지키고 있음.
리펙토링 개시
을 단에 사람은 결국 출근 않함


여러 사람을 힘들게 하는건 치열한 경쟁이나 스케쥴이 아니다.
약속이라는것,환경이라는 것이다.

2005년 4월 7일 목요일

2005년4월7일

독도는 한국 땅이다.
이는 자명한 사실이며 이를 더이상 논할가치가 없는 것은 논리에 맏아 보인다.

하지만 자국영토에 대한 도발을 논할가치가 없다고 호도해 버리고 있는 지금에 실태는 과연 어떤결과를 불러 올것인가?
블로그 메인화면에 사진을 올린 책을 읽어 보고 싶다..
내 주변에 일본인들은 어떻게 생각 하고 있을까...?

2005년 4월 6일 수요일

팀 파견 단위 PM이 가져야할 자세(등장인물 갑을병정)

록봉기에서 VOD시스템개발을 시작한지 2달이 넘어 간다.
VOD 시스탬을 발주 한 갑 +갑 회사 내부에 시스템 개발팀 을
내가 사원적을 두고 있는 병 + 병을 통해 들어온 정

실질적인 코딩 작업 은 병 단에서 시작 한다.
코딩하는 인력은 20명 정도
내가 적을 두고 있는 병..
(일본에서 그래도 자바 잘한다고 평가 받고 있는 회사 ???가끔 책을 쓰거나 하던 사원도 2개월 전에 그만 뒀다.그사람이 꽤 실력 있었는데..같이 2개월 정도 프로젝트를 했었는데.. 소스도 깔끔하고 문제 정리도 잘 하는 ..그런 타입)
지금 프로젝트에 PM은 나랑 동갑에 (일본애니까 경력은 내 1.5배 정도 )병에서 같이 파견을 나와 있다.
근데 PM이 처음이라 우왕 좌왕한다.
처음엔 괜찬더니만 매일 시도 때도 없이 변경되는 사양,DB 를 앞에 두고 내가 제시한 스케쥴 이상에 일을 하란다.
제시된 날짜까지 사양이나 제대로 정리 될라나?..
이 PM이 어느 회사 사람인지 이해가 않되기 시작 한다.
방금도 사양 대로 만들어 놓은 인터페이스 가지고 외부에서 사용하는 팀이랑 회의를 했는데 전혀 딴소리 한다.
어찌하면 좋을꼬..
PM도 그 자리에 있었지만 갑,을 에는 아무 소리도 못한다..이놈을 어쩨 쓸까이...
스케쥴 을 무시하고 전송 이라는 부분 까지 18일까지 만들어 달란다.
절대 무리 라고 했더니 해 달란다.아니 하란다..일본에서 일하면서 이런놈 첨 본다..기가 막혀서..
PM이 될리도 없지만 된다고 하더라도 이런놈은 되지 말아야지..
되고 싶지도 않고 그럴 능력도 없다.
음...

2005년 4월 5일 화요일

내일은 우리지오 유치원 입학식

저는 참 많은 분들에게 신세를 지고 살고 있습니다.
30년을 가까이 키워주신 부모님,
내일이 어찌 될지 모르는 날백수 랑 결혼해
말도 안통하는 이국 땅에서 자식 키우며 저를 돌봐 주고 있는 집사람,
할아버지 할머니 귀여움을 못받고 자라는 내딸..
어느날 갑자기 일본 간다 하며 휭하니 사라져 버린 저를 기억해 주는 친구들
하나 도움도 되어 주지 못해 항상 미안한 형제들..

갑자기 기분이..ㅋㅋㅋ
내일 제 딸이 유치원 입학을 합니다.
오전 휴가를 내어 입학식에 참석합니다.
(하루 휴가를 내고 싶었는데 PM이 NO.하네요,,짜식 열받네..)
아무튼 자주 못놀아주고,사랑을 많이 못줘서 미안한 제 딸이
이제 유치원 입학을 합니다..짝짝짝...

2005년 3월 31일 목요일

2005년3월31일 읽고 싶은책

한국을 떠나 있는 관계로 읽고 싶은 책이 있어도 금방 구입을 하지 못한다.3개월 전에 읽고 싶은 책이 있어서 (400페이지 정도)해외 배송을
이용해 봤는데 책값에 절반정도 였다 .
책이 3만원에 배송비가 만칠천원 정도..

근데 정말 읽고 싶다..

톰켓 관련
http://www.yes24.com/Goods/FTGoodsView.aspx?goodsNo=1456047&CategoryNumber=001001003011014

커널관련
http://www.yes24.com/Goods/FTGoodsView.aspx?goodsNo=1469757&CategoryNumber=001001003005

http://www.yes24.com/Goods/FTGoodsView.aspx?goodsNo=1461768&CategoryNumber=001001003005001002

DB 변경사항 반영

아침 출근시간에 근희형과 예기하다가 생각난 아이디어
DBTable Mapper
프로젝트 중에 DB Layout이 변경되면 여타 개발자들에게 메일로 변경내용을 알려주게 된다.
하지만 테이블이 불어나고 구조가 복잡해지기 시작하면 실질적 관련이 없는 부분은 무시하고 테이블 변경을 하지않는 경우가 자주 발생하게 된다.

테이블 명을 클래스명으로 하고 각컬럼을 필드로 가지는 일반적 VO 의 형태를 가진 클레스를 가지고 작업을 한다면 그리고 VO클레스를
매일 저녁 재작성해 CVS에 반영 한다면 layout 변경정보를 모든 개발자 들이 공유 할수 있게 되지 않을까.

만들어 보자.

2005년 3월 13일 일요일

Oracle 10g DBPUMP

datapump(10g to 10g)

OS dir 作成
C:>sqlplus /nolog

SQL*Plus: Release 10.1.0.2.0 - Production on 日 3月 13 14:03:03 2005

Copyright (c) 1982, 2004, Oracle. All rights reserved.

SQL> connect sys/sys as sysdba
接続されました。
SQL> create or replace directory exportdir as 'C:datapump'
ディレクトリが作成されました。

SQL> create user sam identified by sam default tablespace users quota unlimited on users;
ユーザーが作成されました。

SQL> grant create any directory to sam;

SQL> grant read,write on directory exportdir to sam
権限付与が成功しました。

SQL>alter user sam default tablespace users quota unlimited on users;

expdp 実行
C:Documents and Settingsoracle>C:Documents and Settingsoracle>expdp sam/sam tables=dbpump dumpfile=exportdir:aaa.dump logfile=exportdir:aaa.log

Export: Release 10.1.0.2.0 - Production on 日曜日, 13 3月, 2005 14:40

Copyright (c) 2003, Oracle. All rights reserved.

接続先: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options
"SAM"."SYS_EXPORT_TABLE_01"を起動しています: sam/******** tables=dbpump dumpfile
=exportdir:aaa.dump logfile=exportdir:aaa.log
BLOCKSメソッドを使用して見積り中です...
オブジェクト型TABLE_EXPORT/TABLE/TBL_TABLE_DATA/TABLE/TABLE_DATAの処理中です
BLOCKSメソッドを使用した見積合計: 0 KB
オブジェクト型TABLE_EXPORT/TABLE/TABLEの処理中です
. . "SAM"."DBPUMP" 0 KB 0行がエクスポート
されました
マスター表"SAM"."SYS_EXPORT_TABLE_01"は正常にロード/アンロードされました
******************************************************************************
SAM.SYS_EXPORT_TABLE_01に設定されたダンプ・ファイルは次のとおりです:
C:DATAPUMPAAA.DUMP
ジョブ"SAM"."SYS_EXPORT_TABLE_01"が14:42で正常に完了しました。


impdp実行
C:Documents and Settingsoracle>impdp sam/sam tables=dbpump dumpfile=exportdir:aaa.dump logfile=exportdir:aaa.log
Import: Release 10.1.0.2.0 - Production on 日曜日, 13 3月, 2005 14:45

Copyright (c) 2003, Oracle. All rights reserved.

接続先: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options
マスター表"SAM"."SYS_IMPORT_TABLE_01"は正常にロード/アンロードされました
"SAM"."SYS_IMPORT_TABLE_01"を起動しています: sam/******** tables=dbpump dumpfile
=exportdir:aaa.dump logfile=exportdir:aaa.log
オブジェクト型TABLE_EXPORT/TABLE/TABLEの処理中です
オブジェクト型TABLE_EXPORT/TABLE/TBL_TABLE_DATA/TABLE/TABLE_DATAの処理中です
. . "SAM"."DBPUMP" 0 KB 0行がインポートさ
れました
ジョブ"SAM"."SYS_IMPORT_TABLE_01"が14:45で正常に完了しました


dbconsole実行
C:>emctl status dbconsole
Environment variable ORACLE_SID not defined. Please define it.

C:>set ORACLE_SID=jeon

C:>emctl status dbconsole
Oracle Enterprise Manager 10g Database Control Release 10.1.0.2.0
Copyright (c) 1996, 2004 Oracle Corporation. All rights reserved.
http://EVS-D106:5500/em/console/aboutApplication
Oracle Enterprise Manager 10g is running.
------------------------------------------------------------------
Logs are generated in directory C:oracleproduct10.1.0db_1/EVS-D106_jeon/sysm
an/log

2005년 3월 7일 월요일

1달 가까이 가는 감기.

3월도 1주일이 훌쩍 지나 버렸다.
회사 일은 다들 바쁜데 구현 부분을 끝내버린 나는 한가하다.
Https에 soap로 EJB를 어쩌구 저쩌구 하는데..
AP서버단에서 이미 구현 되어져 있는거 아닌가.?
SOAP메세지형식만 서로 정해주면 클라이언트에서 서버 호출하고
EJB실행하고 결과 돌려 주면 되는듯 한데...음...
감기라 집중이 않된다..코가 막혀서 ..
퇴근 해야 겠다.

2005년 3월 4일 금요일

pgcluster

DB Cluster
OpenSource 가능성

http://www.csra.co.jp/~mitani/jpug/pgcluster/docs/okinawa_2004.pdf
http://www.sra.co.jp/tepia1205/document/B-2-1.pdf

2005년 2월 25일 금요일

N모 종합연구소

이직을 하기위해 면접을 보고 있다.
일본에서 유명한 회사인 N모종합연구소에 면접결과가 오늘 나왔다.
일본어 능력 부족을 이유로 불합격..
음...일본어 능력이 부족한건 인정하지만 처음 응모해서 서류 전형을 통과한 포지션은 시스템 엔지니어 부문이었는데..
상류공정에 서의 일본어 사용능력이 부족하다는 애매한 대답이다.
시스템 엔지니어의 상류공정이라면 시스템 전반 설계,컨설팅 까지를 포함 한단 말인가?..

나 자신의 능력부족을 통감한다.
마음 한켠에는 내 일본어 능력이 그렇게 부족한가 라는 생각이 들기도 하고, 또 한켠에서는 일본어 를 커버 가능할 정도에 기술력을 키워야 겠다는 생각이 든다.

아무튼 능력부족을 극복해 보자.

[PostgreSQL] Non-superuser connection limit exceeded

JBOSS로 작성한 MBD로(큐방식 구현)메세지를 루프를 돌리며(최대20건 )send해본 결과 PostgreSQL의 connection문제로 에러 발생
DB설정 문제
表示されているエラーを見ると、
「非特権ユーザーの接続(数)の限界が超えています。」

ということなので、postgresql.conf の max_connections の項、
php.ini の pgsql.max_links, pgsql.max_persistent の項、
エラーが発生している時の、netstat -a の結果を見比べる。
とか、PostgreSQL が吐きだしているログを、PHP のログと見比
べたりしすると「何故なのか」わかるかもしれません。

そのエラーをみたらとりあえず、そんなことをしてみたくなり
ます。

postgresql.conf 의 max_connections수가 32 이던것을 96으로 변경후 1000건을 루프를 돌리며 send해본결과 문제없이 수행 완료 되었음

DB설정 변경이 불가능한 경우
스레드를 생성해 메세지 send 후에 wait(200ms)을준 결과 문제없이 수행

JBoss(4.x)MQ+PostgreSql

JBoss+Postgre에서 MDB설정 부분입니다.
DataSource 설정부분과 queue설정
그리고 권한 설정부분만 제대로 잡아주면 문제가 없을듯 합니다.
(JBoss 디폴트 설정부분이 남아 있어 지저분 하지만..)
회사 동료들을 위해 작성한 설정 자료를 그대로 올려봅니다.
Postgres는 버전 7.x에 pg73jdbc2ee.jar로 동작확인

以下のFileを上書きしてください。(CVSのtoolsJMS設定)
C:/jboss-4.0.1/server/default/deployjms下に
postgres-jdbc2-service.xml
postgres-jdbc-state-service.xml
jbossmq-service.xml
jbossmq-destinations-service.xml

C:/jboss-4.0.1/server/default/conf下に
login-config.xml
standardjbosscmp-jdbc.xml

hsql관련 파일을 삭제해 주십시요.

C:/jboss-4.0.1/server/default/deploy/hsqldb-ds.xml
C:j/boss-4.0.1/server/default/deploy/jmshsqldb-jdbc-state-service.xml
C:jboss-4.0.1/server/default/deploy/jms/hsqldb-jdbc2-service.xml

서버를 제 기동해 로그를 확인해 주십시요.

INFO [ConnectionFactoryBindingService] Bound connection factory for resource adapter for ConnectionManager
'jboss.jca:name=JmsXA,service=ConnectionFactoryBinding to JNDI name 'java:JmsXA'
INFO [WrapperDataSourceService] Bound connection factory for resource adapter for ConnectionManager 'jboss
.jca:name=PostgresDS,service=DataSourceBinding to JNDI name 'java:PostgresDS'
INFO [A] Bound to JNDI name: queue/A
INFO [B] Bound to JNDI name: queue/B
INFO [C] Bound to JNDI name: queue/C
INFO [D] Bound to JNDI name: queue/D
INFO [ex] Bound to JNDI name: queue/ex
INFO [testTopic] Bound to JNDI name: topic/testTopic
INFO [securedTopic] Bound to JNDI name: topic/securedTopic
INFO [testDurableTopic] Bound to JNDI name: topic/testDurableTopic
INFO [testQueue] Bound to JNDI name: queue/testQueue
INFO [drmRealTimeQueue] Bound to JNDI name: queue/drmRealTimeQueue
INFO [queue/drmRealTimeQueue] Bound to JNDI name: queue/queue/drmRealTimeQueue
INFO [UILServerILService] JBossMQ UIL service available at : /0.0.0.0:8093
INFO [DLQ] Bound to JNDI name: queue/DLQ





INFO [Http11Protocol] Coyote HTTP/1.1をポート http-0.0.0.0-8080 で起動します
INFO [ChannelSocket] JK2: ajp13 listening on /0.0.0.0:8009
INFO [JkMain] Jk running ID=0 time=0/32 config=null
INFO [Server] JBoss (MX MicroKernel) [4.0.1 (build: CVSTag=JBoss_4_0_1 date=200412230944)] Started in 22s:
540ms

以上LogPatternであればOKです。
以上の設定でOKですが、変更内容が知りたい方は下のを参考にしてください。
お疲れ様でした。

2005년 2월 17일 목요일

JBOSS 클러스트링 관련 문서

JBoss를 이용한 VOD관리시스템 2주차
http://h50146.www5.hp.com/products/software/oe/linux/summary/reference/pdfs/hp_jboss1.0.pdf

TDD

프로젝트 공통 PageUtil 클래스를 만들었다.
테스트 클래스 만들고 기반 메소드에서 문제가 될듯한 부분을 전부 테스트 했다.같이 일하고 있는 동료에게 사용해 보라고 했는데.(사용법은 테스트 클래스를 보면 알꺼라고..)3일 동안 딴일을 하느라 소스를 점검하지 못했었는데..
어제 저녁 test 리포트 에서 PageUtil관련 테스트 항목이 없어져 있는 것이 아닌가...
테스트 클래스는 삭제 되었고 ,PageUtil클래스는 이상한 방향으로 흘러 가고 있다..(물론 고쳐서 사용해 달라고 했지만..테스트 클래스는 반드시 갱신해 달라고 했는데..)
어쩌면 좋을까...

2005년 2월 16일 수요일

eclipsecolorer.sourceforge.net

이클립스 3.0x + jboss4.x에서 동작 확인 완료.
http://eclipsecolorer.sourceforge.net
http://eclipsecolorer.sourceforge.net/index_profiler.html
0.5.33 [show only this release]

2005년 2월 4일 금요일

本番環境Deploy

작년 7월부터 작업하던 프로젝트가 1차 릴리스 운용을 시작 하게 되었다.(록봉기 프로젝트와는 다른 프로젝트)
30분 후에 Deploy가 시작 된다.
오늘은 일찍 퇴근 할수 있을려나.

2005년 2월 3일 목요일

六本木生活三日目

가끔 내 블로그를 보는 일본인 동료들 때문에 일본어로 글을 올리는건 조심해야 겠다.
힘들다.
전부 CMP로 만들어 지고 있는 부분에 대해 수정이 필요하다고 말했다.오늘 그 회의 가 있었다.
검색 결과가 만건 가까이 되는걸 (그것도 CMR로 조인)CMP로 만들고 있다.뒤에서 보다가 안되는 건 아니지만 서버가 괜챤겠냐고
예기 한번 했더니 무슨 말이에요?그런다....
쩝...어찌하면 좋을까..

오늘 만든 DBUnit BaseClass

package xxx.framework.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

import org.dbunit.Assertion;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.CompositeTable;
import org.dbunit.dataset.FilteredTableMetaData;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.filter.DefaultColumnFilter;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;

import junit.framework.TestCase;
public class DBTestCase extends TestCase {

private DBinfo info = DBinfo.getInstance();

/**
* コンストラクタ。
*
*/
public DBTestCase() {
super();

}


/**
* 指定したテーブルのデータでXMLFileを作成します。
* @param arrayTables 対象テーブル名
* @param sFileName xmlファイル名
*/
protected void exportOp(String[] arrayTables, String sFileName)throws Exception {
info.init();
exportTable(arrayTables,new File(info.sExportDir_, sFileName));
}

/**
* XMLFileをDBに書き込みます。
* @param sFileName xmlファイル名
*/
protected void importOp(String sFileName)throws Exception {
info.init();
importTable(new File(info.sExportDir_, sFileName));
}

/**
* 指定したテーブルの現在データとXMLFileを比較します。
* @param arrayTables 対象テーブル名
* @param sFileName xmlファイル名
*/
protected void compareOp(String[] arrayTables, String sFileName) throws Exception{
info.init();
compareTable(arrayTables,new File(info.sExportDir_,sFileName),null);
}
/**
* 指定したテーブルの現在データとXMLFileを比較します。
* @param arrayTables 対象テーブル名
* @param sFileName xmlファイル名
* @param columns 比較対象外とするカラム名
*/
protected void compareOp(String[] arrayTables, String sFileName,String[] columns) throws Exception{
info.init();
compareTable(arrayTables,new File(info.sExportDir_,sFileName),columns);
}

private void compareTable(String[] arrayTables, File file,String[] columns) throws Exception {
IDatabaseConnection connection = null;

try {
connection = getConnection();
QueryDataSet partialDataSet = new QueryDataSet(connection);

for (int i = 0; i < arrayTables.length; i++) {
IDataSet databaseDataSet = getConnection().createDataSet();
ITable actualTable = databaseDataSet.getTable(arrayTables[i]);
IDataSet expectedDataSet = new FlatXmlDataSet(file);
ITable expectedTable = expectedDataSet.getTable(arrayTables[i]);
if(columns == null){
Assertion.assertEquals(actualTable, expectedTable);
}else{
DefaultColumnFilter columnFilter = new DefaultColumnFilter();
for(int x = 0; x < columns.length; x++) {
columnFilter.excludeColumn(columns[x]);
}
FilteredTableMetaData metaData = new FilteredTableMetaData(actualTable.getTableMetaData(), columnFilter);
ITable filteredTable = new CompositeTable(metaData, actualTable);
Assertion.assertEquals(filteredTable, expectedTable);
}
}
}finally {
if (connection != null) {
connection.close();
}
}
}


private void importTable(File file) throws Exception {

IDatabaseConnection connection = null;
try {
connection = getConnection();
FlatXmlDataSet dataSet = new FlatXmlDataSet(file);
DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
} finally {
if (connection != null) {
connection.close();
}
}
}

private void exportTable(String[] arrayTables,File file) throws Exception{
IDatabaseConnection connection = null;
try {
connection = getConnection();
QueryDataSet partialDataSet = new QueryDataSet(connection);
for (int i = 0; i < arrayTables.length; i++) {
partialDataSet.addTable(arrayTables[i]);
}
FlatXmlDataSet.write(partialDataSet, new FileOutputStream(file));
} finally {
if (connection != null) {
connection.close();
}
}
}

private IDatabaseConnection getConnection()throws Exception {
Class driverClass =
Class.forName(info.sDriver_);

Connection jdbcConnection =
DriverManager.getConnection(
info.sUrl_, info.sUser_, info.sPassword_);

return new DatabaseConnection(jdbcConnection);
}

private void operation(DatabaseOperation operation,IDataSet dataSet)throws Exception {
IDatabaseConnection connection = null;
try {
connection = getConnection();
operation.execute(connection, dataSet);
} finally {
if (connection != null) {
connection.close();
}
}
}

private static class DBinfo{
private static final DBinfo INSTANCE = new DBinfo();
private boolean initialrized;
private Properties prop;
public String sDriver_;
public String sUrl_;
public String sUser_;
public String sPassword_;
public String sSchema_;
public String sExportDir_;


public void init() throws IOException, ClassNotFoundException {
if (initialrized) {
return;
}
synchronized (this) {
prop = new Properties();
InputStream resourceStream =
ClassLoader.getSystemResourceAsStream("dbunit.properties");

if (resourceStream == null) {
System.err.println("クラスパスにdbunit.propertiesがありません!!");
}
prop.load(resourceStream);
sDriver_ = prop.getProperty("driver");
sUrl_ = prop.getProperty("url");
sUser_ = prop.getProperty("user");
sPassword_ = prop.getProperty("password");
sSchema_ = prop.getProperty("schema");
sExportDir_ = prop.getProperty("exportDir");
Class.forName(sDriver_);
initialrized = true;
}
}

public static DBinfo getInstance() {
return INSTANCE;
}

}
}

2005년 2월 2일 수요일

코더 10명

코더라는 단어를 별로 좋아 하지는 않지만
이번 프로젝트에 참가 한 내 포지션이 PG..
이제까지는 아키텍쳐..(그게 그건가?하지만 선행 개발자 라고 해 두자.)

이번 프로젝트
개발 머신은 *HP*P4-540
모니터가 19인치라 눈이 아프다..어제까지 Thinkpad12인치 노트북 만 보다가 환경이 바뀌니 적응이 잘않된다..
ㅋㅋㅋ
개발 내용은 VOD관리 시스템..
사용자가 요건정의 가 명확히 되지 않은 상태에서 프로토타입 제작이 시작됬다.
개발 관련 툴들도 전부 오픈소스(JBOSS,LINUX,POSTGRES)라
운영인력 교육 같은 부분도 많이 필요 할듯한데..
어찌 하면 좋을까..
버그트레이싱 을 위해서 벽에다 버그 분류 시트를 붇이는데 까지는 성공했다..
일부분 코더 들에게 문제 발생 부분에대한 postit을 붇이는 작업도 요청해 6장을 붙였다.그중에 PM모니터에 2장 내모니터에 1장 나머지 3장은 벽에 붇어있다.
방금도 한장이 늘었다..일본 개발자들은 참 말하기를 싫어 한다..
한국 개발자 들도 그럴까?..

六本木生活二日目

六本木39皆で二日目。。
ちょっと不便なビルだ。
카치도키 보다 10분 정도 전차를 타는 시간은 줄었지만,
역에서 걸어오는 시간이 꽤 걸린다.(익숙해 지지 않아서 그런가.)
불편해도 경치는 죽인다.동경 시내가 한눈에 들어 오는
사진 찍어서 올려야 겠다..

2005년 1월 26일 수요일

XP에 관심이 있다면 읽어 보아야 할글

2년간 XP로 개발 5가지 정도 프로젝트를 수행 해왔다.
우연히 이 글을 읽게 되었는데 느끼는 점이 참 많다.
현실상황이 이렇게 되지 않는 다고 외면 하지만 말고 도전해 보자.
http://xper.org/wiki/xp/XpDiary
http://www.xprogramming.com/xpmag/xpdiary.htm

2005년 1월 24일 월요일

27時間勤務スタト

27時間勤務開始。
本番でのシステムテスト以前にShellをけんしょうするため午後5時に出勤。
9時間が過ぎた。
目がいたい。

2005년 1월 22일 토요일

영어 컴플렉스

1999년 2000년 2001년 2002년 2003년 2004년 2005년
일본 과 연을 맺은지도 6년 에 접어든다.
히라가나조차 전부 쓸수 없었던 상황에서 감행한 어학연수
어줍지 않은 일본어 실력과 1년 일본 어학연수로 떨어진 토익점수로
원하는 회사에 취업을 하지 못해 방황하다 선택한 일본취업
언제 끝날지 모르는 일본 생활

일본에서 영어에 대한 장벽을 느끼는 지금..
올해는 이걸 극복하고 싶다.

2005년 1월 21일 금요일

프로젝트 종반

2월7일 유저 릴리스 ..
토요일 출근하고 일요일 오후출근해서 월요일 밤에 퇴근 하게 생겼다.PM에게 미리미리 테스트 할수 있는 환경을 2달 전부터 요구했는데..결국은 아무런 준비도 해주지 않았다.
27시간 근무..
괴롭다.

2005년 1월 20일 목요일

2004년을 사는 개발자를 위한「경력관리 로드맵」

자바지기 님에 사이트 에 게시된 글 이다.
개발자로써 살아간다는것.살아가기 위해 필요한 가치관 확립.
어떻게 나아 가야 할것인가.
느끼고 생각하는 그리고 실천하는 힘
많은걸 느끼게 하는 글이다.

원문
http://www.zdnet.co.kr/techupdate/trend/0,39024505,39131905,00.htm

vi command

http://www.maruhosting.com/new_manual/hosting02.htm

마루 호스팅 사이트에서

VI 프로그램의 위치
$ which vi

/usr/bin/vi
/usr/ucb/vi
/bin/vi

VI를 이용한 화일 열기

# vi
: e test.txt

# vi test.txt

========= 명령모드 ==========================================


편집모드

i - 커서앞에 텍스트 삽입
a - 커서뒤에 텍스트 삽입
o - 현재 행 아래에 텍스트 삽입

텍스트 교체

r - 한 글자만 교체
R - 커서가 있는 자리부터 여러문자 교체


커서이동

←, h,
↓, j
↑, k
→, l

신속이동

w - 오른쪽으로 특수문자 혹은 한단어의 처음으로 이동
b - 왼쪽으로 특수문자 혹은 한단어의 처음으로 이동
W - 오른쪽으로 한단어의 처음으로 이동
B - 왼쪽으로 한단어의 처음으로 이동

한 행 안에서의 이동

0 (숫자) - 행의 맨 처음으로 이동
$ - 행의 맨 마지막으로 이동

페이지 이동

G - 문서의 맨 끝 행으로 이동
nG - nqjsWo 행으로 이동
C-f - 한페이지 아래로 이동
C-b - 한페이지 위로 이동

삭제명령

dw - 한 단어 삭제
dd - 한 줄 삭제
D - 커서부터 행 끝까지 삭제
x - 한 글자 삭제

숫자와 명령의 조합 예제

10j - 10줄 위로 이동
10x - 10글자 삭제
5dd - 5줄 삭제

복사 & 붙여넣기

x, dw, dd, D → p - 커서 뒤에 임시 버퍼내용 추가
x, dw, dd, D → P - 커서 앞에 임시 버퍼내용 추가

텍스트 복사

yw - 한단어 복사
y$ - 커서부터 행끝까지 복사
yy - 한줄 모두 복사

텍스트 탐색

/ - 전방 탐색
? - 후방 탐색
n - 같은방향으로 탐색 계속
N - 반대방향 탐색 계속
/  - 전방탐색 계속
?  - 후방탐색 계속

행 번호 붙이기

:set nu
:set nonu - 번호 없애기

특정 행 번호로 이동

:1 - 1번째 행으로 이동
:$ - 마지막 행으로 이동
:$= - 현재 문서의 총 줄(행)수
:.= - 현재위치의 행번호

범위 지정

v

:1,10d - 1번행부터 10번행가지 삭제(d)
:.,$d - 현재부터 마지막 행까지 삭제
:0,$-4d - 파일의 맨처음(0- 가상번호)부터 끝까지 삭제하되 4는 제외
:.-1,.+1y(:.-,.+y)(:-,+y) - 현재 행을 기준으로 아래위 3행을 복사
:0,$y - :%y - 모든 행 복사

일부분 저장

:1,.w part1.txt - 1행부터 현재 행까지 part1.txt 라는 이름으로 저장
:1,.w >>part.txt - 1행부터 현재 행까지를 part.txt 파일에 추가

다른파일 내용 (읽기) 삽입

:r insert.txt - 커서위치 아래에 insert.txt 파일을 추가
1r insert.txt -
0r insert.txt -

텍스트 검색 및 교체

:범위s/찾는문자열/교체할문자열/옵션
:%s/girl/woman/g (※ g - global)
:0,.s/^/>> /g - 맨 처음부터 현재행에 대하여 행의 맨 앞에 >>를 붙임 (※ ^ 는 가상의 맨 앞)
:.-3,.+5s/$/<
※ . - 현재 행 ^ - 가상의 맨 처음 $ - 가상의 맨 처음 % 현 문서 전체

텍스트 검색 및 치환

/찾는문자열
- 파일내에서 찾는 문자열을 찾아 커서가 이동한다.(아래방향으로)
?찾는문자열
- 파일내에서 찾는 문자열을 찾아 커서가 이동한다.(위로 향하여)
n
- "/찾는문자열"을 입력후 다음찾기할때(아래방향)
N
- "/찾는문자열"을 입력후 다음찾기할때(위방향)

:s/찾는문자열/치환문자열
- 현재 커서가 놓여 있는 행에서 첫번째로 검색된 특정문자열 바꾸기:1,10s/찾는문자열/치환문자열
- 1행부터 10행사이에 걸쳐 첫번째로 검색된 특정문자열 바꾸기
:%s/찾는문자열/치환문자열
- 모든행에 걸쳐 첫번째로 검색된 특정문자열을 바꾸기

특수문자가 들어간 문자열의 교체

:%s//usr//usr/local/g - /usr를 찾아서 /usr/local 로 교체
※ (역 슬래쉬) 특수문자(/)의 해석방지


외부 유닉스 명령어 실행

:!명령
:sh -
:r :ls - 유닉스 명령의 실행 결과 화면을 현재 편집중인 내용에 불러들임

필터와 명령

:%!tr [a-z][A-Z] - 전체 텍스트의 영문자를 대문자로 치환
:%!sort - 정렬


========= 명령모드 ==========================================

명령모드에서 벗어나 편집모드로 진입하기(입력모드)

i : 커서가 놓여 있는 위치의 문자를 밀어내고 삽입된다.
a : 커서가 놓여 있는 위치의 문자뒤에 삽입된다.
o (소문자 o) : 현재행의 아래행을 밀어내고 입력모드로 전환된다.
O (대문자 O) : 현재행을 한줄 아래로 밀어내고 입력모드로 전환된다.

입력모드 와 삽입모드를 습관적으로 변환하기

입력모드 : ESC - 명령모드(이동,삭제,검색,치환,저장,종료,열기)
명령모드 : i,a,o,O - 삽입모드(입력)

VI 방식의 종료와 저장, 새이름으로 저장

:q - 저장하지 않고 vi 종료하기
:q! - 강제 종료
:w - 현재내용을 저장
:w! - 읽기전용인 파일을 수정후 강제로 저장할때
:wq - 저장하고 종료
:wq! - 읽기전용인 파일을 수정후 강제로 저장하고 종료하기
:w 새파일명 - 새이름으로 저장

VI 환경설정

:set number : 행번호 보이게
:set nonumber : 행번호 안보이게
:set autoindent : 들여쓰기 설정
:set noautoindent : 들여쓰기 제거
:set list : 문단,조판부호 보기
:set nolist : 문단,조판부호 안보이게
:set window=30 : 한 화면당 행의 갯수 30개로 지정
:set ignorecase : 검색시 대소문자 구별 제거
:set noignorecase : 검색시 대소문자 구별
:set all : 현재 설정된 vi 모든 설정값 보기

2005년 1월 19일 수요일

느슨해진 자신을 추스려 보는 방법

느슨해진 자신을 추스려 보는 방법

1.더욱더 느슨해져 본다.
2.전혀 새로운 분야에 책을 산다.(IT관련서)
3.짧은 여행을 떠나 본다.
4.동종분야에 잘나가는 사람에 근황을 살펴 본다.
5.자격시험 원서를 제출 한다.
6.치밀하게 미래에 계획을 세워본다.

일본 dev2dev 사이트 문서 모음

초급과 중급에 분류기준이 모호하기는 하지만..

예전부터 Tuxedo 관련 관심이 많았었는데..
문서라도 읽어 봐야 겠다.

초급?
http://www.beasys.co.jp/dev2dev/resourcelibrary/newjava/products_tutorial.html
중급?
http://www.beasys.co.jp/dev2dev/resourcelibrary/newjava/higher.html

2005년 1월 18일 화요일

3번째 모임

회사 설립에 가장 열정적인 었던 형님이 한국으로 돌아 가시게 되었다.(역시 새상일은 마음대로 되는 것이 아닌가 보다.)

형님께 너무 의존하고 있었나 보다..라는 반성도 하게 되었다.

작년에 한국으로 돌아 가신 분이 회사를 설립하셨다.
부럽기도 하고 지금 내가 서 있는 위치를 돌아 보고 정리 해야 겠다는
새로운 의욕도 생겼다.

2005년이 시작되고 18일이 지났다.
열심히 해보자..

2005년 1월 17일 월요일

오라클 DBA를 위한 유용한 5가지 유닉스 명령어

좀 오래된 듯한 감이 있기는 한 글이지만...
Unix for Oracle DBAs Pocket Reference

오라클 DBA를 위한 유용한 5가지 유닉스 명령어
2001년 03월 21일

Oracle DBAs Pocket Reference는 데이터베이스 관리자(DBA)가 알아야 할 모든
유닉스 명령어를 20년 이상 공부하고 하나로 모아 놓은 결과물이다. 컨설턴트
이기 때문에 유닉스 다이어렉트에 대한 데이터베이스 조절 방법을 강구하고 모
든 명령어를 암기해야 했는데, 정말이지 힘든 과정이었다. 여기에 Oracle
DBAs Pocket Reference에 수록되어 있는 스크립트 중에서 내가 좋아하는 5개
를 뽑아 보았다.

유닉스용 "Change All" 명령어

이 스크립트는 디렉토리에 있는 모든 파일에서 한 문자열과 다른 문자열을 바
꿔서 검색과 교환을 실행시킨다. 유닉스 디렉토리에 수 백 개의 파일이 들어
있고 각 파일에서 ORACLE_SID를 바꾸고 싶을 때, 이 스크립트를 이용하면 몇
초안에 모든 것을 해결할 수 있다. 게다가 변환된 파일의 원 파일에 대한 백
업 디렉토리도 만들어 준다. 나는 이 스크립트를 이용해 수 백 시간에 걸쳐 똑
같이 수정해야 하는 작업을 하지 않을 수 있었다.
#!/bin/ksh

tmpdir=tmp.$$

mkdir $tmpdir.new

for f in $*
do
sed -e 's/oldstring/newstring/g'
< $f > $tmpdir.new/$f
done

# Make a backup first!
mkdir $tmpdir.old
mv $* $tmpdir.old/


cd $tmpdir.new
mv $* ../

cd ..
rmdir $tmpdir.new



위에 있는 for 루프로 인해 sed 명령어가 현재 디렉토리 내 모든 파일에서 실
행된다. sed 명령어는 작업을 실제 검색, 교환하며 동시에 임시 디렉토리에 관
계 파일의 새로운 버전을 생성한다.

이 스크립트를 사용하려면 여기에 나타난 코드의 파일 이름을 chg_all.sh 로
바꿔야 한다. 전체를 바꾸고자 한다면, 스크립트 파일에서 이전 문자열과 새로
운 문자열을 수정하는 것부터 해야 한다. 그러면 스크립트를 실행할 때, 파일
마스크에서는 인자로서 지나쳐도 된다. 예를 들어 SQL 파일을 바꿀 때는 다음
과 같은 명령을 실행하기만 하면 되는 것이다.

root> chg_all.sh *.sql

스크립트가 완성되면, 원하던 문자열이 대체되어 있을 것이고, tmp.old 라는
디렉토리 이름이 붙은 파일이 남게 될 것이다. 이 파일은 수정된 파일의 원 버
전이다.

수백 개의 데이터베이스에서 오라클 값을 검사하는 스크립트

모든 데이터베이스에서, 심지어는 서버가 다른 데이터베이스에서 바로
SQL*Plus 명령어를 실행할 수 있는 방법이 유닉스에 꼭 필요하다고 생각해 왔
다. 내가 아는 한 매니저는 가게에 있는 모든 데이터베이스에 대한 디폴트 최
적화 모드를 알고 싶어했다. 그 가게에는 30개의 데이터베이스 서버에 150개
의 데이터베이스가 있었다. 그는 이틀 안에 이 일을 끝내라고 했는데, 내가 10
분 안에 정확한 답을 말하자 크게 놀랐다. 그때 이용한 것이 바로 이 스크립트
이다.
# Loop through each host name . . .
for host in `cat ~oracle/.rhosts|
cut -d"." -f1|awk '{print $1}'|sort -u`
do
echo " "
echo "************************"
echo "$host"
echo "************************"
# loop from database to database
for db in `cat /etc/oratab|egrep ':N|:Y'|
grep -v *|grep ${db}|cut -f1 -d':'"`
do
home=`rsh $host "cat /etc/oratab|egrep ':N|:Y'|
grep -v *|grep ${db}|cut -f2 -d':'"`
echo "************************"
echo "database is $db"
echo "************************"
rsh $host "
ORACLE_SID=${db}; export ORACLE_SID;
ORACLE_HOME=${home}; export ORACLE_HOME;
${home}/bin/sqlplus -s /<
set pages 9999;
set heading off;
select value from v"""$"parameter
where name='optimizer_mode';
exit
!"
done
done



이 스크립트를 사용할 때에는 유닉스 원격 쉘(rsh)이 필요하다. 이 유닉스
rsh 를 이용하면 서버들 사이에서 빨리 옮겨 다닐 수 있다. 자신의 .rhosts 파
일에 엔트리를 만들기만 하면 되는 것이다. 스크립트가 시스템에서 .rhosts 파
일에 정의된 서버 이름을 통해서 반복되고, 각 서버의 /etc/oratab 파일에 리
스트된 데이터베이스를 통해서도 반복될 것이다.

데이터베이스 값을 확인할 때, 그리고 SQL*Plus 스크립트를 운영할 때 이 스크
립트를 이용하면 된다. 자신의 엔터프라이즈에 있는 모든 데이터베이스에 대
한 사용자 리포트, 수행 통계, 정보량 등을 빨리 받아 볼 수 있다. 이 스크립
트를 변형시키면 오라클 디렉토리에서 쓸모 없는 파일을 지울 수도 있고, 재실
행 로그 파일시스템 아카이브의 빈 공간을 확인할 수도 있다. 이 스크립트를
이용해서 여러 데이터베이스에 같은 명령을 실행해서 반복적인 일을 수행하는
데 드는 시간을 많이 줄일 수 있었다.

오라클 환경을 변화시키는 빠른 방법

큰 가게에서 일할 때 발생할 수 있는 곤란한 문제 한가지는 오라클 환경을 빨
리 변환시켜야 할 때이다. 모든 사람이 각자의 방식으로 이 문제를 해결하고,
서버들 간에 어떤 차이가 있는지 기억하기도 힘들어 보인다. 서버가 다른 오라
클 버전을 운영하고 있다면 문제는 더욱 해결하기 힘들어 진다.

이럴 때 나는 모든 서버에 표준 .profile 스크립트를 설치한다. 내가 서버에
신호를 보내면 .profile이 실행하고 모든 데이터베이스에 대한 얼라이어스를
자동으로 만들어 낸다. 이 데이터베이스는 Oracle SID의 이름과 같다. 유닉스
프롬프트에서 Oracle SID를 입력하면, 전체 유닉스 환경이 새로운 데이터베이
스용으로 바뀐다. 다음에 나오는 코드는 내 .profile 파일에 만들어 놓은 것이
다.
for DB in `cat /etc/oratab|grep -v #|grep -v *|cut -d":" -f1`
do
alias $DB='export ORAENV_ASK=NO;
export ORACLE_SID='$DB';
. $TEMPHOME/bin/oraenv;
export ORACLE_HOME;
export ORACLE_BASE=
`echo $ORACLE_HOME | sed -e 's:/product/.*::g'`;
export DBA=$ORACLE_BASE/admin;
export SCRIPT_HOME=$DBA/scripts;
export PATH=$PATH:$SCRIPT_HOME;
export LIB_PATH=$ORACLE_HOME/lib64:$ORACLE_HOME/lib '
done



이제부터는 PROD 데이터베이스로 환경을 바꾸고 싶을 때, 단지 유닉스 명령 프
롬프트에서 PROD라는 명령만 입력하면 된다.

솔라리스에선 /etc에서 /var/opt/oracle까지 oratab 디렉토리 이름을 변환시
켜 주어야 한다.

유용한 유닉스 얼라이어스 패키지

새벽 3시에 제품에 이상이 있다는 호출을 받는다면, 모든 오라클 경고 로그 파
일과 쓸모 없는 파일 디렉토리가 어디에 있는지 기억할 수 없을 것이다. 이럴
때 일을 단순하고 일괄적으로 처리하기 위해서 나는 항상 내 유닉스 .profile
파일에 표준 얼라이어스 목록을 만들어 놓는다. 예를 들면:
# Aliases
#
alias alert='tail -100
$DBA/$ORACLE_SID/bdump/alert_$ORACLE_SID.log|more'
alias arch='cd $DBA/$ORACLE_SID/arch'
alias bdump='cd $DBA/$ORACLE_SID/bdump'
alias cdump='cd $DBA/$ORACLE_SID/cdump'
alias pfile='cd $DBA/$ORACLE_SID/pfile'
alias rm='rm -i'
alias sid='env|grep ORACLE_SID'
alias admin='cd $DBA/admin'



이 얼라이어스를 이용하면 긴 명령어를 쉽게 기억할 수 있다. 일례로 경고 얼
라이어스는 다음에 나오는 긴 명령을 의미한다.

tail -100 $DBA/$ORACLE_SID/bdump/alert_$ORACLE_SID.log|more

이 얼라이어스를 이용해서 유닉스 프롬프트에서 경고를 입력하기만 하면 오라
클 경고 로그에 있는 가장 최근 엔트리를 볼 수 있다. 그리고 아카이브를 입력
하면 오라클 아카이브 재실행 로그 디렉토리의 위치로 갈 수 있다.

서버 통계를 오라클 테이블에 저장할 때 사용하는 스크립트

오라클 데이터베이스를 튜닝할 때 수행 문제가 발생하면 데이터베이스 서버에
서 어떤 일이 일어나는가를 알아야 한다. 수행 문제가 발생하면 유닉스
vmstat 명령으로부터 출력 데이터를 알아내어 mon_vmstats라는 오라클 테이블
에 서버 메트릭스를 저장하는 스크립트를 만든다. 바로 이것이다:
#!/bin/ksh

# First, we must set the environment . . . .
ORACLE_SID=BURLESON
export ORACLE_SID
ORACLE_HOME=`cat /etc/oratab|
grep ^$ORACLE_SID:|cut -f2 -d':'`
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH
export PATH
MON=`echo ~oracle/mon`
export MON

SERVER_NAME=`uname -a|awk '{print $2}'`
typeset -u SERVER_NAME
export SERVER_NAME

# sample every five minutes (300 seconds) . . . .
SAMPLE_TIME=300

while true
do
vmstat ${SAMPLE_TIME} 2 > /tmp/msg$$

# This script is intended to run starting at
# 7:00 AM EST Until midnight EST
cat /tmp/msg$$|sed 1,4d | awk '{
printf("%s %s %s %s %s %s %s
", $1, $6, $7,
$14, $15, $16, $17) }' | while read RUNQUE
PAGE_IN PAGE_OUT USER_CPU SYSTEM_CPU
IDLE_CPU WAIT_CPU
do

$ORACLE_HOME/bin/sqlplus -s / <
insert into mon_vmstats values (
sysdate,
$SAMPLE_TIME,
'$SERVER_NAME',
$RUNQUE,
$PAGE_IN,
$PAGE_OUT,
$USER_CPU,
$SYSTEM_CPU,
$IDLE_CPU,
$WAIT_CPU
);
EXIT
EOF
done
done

rm /tmp/msg$$


이 스크립트는 5분간의 경과 시간동안 vmstat 유틸리티를 작동시켜
mon_vmstat 테이블에 있는 정보를 저장한다. 테이블에 있는 정보에서 서버 수
행 통계를 뽑아 내어, 훌륭한 서버 수행 그래프를 만들 수 있다. 예를 들어 마
이크로소프트 엑셀에 데이터를 복사해서 붙이기를 하면 다음에 있는 페이지 활
성화 그래프를 만들 수 있는 것이다. 이 그래프를 보면 몇 달에 걸쳐 세 번의
다른 시간대 간격의 페이지 활성화 그래프를 알 수 있다.

위의 스크립트는 내가 쓴 Unix for Oracle DBAs Pocket Reference에서 시간을
절약해 주는 몇 가지만을 나열한 것이다. 유닉스의 위력은 실로 대단하며, 이
유닉스의 위력으로 자신의 일을 더 쉽게 만들 수 있다.

2005년 1월 12일 수요일

XA error: XAER_RMERR : A resource manager error has occur

java.sql.SQLException: XA error: XAER_RMERR :
A resource manager error has occured in the transaction branc
h start() failed on resource 'xxxXAPool':


진행중인 플젝에서 WL8.1&OARCLE9i로 Datasource(일반 Datasource,XaDatasource)를 사용하고 있다.
검증 환경이 여러 군데라 동일한 설정을 한다는 것이 쉽지 않다.
(설정해주는 회사가 다를 정도니..)
동일한 모듈을 검증하고 있는데 위와 같은 Error가 발생했다.

http://support.bea.com/application?namespace=askbea&origin=ask_bea_answer.jsp&event=link.view_answer_page_clfydoc&answerpage=solution&page=wls%2FS-20733.htm

2005년 1월 10일 월요일

테이블 스페이스의 데이터 파일과 테이블 스페이스의 크기 확인

오라클 클럽에서

테이블스페이스 정보보기

테이블 스페이스의 데이터 파일과 테이블 스페이스의 크기 확인

DBA_DATA_FILES 데이터 사전을 이용 하면 됩니다.

SQL>
COL FILE_NAME FORMAT A40
COL TABLESPACE_NAME FORMAT A15

SELECT file_name, tablespace_name, bytes, status FROM DBA_DATA_FILES;

FILE_NAME T ABLESPACE_NAME BYTES STATUS
------------------------------------- --------------- ------------ ------------
C:ORACLEORADATAORACLESYSTEM01.DBF SYSTEM 248250368 AVAILABLE
C:ORACLEORADATAORACLERBS01.DBF RBS 545259520 AVAILABLE
C:ORACLEORADATAORACLEUSERS01.DBF USERS 113246208 AVAILABLE
C:ORACLEORADATAORACLETEMP01.DBF TEMP 75497472 AVAILABLE
C:ORACLEORADATAORACLETOOLS01.DBF TOOLS 12582912 AVAILABLE
C:ORACLEORADATAORACLEINDX01.DBF INDX 60817408 AVAILABLE
C:ORACLEORADATAORACLEDR01.DBF DRSYS 92274688 AVAILABLE

◎ FILE_NAME : DATAFILE의 물리적인 위치와 파일명을 알 수 있습니다.
◎ TABLESPACE_NAME : 테이블 스페이스의 이름을 알 수 있습니다.
◎ BYTES : 테이블 스페이스의 크기를 알수 있습니다.
◎ STATUS : 테이블 스페이스의 이용 가능 여부를 알 수 있습니다.



테이블 스페이스별 사용 가능한 공간의 확인

DBA_FREE_SPACE 데이터 사전


SQL> SELECT tablespace_name, SUM(bytes), MAX(bytes)
FROM DBA_FREE_SPACE
GROUP BY tablespace_name


TABLESPACE_NAME SUM(BYTES) MAX(BYTES)
--------------- ---------- ----------
DRSYS 88268800 88268800
INDX 60809216 60809216
RBS 524279808 498589696
SYSTEM 65536 65536
TEMP 75489280 74244096
TOOLS 12574720 12574720
USERS 113238016 113238016


◎ SUM을 사용한 이유는하나의 테이블 스페이스에 분산되어 있는 여유공간을 합한 것이며,
◎ MAX를 사용한 이유는 여유 공간중 가장 큰 공간의 SIZE를 의미 합니다.




데이타 화일에 대한 총 크기와 남아있는 공간, 사용한 용량, 남은 %율

DBA_FREE_SPACE, DBA_DATA_FILES 데이터 사전

SQL>
COL FILE_NAME FORMAT A40
COL TABLESPACE_NAME FORMAT A30
SET LINESIZE 150
SELECT b.file_name "FILE_NAME", -- DataFile Name
b.tablespace_name "TABLESPACE_NAME", -- TableSpace Name
b.bytes / 1024 "TOTAL SIZE(KB)", -- 총 Bytes
((b.bytes - sum(nvl(a.bytes,0)))) / 1024 "USED(KB)", -- 사용한 용량
(sum(nvl(a.bytes,0))) / 1024 "FREE SIZE(KB)", -- 남은 용량
(sum(nvl(a.bytes,0)) / (b.bytes)) * 100 "FREE %" -- 남은 %
FROM DBA_FREE_SPACE a, DBA_DATA_FILES b
WHERE a.file_id(+) = b.file_id
GROUP BY b.tablespace_name, b.file_name, b.bytes
ORDER BY b.tablespace_name


FILE_NAME TABLESPACE_NAME TOTAL SIZE(KB) USED(KB) FREE SIZE(KB) FREE %
------------------------------------- --------------- -------------- ------------- ------------- ----------
C:ORACLEORADATAORACLEDR01.DBF DRSYS 90112 3912 86200 95.6587358
C:ORACLEORADATAORACLEINDX01.DBF INDX 59392 8 59384 99.9865302
C:ORACLEORADATAORACLERBS01.DBF RBS 532480 20488 511992 96.1523438
C:ORACLEORADATAORACLETEMP01.DBF TEMP 73728 8 73720 99.9891493
C:ORACLEORADATAORACLETOOLS01.DBF TOOLS 12288 8 12280 99.9348958
C:ORACLEORADATAORACLEUSERS01.DBF USERS 110592 8 110584 99.9927662

2005년 1월 5일 수요일

oracle export import option

//-------------------
//table 설정 export
//-------------------
set ORACLE_SID=SP

exp system/manager@sp file=c:expXXXS010TB.dmp log=c:explogXXXS010TB.log tables=XXX_XXX.XXXS010TB direct=y

//-------------------
//user설정 export
//-------------------
set ORACLE_SID=SP

exp system/manager@sp file=c:expXXX_XXX.dmp log=c:explogXXXX001TB.log owner=XXX_XXX direct=y

//-------------------
// import
//-------------------
set ORACLE_SID=SP

imp system/manager@sp file=c:expXXXS010TB.dmp log=c:explogXXXS010TB.log ignore=y fromuser=XXX_XXX touser=XXX_XXX rows=y indexes=y

2005년 1월 4일 화요일

gzlog Shell

Shell 끝부분에 추가 해주면 로그 파일을 년월일시간형식으로
gz로 압축해 주는 쉘

기존 쉘에 추가부분

if [ -x $USR_HOME/shell/gzlog.sh -o -x $USR_HOME/shell/gzlog.sh ];then
echo "#####XXXR0100J_LOG FILECOPY START#####" >> ${LOG} 2>&1
TRACE_JOB_COMMAND=$USR_HOME/shell/gzlog.sh
$TRACE_JOB_COMMAND /apl/xxx/log/XXXR0100J.log XXXR0100J_LOG
echo "#####XXXR0100J_LOG FILECOPY END#####" >> ${LOG} 2>&1
else
echo "NOT FOUND gzlog.sh !!"
fi

///////////////////////////////////////////////////////////

gzlog.sh 부분

#!/usr/bin/ksh

SAMPLESHHOME=/apl/xxx
LOG=${SAMPLESHHOME}/log/xxxR0100.log
LOG_FILE_NAME=$1
LOG_FILE_DIR=$2

echo "#####設定完了#####" >> ${LOG} 2>&1

FILE_TIME=`date +%y%m%d%H%M%S`.log
echo "FileName 取得" >> ${LOG} 2>&1

#gzip -d /apl/xxx/log/${LOG_FILE_DIR}/${LOG_FILE_DIR}.log.gz
#rm /apl/xxx/log/${LOG_FILE_DIR}/${LOG_FILE_DIR}.log.gz

cp $LOG_FILE_NAME /apl/xxx/log/${LOG_FILE_DIR}/${FILE_TIME}
echo "FileName COPY" >> ${LOG} 2>&1

gzip /apl/xxx/log/${LOG_FILE_DIR}/*.log
echo "File ZIP" >> ${LOG} 2>&1

#rm /apl/xxx/log/${LOG_FILE_DIR}/${FILE_TIME}
exit 0

init.ora parameter

OracleClub.com 에서 가져온 내용입니다.

시스템 성능에 큰 영향을 미치는 상위 8개 INIT.ORA 파라미터
=========================================================

Technical Bulletins No. 17104 (http://211.106.111.2:8880/bulletin/list.jsp)

PURPOSE -------
이 문서는 init.ora의 어떠한 parameter들이 database성능에 많은 영향을 미치는지에 대해 기술한다.

Explanation -----------
다음에 열거된 파리미터는 각각 데이터베이스 튜닝에 영향을 미치는 것들이다.


DB_BLOCK_BUFFERS
SHARED_POOL_SIZE
SORT_AREA_SIZE
DBWR_IO_SLAVES
ROLLBACK_SEGMENTS
SORT_AREA_RETAINED_SIZE
DB_BLOCK_LRU_EXTENDED_STATISTICS
SHARED_POOL_RESERVE_SIZE



1. DB_BLOCK_BUFFERS

이 파라미터는 모든 버젼의 오라클에서 사용되며, Oracle block 크기를 단위로 지정하게 된다.
이 값은 사용자가 요청하는 데이터를, 메모리 영역에 저장해 둘 수 있는
공간의 크기를 지정하므로 튜닝시 매우 중요한 역할을 한다.

db_block_buffers 값은 SGA 캐쉬 영역에 존재하는 버퍼의 갯수를 지정 하는데 사용되며,
적절한 캐쉬 크기는 실제 디스크 I/O를 줄이는데 도움이 된다.

캐쉬 영역이 적절하게 지정되어 있는지 여부는 buffer cache hit ratio로 측정 가능하며,
일반적으로 90% 이상의 값을 유지하도록 하는 것이 바람직하다.
buffer cache hit ratio는 다음 SQL을 사용하여 조회 가능하다.

SELECT ROUND(((1-(SUM(DECODE(name, 'physical reads', value,0))/
(SUM(DECODE(name, 'db block gets', value,0))+
(SUM(DECODE(name, 'consistent gets', value, 0))))))*100),2) || '%' "Buffer Cache Hit Ratio"
FROM V$SYSSTAT;

실행 결과는 다음과 같은 형식으로 나타나게 된다.

Buffer Cache Hit Ratio:
97.63%


만약 hit ratio가 90% 미만이라면,
hit ratio 가 90% 이상을 유지할 정도로 buffer cache의 크기를 늘려주는 것이 바람직하다.
이 값이 작을 경우 사용된 데이터가,
다른 데이터를 처리할 메모리 영역을 확보시키기 위해 메모리에서 삭제된 후,
다시해당 데이터가 요청될 경우 충분한 cache를 확보하였을 때
피할 수 있는 물리 I/O 가 발생하게 된다.

그러나 만약 이 값을 가용한 메모리 크기에 비해 너무 크게 지정할 경우에는
OS 에서 swapping이 발생하게 되어 시스템이 hang 상태까지 갈 수 있다.




2. SHARED_POOL_SIZE


SHARED_POOL_SIZE는 모든 버젼의 오라클에서 사용되는 파라미터로, 단위는 byte 단위이다.

이 영역은 data dictionary나, stored procedure, 그리고 각종 SQL statement가 저장된다.

SGA 영역가운데 많은 비중을 차지하는 shared_pool_size는 다시 dictionary cache
및 library cache 영역으로 나뉘어 지며,
db_block_buffers와 마찬가지로 너무 크거나, 작게 잡지 않도록 하여야 한다.

SHARED_POOL_SIZE 값이 적절한지 여부는 data dictionary cache 및
library cache 의 hitratio로 측정할 수 있다.

SQL 처리에는 data dictionary가 여러차례 참조되므로,
data dictionary 조회시 디스크 I/O가 적게 발생하도록 하면, 성능 향상에 도움이 된다.

Data dictionary cache hit ratio는 다음 SQL에 의해 측정 가능하다.

SELECT (1-(SUM(getmisses)/SUM(gets))) * 100 "Hit Ratio"
FROM V$ROWCACHE;

결과는 다음과 같이 생성된다.

Hit Ratio
95.40%



Data dictionary cache hit ratio는 90% 이상을 유지하는 것이 바람직 하지만,
인스턴스 구동 직후에는 캐쉬영역에 데이터가 저장되지 않으므로
대략 85% 가량을 유지 하도록 하는 것이 바람직하다.


Library cahce 영역은 공유 SQL 영역 및 PL/SQL 영역으로 나뉘어 진다.
SQL이 실행될 경우,
문장은 먼저 parsing 되어야 하는데, library cache는 SQL 및 PL/SQL을 미리 저장해 두어,
실제 parsing이 발생하는 빈도를 줄이는 역할을 한다.
OLTP 업무의 경우, 동일한 SQL이 여러차례 수행되므로
적절한 cache 영역을 확보함으로써 성능 향상을 기대할 수 있다.
- 물론 bind variable을 사용하여야만 공유가능한 SQL이 생성된다.

SHARED_POOL_SIZE 값이 적을 경우는 물론이거니와,
너무 이 값을 크게 지정해도 문제가 된다. SHARED_POOL_SIZE가 너무 클 경우,
새로운 SQL 수행시 가용한 메모리 영역을 찾아 내기 위한 latch contention 의 가능성이 높아지게 된다.


V$SGASTAT을 조회하여 free memory를 조사할 수 있으며,
메모리가 낭비되고 있는지 여부도 확인 가능하다.

SELECT name, bytes/1024/1024 "Size in MB"
FROM V$SGASTAT
WHERE name='free memory';

실행 결과는 다음과 같다.

NAME Size in MB
Free memory 39.6002884

이 결과는 shared pool에 39M 공간이 사용되지 않고 있으며,
만약 shared pool의 크기를 70M 로 지정하였다면,
절반 이상의 메모리 공간이 사용되지 않고 낭비되고 있음을 의미한다.



3. SORT_AREA_SIZE


SORT_AREA_SIZE에 대해서는 흔히 잘못된 이해를 하게된다.
대부분의 사용자들은 이 값이 모든 사용자들이
sort 작업에 사용하게 되는 공용 메모리 영역의 크기로 이해를 하는데,
실제로는 사용자 프로세스 별로 사용하게 되는 sort 영역의 크기를 나타낸다.
앞에서 살펴본 두개의 파라미터와 달리, SORT_AREA_SIZE는 SGA영역에 속하지 않는다.

만약 sort_area_size 값이 너무 작다면,
sort 작업 대부분이 사용자의 temporary tablespace에서 디스크를 사용하여 이루어 지게 된다.

SQL 처리시 order by 나, group by 등을 사용할 경우에는 sort 작업이 발생하나.
index 생성등에도 sort가 발생한다.


메모리 sort는 디스크 sort에 비해 훨씬 좋은 성능을 보이므로,
지속적으로 SORT_AREA_SIZE 값을 모니터하여 튜닝을 하는것이 바람직하다.
하지만, 이 값을 너무 크게 지정할 경우,
swapping이 발생하면서 시스템 성능이 급격하게 저하될 수 있다.


* SORT_AREA_SIZE는 세션별로도 지정가능하며, 지정하기 위해서는
ALTER SESSION 권한이 있어야 한다. 특정 세션에서 시스템상의
모든 메모리를 사용하도록 할 경우 시스템 성능이 급격히 저하
될 수도 있다.



4. DBWR_IO_SLAVES

DBWR_IO_SLAVES는 SORT_AREA_SIZE와 마찬가지로 사용자들이 흔히 잘못 이해하는 파라미터로,
Oracle 8 이후 버젼에서 사용된다.

이 파라미터는 Oracle 8 이전에 사용되던 DB_WRITERS 파라미터를 대체한다.
Oracle 8에서는 DB_WRITER_PROCESSES 라는 파라미터가 DB_WRITERS를 대체하지만,
DBWR_IO_SLAVES 파라미터와 함께 사용할 경우 아직까지도 문제점들이 발생한다.


DBWR_IO_SLAVES는 slave writer process가 - OS에서 지원할 경우 -
asynchronous I/O를 수행하도록 허용한다.

DB_WRITERS 및 DBWR_IO_SLAVES 관련 자료는 METALINK에 많이 올라와 있으며,
DB_WRITERS 와 DBWR_IO_SLAVES 는 동시에 사용하 지 못한다는 것을 이해하는 것이 중요하다.

* 참조



5. ROLLBACK_SEGMENTS

이 파라미터는 모든 버젼의 오라클에서 사용되며,
인스턴스 기동중에 온라인 상태로 사용할 rollback segment를 지정한다.
만약 파라미터에서 지정한 rollback segment가 존재하지 않는 것이라면 ora-1534 에러가 발생하며,
데이터베이스는 mount까지만 되고 open 되 지는 않는다.

Rollback segment는 트랜잭션에서 발생하는 변경사항을 기록하여,
트랜잭션이 rollback 되어야 할 경우 이전 상태로 돌리기 위한 각종
정보를 저장하는 영역이다. - Windows 의 undo 기능과 유사함.

Rollback segment는 여러 extent들로 구성되는데,
extent는 round-robin 방식으로 순환되며 사용된다.
즉, 현재 사용되는 extent가 full이 나는 경우 다음 extent를 사용하는 식으로 사용된다.

Rollback segment는 read consistency를 제공해 주고, 트랜잭션을 undo 시킬수 있고,
recovery에 사용되는 등, 데이터베이스에서 매우 중요한 역할을 수행한다.

Read consistency는 업무적으로도 매우 중요한데, 한 사용자 (1번 사용자) 가 데이터를 읽는동안,
다른 사용자가 (2번 사용자) 그 데이터에 변경을 가한다면,
2번 사용자가 데이터 변경을 일관성 있게 종료하기 전가지 1번 사용자는 이전 상태의 데이터,
즉 이전에 commit 된 상태의 데이터를 사용하여야만 데이터 일관성및 정합성이 보장된다.


RBS의 적정 크기는 다른 문제와 마찬가지로 데이터베이스 내에서
사용되는 일반적인 트랜잭션 레벨에 따라 다르다.
RBS extent의 크기와 관련해서는 오라클에서는
extent size와 관련된 (initial,next 값)권고 사항이 존재한다.

Rollback segment의 갯수와 관련해서는,
rollback segment간의 contention 이 발생하지 않도록 조정해 주는 것이 중요하다.
모든 트랜잭션은 RBS의 헤더에 존재하는 트랜잭션 테이블에 정보가 저장된다.
모든 트랜잭션이 이 테이블의 내용을 변경하여야 하므로, contention이 발생할 수 있다.
한 시점에 한개의 트랜잭션이 한개의 rollback segment를 사용하도록 하는
것이 일반적인 원칙이다. 오라클에서는 4개의 트랜잭션당 한개의
rollback segment를 사용하는 것을 권고하지만,
절대적인 기준이 아니라 상대적인 기준으로 보는 것이 바람직하다.

rollback segment간 contention을 조사하기 위해서는 v$waitstat을 조회하면 된다.
다음 query로 rollback segment간 contention을 조회해 볼 수 있다.


SELECT a. name, b.extents, b.rssize, b.xacts, b.waits,
b. gets, optsize, status
FROM V$ROLLNAME A, V$ROLLSTAT B
WHERE a.usn = b.usn;

실행결과는 대략 다음과 같은 형식으로 나타난다.

NAME EXTENTS RSSIZE XACTS WAITS GETS OPTSIZE STATUS
SYSTEM 4 540672 1 0 51 ONLINE
RB1 2 10240000 0 0 427 10240000 ONLINE
RB2 2 10240000 1 0 425 10240000 ONLINE
RB3 2 10240000 1 0 422 10240000 ONLINE
RB4 2 10240000 0 0 421 10240000 ONLINE

위의 질의를 처리한 결과로 "xacts" ( 트랜잭션의 줄임말 ) 가 계속해서 1 이상이 경우,
rollback segment의 갯수를 늘려주는 것이 contention이 발생할 가능성을 줄여준다.
만약 wait 갯수가 0보다 크고, 특별한 사항에서만 나타나는 것이 아니라 항상 비슷한 상황이라면,
이 경우에도 rollback segment의 갯수를 늘려주는 편이 낫다.

* Rollback segment의 적정 갯수 도출관련 자료는 , 참조
* Rollback segment의 생성, 최적화 관련 자료는 , 참조



6. SORT_AREA_RETAINED_SIZE

init.ora 파일에서 지정하는 sort 작업 관련된 파라미터로 SORT_AREA_RETAINED_SIZE 도 있다.
이 값은 sort 가 끝난 후에도 유지하고자 하는 SORT_AREA_SIZE를 나타낸다.
이 파라미터는 SORT_AREA_SIZE 값과 같거나 적게 지정되어야 한다.

SORT_AREA_RETAINED_SIZE는 SORT_AREA_SIZE와 마찬가지로 적절한 값이 지정되어야 하는데,
소트작업을 수행하기 위해 할당된 메모리 영역이 소트 작업이 끝난 후가 아니라 세션이 종료될 때
까지 유지될 수 있기 때문이다.

SORT_AREA_SIZE 값은 다른 파라미터와 마찬가지로 시스템에 가용한 실제 메모리 크기 이내에서 조정되어야 한다.
일반적으로 권고되는 SORT_AREA_SIZE 값은 65k 에서 1M 사이 에서 결정된다.



7. DB_BLOCK_LRU_EXTENDED_STATISTICS

Oracle 8i 부터는 사용되지 않는 파라미터로, SGA의 buffer cache 값을
증가시키거나 감소시킬 경우 미치는 영향을 예측하기 위한 각종 통계 정보를
수집하는 작업을 활성화 시키거나 비 활성화 시킬 수 있다.

사용자는 DB_BLOCK_BUFFERS 값을 바꾸어 시스템을 재 기동 시키지 않고도,
alter system 명령으로 buffer cache 크기를 조정할 수 있게 해 주시만,
내부적으로는 DB_BLOCK_BUFFERS 값은 데이터 베이스 재 기동시에만 바뀔 수 있다.

통계정보는 X$KCBRBH 테이블에 저장된다.

이 값을 0 이상으로 지정하면 DB_BLOCK_BUFFERS 값을 추가하거나
혹은 추가한 것처럼 simulate 시킬 수 있다.

기능상으로는 튜닝에 많은 도움을 줄 것 처럼 보이나,
많은 문제점을 안고 있는 것으로 알려져 있으므로 오라클에서는
production 환경에서는 사용하지 않도록 권고하고 있다.



8. SHARED_POOL_RESERVE_SIZE

sahred pool의 일정 부분을 larget object을 위해 할당하도록 지정하는 파라미터로,
기본적으로는 shared_pool_size의 5% 정도가 사용된다.
파라미터 값은 byte 단위로 지정한다.

이 파라미터를 지정할 때 유의해야 할 점은 shared pool의 대부분의 영역이
large object에 의해 사용되지 않도록 하고,
large object는 별도의 영역에서 처리되도록 지정하는
것이 관건이다.



Reference Documents -------------------













- 김정식 [2004-11-11]
-- Current Hit Ratio
SELECT SUM(DECODE(Name, 'consistent gets',Value,0)) Consiste
nt,
SUM(DECODE(Name, 'db block gets',Value,0)) Dbblockget
s,
SUM(DECODE(Name, 'physical reads',Value,0)) Physrds,
ROUND(((SUM(DECODE(Name, 'consistent gets', Value, 0)
)+
SUM(DECODE(Name, 'db block gets', Value, 0)) -
SUM(DECODE(Name, 'physical reads', Value, 0)) )/
(SUM(DECODE(Name, 'consistent gets',Value,0))+
SUM(DECODE(Name, 'db block gets', Value, 0)))) *100,2
) Hitratio
FROM V$SYSSTAT;

ant eclipse memory parameter

set ANT_OPTS=-Xms128m -Xmx256m
D:eclipseeclipse.exe -vmargs -Xms256M -Xmx512M