1. 목적
SQL Server 데이터베이스 유지 관리를 수행할 때 상사가 수십 기가바이트의 데이터 파일을 다른 서버로 이동하고 가동 중지 시간을 최소화해야 한다고 요청하는 경우 이러한 요구 사항을 충족할 계획이 있습니까?
여기서는 두 컴퓨터가 동일한 컴퓨터실에 있지 않다고 가정하므로 솔루션이 더 의미 있게 보입니다. 운이 좋고 두 컴퓨터가 동일한 LAN에 있으면 축하합니다. 프로그램에서 더 많은 것을 얻을 수 있습니다. 그것을 해라.
2. 분석 및 디자인 아이디어
실제로 우리가 가정하는 환경에는 두 가지 특징이 있습니다. 첫 번째는 데이터베이스 파일이 상대적으로 크다는 것이고, 두 번째는 파일 전송 속도가 상대적으로 느릴 수 있다는 것입니다. 어쩌면 전송 속도에 대해서는 우리가 할 수 있는 일이 없을 수도 있지만, 파일 크기 문제에서 출발하여 이를 SQL Server의 특성과 결합하면 다음과 같은 해결책을 얻을 수 있습니다.
다운타임을 최소화하기 위해 전체 백업과 차등 백업을 사용하여 데이터베이스를 마이그레이션하고 있으며, 낮에는 마이그레이션이 필요한 데이터베이스를 전체 백업(XXX_full.bak)하고 백업 파일을 복사합니다(사용 가능). FTP 소프트웨어는 여기서) 복원을 위해 대상 서버에 중단점 재개)를 수행하고 근무 시간이 끝날 때까지 기다린 후 차등 백업(XXX_diff.bak)을 수행한 다음 이 차등 백업을 대상 서버에 복사하고 전체 복원을 기반으로 차등 복원을 수행합니다. .
여기서 다운타임 = 차등 백업 시간 + 차등 백업 파일 전송 시간 + 차등 백업 파일 복원 시간 이렇게 다운타임이 발생하면 이 시간이 매우 짧다고 느껴지시나요?
3. 참조 스크립트
아래 스크립트에서 데이터베이스 이름과 절대 경로를 수정하는 데 주의하세요.
--1: 전체 백업
@dbname varchar(100) 선언
@sql nvarchar(최대) 선언
@dbname = 'DataBaseName' 설정
@sql = '설정
백업 데이터베이스 ['+@dbname+']
TO 디스크 = ''D:DBBackup'+@dbname+'_full.bak''
WITH NOFORMAT, NOINIT, NAME = '''+@dbname+' -전체 데이터베이스 백업'',
건너뛰기, NOREWIND, NOUNLOAD, STATS = 10
가다'
PRint @sql
--생성된 SQL
--DataBaseName_full
백업 데이터베이스 [데이터베이스 이름]
TO 디스크 = 'D:DBBackupDataBaseName_full.bak'
WITH NOFORMAT, NOINIT, NAME = 'DataBaseName-전체 데이터베이스 백업',
건너뛰기, 북풍, NOUNLOAD, STATS = 10
가다
--2: 전체 백업 및 복원
@dbname varchar(100) 선언
@sql nvarchar(최대) 선언
@dbname = 'DataBaseName' 설정
@sql = '설정
--RESTORE '+@dbname+'_full
데이터베이스 복원 ['+@dbname+']
FROM DISK = ''D:DBBackup'+@dbname+'_full.bak'' WITH FILE = 1,
N''DataBase_Name''을 N''D:DataBase'+@dbname+'.mdf''로 이동합니다.
N''DataBase_Name_log''를 N''D:DataBase'+@dbname+'_log.ldf''로 이동,
복구 없음, 로드 없음, 교체, 통계 = 10
가다'
@sql 인쇄
--생성된 SQL
--RESTORE DataBaseName_full
데이터베이스 [데이터베이스 이름] 복원
FROM DISK = 'D:DBBackupDataBaseName_full.bak' WITH FILE = 1,
N'DataBase_Name'을 N'D:DataBaseDataBaseName.mdf'로 이동합니다.
N'DataBase_Name_log'를 N'D:DataBaseDataBaseName_log.ldf'로 이동,
복구 없음, 로드 없음, 교체, 통계 = 10
가다
--3: 차등 백업
@dbname varchar(100) 선언
@sql nvarchar(최대) 선언
@dbname = 'DataBaseName' 설정
@sql = '설정
백업 데이터베이스 ['+@dbname+']
TO 디스크 = N''D:DBBackup'+@dbname+'_diff.bak''
WITH DIFFERENTIAL, NOFORMAT, NOINIT, NAME = N'''+@dbname+' -차등 데이터베이스 백업'',
건너뛰기, 북풍, NOUNLOAD, STATS = 10
가다
'
@sql 인쇄
--생성된 SQL
--DataBaseName_diff
백업 데이터베이스 [데이터베이스 이름]
TO 디스크 = N'D:DBBackupDataBaseName_diff.bak'
WITH DIFFERENTIAL, NOFORMAT, NOINIT, NAME = N'DataBaseName-차등 데이터베이스 백업',
건너뛰기, 북풍, NOUNLOAD, STATS = 10
가다
--4: 차등 백업 및 복원
@dbname varchar(100) 선언
@sql nvarchar(최대) 선언
@dbname = 'DataBaseName' 설정
@sql = '설정
--RESTORE '+@dbname+'_full
데이터베이스 복원 ['+@dbname+']
FROM DISK = ''D:DBBackup'+@dbname+'_diff.bak'' WITH FILE = 1,
NOUNLOAD, 통계 = 10
가다'
@sql 인쇄
--생성된 SQL
--RESTORE DataBaseName_full
데이터베이스 [데이터베이스 이름] 복원
FROM DISK = 'D:DBBackupDataBaseName_diff.bak' WITH FILE = 1,
NOUNLOAD, 통계 = 10
가다
4. 추신
여기에 있어야 할 수도 있지만 종종 역효과를 낳습니다. 데이터베이스 파일의 크기가 수십 기가바이트가 아닌 경우 어떻게 해야 합니까? 다른 해결책이 있나요?
이전에 700G 데이터 파일을 이동한 적이 있지만 이동할 시간이 충분했습니다. 데이터베이스 작업을 통해 데이터를 새 서버로 이동했습니다. 테이블 파티션으로 사용하고 이전 데이터베이스에 최대한 영향을 주지 않고 데이터를 마이그레이션합니다. 자세한 과정은 다음에 작성하겠습니다.
(저자: 바람과 비를 들어보세요 출처: http://gaizai.cnblogs.com/ )