Wednesday, May 25, 2011

bcp를 이용한 대량 데이터 이관

bcp라는 SQL Sever의 Tool을 이용해서 대량의 데이터를 파일로 떨구고 그걸 다시 DB로 넣는다.
속도는 DTS를 이용하는 것보다 빠른 듯 하다.

# 테이블 => 파일

bcp "select * from AMSRaw.dbo._MOT_Data where GeneratedDateTime >= '2011-05-17 00:00' and GeneratedDateTime < '2011-05-18 00:00'" queryout "D:\2011-05-17.txt" -c -S"192.168.10.165\sql2008" -T

509511개 행이 복사되었습니다.
네트워크 패킷 크기(바이트): 4096
총 클럭 시간(밀리초): 177031 평균: (2878.09개 행/초)

# 파일 => 테이블

bcp AMSRaw.._MOT_Data110517 in "D:\2011-05-17.txt" -c -S"192.168.10.165\sql2008" -T

509511개 행이 복사되었습니다.
네트워크 패킷 크기(바이트): 4096
총 클럭 시간(밀리초): 56313 평균: (9047.84개 행/초)

[펀글] 대용량 SQL Server 관리자를 위한 활용 팁 14가지

1. 가능한 테이블의 컬럼수는 작게 설계하는 것이 좋다.
테이블의 컬럼수가 적은 것은 당연히 I/O의 성능 향상에 도움이 된다. 당연히 쿼리 연결시 필요한 컬럼만을
가져 와야 하며 작은 컬럼수의 설계는 백업이나 리스토어 등의 업무에 성능 개선을 준다.

2. 컬럼 타입을 text/ntext를 써야 하는 경우라면 varchar/nvarchar 컬럼 형태로 사용하는 것이 좋다.
왜냐하면 SQL Server는 text/ntext 컬럼의 경우 다른 데이터들과 분할에서 저장하게 되며 이 저장된 값이 필요
할때는 다른 형식의 값들보다 오래걸리는 것은 당연한 이야기이다.

3. 만약 유니코드값이 입력되지 않는 컬럼 타입에 nchar/nvarchar를 써야 하는 경우라면 char/varchar를 고려하는 것이 좋다.
당연히 이러한 설계는 테이블 사이즈를 감소시킨다. 작은 테이블 사이즈는 I/O비용을 감소시키고 데이터베이스의
부하를 줄이면서 성능향상의 기본이 된다.

4. 만약 테이블 컬럼에 들어올 데이터의 크기가 4바이트 이하라면 varchar/nvarchar 컬럼 대신 char/nchar를 사용하는 것이 좋다.
고정된 값의 크기를 갖는 char 데이터 타입은 가변적인 값을 갖는 varchar 데이터 타입보다 작은 사이즈를 갖는다.
결국 char 데이터 타입을 사용하면 업데이트를 하거나 입력을 하는데 도움이 된다. 업데이트를 실행하게 되면 기존 값을 지우고
새로운 값을 입력하는 수정작업이 이뤄지게 되는데 이러한 물리적인 데이터의 수정작업은 사이즈가 작을 수록 성능 향상에 도움이 되는 것이다.

5. 데이터베이스의 테이블을 3정규화를 하는 것이 좋다.
만약 3정규화를 통한 테이블 설계가 이뤄지지 않고 종속관계를 포함하지 않거나 2정규화 등을 통해 테이블 설계
가 이뤄진다면 많은 문제를 발생시킬 수 있다.

3정규화를 통해 여러 테이블의 조인비용등의 두려움으로 인해 반정규화를 한다는 것은 위에서 말한 심플한 컬럼
디자인과 쿼리시 필요한 컬럼만을 조인하는 방법등으로 얼마든지 성능개선을 할 수 있다.

6. 데이터베이스의 테이블이 4정규화와 5정규화를 요구한다면 반정규화를 고민해보는것도 좋다.
정규화에서 4정규화와 5정규화를 요구한다면 그 결과는 성능저하를 요인할 수 있다. 이런 경우 성능 개선을 위해
반정규화 설계를 고민해보는 것이 필요하다.

7. 만약 모든 테이블의 레코드를 지우는 삭제작업을 해야 한다면 DELETE 명령어를 통한 삭제보다는 TRUNCATE
TABLE을 사용하는 것을 고려해 볼만 하다.

