달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2011. 1. 14. 18:05

김제동 강의 Work/Etc2011. 1. 14. 18:05

http://www.tagstory.com/video/video_post.aspx?media_id=V000369963

아마.. 선덕여왕이 인기리에 방송되던 때에 했던 강의 같음..
비슷한 나이인데도 참 괜찮은 인간형이라 호감이 같다.

요약 내용
현재 시대는 소통의 시대다.
누구나 마이크를 들 수 있다.
마이크를 잡고 이야기 하는 것은 중요하다.

상식.
진리와 가까운 상식 이외에 모두 바꿔야 유머가 발생한다.
모국어로 사유할 수 있어야 한다.

사람이 사람을 웃기는 것은 사람이 사랑하는 증거이다.
누가 누군가의 이야기를 듣고 웃을 때는 그를 인정하는 증거다.
사람을 웃기는 것에는 진심이 필요하다.

처음... 아무것도 없을 때는 두려움이 없었다.
돈이 쌓여가자 두려움이 생겼다.
그래서 기부를 시작했다.
자신에게 들어오는 것이 어디에서 오는 것을 잊지 않기 위한 수단이 기부였다.



:
Posted by Elick
2011. 1. 14. 15:31

External Table Work/ORACLE2011. 1. 14. 15:31

Overview
Oracle 9i 이상
Table이 Database 내부의 Tablespace가 아닌 Database 외부의 OS 파일로 존재하게 하는 기능.
흔히 DW(Data Warehousing) 환경에서 기본적인 ETL(Extraction, Transformation, Loading) 작업에 사용.
주로 SELECT 만 사용하게 됨.
CREATE TABLE ... ORGANIZATION EXTERNAL 구문을 사용하여 생성하기는 하지만, 실제로 Table이 생성되는 것은 아니다.
External Table은 어떤 extents 와도 관련이 되어 있지 않다.
External Data에 접근하려면 Data Dictionary 에 metadata를 생성해야 한다.

문법
SQL> CREATE TABLE table_name ORGANIZATION EXTERNAL ...
External Table에 데이터를 처음 Unload 하게 되면, 자동으로 Select 문장의 데이터타입을 기준으로 metadata가 생성된다.

External Table 생성 방법
ORACLE_LOADER
: external 파일의 데이터를 읽어오는 기능. SQL*Loader 의 문법을 따른다.
ORACLE_DATAPUMP
: external 파일에 데이터를 쓰는 기능을 하고, 이를 다시 Database에 다시 reload 한다. 
Database로부터 데이터를 읽고 External Table에 insert 한다.
(... 사실 이렇게 External Table을 사용해 본 경험이 없다...)

External Table의 장점
병렬 SQL 수행가능
Table로 Loading 불필요
Storage 절약
Virtual Read-only Table*
External regular table 간 조인가능

External Table의 단점
index 생성 불가
Join 이나 Filter 수행이 어려움

[예제]
-- Oracle Directory 로 만들 경로 결정 혹은 생성
-- Oracle Directory 생성
        CREATE OR REPLACE DIRECTORY <oracle directory name> AS '<path>';
        GRANT READ, WRITE ON DIRECTORY <oracle directory name> TO <account>;
-- External Table 생성
CREATE TABLE et_ora_ext_t (
        col1 varchar(10)
        .
        .
        .
)
ORGANIZATION EXTERNAL
  (  TYPE ORACLE_LOADER -- 생성 방식 지정 (ORACLE_LOADER / ORACLE_DATAPUMP)
     DEFAULT DIRECTORY <directory>
     ACCESS PARAMETERS 
       ( records delimited by newline
        badfile D_ORA_EXT_TXT:'et_ora_ext_t.bad'
        logfile D_ORA_EXT_TXT:'et_ora_ext_t.log'
        fields terminated by ',' -- 컬럼 구분자로 사용할 문자
        missing field values are null -- 데이터가 없으면 null 로 입력
                 )
     LOCATION (D_ORA_EXT_TXT:'et_ora_ext_t.txt') -- <oracle directory name> 내의 데이터 파일이름.
  )
