Postgres-XC에 대해서 검색하다가 찾은 글이다. PostgreSQL의 streaming replication과 pgpool-II를 같이 쓰면 어플리케이션에서 접속 정보 변경없이 읽기, 쓰기를 구분하고 부하분산도 가능하다고 한다.
아... 이것도 꽤 쓸만한 구성인것 같은데...

원문 링크 : http://avicom.tistory.com/m/post/view/id/94

아래는 원문의 일부이다. 전체 글은 위의 링크를 클릭하면 볼 수 있다.


별도의 replication 관리 DB가 필요없고 복제 대상 테이블에 trigger를 설치할 필요가 없다.
아카이브 로그 파일을 읽을 필요가 없다
warm standby의 단점이었던 recovery중인 slave db에 대한 엑세스 제한이 없다.
multi-slave 설정이 가능하다.
streaming replication과 pgpool-II를 조합하면 소스에서 타겟DB를 변경하지 않고도 read/write db를 구분하여 select 쿼리를 slave db로 분산시킬 수 있다.

iPhone 에서 작성된 글입니다.
지난주에 테스트 용도로 Oracle 11g R2를 설치한 적이있다. 설치는 참 오랫만이었는데, 기본 옵션을 보니 Spatial이 설정되어있었다. 음 지리정보를 이용한 서비스가 많아져서인지 이게 언제부터 기본으로 지원되었던거지?

음 공부를 소흘히하면 안되겠어.

iPhone 에서 작성된 글입니다.


Cluster/HA DBMS 환경을 구성하려고 보니 DBMS는 오픈소스로 구축 가능하지만, 정작 클러스터 소프트웨어는 상용밖에 몰라서... 혹시나 하고 검색을 해봤더니 LCMC라는 툴이 나왔다.
오픈소스이고 Pacemaker의 GUI 관리툴인듯하다. 자바로 개발되어있다.
흥미로운 툴인듯...... 자세한 내용은 집에가서 가상 머신으로 한번 돌려보고...

iPhone 에서 작성된 글입니다.
엔코어에서 개발한 DA#은 erwin과 같은 모델링 툴입니다. 최근 버전인 dataware는 써보지 않아서 모르겠지만 귀찮은 버그가 몇가지 있는걸 빼면 꽤 쓸만합니다.
DA#에서 디비를 이용한 ar 저장소를 사용하면 표준화 작업에 편리하게 이용할 수 있다고합니다. 아직 써보지는 않아서 모르겠습니다.

요구사항은 Oracle Express edition 10g가 설치되어야 한다는점입니다. 최신버전인 11g는 안되더군요. 참고하시길...

iPhone 에서 작성된 글입니다.
PostgreSQL을 사용하다보니 같은 DB내에서 혹은 다른 DB에 존재하는 테이블의 view를 만들어놓고 사용하는 경우가 종종 있다. (PostgreSQL의 디비링크가 아주 불편하기 때문이기도하고, DA분이 너무 정규화를 잘 해놓았기 때문이기도 하다.)

PostgreSQL에서 처음에 뷰를 만들었을때...... 신기하게도 select만 가능한지 몰랐었다. update문을 실행해보고서야 곤란한 문제가 생겼다는것을 알게되었고, 곧바로 구글 검색과 메뉴얼 검색을 통해서 rule이라는걸 찾게되었다.

rule이란 걸 이용하면 뷰에서 DML문이 실행되면 해당 rule에 맞는 부분만 실행이 되더군요.

예를들어서 update 구문에 대한 rule을 만들면서 "update emp set ename where empno = new.empno"라고 쿼리문을 설정해주면 이 뷰에서는 ename 컬럼만 수정이 가능해집니다.

재밌는 기능이죠. 좀더 자세한 기능과 예제는 다음에 정리해서 올리겠습니다.

iPhone 에서 작성된 글입니다.
Open source RDBMS인 PostgreSQL은 현재 9.1.3버전까지 나온 잘 만들어진 DBMS이지만 아주 큰 약점들이 있다. 오늘은 그중 하나인 계층형 쿼리 기능에 대한 해법을 말해보고자한다.
계층형 쿼리, Hierachical Query는 보통 조직도나 다단계 분류표 등의 구조를 나타내는데 쓰는 구문으로 Oracle RDBMS에서 "start with ~ connect by~"의 형태로 쓰며, 보통 "connect by"로 불리운다. 그런데 PostgreSQL에서는 계층형 쿼리를 쓰려면 추가 모듈을 설치해야 하는데, 이 모듈을 설치하면 쓸 수 있는 connectby라는 함수는 속도가 아주 느리다. 그래서 "connect by"를 따로 구현해 보았다.

입력받은 테이블과 컬럼 이름으로 "with recursive" 구문을 문자열로 만들어서 PL/pgSQL의 dynamic query를 이용해서 실행하고, 결과를 result set 형식으로 반환하는 방식이다.


create or replace udf_connect_by (tab_name varchar, key_name varchar, parent_key_name varchar, start_with varchar)
return SETOF record
as $$
declare
v_rowcnt integer;
v_query varchar;
begin
select count(*) into v_rowcnt
from pg_tables
where tablename = tab_name;

if v_rowcnt = 0 then
raise exception 'Invalid table name';
end if;

v_query := 'with recursive T1(select *, 1 as r_level, array[' || key_name || '::varchar] as r_path, false r_flag
from ' || tab_name || '
where ' || start_with || '
union all
select B.*, T1.r_level + 1 as r_level, array_append(T1.r_path, ' || key_name || '::varchar) as r_path, B.' || key_name || '::varchar = any(T1.r_path) as r_flag
from ' || tab_name || ' B, T1
where not r_flag
and B.' || parent_key_name || ' = T1.' || key_name || ')
select * from T1 order by T1.r_path ';

return query execute v_query;



end;
$$
language pl/pgsql
;



iPhone 에서 작성된 글입니다.


오라클을 주로 사용하던 이들은 다른 DBMS에서 아쉬운 것들이 몇가지 있죠. 현재 사용중인 PostgreSQL의 경우, 오라클의 자유로운 db link와 merge 등이 아주 그립습니다. 그래서 이 merge 기능을 대신하는 방법을 찾아봤습니다.

수정 가능한 WITH CTE 구문을 이용한 merge 기능 구현

WITH TEST AS (
UPDATE world_human A
SET cel_phone = B.cel_phone, email_addr = B.email_addr
FROM servay B
WHERE A.human_id = B.human_id
RETURNING A.*)
INSERT INTO world_human(human_id, cel_phone, email_addr)
SELECT C.human_id, C.cel_phone, C.email_addr
FROM servay C
WHERE C.human_id NOT IN (SELECT human_id FROM TEST)
;

이렇게하면 MERGE와 동일하게 입력 및 수정을 하나의 쿼리로 실행할 수 있습니다.

아 조건이 하나있는데, PostgreSQL 버전이 9.1.3이어야합니다. 9.0 버전에서는 안되는걸 테스트와 메뉴얼로 확인 했습니다. 9.1.2나 9.1.1에서도 잘 되는지는 확인을 못 했습니다.

iPhone 에서 작성된 글입니다.

+ Recent posts