2013년 3월 8일 금요일

한글 포함된 url 전송


환경
CentOS release 5.8 (Final)
apache-tomcat-7.0.35

현상
개발환경을 모두 utf-8로 맞추고 개발을 했지만 아무리 GET으로 api를 호출해도 한글만큼은 깨지는것이였다
물론 클라이언트에서는 utf-8로 인코딩후 요청

GET /list/?objectPath=/%ED%95%9C%EA%B8%80/ HTTP 1.1

서버는 아래처럼 spring을 사용했기 때문에 당연히 spring에서 처리해주는걸로 기대했지만 그게 아니였다 ㅡㅡ;;

org.springframework-version : 3.2.0.RELEASE
org.springframework.data-version : 1.2.0.RELEASE
org.springsecurity-version : 3.1.3.RELEASE

해결방법
처음엔 받아온 값을 utf-8로 변환시켰었다

String str = new String(value.getBytes("8859_1"), "utf-8");

당연히 잘되었음

하지만 먼가 소스상의 지저분함을 느꼈었고 다른 해결책을 알아보았다
당연히 간단한 방법이 있었음

tomcat의 server.xml에 설정만 해주면 되었다

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8" />

결론
한글은 위대하다

2013년 2월 4일 월요일

ORA-01652

*** 2008/10/13 16:20 작성한 내용 ***


ORA-01652 : unable to extend temp segment by 128 in table space TEMP
메세지가 출력된다면....

주로 두가지 원인때문인데

temp tablespace를 구성하는 data file의 size가 작은 경우랑
temp tablespace의 max extents에 도달한 경우이다...


첫번째 원인인 경우 일단 temp tablespace의 tempfile크기를 확인한다

SQL>SELECT * FROM DBA_TEMPFILES
2 WHERE TABLESPACE_NAME = 'TEMP';

확인 후 tablespace 공간을 세가지중 한가지 방법으로 추가한다
 
SQL>ALTER TABLESPACE TEMP ADD TEMPFILE'/ORADATA/TEMP02.DBF' SIZE 100M; or
SQL>ALTER DATABASE TEMPFILE'/ORADTA/TEMP01.DBF' AUTOEXTENT ON; or
SQL>ALTER DATABASE TEMPFILE"/ORADATA/TEMP01.DBF" RESIZE 100M;
 
두번째 원인인 경우 v$sort_segment를 확인해서 현재 할당된 크기가 얼마인지 확인한다
그리고 할당할 수 있는 최대 extent의 크기가 얼마인지 확인한다
 
SQL>SELECT max(blocks), max(bytes)
2 FROM DBA_FREE_SPACE
3 WHERE tablespace_name = 'TEMP';

sqlplus에서 sql 튜닝을 위한 간단한 setting

*** 2008/12/18 22:28 작성한 내용 ***


자동 실행 계획 보기
Set AUTOTRACE [OFF, ON, TRACE (ONLY)] [EXPLAIN] [STATISTICS]

SQL> set autotrace on : autotrace 설정
SQL> set autotrace traceonly : SQL문 실행과 숨기기
SQL> set autotrace traceonly explain : 통계 정보 조회하지 않고 실행 계획만 조회

통계정보 읽기
정보구분 :  설명
db block gets : current gets에 대한 논리적 I/O 수
consistent gets : read-consistent gets에 대한 논리적 I/O수
redo size : (DML문에 대해) 생성된 redo의 양
sorts(memory) : 메모리에서 수행된 정렬 횟수
sorts(disk) : 임시 디스크 스토리지를 사용해 수행된 정렬 횟수
physical gets : 디스크에서 읽혀진 블럭 수

SQL> r
1 select group_name user_group
2 from cab_contact_group_info_tb
3 where tid = 90720342
4 and gid = ( select gid
5 from cab_contact_group_tb
6 where tid = 90720342
7 and cid = 407222006
8 and rownum = 1)
9*
Elapsed: 00:00:00.01
Execution Plan
----------------------------------------------------------
Plan hash value: 1180018063
---------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 92 | 8 (0)| 00:00:01 |
|* 1 | TABLE ACCESS BY INDEX ROWID | CAB_CONTACT_GROUP_INFO_TB | 1 | 92 | 3 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | CAB_CONTACT_GROUP_INFO_TB_PK | 1 | | 2 (0)| 00:00:01 |
|* 3 | COUNT STOPKEY | | | | | |
|* 4 | TABLE ACCESS BY INDEX ROWID| CAB_CONTACT_GROUP_TB | 35663 | 1358K| 5 (0)| 00:00:01 |
|* 5 | INDEX RANGE SCAN | IDX_CAB_CONTACT_GROUP_TB_TID | 12605 | | 4 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("TID"=90720342)
2 - access("GID"= (SELECT /*+ */ "GID" FROM "CAB_CONTACT_GROUP_TB" "CAB_CONTACT_GROUP_TB" WHERE
ROWNUM=1 AND "TID"=90720342 AND "CID"=407222006))
3 - filter(ROWNUM=1)
4 - filter("CID"=407222006)
5 - access("TID"=90720342)
Note
-----
- dynamic sampling used for this statement

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
156 consistent gets
0 physical reads
0 redo size
521 bytes sent via SQL*Net to client
492 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