TRUNCATE TABLE를 사용하면 각각의 레코드를 지우며 로깅을 하는 DELETE 보다는 훨씬 빠른 방법이다.

8. 가능한 엔터프라이즈 메니저를 통해 원격 접속하여 관리하는 것은 서버에 많은 부담을 준다.
엔터프라이즈 매니저의 경우 많은 리소스를 요구하기 때문에 가능한 쿼리분석기등을 통한 제어가 부담을 줄일 수 있다.

9. PDC, BDC, 도메인 컨트롤러 또는 DNS서비스등이 설치된 곳에 설치하지 않는 것이 좋다.
도메인 컨틀롤러 등은 많은 오버헤드가 발생한다. 가능한 SQL Server 만을 독립적으로 설치해서 모든 자원이
서버만을 위해 사용되게 설계하는 것은 기본이다.

10. 성능 저하를 막기 위해 가능한 로컬 하드에 백업한 후 다른 백업장치로 옮기는게 좋다.
만약 백업을 하게 되면 SQL Server에서 몇가지 명령들을 사용할 수 없게 된다. 예를 들어 백업하는 동안 "ALTER
DATABASE","ADD FILE","REMOVE FILE 옵션","shrink a database","CREATE INDEX","SELECT INTO" 등을 사용할
없다. 백업하는 시간이 오래걸리구 성능저하를 고려한다면 먼저 로컬 하드디스크에 백업한 후 백업 파일을 테이프 백업장치 등에 옮기는것이 좋다.

11. 가능한 로그를 남기지 않는 "nonlogged bulk copy"를 이용하는 것이 좋다.
"nonlogged bulk copy" 는 로그를 남기면서 대량 복사 작업을 하는 것보다 무척 빠르다. 하지만 이것을 이용하려면
다음을 충족시켜야 한다.

데터베이스 옵션에서 "select into/bulkcopy"가 체크되어야 한다.
만들어질 테이블은 만들어져 있지 않아야 한다.
만들어질 테이블은 인덱스가 없어야 실행할 수 있다.
12. 가능한 "bcp" 또는 "DTS"를 이용하는 것보다 "BULK INSERT" 명령어를 통해 데이터를 옮기는 것이 좋다.
"BULK INSERT" 명령어를 이용하면 텍스트 파일로 생성한후 "DTS"를 통해서 값을 가져오거나 서버간 연결을
통해 "DTS"로 가져오는 것보다 훨씬 빠르다. 자신의 데이터가 수억레코드가 된다면 고려해 볼만한 내용이다.

13. SQL Server 테이블에 값을 넣거나 다른 데이터로 변환하고자 할때 DTS를 이용하는 것보다 bcp 유틸리티를 사용하는 것이 좋다.
bcp 유틸리티를 사용하는 것이 DTS를 사용하는 것보다 매우 빠르다.

14. 가능한 트랜잭션을 짧게 구성하는 것이 좋다.
트랜잭션 처리 작업이 짧게 이뤄지도록 설계하는것은 데드락을 발생시키는 것을 줄이는 당연한 이야기이다.

Monday, May 23, 2011

INSTALL된 ORACLE PRODUCT 및 VERSION 확인 SCRIPT

set echo off
set feedback off
set verify off
set linesize 79
set pagesize 100

col banner format a70 heading "Oracle Versions"
col PRODUCT format a30 heading "Products Installed"
col VERSION format a15
col STATUS format a15
col parameter format a50 heading "Options Installed"
col value format a10 heading "True/False"
col TODAY NEW_VALUE _DATE

set termout off
select to_char(SYSDATE,'fmMonth DD, YYYY') TODAY from DUAL;
set termout on

TTITLE left _DATE CENTER "Oracle Version and Options Installed" Skip 1 -
CENTER "=====================================" skip 2

select banner
from v$version;
ttitle off
select * from product_component_version;
select parameter, value
from v$option;
set verify on
set echo on
set feedback on

Monday, May 16, 2011

Union & Union All

Union은 중복을 검사하고, Union All은 안한다.. 즉 중복이 없을 테이블끼리는.......... 그냥 All로 하자...

Tuesday, April 19, 2011

[Ruby] Install Ruby 1.8.7 on Windows

