이 글은 Naver cafe SQLROAD카페(MSSQL전문가로가는지름길)에 올렸던 글에 좀더 살을 붙인 글입니다.

 MS SQL Server를 운영하는 중에 이기종 DBMS에서 data를 가져올 일이 꽤 많죠. DW 구축을 위해 도입한 ETL Tool이 있다면 이런 일이 다른 팀에 생색내며 해줄 수 있는 좋은 건수가 될텐데요. 대부분의 경우 이런 경우 PHP 같은 스크립트 언어를 이용해서 data를 넘기도록 만들거나, 해당 DB에 Tool로 접속하여 엑셀 파일 형태로 data를 뽑아낸뒤 다시 업로드하는 방식을 이용하는걸로 알고 있습니다. 조금 번거롭죠...
이건 SQL Server를 운영하는 DBA만의 고민은 아닐겁니다. 이번엔 SQL Server를 운영하다가 PostgreSQL의 Data를 가져올때 어떻게 하나... 하는 얘기를 해볼까합니다. Oracle, Tibero와 data를 공유하는 것에 대해서는 이전에 올린 글들을 찾아보시면 될것 같습니다. 이번에는 PostgreSQL입니다.

 제가 올렸던 SQL Server 관련 글들을 보시면 아시겠지만, 저는 OLEDB, ODBC 드라이버를 이용해서 SSIS 혹은 Openquery를 쓰는 방식을 얘기할 생각입니다.

1. ODBC, OLEDB driver 설치하기.
 PostgreSQL 홈페이지(www.postgresql.org)에서 다운로드 메뉴로 들어가면 "Driver and interface"라는 항목이 있습니다. (바로가기)
 OLEDB driver가 몇가지 있지만 저는 PostgreSQL OLE DB Provider project에서 제공하는 PostgreSQL OLE DB Provider for Windows를 이용하였습니다. 이유는 오픈소스라서입니다. PostgreSQL Native OLEDB Provider (PGNP)라는게 있는데 최근까지 업데이트도 되고 SQL Server 200의 DTS와 2005/2008의 SSIS 그리고 복제 등에서 사용할 수 있다고 소개되어있네요. 문제는 Trial 버전이라는겁니다. 아직 Manual과 홈페지이를 다 확인하지는 못했지만, 제약이 있을것 같네요.

 

2. Linked server(연결된 서버)를 이용한 Openquery 사용하기
 Openquery는

3. SSIS로 data 가져오기
 설치한 OLEDB 드라이버를 통해서 PostrgeSQL에 접속할 수 있습니다.
아래의 그림은 SQL Server 2008 버전의 SQL Server Management Studio에서 SSIS를 사용할 때 데이터 원본 선택 화면입니다.

SQL Server 가져오기 및 내보내기 마법사


위에서 PostgreSQL OLEDB driver를 선택하면 아래와 같은 화면이 보입니다.


위에서 한 뒤 연결 속성을 클릭하면 아래와 같이 창이 뜹니다. 여기서 PostgreSQL 정보를 입력하면 해당 DB에 접속이 가능합니다.

 여기서부터는 PGNP Provider를 설치하고 SSIS를 사용할때의 화면입니다. 뭐... 별로 다른점은 없어 보입니다.
화면이 달라 보인다면 그건 위의 화면은 Windows 2003 Test server에서 캡쳐한 화면이고, 아래는 Windows 7 Test PC에서 캠쳐한 화면이라는 겁니다.


SSIS 사용에 대해서는 다음에 따로 정리하도록 하겠습니다.
그럼 이만...





 현재 사용중인 Linux server가 어떤 시스템인지 정보를 확인하는 방법은 많다.
RedHat 계열이면 /etc/redhat-release 파일을 열면 배포판 정보가 보이고,
uname 명령을 사용하면 또 일부 정보를 확인할 수 있다.

nmon을 설치했다면 nmon 실행 후 r을 입력하면 시스템 정보를 볼 수 있지만, 32비트인지 64비트인지 확인하는데는 좀 번거롭기도 하고... 그래서 찾아보았더니 명령어 한줄로 확인하는 법이 있었다!!

# getconf LONG_BIT
64


자 이렇게 하면 32 혹은 64로 화면에 뿌려준다.
쉽구나... 근데, 이거 정확한거겠지... ^^;
 사무실 PC에서 nmonanalyser 3.3.E가 엑셀과 함께 죽어버리는 문제가 종종 생겨서 혹시나하는 마음에 홈페이지에 들어가보니 새 버전이 올라와 있네요.
nmonanalyser 3.3.e3