이번 프로젝트 하면서 이넘의 그룹 땜에 몇날며칠을 고생을 했다.................제길.....
인덱스 타는거부터 시작해서..................... 간단한데도 불구하고 쿼리 짜는게 왜케 힘든지..
헌데 이런 좋은 setting 법이 있을 줄이야.....
모르면 손발이 고생한다더니...ㅋㅋㅋㅋ

개발기에서는 잘도 돌아가는것이 엄청난 양이 들어 있는 테이블을 조회하게 했더니 결국 뻗어 버리더라는.........
이런게 있다는걸 진작에 알았더라면 빨리 수정했을텐뎅...흠냐..

공부하자 제발...ㅋㅋㅋㅋㅋ

ORA-28000

*** 2010/08/21 12:11 작성한 내용 ***
 
 
10g에서 일정수 이상 로그인 실패시 계정에 lock이 걸린다
그리곤 'ORA-28000: the account is locked' 같은 에러를 뿜어 내는데
처음설치시에도 락이 걸려있는 계정들이 있다

일단 확인하기

SQL> select username, account_status, to_char(lock_date, 'yymmdd hh24:mi') lock_date
2 from dba_users;

위와 같이 하면 전체 계정에 대한 상태가 나타나는데....

account_status가 OPEN이 아닌 EXPIRED & LOCKED나 LOCKED(TIMED) 면 락이 걸린거....ㅋ
lock_date를 보면 딱 설치한날에 바로 락이 걸려 있는걸 확인할수가 있다... 흠냐..

필요한 계정에 대해 락을 함 풀어보자

SQL> alter user 계정명 account unlock;

이러면 락이 풀린다 ㅎㅎ

참고로 락이 걸리기 위한 횟수를 알아보려면

SQL> select p.profile, p.resource_name, p.limit
2 from dba_users u, dba_profiles p
3 where p.profile = u.profile
4 and username = '계정명';

이러면 되는데

PROFILE RESOURCE_NAME LIMIT
------------------ --------------------------------------- ---------------------
DEFAULT COMPOSITE_LIMIT UNLIMITED
DEFAULT SESSIONS_PER_USER UNLIMITED
DEFAULT CPU_PER_SESSION UNLIMITED
DEFAULT CPU_PER_CALL UNLIMITED
DEFAULT LOGICAL_READS_PER_SESSION UNLIMITED
DEFAULT LOGICAL_READS_PER_CALL UNLIMITED
DEFAULT IDLE_TIME UNLIMITED
DEFAULT CONNECT_TIME UNLIMITED
DEFAULT PRIVATE_SGA UNLIMITED
DEFAULT FAILED_LOGIN_ATTEMPTS 10
DEFAULT PASSWORD_LIFE_TIME UNLIMITED
PROFILE RESOURCE_NAME LIMIT
DEFAULT PASSWORD_REUSE_TIME UNLIMITED
DEFAULT PASSWORD_REUSE_MAX UNLIMITED
DEFAULT PASSWORD_VERIFY_FUNCTION NULL
DEFAULT PASSWORD_LOCK_TIME UNLIMITED
DEFAULT PASSWORD_GRACE_TIME UNLIMITED

여기서 FAILED_LOGIN_ATTEMPTS 값이 제한 횟수인거다
이건 귀찮아서 캡쳐 대신 그냥 복사붙여넣기 신공을......ㅋ

제한을 두기 싫다면 그 제한을 풀어버리면 된다

SQL> alter profile default limit FAILED_LOGIN_ATTEMPTS UNLIMITED;

후훗..... 간단하지 아니한가......ㅋㅋ

export / import

*** 2008/10/21 20:04 작성한 내용 ***


다른 설명 필요 없이 간단한 예제로 확인하기.....
정의가 궁금하다면 구글링~~~~~으로 해결하장...ㅎㅎ

$ sqlplus '/as sysdba'
SQL>startup
Database opened.
SQL>host

여기서 sqlplus가 아닌 운영체제로 돌아간다는게 포인트.....ㅎㅎ
오라클과 상관없이 백업가능하다는 얘기..

$ mkdir /oracle/exp_test/
$ cd /oracle/exp_test
$ exp hr/hr tables=employees,departments rows=y file=/oracle/exp_test/emphr.dmp
Export terminated successfully with warnings.