1. Download the windows binaries for Ruby 1.8.7 here: http://www.ruby-lang.org/en/downloads/ extract that to wherever you would like, I use c:\ruby. Then put c:\ruby\bin in your PATH environment variable.

2. Download the zlib package: http://www.zlib.net/zlib123-dll.zip and extract the zlib1.dll, rename it to zlib.dll and move it into your Windows\System32.

3. Download the iconv package: http://sourceforge.net/project/showfiles.php?group_id=25167&package_id=51458. Find and extract the iconv.dll into your Windows\System32.

4. Download the rubygems package and follow the instructions, basically extracting the package and running
ruby setup.rb

5. Verify that everything works properly by trying a
gem install rails

6. once that installs then do:
rails test_project

Note: If zlib.dll and iconv.dll don’t work, copy them into c:\ruby\bin

Thursday, April 14, 2011

xcode 제거

터미널에서 root로 스위칭하고...

sudo /Developer/Library/uninstall-devtools --mode=all

Wednesday, April 13, 2011

[ERWin] post script

%ForEachTable() {

%ForEachKey() {

%If (%==(%IndexType,PK)) {

ALTER TABLE %TableName ADD CONSTRAINT "%TableName_%KeyType" PRIMARY KEY (%ForEachKeyMem() {%ColName,}) USING INDEX TABLESPACE "TS_MOBIKIT_DAT";

CREATE INDEX %TableName_IDX01 ON %TableName USING btree (%ForEachKeyMem() {%ColName,}) TABLESPACE "TS_MOBIKIT_IDX";

}

}

}

Tuesday, April 05, 2011

Oracle XDB 비활성화 방법 [8080포트 변경]

오라클 9i

Enterprise Manager Console

-> 네트워크->데이타베이스->

instance명->sys as dba로 login->XML데이타베이스->

구성-> ftp-port,http-port 변경 후 적용-> 재시작







오라클 10g


Oracle9i부터는 XML DB가 포함되어 있는데, 이 녀석은 HTTP/WebDAV과 FTP 포트로 각각 8080과 2100 포트를 사용한다. 데이터베이스 서버에 Oracle만 실행 중이라면 XML DB가 떠있다고 해서 문제될 것이 없으니 그냥 무시하면 되겠지만(보안을 생각한다면 막아두는 것이 좋다), 개발 서버나 테스트 서버의 경우 8080포트를 쓰는 다른 서버 프로그램(가령 Tomcat 같은)을 띄워야 하는 경우 포트가 충돌해 문제가 발생할 수 있다. Oracle9i에는 그나마 DBCA를 이용해 DB를 생성할 때 XML DB를 제외할 수 있는 옵션이 있었던 것 같은데, 10g에는 그 옵션이 사라져버렸다.
Oracle이 8080 포트를 사용하지 않게 하려면 XML DB가 뜨지 않게 해야 하는데, 이에 대한 방법이 정확히 나와 있지 않고, Metalink 등을 찾아봐도 설명이 정확하지 않아 다른 인터넷 사이트에서 알아낸 정보와 테스트 결과를 다음과 같이 정리한다.


참고) 원격 사용자가 비정상적인 HTTP 헤더로 Oracle XDB 서버에 HTTP 요청을 보내면 DoS 상태에 빠지게 할 수 있다. 즉 권한이 없는 사용자가 Oracle 데이터베이스 인스턴스의 서비스를 중지시킬 수 있다는 뜻이다. 또한 XDB가 실행 중인 시스템에서는 원격 사용자가 임의의 코드를 Oracle 서버 프로세스 권한으로 실행시킬 수 있는 문제도 있다. 이에 대한 패치가 있는지는 확인하지 못했지만, 사용하지 않는다면 XDB 서비스를 중지시키는 것이 좋겠다.

1. 포트 사용 여부 확인
UNIX의 netstat 명령이나 Oracle의 lsnrctl을 사용해 다음과 같이 확인할 수 있습니다.
$ netstat ?a | grep LISTEN | grep 8080
tcp 0 0 *.8080 *.* LISTEN

$ lsnrctl status

