글 제목과도 같이...
MS SQL 2008 R2에 ODBC를 이용하여 힘들게 Linked한 MySQL DB에 daily로 생기는 특정 테이블 (XXX-2014_03_26)
의 데이터를 일정한 주기 (5분, 10분)에 한 번씩.... 동일 이름을 가진 혹은 조금 변형한 이름을 가진 MS SQL의 테이블을
동기화 시키는 것입니다. 시나리오는 이렇습니다. (편의상, Linked된 MySQL DB의 테이블을 A, A와 동일한 이름 혹은 약간
변형된 이름의 MS SQL 2008의 테이블을 B라고 하겠습니다.)
1. 일별로... 특정시간부터 시작하여...5/10분의 주기로 A가 생성되었는지 확인되면, B를 만든다 (100% copy 개념)
2. 이후, 5/10분 주기로 A를 확인하여, 추가된 내용이 있으면 그 만큼을 B로 insert 한다
3. 이런 작업은 특정 시간이 되면, 종료한다...
짧은 실력에... 위와 같은 걸 하려면, 뭔가 스케줄링 기능 및 프로시져.. 뭐 이런 것들이 필요할 것 같은데...
그나마, 좀 안다 싶었던 MS SQL 2000 과는 너무나 많이 바뀐 인터페이스와 용어들에 엄두가 나질 않군요!
고수분들! 꼭 좀 도와주세요! ㅠㅠ
Comment 3
-
항해자™
2014.04.04 15:08
-
catchv
2014.04.04 16:12
CDC ( Change Data Capture ) 로 한번 검색해 보시면 도움이 될 것 같습니다.
트리거 등을 통해서 테이블의 변경을 감시해서 동기화 할 수 있는 방법을 찾아 보실 수 있습니다.
-
디비디비
2014.04.07 13:40
항해자님!
스케줄러는 에이전트를 말씀하시는 것인지요? 쿼리를 구성할 때, 원본에서 타겟으로 최초 복사한 데이터의 마지막 번호를 쿼리 내에서 리턴 받아야(알아야), 다음 (5분/10분뒤) select into 할 때, 중복이 안 될 것 같은데... 이렇게 구성하는 쿼리는 어떻게 작성해야 하는지 가르쳐 주십시오! 솔직히, 첨부터 어찌 짜야 할지 난감합니다. 예를 들면, 타겟 DB에 오늘자로 생성된 XXX 테이블이 있는지 확인해서, 없으면 해당 쿼리 (스케줄)을 돌리면 안될 것이고, 있으면 돌리되.... 최초 복사가 아닌 2번째 복사 부터는 앞선 복사의 마지막 일련번호의 값을 알아야 하는등.... 초보라서, 한 줄짜리 select/insert/delete/update 밖에 쿼리를 짜 본 적이 없습니다. ㅠ.ㅠ
위 작업을 진행하는 방법은 3가지 정도 있을 수 있을것 같습니다.
1.콘솔 프로그램을 이용해서 지속적으로 데이터를 퍼 나르는 방법
2.SQLServer의 Linked server를 이용하는 방법
3.SSIS를 이용하는 방법
어떤 방법을 이용하든 원본(A)테이블의 데이터를 어디까지 읽어서 대상(B)테이블에 기록했는지 알아야 합니다.
그러기 위해 가장 좋은 방법은 identity 컬럼이 있으면 좋은데요,,
이 컬럼은 원본에만 identity로 존재하고, 대상에는 일반 컬럼으로 만들어져야 합니다.
그렇지 않으면 대상 테이블에 데이터를 입력할 때 조금 귀찮을 수 있습니다.
지금 하시려는 방법이 2번인 것 같은데요.
스케줄러를 이용해서 B테이블에 마지막으로 입력된 identity 값을 확인해서 A테이블에서 그 이후의 데이터만 끌어오면 되겠네요.
이를 실행하는 주체는 대상 서버에서 하시는게 좋습니다.