가끔씩 라이브에서 데이터를 추출해서 전달해 달라는 요청이 들어옵니다.
일반적인 경우 추출한 데이터는 따로 검증작업 없이 요청자에게 전달하여 CS 에서 확인하는 용도로 사용됩니다.
즉, 추출한 데이터를 라이브에서 다시 사용하지 않는다는 의미입니다.
하지만 추출한 데이터를 다시 라이브용도로 활용하려고 하는 경우에는 어떻게 해야할까요?
DMA 툴이나 패키지를 사용하여 데이터를 마이그레이션 할 수도 있지만
환경이 안되어서 SRC 서버에서 INSERT 쿼리형식으로 추출하여 DST 서버에서 적재하는 방법도 검토해야 합니다.
이런경우 추출한 데이터가 정확한지 검증작업을 진행해야 합니다.
( 테이블에 PK 가 있는 경우에만 가능한 점 참고 부탁드립니다. )
데이터 검증 방법
1. 데이터가 변경되지 않도록 설정합니다. (서비스 점검을 걸거나, DB 계정 암호를 변경하거나 등이 있겠습니다.)
2. SRC 에서 데이터를 INSERT 쿼리로 추출합니다.
3. DB서버에 원본테이블스키마와 동일한 타겟테이블을 하나 더 생성합니다.
4. 추출한 INSERT 쿼리를 생성한 테이블로 적재합니다.
5. 원본테이블과 타겟테이블의 데이터를 비교합니다.
주의할 점
1. 데이터비교는 가능하면 테스트 서버에서 진행하세요.
라이브 DB서버에 부하가 가면 DB 를 사용하는 다른 서비스에 영향을 미칠 수 있습니다.
2. 추출대상 데이터가 많을수록 디스크 사용량과 소요시간이 증가 됩니다.
테이블 크기와 작업시간을 사전에 산정하도록 합니다.
데이터 검증 쿼리 방법
T1 테이블과 T2 테이블의 데이터를 비교하는 방법입니다.
PK 가 동일한 경우라면 이외의 컬럼값이 다른 부분이 없는지
한쪽 테이블에 PK 가 없는 데이터가 있는지를 확인합니다.
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
|
CREATE TABLE T1 (C1 INT PRIMARY KEY, C2 VARCHAR(100), C3 DATETIME)
CREATE TABLE T2 (C1 INT PRIMARY KEY, C2 VARCHAR(100), C3 DATETIME)
-- PK 값은 동일하나 이 외 컬럼값이 동일하지 않는지 확인
SELECT A.*, B.*
FROM dbo.T1 A WITH(NOLOCK)
INNER JOIN dbo.T2 B WITH(NOLOCK)
ON A.C1 = B.C1
WHERE A.C2 != B.C2
OR A.C3 != B.C3
OPTION (MAXDOP 1)
-- A 테이블에만 존재하는 항목
SELECT A.*
FROM dbo.T1 A WITH(NOLOCK)
LEFT OUTER JOIN dbo.T2 B WITH(NOLOCK)
ON A.C1 = B.C1
WHERE B.C2 IS NULL
OPTION (MAXDOP 1)
-- B 테이블에만 존재하는 항목
SELECT B.*
FROM dbo.T1 A WITH(NOLOCK)
LEFT OUTER JOIN dbo.T2 B WITH(NOLOCK)
ON A.C1 = B.C1
WHERE A.C2 IS NULL
OPTION (MAXDOP 1)
|
cs |
만약 결과가 나온다면 데이터가 서로 다르다는 의미입니다.
'Database > DBA 의 개인생각' 카테고리의 다른 글
[DBA] SQL Server 이전작업을 진행할 때 전/후 체크리스트 (0) | 2020.07.10 |
---|---|
[DBA] 로그인 계정을 삭제할 때 체크해야 할 리스트 (0) | 2020.07.06 |
[DBA] 배치작업 만들 때 고려사항, 여러개를 같은시간에 수행할 때 위험성 (0) | 2020.04.03 |
[DBA] Order By 없는 쿼리의 위험성 (0) | 2020.02.03 |
[DBA] 삭제 조건에 적절한 인덱스가 없는 경우 단위처리 및 RowLock 으로 삭제하는 방법 (0) | 2019.12.26 |