LSNRCTL for HPUX: Version 10.1.0.2.0 - Production on 09-MAY-2005 16:24:20

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=chantest)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for HPUX: Version 10.1.0.2.0 - Production
Start Date 09-MAY-2005 11:37:58
Uptime 0 days 4 hr. 46 min. 21 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle/ora10g/network/admin/listener.ora
Listener Log File /oracle/ora10g/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=chantest)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=chantest)(PORT=2100))
(Presentation=FTP)(Session=RAW))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=chantest)(PORT=8080))
(Presentation=HTTP)(Session=RAW))
Services Summary...
Service "ORA10G" has 2 instance(s).
Instance "ORA10G", status UNKNOWN, has 1 handler(s) for this service...
Instance "ORA10G", status READY, has 2 handler(s) for this service...
Service "ORA10GXDB" has 1 instance(s).
Instance "ORA10G", status READY, has 0 handler(s) for this service...
The command completed successfully
2. XML DB 비활성화
SQL*Plus로 DBA 권한으로 로그인한 다음 dispatchers 파라미터를 확인하면 다음과 같이 설정되어 있을 것이다.
SQL> show parameter dispatchers

NAME TYPE VALUE
-------------------- ----------- -------------------------------
dispatchers string (PROTOCOL=TCP)(SERVICE=XDB)
max_dispatchers integer
이 파라미터 값을 변경 또는 제거한 다음 DBMS를 다시 시작하면 된다. PFILE을 사용하는 경우 init.ora 파일을 텍스트 에디터로 편집하면 되고, SPFILE을 사용하는 경우에는 다음과 같이 파라미터를 수정한 후 DBMS를 다시 시작한다.


SQL> alter system set dispatchers='' scope=both;
SPFILE을 사용하는 경우 alter system 명령으로 파라미터 값을 바꿀 수는 있지만, 파라미터 값만 바꾼다고 XDB가 바로 비활성화 되는 것은 아니다. DBMS를 다시 시작해줘야 XDB가 비활성화 된다. 데이터베이스를 재기동한 후 netstat 또는 lsnrctl로 확인해보면 8080 포트를 사용하지 않음을 확인할 수 있다.
Metalink와 일부 문서에는 dispatchers 파라미터에서 "(SERVICE=XDB)" 부분만 제거하면 된다고 되어있지만, Oracle10g에서는 dispatchers 파라미터를 ''로 만들어줘야 했다.

3. HTTP, FTP 포트 바꾸기
다음과 같이 하면 HTTP와 FTP 포트를 바꿔줄 수 있다. 이렇게 한 경우에는 DBMS를 다시 시작시킬 필요가 없다. 프로시저를 실행시킨 후 netstat, lsnrctl 명령을 통해 결과를 바로 확인할 수 있다. 포트를 0으로 설정하면 XML DB를 비활성화 시킬 수 있다.

-- HTTP/WEBDAV 포트를 8081로 변경
SQL> call dbms_xdb.cfg_update(updateXML(
2 dbms_xdb.cfg_get(),
3 '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()',
4 8081))
5 /

Call completed.

-- FTP 포트를 2111로 변경
SQL> call dbms_xdb.cfg_update(updateXML(
2 dbms_xdb.cfg_get(),
3 '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()',
4 2111))
5 /

Call completed.
테스트 결과 여기까지만 해도 포트가 변경된다. DBMS를 다시 시작해도 결과는 그대로 남아 있다. 그런데 참조한 문서에는 다음 과정이 있어 참고로 남겨둔다.
SQL> COMMIT;
Commit complete.

SQL> EXEC dbms_xdb.cfg_refresh;
PL/SQL procedure successfully completed.
결과를 확인하는 단계다. netstat이나 lsnrctl로 확인할 수도 있지만, 다음 SQL을 통해서도 확인할 수 있다. 결과가 매우 길기 때문에 중간에 불필요한 부분은 제거했다. long과 pagesize를 충분히 설정해줘야 결과가 제대로 보인다. 결과를 자세히 보고 싶으면 SPOOL해서 에디터에서 보는 편이 좋겠다.
SQL> -- Verify the change
SQL> set long 100000
SQL> set pagesize 9000
SQL> SELECT dbms_xdb.cfg_get FROM dual;

CFG_GET
------------------------------------------------------------------------------


900
32
,
300
100
3600
1048576


...생략...


2111
local_listener
tcp
6000


8081
local_listener
tcp
6000
XDB HTTP Server
...생략...




출처:http://ntalbs.tistory.com/16