http://www.ibm.com/developerworks/wikis/display/Wikiptype/nmonanalyser
최근 버전이 3.3.e3이구요. 생각보단 나온지 오래됐네요.

nmon을 사용하시는 분들은 한번 받아서 사용해보시길 ^^
저는 가끔씩 엑셀과 함께 죽는 현상이 없어져서 만족하고 있습니다.

 DBMS를 운영하다보면 종종 DB 복제, 혹은 특정 data의 동기화를 해야할때가 있다. 동일한 DBMS라면 그것도 시장에 잘 알려져 있어서 확실한 3rd party 복제 툴이 있거나, 혹은 한 두개 정도의 테이블만 복제/동기화 작업을 해줘야한다면 큰 문제가 아닐것이다. 허나 여러 종류의 DB를 사용하다보면, 그것도 시장에 널리 퍼지지 않았거나, 국내에서만 사용하는 DB라는 이유로 확실한 3rd party 툴이 없다면... 아마 저처럼 고민에 빠지게 될겁니다.
 제 고민의 원인에 대해서는 제가 앞에 작성했던 글들을 보시면 아시게 될겁니다.
2010/06/16 - [Database] - Tibero4 migration 모험기 (4) 중간정리 : Oracle DBA의 Tibero 사용 후기
2010/05/07 - [Database] - 국산 DBMS. TmaxData Tibero TAC의 좋은점과 아쉬운점.
2010/02/25 - [Database] - [이기종 DB간 Data 공유] MS-SQL에서 Openquery를 사용할때 문제점.
2010/02/01 - [Database] - Tibero4 migration 모험기 (3) Index rebuild 기능
2010/01/28 - [Database] - Tibero4 migration 모험기 (2) tbAdmin에 대해서
2010/01/07 - [Database] - [이기종 DB간 Data 공유] MS-SQL에서 Oracle에 있는 Data 가져와서 동기화 맞추는 기능 구현
2009/11/23 - [Database] - Tibero4 migration 모험기 (1) 사용자 정의 함수 사용시 경험한 묘한 버그
아~ 꽤 많군요. 걍 눈에 띄는것들만 선택한 건데...

 DB 복제(Replication), Data 동기화(Synchronization), Change Data Capture(CDC)... 뭐 이런 식으로 불리거나 비슷한 단어들로 묘사되는 툴들이죠.
 Oracle만 혹은 Oracle만큼 시장에 많이 알려진 DB2, MySQL, SQL Server, Sybase 등의 DBMS들, 심지어는 국내에서는 잘 쓰지 않는다고 알려진 Postgresql, FireBird까지도 지원하는 툴이 있는데, 저에게는 TmaxData Tibero라는 복병이 있습니다. 아시다시피 국산 소프트웨어이며, Oracle의 문법 체계를 그대로 적용하여 Query, Procedure 등을 개발할 수 있는 등의 많은 장점을 지닌 제품입니다.
 문제는 Tibero를 지원하는 툴들이 거의 없다는겁니다. NHN의 Cubrid가 오픈소스 프로젝트를 열고, 많은 개발자, 사용자들을 끌어들여서 Pentaho에서 JDBC를 이용하여 접속을 가능하게 하는 문서(블로그)가 검색되는 등의 성과를 올리는 것과는 반대로 "Orange for Tibero"외의 성과가 없는게 Tibero측의 아주 큰 약점입니다.
 물론 TmaxData에서는 자사의 Tibero와 함께 DB복제 솔루션인 ProSync와 ETL 솔루션인 ProETL이라는 제품도 판매하고 있습니다만, 아직 제약이 많습니다. Oracle-to-Tibero 복제는 이상없이 잘되는데, Tibero-to-Tibero 복제에서 문제가 생겨서 도입하려다 중지한 상태입니다. 뭔가 남들과 조금 다르게 구성하면 잘 안되는게 생기네요.

 이 모든것을 뒤로하고...

지금 고민은 "오픈소스 ETL/BI 솔루션 중에서 어떤 제품을 사용하는게 좋은가?"입니다. 음... 어떤게 좋을까요?
고민되네요.

 그동안 NHN에서 영입한 많은 인재들이 만들어낸 아름다운 성과물의 집합. NHN Deview 2010을 다녀온 감상입니다.
사실 NHN Deview 210에 다녀오기 전에는 서버 가상화랑, 대용량 DB에 대한 내용만 좀 건져도 가치있는 시간일거라 생각했었습니다. 근데, 실제로 뚜껑을 열어보니 기대 이상의 내용이었습니다.

