1. Zweck
Haben wir Pläne, diese Anforderungen zu erfüllen, wenn unser Chef uns bei der Wartung der SQL Server-Datenbank auffordert, Dutzende Gigabyte an Datendateien auf andere Server zu verschieben und nur minimale Ausfallzeiten erfordert?
Hier gehen wir davon aus, dass sich die beiden Maschinen nicht im selben Computerraum befinden, sodass unsere Lösung sinnvoller erscheint. Wenn Sie so viel Glück haben und die beiden Maschinen im selben LAN sind, dann herzlichen Glückwunsch, Sie können viel mehr haben Mach es.
2. Analyse- und Designideen
Tatsächlich weist die von uns angenommene Umgebung zwei Merkmale auf: Erstens ist die Datenbankdatei relativ groß, zweitens ist unsere Dateiübertragungsgeschwindigkeit möglicherweise relativ langsam. Vielleicht können wir an der Übertragungsgeschwindigkeit nichts ändern, aber wir können vom Problem der Dateigröße ausgehen und es mit den Eigenschaften von SQL Server kombinieren, sodass wir die folgende Lösung haben.
Um die Ausfallzeit zu minimieren, verwenden wir eine vollständige Sicherung und eine differenzielle Sicherung, um die Datenbank zu migrieren. Erstellen Sie tagsüber eine vollständige Sicherung (XXX_full.bak) der zu migrierenden Datenbank und kopieren Sie die Sicherungsdatei (Sie können sie verwenden). FTP-Software hier) Führen Sie zur Wiederherstellung eine Haltepunkt-Wiederaufnahme auf dem Zielserver durch, warten Sie bis nach Geschäftsschluss und führen Sie eine differenzielle Sicherung (XXX_diff.bak) durch, kopieren Sie dann diese differenzielle Sicherung auf den Zielserver und führen Sie eine differenzielle Wiederherstellung basierend auf der vollständigen Wiederherstellung durch .
Die Ausfallzeit hier = differenzielle Sicherungszeit + differenzielle Sicherungsdatei-Übertragungszeit + differenzielle Sicherungsdatei-Wiederherstellungszeit. Haben Sie das Gefühl, dass diese Zeit sehr kurz ist?
3. Referenzskript
Achten Sie darauf, den Namen der Datenbank im folgenden Skript sowie den absoluten Pfad zu ändern.
--1: Vollständige Sicherung
deklariere @dbname varchar(100)
@sql nvarchar(max) deklarieren
set @dbname = 'DataBaseName'
setze @sql = '
BACKUP-DATENBANK ['+@dbname+']
TO DISK = ''D:DBBackup'+@dbname+'_full.bak''
WITH NOFORMAT, NOINIT, NAME = '''+@dbname+' -Vollständige Datenbanksicherung'',
SKip, NOREWIND, NOUNLOAD, STATS = 10
GEHEN'
Drucken Sie @sql
--Generiertes SQL
--DataBaseName_full
BACKUP-DATENBANK [DataBaseName]
TO DISK = 'D:DBBackupDataBaseName_full.bak'
WITH NOFORMAT, NOINIT, NAME = 'DataBaseName-vollständige Datenbanksicherung',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GEHEN
--2: Vollständige Sicherung und Wiederherstellung
deklariere @dbname varchar(100)
@sql nvarchar(max) deklarieren
set @dbname = 'DataBaseName'
setze @sql = '
--RESTORE '+@dbname+'_full
DATENBANK WIEDERHERSTELLEN ['+@dbname+']
FROM DISK = ''D:DBBackup'+@dbname+'_full.bak'' WITH FILE = 1,
MOVE N''DataBase_Name'' TO N''D:DataBase'+@dbname+'.mdf'',
VERSCHIEBE N''DataBase_Name_log'' NACH N''D:DataBase'+@dbname+'_log.ldf'',
NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
GEHEN'
@sql drucken
--Generiertes SQL
--RESTORE DataBaseName_full
DATENBANK WIEDERHERSTELLEN [DataBaseName]
FROM DISK = 'D:DBBackupDataBaseName_full.bak' WITH FILE = 1,
MOVE N'DataBase_Name' TO N'D:DataBaseDataBaseName.mdf',
MOVE N'DataBase_Name_log' NACH N'D:DataBaseDataBaseName_log.ldf',
NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
GEHEN
--3: Differenzielle Sicherung
deklariere @dbname varchar(100)
@sql nvarchar(max) deklarieren
set @dbname = 'DataBaseName'
set @sql = '
BACKUP-DATENBANK ['+@dbname+']
TO DISK = N''D:DBBackup'+@dbname+'_diff.bak''
WITH DIFFERENTIAL, NOFORMAT, NOINIT, NAME = N'''+@dbname+' -Differenzielle Datenbanksicherung'',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GEHEN
'
@sql drucken
--Generiertes SQL
--DataBaseName_diff
BACKUP-DATENBANK [DataBaseName]
TO DISK = N'D:DBBackupDataBaseName_diff.bak'
WITH DIFFERENTIAL, NOFORMAT, NOINIT, NAME = N'DataBaseName-differentielle Datenbanksicherung',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GEHEN
--4: Differenzielle Sicherung und Wiederherstellung
deklariere @dbname varchar(100)
@sql nvarchar(max) deklarieren
set @dbname = 'DataBaseName'
setze @sql = '
--RESTORE '+@dbname+'_full
DATENBANK WIEDERHERSTELLEN ['+@dbname+']
FROM DISK = ''D:DBBackup'+@dbname+'_diff.bak'' WITH FILE = 1,
NOUNLOAD, STATS = 10
GEHEN'
@sql drucken
--Generiertes SQL
--RESTORE DataBaseName_full
DATENBANK WIEDERHERSTELLEN [DataBaseName]
FROM DISK = 'D:DBBackupDataBaseName_diff.bak' WITH FILE = 1,
NOUNLOAD, STATS = 10
GEHEN
4. Nachwort
Vielleicht sollte es hier sein, aber es geht oft nach hinten los. Manchmal beträgt die Größe unserer Datenbankdatei nicht mehrere zehn Gigabyte. Was sollen wir also tun? Gibt es noch andere Lösungen?
Ich habe schon einmal eine 700G-Datendatei verschoben, aber mir wurde genügend Zeit gegeben, sie über den Datenbankjob auf den neuen Server zu verschieben. Der Vorteil besteht darin, die vorherige Datenbank zu optimieren, z. B. Datenbankparameter festzulegen als Tabellenpartitionen und migrieren Sie Daten mit möglichst geringen Auswirkungen auf die vorherige Datenbank. Ich werde den detaillierten Prozess beim nächsten Mal schreiben.
(Autor: Listen to the Wind and Rain Quelle: http://gaizai.cnblogs.com/ )