REJECT LIMIT UNLIMITED
PARALLEL -- 병렬처리 여부 (PARALLEL | NOPARALLEL)
;

SELECT * FROM et_ora_ext_t;

--ALTER EXTERNAL TABLE
ALTER TABLE et_ora_ext_t REJECT LIMIT 100;
ALTER TABLE et_ora_ext_t PROJECT COLUMN REFERNCED;
ALTER TABLE et_ora_ext_t PROJECT COLUMN ALL;
ALTER TABLE et_ora_ext_t DEFAULT DIRECTORY admin_dat2_dir;
ALTER TABLE et_ora_ext_t ACCESS PARAMETERS (FIELDS TERMINATED BY ';');
ALTER TABLE et_ora_ext_t LOCATION('et_ora_ext_t2.txt', 'et_ora_ext_t3.txt');
-- PARALLEL, ADD COLUMN, MODIFY COLUMN, DROP COLUMN, RENAME TO 는 일반 테이블변경방식과 동일함.

-- 일반 테이블을 삭제하는 것과 같지만, DB 외부의 실제 데이터는 삭제되지 않고, DB 내의 metadata 만 삭제된다.
-- DROP EXTERNAL TABLE
DROP TABLE admin_ext_employees;
:
Posted by Elick
2011. 1. 13. 18:16

MS 제품 학생용 Edition 받기 Work/Etc2011. 1. 13. 18:16

ms제품이 비싸지만.. 학생들은 무료로 사용할 수 있다.
아래 링크로 가서 학생인 것을 인증하고 받으면 된다.

https://www.dreamspark.com/default.aspx
Sign IN : windows live id 로 인증
Get Verified : 
What country do you live in? 
Korea
How would you like to verify?
Verify as a Student
How would you like to verify your account?
Get verified through my school
Countinue
학교 선택
Email : 학교 이메일
Email Confirm : 학교 이메일
Countinue
학교 이메일 확인
Access key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Access URL: https://www.dreamspark.com/Activate 

최초 인증했던 Windows live ID 로 인증한 후 위의 Access URL 로 가서 Access key로 인증.
오른쪽 하단에 product를 선택한 후 Download.

:
Posted by Elick
어떤 목적으로 DB를 운영한다 하더라도 DB 관리자 입장에서 백업은 항상 최우선이다.
다른 것은 다 용서해도 백업을 못한 것은 용서받기 힘들다.

백업은 복구를 위한 것으로 언제 발생할 지 모르는 장애를 위한 것이다.
장애가 발생한 직전 순간까지 최대한 복구를 하고자면 정교한 백업 복구 전략이 필요하다.

내가 아는 DBMS들은 대부분 백업은 크게 전체, 증분 혹은 차등, 로그 백업 3가지 종류를 지원한다.
단순한 백업 복구 정책이라면 증분 혹은 차등 백업은 생략하고 전체, 로그 백업 2가지로 백업 복구 전략을 수립한다.
백업 복구 정책의 결정 및 수립은 해당 시스템의 서비스레벨과 환경, 비용등을 고려하여 결정한다.

PostgreSQL을 사용하기 앞서 가장 두려운 것은 로그 백업이 되는가? 백업된 로그로 복구가 가능한 것인가? 에 대한 걱정이었다.
다행히도 로그 백업과 유사한 개념의 백업을 8.0 이상에서 지원하는 듯 하다. 현재 9.0.2 가 릴리즈 되었으므로 당연히 지원될 것으로 생각되어 테스트를 수행했다.

PostgreSQL은 전체 백업을 file copy 수준으로 하기 때문에 전체 백업 시점을 지정해 주어야 전체 백업이 언제 되었다는 것을 관리자가 직접 파악하고 해당 이후부터 로그를 리플레이하는 방식을 취하는 것 같다.
메뉴얼을 정독하지 않았기 때문에 해당 내용은 더 확인이 필요할 듯 하다.

