Database/MS-SQL

★ MSSQL 이관 작업 STEP

99iberty 2018. 7. 8. 18:17


1. 신규 MSSQL 설치 전 기존 DB의 데이터 정렬 (캐릭터 셋) 값 확인

보통은 다 Korean_Wansung_CI_AS


2. DB 복원 방법 선택

트랜잭션이 없는 DB라고 하면 걍 온라인 FULL백업 - 복원.

트랜잭션이 있는 경우 온라인 FULL백업 복원 후 데이터 유입을 막은 후에 로그백업 진행 후 복원.

※ 현재 트랜잭션 있는지 여부 확인


※ 트랜잭션 로그 trn_id / LSN확인


USE ReadingDBLog;

GO

select [Current LSN],

[Operation],

[Transaction Name],

[Transaction ID],

[Transaction SID],

[SPID],

[Begin Time]

FROM fn_dblog(null,null)






2-1. DB버전이 달라질 경우..

복원한 후 DB 속성에서 호환성을 이관된 DB로 맞춰주기



2-2. tempdb 개수

보통 코어수만큼 생성. tempdb.ldf는 100mb growth.

tempdb는 기본 8mb 크기로

코어가 8개 넘어가면 걍 8개까지만 생성...


2-3. error reporting

2016?부터 자동으로 활성화되는듯 하다. 내가 선택 안 해도...

SQL SERVER 시작 속성 > 고급탭에서 아니오로 바꾸자. (재시작 필요)


3. 본 DB에서 login 정보 추출하여 create sql 생성

http://blog.daum.net/99lib/618

※ 주의 : 암호까지는 복사가 되나 서버역할은 복사가 안 되는 듯.

       create login 후 서버역할 / db멤버역할 은 일일이 확인 필요.


4. DB 유저 - 로그인명 매핑

create login 으로 새로 생성한 GUID와 DB내 GUID 가 맞지 않기 때문에 GUID 매핑 필요.

이 문제는 해당 DB를 사용하는 사용자의 GUID가 syslogins.sid 테이블에 있는 것과 다르기때문이다.

이것을 해결하기 위해서는 새 서버의 로그인 계정과 복원한 DB의 사용자 를 연결해야 한다.


USE [DB명]

GO

sp_change_users_login 'Update_one', 'USER이름', 'LOGIN이름'



5. 시스템 DB에 남아있는 프로시저 이관


사용자 DB의 프로시저는 DB복원할 때 같이 생성된다.

시스템DB에 생성해 둔건 저장 프로시저 > 스크립팅 > CREATE로 생성 스크립트 생성


6. JOB 이관

작업은 하나하나 우클릭해서 작업 스크립팅 - CREATE 로 생성


7. 링크드 서버 유무 확인




8. optimize foradhoc workloads 구성

- Ad-Hoc쿼리가 많은 OLTP 환경에서, Plan Cache에 저장되는 크기를 줄여, Buffer Pool 의 여유 공간을 확보할 수 있는 옵션입니다.
- optimize for ad hoc workloads 옵션은 여러 개의 일회용 임시 일괄 처리를 포함하는 작업에서 계획 캐시의 효율성을 높이는 데 사용됩니다. 이 옵션을 1로 설정하면 데이터베이스 엔진이 일괄 처리가 처음으로 컴파일 되었을 때 전체 컴파일 된 계획 대신 계획 캐시에 포함된 작은 컴파일 된 계획 스텁을 저장합니다. 이렇게 하면 계획 캐시에 다시 사용할 수 없는 컴파일 된 계획이 채워지지 않게 되므로 메모리 가중을 줄일 수 있습니다
- optimize for ad hoc workloads를 1로 설정하면 새 계획만 영향을 받으며, 이미 계획 캐시에 있던 계획은 영향을 받지 않습니다.

sp_configure 'optimize for ad hoc workloads', 4

go

reconfigure with override

go


9. 테이블 개수 비교

http://blog.daum.net/99lib/580

https://docs.microsoft.com/ko-kr/sql/tools/tablediff-utility?view=sql-server-2017

tablediff로 테이블간 정합성 확인.

primary key나  unique key가 없어서 tablediff가 안 된다면...

걍 테이블별 row개수 확인하기

http://akbory.tistory.com/2

http://unions5.tistory.com/92

SELECT o.name

     , i.rows

FROM   sysindexes i

           INNER JOIN sysobjects o on i.id = o.id

WHERE  i.indid < 2

   AND o.xtype = 'U'

ORDER BY

       i.id