SQL Server의 transaction 격리 수준에 대해서 정리한 문서가 있어서 소개하려한다.
SQL Server 사용자라면 한번쯤은 들어봤을 sqler.com이라는 사이트의 글이다. 직접 시험해볼 수 있게 table을 생성하는 부분 등도 포함되어 있다. 대충 읽어봤는데, 나중에 Oracle이랑 비교하면서 한번 읽어봐야겠다. 음... 시간 내서 읽어봐야 할텐데... ㅋㅋ

원문 [트랜잭션 격리 수준]


IT 개발 혹은 관리 운영을 하다보면 부하 Test를 위해서 data를 입력할 일이 생깁니다.
이런 작업을 위해서 보통은 script를 짜거나 저장 프로시져를 만들어놓고 필요할때 data를 입력하죠. 그런데 블로깅 중에 test data를 입력해주는 "SQL Data generator"를 소개하는 글을 발견했습니다.
블로그 : "달려라하니" (http://ihchoi.tistory.com/)

 원본 글을 보시려면 아래 링크를 클릭하시면 됩니다.
아직 사용해보지는 않았지만... 재밌어 보이는 툴입니다. 유료지만, 무료 15일 버전도 있네요.

Test Data Insert Tool

제작사의 해당 툴 웹 사이트
제작사 웹 사이트

 작년에 다녀왔던 "SQL Unplugged : 괴물이야기" 컨퍼런스에서 SQL Server에 대한 다양한 경험을 할 수 있었고, 이후 운영중인 SQL Server를 좀더 잘 운영하려고 노력하게 되었습니다. 튜닝 공부를 위해 주말 과정을 듣기도 했고, 시중에 나와있는 책도 찾아보게 되었구요. 그래서일까요? 아래 화면을 보게 되었을때 참 반가웠습니다.

"올해에도 하루라는 시간이 아깝지 않을 컨퍼런스가 열리는구나!!" 고맙습니다. 수고하셨습니다.
자세한 후기는 나중에 정리해서 올리겠습니다.




아래 글 링크는 작년에 SQL Unplugged 첫번째 컨퍼런스 참석 후기입니다. 
2010/06/14 - [IT 기술/Database] - SQL Unplugged "괴물 이야기" 참석 후기


 Tibero는 Oracle과 유사한 구조로 구현되어있기에, Oracle처럼 Redo log file과 Archive log file이 존재한다. 당연히 Archive log mode로 설정을 해줘야 된다.


1. Tibero RDBMS의 설정 파일에 Archive log file이 저장될 디렉토리를 지정해준다.
$TB_HOME/config/DB명.tip파일에 디렉토리 설정을 추가해준다.
LOG_ARCHIVE_DEST="/data/tb_archive_log"


2. 운영중인 Tibero를 종료시킨 뒤 mount mode로 기동한다.
# tbboot mount

3. Achive log mode로 변경한다.
# tbsql sys

SQL>  alter database archivelog;


4. DBMS를 재기동한 뒤 정상적으로 Archive log file이 생성되는지 확인한다.
# tbdown immediate

# tbboot

# tbsql sys

SQL> alter system switch logfile;
 Tibero 4 SP1을 사용한지도 벌써 일년이 넘어가고 있다. 그동안 안정화에 꽤 많은 노력을 기울였고, 생각보다 오래 걸렸지만, Tibero를 그럭저럭 사용하고 있다. 문제는 아직까지는 초기에 Tibero 영업에서 얘기한 "Oracle 10g 기준으로 거의 모든(?) 기능이 동일하다"는 얘기에는 많이 모자란 모습이라는 것이다.

 그동안 Tibero에 대해서 몇번 얘기했었는데, 이번에 얘기할 것은 Oracle의 exp, imp에 해당하는 tbexport와 tbimport에 대한 얘기이다. tbexport는 Oracle의 exp와 같이 Online 상태의 DB에서 data를 backup할때 사용하는

 무엇이 문제인가!!
 Oracle에서 export한 덤프 파일을 import할 때에 원본 DB에는 A라는 Tablespace가 존재하지만, import하는 DB에는 A라는 Tablespace가 없다고 가정해보자. 어떻게 되는가. 아래의 이미지를 보면 쉽게 이해가 가지 않을까?
두 DB에 생성된 Tablespace 현황

  DB-1의 ERP라는 유저를 export한 뒤 DB-2의 ERP라는 유저에 import한다고 할 때, 두 DB에 생성된 Tablespace가 서로 다르다면, Oracle에서는 DB-1에서 export한 Table들이 원래 생성되었던 A라는 Tablespace가 DB-2에 없다면 import하는 계정의 default tablespace인 B에 Table을 생성하죠. Tibero에서도 이렇게 될 줄 알았습니다.


 그런데... Tibero에서는 import하는 DB에 원래 DB-1에서 Table이 생성될때 사용했던 Tablespace와 동일한 이름의 Tablespace가 없으면 에러를 발생시키네요. ignore=y 옵션을 주고 시작하면 해당 오류를 그냥 통과하고 나머지를 import합니다만 오류가 발생한 Table은 수작업으로 생성해야 합니다.
 나이를 한살 한살 더 먹어가면서 뭔가 잘 까먹는것 같다. 나의 전문 영역이라고( 이 말에 짱돌을 들어올리신 분들이 계실것이다... 제가 하고 있는것 중에서 그나마 잘 알고있는... 이라는 뜻.... 아시죠... 돌 내려놓으세요. 어르신들... 자자 좋게좋게... ^^; ) 생각하는 오라클에 대한 내용도 해가 갈수록 가물가물해지는 내용이 많고 새로운 기법과 기술들이 나날이 등장하고 있다.(사실은 현재 재직중인 곳에서 메인DB를 Oracle에서 Tibero로 전환 한 뒤에 더더욱 망각의 속도가 빨라지고 있는듯하다.) 그래서 2007년에는 오라클 DBA 과정을 통채로 한번 더 수강하면서 복습했었고, 종종 세미나와 학원 강의를 듣고 있다. 물론 비용이 많이 드니까 자주 들을 수 없다는게 단점이다.
 요즘 책도 잘 나오고, 어느정도 경력도 있으니 알고지내는 전문가도 많을테고, 혼자 혹은 아는 사람들이랑 스터디를 하면 되지 않느냐고 얘기하신다면... 본인의 게으름으로 인해 그건 좀 힘들다는 거다. ㅋㅋㅋㅋ
그리고 전문가들은 다들 바빠서 맨입으로는 모시기 힘들더라는... ㅋㅋㅋㅋ

 요즘 토요일이면 엑시엄에서 진행하는 세미나 형식의 강의를 듣고있다.  제목들만 살펴봐도 참 듣고 싶어지는 수업들이다.
 대용량 데이타베이스 아케텍쳐
 데이타베이스 관리를 위한 PL/SQL
 AWR을 이용한 고성능 데이타베이스 튜닝
 초보자를 위한 데이타 모델링 2부
 그 중에서도 "AWR을 이용한 고성능데이타베이스 튜닝" 강의를 듣고 있다. 그동안 몰랐던 Oracle 10g의 속 내용과 세월속에 점점 잊어가고 있던 Oracle 내부구조를 다시 학습하는 기회가 되어서 참 좋다.
 문제는 이론 수업이라서 내가 알아서 부지런히 실습을 해야하는건데, 실습환경 구축이 아직 안끝났다는... ㅜㅜ (이런 벌써 강의가 중반부를 넘어서고 있는데) ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ        아 웃자 힘들땐 웃어야해~~~

 어떤 강의냐고 물어보신다면 아래의 책을 집필한 저자중 한분이 강의를 하신다는거. 강의 내용은 "오라클 AWR을 이용한 고성능 데이타베이스 튜닝"이라는 책의 내용을 기반으로 한다는 거. 이 책의 목차를 보면 알게되겠지만, Oracle 10g의 내부 구조와 락, 래치에 대한 내용과 AWR을 이용하여 상태 분석 및 튜닝에 대한 내용이 주를 이룬다고 보면된다.

강의 준비를 열심히 하시고, 지각하는 사람이 있으면 남아서 챙겨주는 아름다운 마음까지...

고성능데이터베이스튜닝
카테고리 컴퓨터/IT > 데이터베이스 > DB
지은이 김지한 (비팬북스, 2010년)
상세보기
오라클 AWR을 이용한 고성능 데이터베이스 튜닝
국내도서>컴퓨터/인터넷
저자 : 김지한,황오현,장효성
출판 : 비팬북스(러닝스페이스) 2010.11.10
상세보기

왜 책 정보가 두줄이냐고 궁금해할것 같은데, 아랫칸은 인터파크도서 정보이다. 윗칸은... 잘 기억이 나지 않는다. 아마도 다음 책 정보였던거 같은데...

 그리고 지난 주말에 집에서 사용중인 PC에 가상머신으로 리눅스 설치 완료. Oracle VirtualBox를 설치했는데, 이거 쓸만한듯. 공짜지만 될거 다 되고...
암튼 현재 실습환경 구축 중....
얼른 이것저것 질러봐야겠다. 아 배고프다. 퇴근시간이 다가오는구나. 집에 도착하면 책이라도 봐야겠다.
 본격적으로 SQL Server까지 같이 관리하게 된지도 2년이 넘었다. 튜닝 수업도 들어보고, 전문가들의 세미나도 들어봤지만 아직 Oracle에 비해서는 자료나 강의가 좀 부족하다는 느낌을 지울수 없다. 그러다가 알게된 "SQL Server 2008 R2 Upgrade seminar" 웹 사이트.
 이 사이트는 SQL Server 2008 R2로의 upgrade 필요성과 방법론, 사례 발표 등의 세미나를 영상과 문서로 제공하는데, Microsoft SQL Server 2008 R2로 upgrade하려는 사람이라면 한번 들어볼만 하다. Firefox에서도 정상 작동하는 웹 사이트임.

 이 글은 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 사용에 대해서는 다음에 따로 정리하도록 하겠습니다.
그럼 이만...





 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 솔루션 중에서 어떤 제품을 사용하는게 좋은가?"입니다. 음... 어떤게 좋을까요?
고민되네요.

 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