대충... 개념은 설정->전체백업 표시->전체백업->전체백업 표시 중단 의 순서로 이루어진다.

설정할 부분은 postgresql.conf 에서 PostgreSQL 시작 parameter의 값을 기본값에서 변경을 해주어야 한다.
wal_level = archive
archive_mode = on
archive_command = '/bin/cp -i %p [log backup path]%f > [log backup result log]'
로그 백업을 위해 설정해 주어야 할 부분은 위의 3가지 정도 이다.
참고로 로그 백업이 될 위치를 결정해 주는 부분이 archive_command 인데... CentOS에서는 의도대로 동작했지만, Windows에 설치된 PostgreSQL은 원하는 위치로 로그 백업이 되지 않았다.(당연히 로그백업 자체는 동작했다. 설정을 잘못했는지 알 수 없었지만... 메뉴얼에 모든 플렛폼에서 동작하는 것을 기대하지 말라고 해서 더 확인해 보기도 찜찜하다.)

아직 복구까지 테스트가 끝난것이 아지만, 로그 백업이 이루어지는 결과(로그가 파일로 생성되는 것)를 확인 할 수 있었다.






:
Posted by Elick
2011. 1. 12. 17:08

Windows xp, Virtual Box, CentOS, PostgreSQL Work/PostgreSQL2011. 1. 12. 17:08

Windows에 PostgresSQL을 설치해보았으니 이제 Linux 에도 해보자.
설치까지는 별거 없었다.
역시 Test 환경을 만드는 것이 쉽지 않았다.
팀내 SE분이 아니었으면 엄청난 삽질을 했을 것으로 예상된다.(SE님 감사합니다 (--)(__))

. Virtual Box 설치 : 무리없음.
. Virtual Box로 CentOS설치 : image file 있으면 무리없음.
. Virtual Box에 Guest Addon 설치 : 무리 없음.
. Virtual Box의 CentOS에 PostgreSQL 설치 : 무리없음.
. 내 PC에서 Virtual Box의 CentOS의 PostgreSQL를 접속 : 이것이 생소했다. 아래처럼 설정한다.
1. 내 PC(windows xp)에서 [제어판]->[새 하드웨어 추가] 실행.
이 하드웨어를 컴퓨터에 이미 연결했습니까? -> yes
설치된 하드웨어 -> 새 하드웨어 장치 추가
원하는 작업을 선택하십시오. -> 목록에서 직접 선택한 하드웨어 설치
일반 하드웨어 종류 -> [네트워크 어댑터]
제조업체 -> [Microsoft], 네트워크 어댑터 -> [Microsoft Loopback Adapter]
다음, 마침
2. [내 네트워크 환경] -> [속성] 을 보고 새로운 [로컬 영역 연결 n] 이 추가되어 있는 것을 확인.
  새로 생성된 [로컬 영역 연결 n]의 [속성]에서 [인터넷 프로토콜(TCP/IP)] 의 속성을 편집한다.
다음 IP 주소 사용 선택
IP 주소 : 192.168.n.1
서브넷 마스크 : 255.255.255.0
기본 게이트웨이: (비워둔다)
3. Virtual Box에서 네트워크 카드가 2장인 것으로 인식하게 네트워크 카드를 추가한다.
Virtual Box의 CentOS power off
Virtual Box의 메뉴 중 [설정]
왼쪽 메뉴 중 [네트워크] 선택 
어댑터가 4개 보인다.
특별한 설정을 하지 않았다면, [어댑터1]은 NAT로 연결된 것을 확인할 수 있다.
[어댑터 2]를 사용하기로 한 후 [브릿지 어댑터] 로 설정한다.
[확인] 클릭 후 CentOS Startup
4. Virtual Box의 CentOS에서 해당 Loopback Adapter의 IP 대역을 사용하게 한다.
Gnom에서 작업.
[System] -> [Administration] -> [Network] 실행
Inactive 되어 있는 Device를 선택.
[Statically set IP addresses] 를 선택.
Address :192.268.n.2
Subnet mask:255.255.255.0
[OK] 선택
PostgreSQL startup
5. 내 PC에서 5432 port가 해당 IP로 연결되는지 확인
telnet 192.168.n.2 5432
6. 연결 잘 되면 완료. 연결 잘 안되면 처음부터 다시 확인.