확인을 하면 이런 파일이 하나 생겼겠지
/oracle/exp_test/emphr.dmp

이건 hr의 2개의 테이블이 파일 형태로 빠진것....

$ exit
exit
SQL>

테스트를 위해 일단 export시킨 두개의 테이블을 drop 시키자

SQL> drop table hr.employees cascade constraint;
Table dropped.
SQL> drop table hr.departments cascade constraint;
Table dropped.

테이블 확인을 하면
ORA-00942: table or view does not exist
요딴 에러가 뜨겠징.....

이걸 import를 이용하여 복원시킨다면 오라클과 아무 상관없이 복원가능
즉, 서비스 중단이라는걸 하지 않아도 된다는 얘기가 된다
import 역시 운영체제 콘솔에서 실행한다

SQL>host
$ imp hr/hr tables=employees,departments rows=y file=/oracle/exp_test/emphr.dmp
. importing HR's objects into HR
. . importing table "EMPLOYEES" 107 rows imported
. . importing table "DEPARTMENTS" 27 rows imported
About to enable constraints...
Import terminated successfully without warnings.
$ exit
exit
SQL>

다시 해당 테이블을 확인하면 이전의 데이터가 그대로 있겠지..
정말 간단하면서도 쉬운 백업과 복원 기술이 된당.....ㅎㅎ
더군다나 DB를 stop시키지 않아도 사용할수 있는 상당히 매력있는 방법.....
이런걸 실무에서 사용할 일이 있을까나........ㅋㅎ

하둡 (hadoop) 설치

환경 : CentOS release 5.8 (Final)


1. 다운로드

아래 주소로 들어가 버전별로 다운로드 하면 된다
http://apache.mirror.cdnetworks.com/hadoop/common/

• 1.0.X - current stable version, 1.0 release
• 1.1.X - current beta version, 1.1 release
• 2.X.X - current alpha version
• 0.23.X - simmilar to 2.X.X but missing NN HA.
• 0.22.X - does not include security
• 0.20.203.X - old legacy stable version
• 0.20.X - old legacy version

작성시간 기준으로 1.0.4 가 가장 안정버전이라 해당 버전으로 테스트했다
Documentation : http://hadoop.apache.org/docs/r1.0.4/index.html


2. 설치

다운로드한 파일(hadoop-1.0.4.tar.gz)을 앞축풀면 설치끝
나는 hadoop user를 생성하여 설치를 했다
각종 PATH는 생략
정상적으로 설치가 되었다면

hadoop>$ hadoop version
Hadoop 1.0.4
Subversion https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1393290
Compiled by hortonfo on Wed Oct  3 05:13:58 UTC 2012
From source with checksum fe2baea87c4c81a2c505767f3f9b71f4

대충 위와 같은 메세지가 뿌려진다


3. 환경 설정

하둡은 다음의 세가지 방식중 한가지로 동작

• Local (Standalone) Mode
• Pseudo-Distributed Mode
• Fully-Distributed Mode

이중에서 Local Mode는 아무것도 설정해 줄것이 없기 때문에 Pseudo-Distributed Mode로 설정한다

hadoop-env.xml 설정
# The java implementation to use.  Required.
export JAVA_HOME=/usr/java/jdk1.6.0_25
 
.bash_profile에 JAVA_HOME를 잡아두어도 여기에 설정하지 않으니깐 JAVA PATH가 잡히지 않았다는 에러가 나타났다(이유를 모르겠음)
그래서 처음 설치할때 .bash_profile에 따로 PATH를 잡아 두지 않고 생략한 것이다

core-site.xml 설정

HDFS와 mapReduce에 공통적으로 사용되는 하둡코어 환경설정
<configuration>
 <property>
  <name>fs.default.name</name>
  <value>hdfs://localhost:9000</value>
 </property>
 <property>
  <name>hadoop.tmp.dir</name>
  <value>/home/hadoop/temp</value>
 </property>
</configuration>
 

hdfs-site.xml 설정

HDFS 데몬환경
Pseudo-Distributed Mode이므로 동일한 서버에 네임노드와 데이터 노드를 설정
<configuration>
 <property>
  <name>dfs.name.dir</name>
  <value>/home/hadoop/dfs/name</value>
 </property>
 <property>
  <name>dfs.name.edits.dir</name>
  <value>${dfs.name.dir}</value>
 </property>
 <property>
  <name>dfs.data.dir</name>
  <value>/home/hadoop/dfs/data</value>
 </property>
 <property>
     <name>dfs.replication</name>
     <value>1</value>
    </property>
</configuration>
 

mapred-site.xml 설정

