1. Objectif
Lors de la maintenance de la base de données SQL Server, lorsque notre patron nous demande de déplacer des dizaines de gigaoctets de fichiers de données vers d'autres serveurs et nécessite un temps d'arrêt minimal, avons-nous l'intention de répondre à ces exigences ?
Ici, nous supposons que les deux machines ne sont pas dans la même salle informatique, de sorte que notre solution semble plus significative. Si vous êtes si chanceux et que les deux machines sont dans le même réseau local, alors félicitations, vous pouvez avoir beaucoup plus de programmes. fais-le.
2. Idées d'analyse et de conception
En fait, l'environnement que nous supposons présente deux caractéristiques : la première est que le fichier de base de données est relativement volumineux ; la seconde est que notre vitesse de transfert de fichiers peut être relativement lente. Peut-être que nous ne pouvons rien faire contre la vitesse de transmission, mais nous pouvons partir du problème de la taille du fichier et le combiner avec les caractéristiques de SQL Server, pour obtenir la solution suivante.
Afin de minimiser les temps d'arrêt, nous utilisons une sauvegarde complète et une sauvegarde différentielle pour migrer la base de données. Pendant la journée, effectuez une sauvegarde complète (XXX_full.bak) de la base de données qui doit être migrée et copiez le fichier de sauvegarde (vous pouvez utiliser). Logiciel FTP ici) Effectuez la reprise du point d'arrêt) sur le serveur cible pour la restauration, attendez la fin des heures de travail et effectuez une sauvegarde différentielle (XXX_diff.bak), puis copiez cette sauvegarde différentielle sur le serveur cible et effectuez une restauration différentielle basée sur la restauration complète. .
Le temps d'arrêt ici = temps de sauvegarde différentielle + temps de transfert du fichier de sauvegarde différentielle + temps de restauration du fichier de sauvegarde différentielle Vous donne-t-il l'impression que ce temps est très court ?
3. Script de référence
Faites attention à modifier le nom de la base de données dans le script ci-dessous, ainsi que le chemin absolu.
--1 : sauvegarde complète
déclarer @dbname varchar (100)
déclarer @sql nvarchar(max)
définir @dbname = 'DataBaseName'
définir @sql = '
BASE DE DONNÉES DE SAUVEGARDE ['+@dbname+']
VERS DISQUE = ''D:DBBackup'+@dbname+'_full.bak''
WITH NOFORMAT, NOINIT, NAME = '''+@dbname+' -Sauvegarde complète de la base de données'',
SAUTER, NOREWIND, NOUNLOAD, STATS = 10
ALLER'
Imprimer @sql
--SQL généré
--DataBaseName_full
BASE DE DONNÉES DE SAUVEGARDE [DataBaseName]
VERS DISQUE = 'D:DBBackupDataBaseName_full.bak'
WITH NOFORMAT, NOINIT, NAME = 'DataBaseName-sauvegarde complète de la base de données',
SAUTER, NOREWIND, NOUNLOAD, STATS = 10
ALLER
--2 : Sauvegarde et restauration complètes
déclarer @dbname varchar(100)
déclarer @sql nvarchar(max)
définir @dbname = 'DataBaseName'
définir @sql = '
--RESTORE '+@nombase+'_full
RESTAURER LA BASE DE DONNÉES ['+@dbname+']
FROM DISK = ''D:DBBackup'+@dbname+'_full.bak'' AVEC FILE = 1,
DÉPLACER N''DataBase_Name'' VERS N''D:DataBase'+@dbname+'.mdf'',
DÉPLACER N''DataBase_Name_log'' VERS N''D:DataBase'+@dbname+'_log.ldf'',
NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
ALLER'
imprimer @sql
--SQL généré
--RESTORE Nom de la base de données_full
RESTAURER LA BASE DE DONNÉES [DataBaseName]
FROM DISK = 'D:DBBackupDataBaseName_full.bak' AVEC FILE = 1,
DÉPLACER N'DataBase_Name' VERS N'D:DataBaseDataBaseName.mdf',
DÉPLACER N'DataBase_Name_log' VERS N'D:DataBaseDataBaseName_log.ldf',
NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
ALLER
--3 : Sauvegarde différentielle
déclarer @dbname varchar(100)
déclarer @sql nvarchar(max)
définir @dbname = 'DataBaseName'
définir @sql = '
BASE DE DONNÉES DE SAUVEGARDE ['+@dbname+']
VERS DISQUE = N''D:DBBackup'+@dbname+'_diff.bak''
WITH DIFFERENTIAL, NOFORMAT, NOINIT, NAME = N'''+@dbname+' -Sauvegarde différentielle de la base de données'',
SAUTER, NOREWIND, NOUNLOAD, STATS = 10
ALLER
'
imprimer @sql
--SQL généré
--DataBaseName_diff
BASE DE DONNÉES DE SAUVEGARDE [DataBaseName]
VERS DISQUE = N'D:DBBackupDataBaseName_diff.bak'
WITH DIFFERENTIAL, NOFORMAT, NOINIT, NAME = N'DataBaseName-sauvegarde différentielle de la base de données',
SAUTER, NOREWIND, NOUNLOAD, STATS = 10
ALLER
--4 : Sauvegarde et restauration différentielles
déclarer @dbname varchar (100)
déclarer @sql nvarchar(max)
définir @dbname = 'DataBaseName'
définir @sql = '
--RESTORE '+@nombase+'_full
RESTAURER LA BASE DE DONNÉES ['+@dbname+']
FROM DISK = ''D:DBBackup'+@dbname+'_diff.bak'' AVEC FILE = 1,
NOUNLOAD, STATISTIQUES = 10
ALLER'
imprimer @sql
--SQL généré
--RESTORE Nom de la base de données_full
RESTAURER LA BASE DE DONNÉES [DataBaseName]
FROM DISK = 'D:DBBackupDataBaseName_diff.bak' AVEC FILE = 1,
NOUNLOAD, STATISTIQUES = 10
ALLER
4. Post-scriptum
Peut-être que cela devrait être ici, mais cela se retourne souvent contre nous. Parfois, la taille de notre fichier de base de données n'atteint pas des dizaines de gigaoctets, alors que devons-nous faire ? Existe-t-il d'autres solutions ?
J'ai déjà déplacé un fichier de données 700G, mais j'ai eu suffisamment de temps pour le déplacer. J'ai déplacé les données vers le nouveau serveur via le travail de base de données. L'avantage est d'optimiser la base de données précédente, par exemple en définissant les paramètres de la base de données. sous forme de partitions de table et migrez les données avec le moins d'impact possible sur la base de données précédente. J'écrirai le processus détaillé la prochaine fois.
(Auteur : Écoutez le vent et la pluie Source : http://gaizai.cnblogs.com/ )