. 다음에는 처음부터 잘 정리해서 올려볼가??
:
Posted by Elick
2011. 1. 11. 11:54

PostgreSQL - fsync Work/PostgreSQL2011. 1. 11. 11:54

PostgreSQL이 설치 된 후 Data Directory에 보면, postgresql.conf 라는 설정 파일이 있다.
이 설정 파일의 parameter 들 중 fsync 에 대해서 test해 본 결과를 기록한다.
이 옵션의 의미는 사용자가 시스템 콜 혹은 DML, DDL 등의 결과를 메모리에서 Disk로 내려쓰는 일을 하는 것을 의미한다.
언제 어떤 조건에서 내려쓰는지는 찾지 못했지만, 기본적으로 시간 날때 마다 쓰는 듯 한 느낌...
(좀 더 공부를..ㅠㅠ)

아래는 Test 결과...

create table t_20110110_03 ( name varchar(30) );
create table t_20110110_04 ( name varchar(30) );

SELECT COUNT(*) FROM t_20110110_02; -- 4,292,608

INSERT INTO t_20110110_03 SELECT * FROM t_20110110_02;
-- fsync off : 13860 ms
INSERT INTO t_20110110_04 SELECT * FROM t_20110110_02;
-- fsync on :  25125 ms

truncate table t_20110110_03;
truncate table t_20110110_04;

INSERT INTO t_20110110_03 SELECT * FROM t_20110110_02;
-- fsync on : 23516 ms
INSERT INTO t_20110110_04 SELECT * FROM t_20110110_02;
-- fsync off : 13860 ms

마지막 2개의 해당 쿼리를 실행할 때의 Phisical Disk Write 모습..

화면에 제대로 안잡혔는데... 위의 모습으로 보아 디스크의 효율적인 사용은 fsync off가 더 나은 듯 하다.
당연한 이야기 이지만, 상황에 따라 잘 써야 할 듯...
:
Posted by Elick
2011. 1. 7. 12:49

PostgreSQL - Windows 설치 후 해본 일 Work/PostgreSQL2011. 1. 7. 12:49

-- Tablespace 생성
CREATE TABLESPACE TS_WORK01 LOCATION E'E:\\PostgreSQL_DATA\\ts_work01';
CREATE TABLESPACE TS_WORK02 LOCATION E'E:\\PostgreSQL_DATA\\ts_work02';

-- Database 생성
CREATE DATABASE DB_WORK01 TABLESPACE=TS_WORK01;
CREATE DATABASE DB_WORK02 TABLESPACE=TS_WORK02;

-- USER 생성
CREATE USER kipi WITH PASSWORD 'xxxxxxxx';

-- OWNER 변경
ALTER TABLESPACE TS_WORK01 OWNER TO kipi;
ALTER TABLESPACE TS_WORK02 OWNER TO kipi;
ALTER DATABASE DB_WORK01 OWNER TO kipi;
ALTER DATABASE DB_WORK02 OWNER TO kipi;

-- 제거
DROP DATABASE DB_WORK01;
DROP DATABASE DB_WORK02;
DROP TABLESPACE TS_WORK01;
DROP TABLESPACE TS_WORK02;
DROP USER kipi;
:
Posted by Elick
2011. 1. 6. 18:09

PostgreSQL 관리 20101225 Work/PostgreSQL2011. 1. 6. 18:09