"한국 IT 업계에서의 오픈소스의 가능성을 보다"

 위와 같은 문구를 내세운것는 제 개인적인 감상입니다.  제가 들었던 세션들이 대부분 오픈소스 프로젝트이거나 외부 오픈소스 프로젝트를 활용한 내용들이었기에 아마도 이런 느낌을 강하게 받았었으리라 생각합니다. 다른 세션을 들었던 분들은 또 다른 느낌일 수 있습니다.

 서버 가상화를 통한 효율적인 서버 자원 운용 및 긴급한 서비스 요구 사항 대처. 가상 서버를 이용해서 개발에 필요한 자원을 쉽게 획득하고 필요할때 자원을 한곳으로 집중할 수 있는 구조는 개발과 운용에 아주 큰 힘이 되죠. 그리고 발표자께서 예로 들은  전직 대통령 조문 사이트 같은 긴급하지만, 일시적인 서비스를 제공할때 아주 유용합니다. 여기에 오픈소스 가상화 시스템인 Xen을 이용하며 그 관리를 위한 시스템을 내부적으로 구축했다는 얘기는 아주 인상적이었습니다. 이 부분은 memcached를 이용한 Arcus에서도 나왔습니다. 음... NHN이라는 거대한 기업이 오픈소스를 많이 사용하고 오픈소스에 기여도 하는걸보니 역시 인재가 많은 회사라는 느낌을 받았습니다.

 오픈소스 소프트웨어을 가져다 쓴다.
 오픈소스 소프트웨어의 부족한 부분을 보완한 코드를 알려주어 다른 사용자들에게도 도움이 되도록 한다.

라는 간단하지만 어려운 일을 하고 있더군요. 저희 회사에도 적용할만한게 있을지 고민 중입니다.
내년 Deview가 벌써부터 기대됩니다. ^^


 SQL Server 2008에서 테이블의 구조를 변경하는 작업을 하던 중 "테이블을 다시 만들어야 하는 변경 내용 저장 사용 안 함"이라는 경고를 보게되었습니다. 간단하게 P.K를 추가하는 거였는데... 암튼 이렇게 되고 보니 뭔가 내가 중요한 실수를 하는 것인지 궁금해지더군요. 검색을 해보니 의외로 간단하게 해결되었습니다.
 SQL Server 2008의 SSMS의 메뉴 중 [도구] > [옵션]을 클릭하면 아래와 같은 창이 뜹니다.


 위에서 "테이블을 다시 만들어야 하는 변경 내용 저장 사용 안 함"이 선택되어 있을텐데 이를 해제해주면 됩니다. 이 설정은 바로 적용되니까. "확인" 버튼을 눌러준뒤에 바로 작업을 속행하시면 됩니다.
 SQL Server 2005를 사용하는 서비스가 있는데, P.K도 없는 테이블을 만들고는 거기에 중복된 값을 넣었더군요. 젠장 뭔놈의 설계를... 암튼... db를 복제해놓으려고 했더니 이 P.K없는 테이블이 걸리더군요. 그래서 pk를 넣어주기 위해서 중복 data 삭제를 시작하려했습니다. 근데... 이거 참... ROWNUM 같은걸 찾기가 힘들더군요. 고심끝에 임시 테이블을 만드는 방법을 쓰기로 했습니다.
물론 다른 방법이 충분히 존재할거 같은 느낌이 듭니다. 그러나... 너무 오랜 시간 동안 이 문제를 잡고 있을수는 없으니까요. 다른 좋은 방법을 알고 계시면 알려주시면 감사하겠습니다. 그럼 평온한 하루 보내시길...

1. 기존 DATA를 백업 테이블에 백업한다.
SELECT * INTO dbo.LIST1_BK FROM dbo.LIST1;

2. 중복된 ROW의 번호를 확인한다.
SELECT A.*
  FROM (select  ROW_NUMBER()OVER(ORDER BY VALUE2) AS SEQ1, * from dbo.LIST1) A;

3. 중복된 ROW의 번호를 제외한 나머지 DATA를 임시 테이블에 입력한다.
INSERT INTO dbo.LIST1_TEMP(VALUE1, VALUE2)
SELECT A.VALUE1, A.VALUE2
  FROM (SELECT ROW_NUMBER()OVER(ORDER BY VALUE2) AS SEQ1, * FROM dbo.LIST1) A
 WHERE A.SEQ1 NOT IN (6, 10);

4. 원본 테이블의 DATA를 삭제한다.
DELETE FROM dbo.LIST1;

5. 임시 테이블의 DATA를 원본 테이블에 입력한다.
INSERT INTO dbo.LIST1(VALUE1, VALUE2)
SELECT VALUE1, VALUE2 FROM dbo.LIST1_TEMP

+ Recent posts