J'ai utilisé pour déplacer des bases de données presque constamment, en raison de la reconfiguration du SAN et des migrations.
En supposant que vous déplacez un serveur entier à la fois, j'irais avec quelque chose comme votre chemin # 2. (Si vous déplacez une base de données à la fois et que vous finissez par effectuer toutes les bases de données sur un serveur, ce serait plus problématique car vous devrez changer les chemins d'accès aux fichiers.)
Notez que "single_user" ne signifie pas nécessairement VOUS. Vous pouvez accéder à DBCC CHECKDB une base de données et ne pas pouvoir y accéder car quelqu'un s'y trouve déjà. Préparez un script que vous pouvez exécuter pour démarrer "tout le monde sauf vous" à partir d'une base de données et conservez-le à un endroit pratique. Notez que SQL 2000 n'a pas les mêmes fonctionnalités «garder tout le monde à l'écart» que les versions plus modernes.
Une vieille astuce consiste à suspendre le service SQL Server. Cela empêchera de nouvelles connexions, mais toute personne déjà connectée peut continuer comme d'habitude. Donc: connectez-vous via une fenêtre SSMS pour pouvoir travailler, puis suspendez le service, puis supprimez les connexions indésirables, faites votre chose via la fenêtre de commande SSMS (pas l'interface graphique, il établit et rompt de nombreuses connexions), puis annulez la pause le service. Avertissement: je ne sais pas comment cela se déroulerait sur un cluster. Il pourrait vouloir basculer.
Il est pratique d'avoir un moyen de garder tous les utilisateurs d'applications hors d'un serveur jusqu'à ce que vous ayez terminé votre travail. Sinon, les connexions peuvent commencer à apparaître lorsque vous essayez de faire des choses, ce qui peut entraîner un conflit de ressources et / ou une lenteur. J'ai utilisé les méthodes suivantes dans le passé, en fonction de la situation exacte: Désactivation du ou des serveurs d'application Utilisation de ALTER DATABASE .. SET RESTRICTED_USER (Si les comptes d'application sont membres des rôles db_owner, sysadmin ou dbcreator, c'est un problème. ) Dire aux utilisateurs que le système sera hors ligne à un moment précis, comme un dimanche matin. (Cela ne fonctionnera pas dans un environnement "pour de vrai" 24x7.) Débrancher la carte réseau qui fait face aux serveurs d'application ou aux utilisateurs. (Dans ce cas, je pourrais entrer via une autre carte réseau connectée à un réseau réservé aux administrateurs ou via l'OIT.)
Détacher un grand nombre de bases de données et les rattacher peut demander beaucoup de travail. Si vous faites cela, assurez-vous que votre script "attaché" est écrit à l'avance.
J'ai eu beaucoup de succès à arrêter SQL Server, à tout copier, à changer les lettres de lecteur et à démarrer SQL Server. Pas de détacher / attacher. Tant que SQL Server est désactivé et que vous copiez (et ne déplacez PAS) les fichiers, vous ne pouvez pas avoir trop de problèmes, même si vous déplacez les bases de données système. Étant donné que les chemins d'accès sont les mêmes, SQL Server ne réalisera pas que quelque chose a changé pendant que le service était désactivé. Assurez-vous simplement que les lettres de lecteur pointent vers les bons volumes, sinon les choses iront mal pour vous.
Mon problème le plus fréquent n'était pas d'obtenir correctement les listes de contrôle d'accès dans les répertoires de fichiers. Les versions plus modernes de SQL Server sont mieux à définir uniquement les autorisations dont le compte de service a besoin tandis que les anciennes versions semblent moins difficiles. Si vous oubliez de définir les listes de contrôle d'accès et que le compte de service n'est pas un administrateur local (ce que je ne recommanderais pas), une ou plusieurs bases de données risquent de ne pas s'ouvrir au démarrage de l'instance. Ne paniquez pas, changez simplement les ACL et attachez la base de données.
J'utilise généralement ROBOCOPY pour faire ce genre de travail. Il existe un commutateur de ligne de commande pour conserver les ACL.
Utiliser un calcul / vérification CRC n'est pas une mauvaise idée, mais je ne l'ai jamais fait. Lorsque les bases de données reviennent, j'exécute CHECKDB () sur chacune d'elles. Je vais généralement préparer un script pour cela à l'avance, plutôt que de compter sur le démarrage manuel d'un travail de maintenance. De cette façon, je peux vérifier quelques bases de données plus petites avant de vérifier une grande base de données qui pourrait prendre plusieurs minutes ou heures pour s'exécuter. Je doute qu'une vérification CRC (ou un outil de comparaison de données Redgate) trouverait quelque chose que CHECKDB () manquerait, et si c'était le cas, SQL Server ne serait pas en mesure de le réparer.
Après avoir copié les fichiers, mais avant de redémarrer l'instance, je vais modifier légèrement le chemin de fichier des anciens dossiers en renommant l'un des dossiers. Il s'agit d'une vérification supplémentaire par rapport au problème "Oups, le serveur pointe toujours vers les anciens fichiers".
Ne soyez pas pressé de supprimer les anciens fichiers et de récupérer de l'espace sur l'ancien stockage et assurez-vous que vos sauvegardes complètes ont réussi. Testez la restauration de quelques-unes de ces sauvegardes ailleurs. Une fois que vous avez de bonnes exécutions checkdb () et de bonnes sauvegardes complètes, vous pouvez alors penser à supprimer cet ancien stockage et à arrêter le Lefthand.
Les pires problèmes que j'ai rencontrés avec ces migrations se sont produits après avoir pensé que j'avais fini. Ce serait l'administrateur du SAN me disant que quelque chose s'était passé et que mes systèmes de fichiers étaient brouillés. (Repartié, reformaté, copié à nouveau.)
Un autre problème amusant est que le SAN est lent sans raison apparente. Si vous pensez qu'il faudra 10 heures pour copier vos données et que vous êtes copié à 30% à l'heure numéro 9, vous avez un problème. Regardez les temps de transfert (robocopy affiche le% copié et donne des estimations de temps, ou vous pouvez utiliser Perfmon) et ayez un plan de secours si quelque chose se passe bizarrement.
De plus, je ne sais pas si vos volumes seront partitionnés pour vous, mais vous voudrez peut-être être sûr qu'ils utilisent un décalage de 1 Mo. Sur Windows Server 2008 et mieux, cela ne devrait pas poser de problème. Sur les anciens OS, c'est le cas. Il y a une tonne de choses googlables à ce sujet, et vos gars du stockage devraient le savoir, mais je demanderais.