가끔씩 라이브에서 데이터를 추출해서 전달해 달라는 요청이 들어옵니다. 일반적인 경우 추출한 데이터는 따로 검증작업 없이 요청자에게 전달하여 CS 에서 확인하는 용도로 사용됩니다. 즉, 추출한 데이터를 라이브에서 다시 사용하지 않는다는 의미입니다. 하지만 추출한 데이터를 다시 라이브용도로 활용하려고 하는 경우에는 어떻게 해야할까요? DMA 툴이나 패키지를 사용하여 데이터를 마이그레이션 할 수도 있지만 환경이 안되어서 SRC 서버에서 INSERT 쿼리형식으로 추출하여 DST 서버에서 적재하는 방법도 검토해야 합니다. 이런경우 추출한 데이터가 정확한지 검증작업을 진행해야 합니다. ( 테이블에 PK 가 있는 경우에만 가능한 점 참고 부탁드립니다. ) 데이터 검증 방법 1. 데이터가 변경되지 않도록 설정합니다. ..
Database/DBA 의 개인생각
SQL Server 버전이 EOS 되면서 버전 업그레이드가 필요한 상황이 되었고,버전 업그레이드 겸 DB Migration (이전작업)을 진행하면서 체크했던 리스트를 정리해 보았습니다. SQL Server 기준으로 작성되어 있고아래에서 작성한 AS-IS 와 TO-BE 는 DB 서버를 의미합니다. 아! 참고로 이전작업을 진행하면서 발생하는 이슈는 연관부서에 바로바로 공유될 수 있도록 해줍시다. 이전 작업 계획 시 예상 일정 수립1. 연관 부서 확인2. 이전할 DB 목록 확인에 필요한 일정 - 하나의 SQL Server 내에 다수의 Database 가 있을 수 있고, 사용하지 않는 DB 는 이전 대상에서 제외할 수 있음3. 호환성 체크 및 수정작업에 필요한 일정4. DB 이관 작업 시 사용할 스크립트 작성에..
로그인 계정이란 외부에서 DBMS 로 접속하기 위한 하나의 인증(?) 과정을 의미합니다. 로그인 계정마다 권한을 다르게 줄 수 있기 때문에,관리자는 여러 계정을 생성하고 알맞은 권한을 부여하여 공격으로부터 방어할 수 있습니다. 문제는 이렇게 생성된 계정도 오랜시간이 지나고 정책이 바뀌면서 사용되지 않을 수 있게 된다는 것입니다. 최고의 방법은 사용하지 않는채로 두는 방법이지만,이런 계정도 너무 오래 방치하면 위험이 따르기 때문에 정리가 필요한 상황이 오게됩니다. 로그인 계정을 삭제할 때 고려할 점 1. 해당 로그인 계정을 사용하는 클라이언트는 없는지?백트레이스로 로그인 계정을 수집하거나, 혹은 현재 접속하는 세션이 없는지 확인해 봅니다. 1SELECT * FROM sys.dm_exec_sessions;c..
배치작업이란SQL Server 엔진에서 정해진 시간에, 정해진 작업을 수행하도록 하는 작업을 말합니다.즉, 배치작업이 실패했다고 해서 이 후 계획된 시간에 수행이 안되는 것이 아니라 다시 수행되고 실패하는 식으로계속해서 정해진 시간에 수행되는 작업을 의미합니다. 예를들면, 아래와 같은 배치작업 주로 이루어져 있겠죠?1. 매일 정해진 시간 백업을 진행한다.2. 매일 정해진 시간에 데이터 동기화 작업을 진행한다.3. 매일 정해진 시간에 특정 일자보다 오래된 데이터는 삭제한다. 그런데, 이러한 작업들은 아무래도 일반적인 쿼리인 1건 조회, 1건 적재와 같은 비용보다는 크게 됩니다. 배치작업을 만들 때 고려할 점 3가지중간 단계에서 실패하더라도, 이 후에 재처리가 가능하도록작업 실패로 인해 제대로 정리되지 못한..
Order By 없는 쿼리란데이터의 출력이 항상 일관되지 않다는 것을 의미합니다.즉, [ 1, 2, 3 ] 순으로 출력되던 결과가 [ 3, 1, 2 ] 로 출력 될 수도 있습니다. Order By 유무에 따른 쿼리아래와 같은 쿼리가 있습니다.이 쿼리는 데이터의 출력이 항상 일관되다는 것을 보장할 수 있을까요?병렬로 출력하게 된다면 출력버퍼에는 매번 다른값이 출력되고 TOP 20 으로 나온 값은 매번 다르게 될 것입니다.즉, 의도하지 않은 값이 임시테이블에 들어갈 수 있게 됩니다. 12345INSERT @TEMP_TABLESELECT TOP(20) C1FROM dbo.T1 WITH(NOLOCK)WHERE C1 > @C1AND C2 = @C2cs 그럼 이 쿼리를 어떻게 변경해야 할까요?ORDER BY 를 넣..
데이터 삭제 시 TabLock 의 이슈가 발생T1 테이블의 인덱스는 아래와 같이 구성되어 있습니다. 인덱스 종류 컬럼 Clustered Index + PK C1, C2, C3, C4 이 때, 라이브 중에 아래와 같은 쿼리를 사용하여 데이터를 삭제하려고 합니다.1DELETE FROM dbo.T1 WHERE C2 = 73985cs 문제는 T1 에 C2 의 인덱스가 없어서,TabLock 이 발생하게 되고 이 시간동안에는 다른 테이블이 접근할 수 없다는 점입니다. 이런 경우 TabLock 없이 어떻게 삭제 작업을 진행할 수 있을까요?시퀀스 (identity column)를 잘 활용해 봅시다.(T1 테이블에 너무 많은 데이터가 있다면 이 작업은 적절치 않을 수 있습니다.) TabLock 없이 삭제 방법1. 작업용..
PK 란 ? PK 로 구성된 컬럼은 해당 값은 고유하며 NULL 이 될 수 없다를 의미합니다.즉 PK 로 조회하거나 데이터 변경시에는 무조건 1건만 적용됩니다. 데이터 변경 시, 왜 PK 로 지워야 하나? 1. 원치않는 데이터가 지워지는 경우를 방지데이터 업데이트 혹은 삭제 작업을 할 때,일반적인 인덱스 혹은 테이블 스캔으로 조건을 지정하는 경우원치 않는 데이터가 지워질 수 있음을 방지할 수 있습니다.이 말인 즉 C1, C2 컬럼을 PK 로 가진 테이블의 C1 = 2, C2 = B 를 지우려고 의도하였으나,DELETE FROM T1 FROM C1 = 2 쿼리를 날리게 되어 C2 = A 도 지워질 수 있음을 방지할 수 있다는 것입니다. C1 C2 1 A 2 A 2 B 3 A 2. Lock 이슈PK 가 아닌..
foreign key (외래키)1. 관계를 맺고있는 릴레이션 R1, R2 가 있을 때 R1이 참조하고 있는 릴레이션 R2의 기본키와 같은 R1 릴레이션의 속성을 말합니다.2. 외래키는 참조되는 릴레이션의 기본키와 참조관계를 맺는데 중요한 Key 입니다. 말이 어려울 수 있으니 간단하게 테이블로 참조해보도록 하겠습니다. Blogs 테이블에는 BlogID 의 기본키가 있습니다. Posts 테이블에는 BlogID 를 외래키로 참조하여 구성하였습니다. 즉, 하나의 Blogs 에는 여러개의 Posts 를 구성할 수 있다는 관계를 나타내고 있습니다. 이처럼 DB 에서 설계, 관계도는 매우 중요합니다.그럼에도 많은 사이트에서 foreign key 를 사용하지 않는 경우가 많습니다. foreign key 를 왜 사용하..
SP 검수 시 체크해야 할 리스트 * SQL Server 기준으로 작성하였습니다. 1. Ad-hoc, 동적 쿼리 제거1. Ad-hoc, 동적 쿼리는 실행 시 쿼리가 어떻게 구성되는지 알 수 없습니다. 구성을 알 수 없으면 인덱스가 적절하게 구성되었는지, 실행계획이 잘못풀려 악성쿼리인지 아닌지를 판단할 수 없습니다. 2. where 절 체크 사항1. 동일한 데이터 타입끼리 비교되는지 확인합니다. 서로다른 데이터 타입끼리 비교 시 CONVERT 함수가 사용되기 때문에 인덱스 사용을 할 수 없습니다.2. OR 문은 UNION ALL 로 변경 OR 문은 상황에 따라 Scan 으로 풀릴 가능성도 있습니다. UNION ALL 로 쿼리를 Seek + Seek 하는 방식으로 변경이 가능한지 확인합니다.3. CASE 문..
데이터 대량 변경 작업 시 체크해야 할 리스트 1. 서비스 영향도 확인1. 시간이 얼마나 소요될지에 대해 파악되면 이에대한 영향도를 개발팀에 확인 요청합니다. 2. 데이터 프리징이 가능한지 확인1. TAB LOCK 으로 대량 변경 작업 진행 시 더 빠르게 처리할 수 있습니다. 이는 ROW Lock 과 TAB Lock 에서 트랜잭션 로그가 쌓이는 방식에 대해 이해하고 있어야 합니다.2. 이 때는 점검을 걸어야 하고, 서비스가 불가능 합니다. 3. 대량 DELETE 작업 시 INSERT 작업이 더 효율적인지 비교1. ROW 별로 DELETE 작업을 진행하는 것보다 DELETE 대상이 아닌 데이터를 새로운 테이블에 INSERT 하는 작업이 효율적일 수 있습니다. 프리징이 되었다는 가정에서 새로운 테이블로 IN..