job tracker와 task racker 같은 mapReduce 데몬환경
<configuration>
 <property>
  <name>mapred.job.tracker</name>
  <value>localhost:9001</value>
 </property>
 <property>
  <name>mapred.local.dir</name>
  <value>${hadoop.tmp.dir}/mapred/local</value>
 </property>
 <property>
  <name>mapred.system.dir</name>
  <value>${hadoop.tmp.dir}/mapred/system</value>
 </property>
</configuration>
 

slaves 설정

데이터 노드와 task tracker를 작동시킬 컴퓨터의 목록
실제 분산 환경으로 처리할때는 데이터 노드에 해당하는 컴퓨터 ip나 호스트명을 써주면 됨
localhost
 

SSH 설정

master 서버와 slave 서버들이 상호 접속 가능하기 위해
slaves를 localhost로 설정했더라도 데몬 프로세스를 실행시키기 위해 로컬 호스트에 암호 입력없이 ssh로그인할수 있도록 설정할 필요가 있음

hadoop>$ ssh-keygen -t rsa
hadoop>$ cp hadoop-env.sh hadoop-env.sh.back
hadoop>$ ssh localhost

네임노드를 HDFS로 포맷

hadoop>$ hadoop namenode -format


4. 실행 및 종료

hadoop>$ ./start-all.sh //모두 실행
hadoop>$ ./start-mapred.sh //맵리듀스만 실행
hadoop>$ ./start-dfs.sh //hdfs만 실행

hadoop>$ ./stop-all.sh //모두 중단
hadoop>$ ./stop-mapred.sh //맵리듀스만 중단
hadoop>$ ./stop-dfs.sh //hdfs만 중단

맵리듀스 : http://localhost:50030
HDFS     : http://localhost:50070

해당페이지가 열리지 않는다면 방화벽이 열렸는지 확인해본다


5. 테스트
hadoop 배포판에 기본적으로 포함된 예제를 돌려본다
CHANGES.txt파일에 있는 단어수를 체크해서 출력하는 예제임

hadoop>$ bin/hadoop dfs -mkdir input
hadoop>$ bin/hadoop dfs -put CHANGES.txt input/
hadoop>$ bin/hadoop jar hadoop-examples-1.0.4.jar wordcount input output

hadoop>$ bin/hadoop dfs -get output output


설치하고 기본예제까지 돌려 봤지만 이걸 어디다 써먹을지는 고민중이다
그래도 한번은 써먹게 되지 않을까...





JEUS Shared Server 설정

*** 2009/01/20 05:04 작성한 내용 ***


Jeus는 이미 pool을 사용하고 있어서 아무 문제가 없고.....
어플 데몬은 pool 적용을 아무리해도 되질 않길래 결국 Oracle server #1, #2 중에서 #2번을 shared로 구성하기로 결정났다

일단 서버 #1, #3번의 어플데몬이 DB#2을 바라보고 있기에 #1, #3의 접속 정보 및 DB#2 parameter 값을 수정을 했다

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.1.75)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=testdb)(SERVER=SHARED)))

server=shared 만 추가해주면 되는구만.....ㅋ
defult는 dedicated이라는것도 알아두고...

DB쪽이야.... DBA가 설정을 하겠지만 간단하게 적자면...
initTESTDB#2.ora 파일에 sessions, dispatchers, shared_servers, max_dispatchers, max_shared_servers 의 초기화 파라미터 값들을 추가수정해주면 될듯...

그리고 데몬중지 -> listener 종료 -> instance 종료 -> listener 시작 -> instance 시작 -> 데몬시작 순으로 적용을 하면 끝.......ㅋㅋ

헌데 이렇게 10분이면 끝날 작업이 DB#2를 바라보는 서버 #2번의 jeus 땜에 시간을 정말 많이 끌었다
이미 pool을 사용하고 있는데 DB server 가 shared 로 구성됐다고 자기도 shared로 붙어 버린다는...

흠.... 요거 아무리 구글링을 해도 답이 나오질 않는다

지금 사용하는건 6버전이라......... 더군다나 WEBMain.xml을 사용도 하지 않는데...
WEBMain.xml 파일만 건드는것만 나온다는............... ㅡㅡ;;;
우린 JEUSMain.xml을 건들어야 되는데........
결국 jeus 기술자를 불러서 설정을 했는데 너무나도 간단히....

<data-source>의 <database>안에
<property>
<name>URL</name>
<type>java.lang.String</type>
<value>jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.1.75)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=testdb)(SER
VER=DEDICATED)))</value>
</property>

를 추가시켜 주었다...... 그리고 중복되는 parameter 값들은 주석처리...
재시작...

아 머리아퍼!!!!!

Docker로 설치된 PostgreSQL에 CSV 파일을 insert하는 과정

1. Docker 컨테이너 실행 : - PostgreSQL 컨테이너가 실행 중이 아니라면 , 다음 명령어로 컨테이너를 시작 ``` docker start <container_name> ``` 2. 컨테...