1. 目的
SQL Server データベースのメンテナンスを行うときに、上司から数十ギガバイトのデータ ファイルを他のサーバーに移動し、ダウンタイムを最小限に抑えるように要求された場合、これらの要件を満たす計画はありますか?
ここでは、2 台のマシンが同じコンピュータ ルームにないことを前提としています。そのため、幸運にも 2 台のマシンが同じ LAN 内にあれば、プログラムはさらに多くのことを実行できるようになります。やってください。
2. 分析と設計のアイデア
実際、私たちが想定している環境には 2 つの特徴があります。1 つ目は、データベース ファイルが比較的大きいことです。2 つ目は、ファイル転送速度が比較的遅い可能性があることです。通信速度に関しては仕方ないのかもしれませんが、ファイルサイズの問題からスタートし、SQL Serverの特性と組み合わせることで、次のような解決策が考えられます。
ダウンタイムを最小限に抑えるために、完全バックアップと差分バックアップを使用してデータベースを移行します。日中に、移行する必要があるデータベースの完全バックアップ (XXX_full.bak) を作成し、バックアップ ファイルをコピーします (使用できます)。 FTP ソフトウェアはこちら) リストアのためにターゲット サーバーに対してブレークポイント再開) を実行し、営業時間終了まで待って差分バックアップ (XXX_diff.bak) を実行します。その後、この差分バックアップをターゲット サーバーにコピーし、完全なリストアに基づいて差分リストアを実行します。 。
ここでのダウンタイム = 差分バックアップ時間 + 差分バックアップ ファイルの転送時間 + 差分バックアップ ファイルのリストア時間 このダウンタイムは非常に短いと感じますか?
3. 参考スクリプト
以下のスクリプト内のデータベース名と絶対パスの変更に注意してください。
--1: 完全バックアップ
@dbname varchar(100) を宣言します
@sql nvarchar(max) を宣言します
set @dbname = 'データベース名'
@sql を設定 = '
バックアップ データベース ['+@dbname+']
TO DISK = ''D:DBBackup'+@dbname+'_full.bak''
WITH NOFORMAT、NOINIT、NAME = ''+@dbname+' -データベースの完全バックアップ'',
スキップ、NOREWIND、NOUNLOAD、統計 = 10
行く'
PRint @sql
-- 生成された SQL
--DataBaseName_full
バックアップデータベース [データベース名]
TO DISK = 'D:DBBackupDataBaseName_full.bak'
WITH NOFORMAT、NOINIT、NAME = 'DataBaseName-完全データベース バックアップ',
スキップ、ノーワインド、ノーロード、統計 = 10
行く
--2: 完全なバックアップと復元
@dbname varchar(100) を宣言します
@sql nvarchar(max) を宣言します
set @dbname = 'データベース名'
@sql を設定 = '
--RESTORE '+@dbname+'_full
データベースを復元 ['+@dbname+']
FROM DISK = ''D:DBBackup'+@dbname+'_full.bak'' WITH FILE = 1、
MOVE N''DataBase_Name'' TO N''D:DataBase'+@dbname+'.mdf'',
MOVE N''DataBase_Name_log'' TO N''D:DataBase'+@dbname+'_log.ldf'',
NORECOVERY、NOUNLOAD、REPLACE、統計 = 10
行く'
@sql を印刷します
-- 生成された SQL
--RESTORE データベース名_full
データベースを復元 [データベース名]
FROM DISK = 'D:DBBackupDataBaseName_full.bak' WITH FILE = 1、
MOVE N'DataBase_Name' TO N'D:DataBaseDataBaseName.mdf',
MOVE N'DataBase_Name_log' TO N'D:DataBaseDataBaseName_log.ldf',
NORECOVERY、NOUNLOAD、REPLACE、統計 = 10
行く
--3: 差分バックアップ
@dbname varchar(100) を宣言します
@sql nvarchar(max) を宣言します
set @dbname = 'データベース名'
@sql を設定 = '
バックアップ データベース ['+@dbname+']
TO DISK = N''D:DBBackup'+@dbname+'_diff.bak''
WITH DIFFERENTIAL、NOFORMAT、NOINIT、NAME = N'''+@dbname+' -差分データベース バックアップ'',
スキップ、ノーワインド、ノーロード、統計 = 10
行く
'
@sql を印刷します
-- 生成された SQL
--DataBaseName_diff
バックアップデータベース [データベース名]
TO DISK = N'D:DBBackupDataBaseName_diff.bak'
WITH DIFFERENTIAL、NOFORMAT、NOINIT、NAME = N'DataBaseName - 差分データベース バックアップ',
スキップ、ノーワインド、ノーアンロード、統計 = 10
行く
--4: 差分バックアップと復元
@dbname varchar(100) を宣言します
@sql nvarchar(max) を宣言します
set @dbname = 'データベース名'
@sql を設定 = '
--RESTORE '+@dbname+'_full
データベースを復元 ['+@dbname+']
FROM DISK = ''D:DBBackup'+@dbname+'_diff.bak'' WITH FILE = 1、
ノーロード、統計 = 10
行く'
@sql を印刷します
-- 生成された SQL
--RESTORE データベース名_full
データベースを復元 [データベース名]
FROM DISK = 'D:DBBackupDataBaseName_diff.bak' WITH FILE = 1、
ノーロード、統計 = 10
行く
4. 追記
おそらくここにあるはずですが、データベース ファイルのサイズが数十ギガバイトに満たない場合が多いので、どうすればよいでしょうか。他に解決策はありますか?
以前に 700G のデータ ファイルを移動しましたが、データベース ジョブを通じてデータを新しいサーバーに移動するのに十分な時間がありました。この利点は、データベース パラメータの設定など、以前のデータベースを最適化できることです。テーブル パーティションとしてデータを移行し、以前のデータベースへの影響を最小限に抑えます。詳しい手順は次回書きます。
(著者:風と雨を聴け 出典: http://gaizai.cnblogs.com/ )