[기본 정보]
현재 PostgreSQL 사용 Port : SELECT inet_server_port();
현재 Database : SELECT current_database();
현재 접속 User : SELECT current_user;
현재 Server IP : SELECT inet_server_addr();
현재 PostgreSQL version : SELECT version();
현재 PostgreSQL 시간 : SELECT current_time;
현재 PostgreSQL 의 UPTIME : SELECT date_trunc('second', current_timestamp - pg_postmaster_start_time()) as uptime;
현재 PostgreSQL 의 시작시간 : SELECT pg_postmaster_start_time();
현재 PostgreSQL 의 UPTIME 상세 : SELECT current_timestamp - pg_postmaster_start_time();
현재 PostgreSQL 에 존재하는 Database : SELECT datname FROM pg_database;

[Lock Monitor]
DBMS 운영시 특정 Session의 lock을 감지하여 해당 Process를 강제종료 해야하는 경우가 종종 발생한다.
* 감지방법
SELECT * from pg_stat_activity;
  혹은
SELECT
w.current_query as waiting_query
, w.procpid as w_pid
, w.usename as w_user
, l.current_query as locking_query
, l.procpid as l_pid
, l.usename as l_user
, t.schemaname || '.' || t.relname as tablename
FROM pg_stat_activity w
join pg_locks l1 on w.procpid = l1.pid and not l1.granted
join pg_locks l2 on l1.relation = l2.relation and l2.granted
join pg_stat_activity l on l2.pid = l.procpid
join pg_stat_user_tables t on l1.relation = t.relid;
* 종료방법
select pg_cancel_backend(11836);

[Table / Column 보기]
SELECT pg_attribute.attname, pg_type.typname
 FROM pg_class, pg_attribute, pg_type
WHERE pg_class.relname = 'table_name' 
 AND pg_attribute.attnum > 0 
 AND pg_attribute.attrelid = pg_class.oid 
 AND pg_attribute.atttypid = pg_type.oid;

[Column Default Value 추가]
ALTER TABLE <table name> ALTER COLUMN <column name> SET DEFAULT <value>;

예)
ALTER TABLE tb_jp_2 ALTER COLUMN last_modified SET DEFAULT current_timestamp;

[성능유지]
아래 사항에 대해 Data 변경이 발생시 혹은 주기적으로 작업을 해야 한다고 한다.
(확인된 사항은 아니지만, 알아둬야 할 것 같다.)
---------------------------------------------------
update, delete 가 발생한 것에 대한 garbage 정리를 해야 한다.
#-- postgres 로 login
vacuumdb -a -f -z -v
index 정리
#-- postgres 로 login
clusterdb [databasename]
---------------------------------------------------

[Tablespace]
PostgreSQL 도 8.xx version 부터는 Tablespace를 지원한다.
Tablespace의 일반적인 개념은 Oracle을 참고하면 비슷할 거라 예상되며, MSSQL은 File Group 을 참고하면 된다.

아래는 실제 작업했던 script 이다.

. Tablesapce 대상 선정
. directory 설정.
---------------------------------------------------
su -
mkdir /mng/solrdata/pg_data
chown postgres /mng/solrdata/pg_data
chgrp postgres /mng/solrdata/pg_data
su - postgres
psql -d dbtest
CREATE TABLESPACE ts_xxxx location '/mnt/solrdata/pg_data';
---------------------------------------------------

위에 보면 알 수 있듯이 directory를 생성 후 그 directory를 통채로 Tablesapce로 지정하는 형태이다.

Tablespace 변경은 아래처럼 한다.
---------------------------------------------------
ALTER TABLE usasg SET TABLESPACE ts_forxtest;
ALTER TABLE kr_cwn SET TABLESPACE ts_forxtest;
ALTER TABLE kr_kpeg_factordb SET TABLESPACE ts_forxtest;
.
.
.
---------------------------------------------------
:
Posted by Elick