web-dev-qa-db-fra.com

Meilleure façon de migrer une énorme base de données SQL Server avec un faible temps d'arrêt sur le réseau

Définition du problème

Notre serveur de base de données doit être transféré vers un autre centre de données. Il fonctionne sur Microsoft SQL Server 2012 Enterprise (64 bits) et contient deux bases de données d'environ 2 To et 1 To.

Avoir peu ou pas de temps d'arrêt pour cela serait idéal.

Charge de travail

Ces bases de données sont utilisées pour un site Web .NET et sont constamment mises à jour.

Ne pas l'avoir disponible pendant le week-end serait cependant acceptable. La base de données actuellement utilisée resterait la seule utilisée jusqu'à ce que vous passiez à la nouvelle.

Ce changement serait idéalement effectué simplement en modifiant les entrées DNS pour pointer vers le nouveau serveur de base de données tout en s'assurant que la base de données n'est pas mise à jour.

De plus, le temps pris par cette opération n'a pas vraiment d'importance tant que le passage d'un serveur à l'autre (temps d'arrêt) est maintenu faible.

Approches envisagées

  • Sauvegarde et restauration

    Cela a été fait dans le passé mais a impliqué un temps d'arrêt élevé même si cela a été fait via un réseau interne, donc plus efficacement que via Internet

  • Expédition des journaux

    Autant que je sache, cette approche minimiserait les temps d'arrêt en configurant un maître/esclave et en transférant une copie exacte de la base de données maître à son esclave en lecture seule. Comme mentionné ci-dessus, aucun accès à l'esclave ne serait nécessaire et nous avons juste besoin d'un moyen d'avoir une réplique de la base de données maître sans corruption de données.

    Il semble également être assez efficace en termes d'utilisation des ressources et n'affecterait pas trop les performances du maître.

    Je peux me tromper sur cette approche alors n'hésitez pas à me corriger.

  • Mise en miroir de bases de données

    Je ne suis pas trop au courant de cette approche mais cela semble être une option valable. Pas besoin d'avoir une synchronisation en temps réel et les performances du maître sont très importantes, donc asynchrone serait la voie à suivre si cette approche était choisie.

  • Autres options?

    Ce serveur fonctionne directement sur du matériel nu, donc les solutions de niveau inférieur ne sont malheureusement pas une option. Peut-être existe-t-il une meilleure façon de procéder?

Contraintes

Comme décrit, ces bases de données sont assez grandes au point qu'elles sont difficiles à maintenir, mais c'est un autre problème.

Les versions de SQL Server seront les mêmes (Microsoft SQL Server 2012 Enterprise 64 bits).

Il devra être transféré sur le réseau entre deux centres de données, donc très probablement sur Internet. Avoir des disques envoyés d'un site à l'autre pour une synchronisation initiale n'est malheureusement pas une option. Avoir une sorte de sécurité pour le transfert serait idéal mais nous ferons de notre mieux.

Cela devrait donner un assez bon aperçu de nos besoins pour cette tâche et j'espère que certains d'entre vous ont dû faire face à cette situation auparavant.

22
Val F.

La sauvegarde et la restauration directes sont évidemment hors service. Je ne considérerais pas non plus la réplication d'aucune sorte.

La mise en miroir de bases de données est relativement simple à configurer, mais nécessite une connectivité en temps réel entre les deux serveurs, la configuration de partenaires et de points de terminaison, etc. Les groupes de disponibilité peuvent être une option, mais en plus des complications de mise en réseau, vous devez également avoir les deux serveurs en tant que membres du même WSFC - ce qui signifie qu'ils doivent tous deux appartenir au même domaine. Ce n'est pas une configuration typique (ou pourrait même être faite pour fonctionner temporairement) pour un déménagement de centre de données.

Mon vote serait pour l'envoi de journaux. La bonne chose à ce sujet est que vous pouvez utiliser les sauvegardes et les sauvegardes de journaux que vous prenez déjà (non?) Et ne pas nécessairement avoir une connectivité en temps réel entre les deux bases de données - elles n'ont pas besoin de connaître chacune d'autres, vous n'avez pas besoin de configurer des points de terminaison pour la mise en miroir, les partenaires, la sécurité, etc. Vous avez juste besoin d'un moyen de récupérer les fichiers de l'ancien serveur vers un emplacement où ils peuvent être restaurés sur le nouveau serveur. Vous pouvez effectuer une sauvegarde complète bien à l'avance, la transférer sur le nouveau serveur, la restaurer, puis appliquer (éventuellement des différences et) des sauvegardes de journal incrémentielles à partir de ce point jusqu'au moment de la transition. Le processus est en fait assez simple et de nombreux didacticiels sur l'envoi de journaux sont disponibles en ligne si vous rencontrez des difficultés.

Si l'application Web se déplace avec la base de données, étant donné que la propagation du DNS peut prendre un certain temps, vous souhaiterez peut-être basculer dans les chaînes de connexion de l'ancienne application pour les faire pointer vers l'IP du nouveau serveur de base de données une fois qu'il est accessible en écriture. , car - même après le basculement, et même si vos paramètres TTL sont serrés), les clients peuvent continuer à utiliser les anciens serveurs Web. Tout dépend du respect que leurs fournisseurs accordent à vos TTL.

20
Aaron Bertrand

J'ai récemment migré 15 To sur 6 bases de données à l'aide de la mise en miroir. Très simple et fonctionnait parfaitement avec seulement quelques secondes de temps de basculement.

Modifications:

J'ai eu deux nouveaux serveurs SQL virtualisés. Les bases de données provenaient de 3 serveurs qu'ils venaient tout juste de dépasser, et avaient un impact sur les performances des petites bases de données hébergées sur eux.

Le processus était très simple.

  1. Attendez la fin des sauvegardes complètes du week-end
  2. Restaurer sans récupération sur de nouveaux serveurs
  3. Une fois ces restaurations terminées, suspendez les sauvegardes
  4. Exécutez une restauration supplémentaire jusqu'à la dernière sauvegarde du journal à partir des originaux, sans aucune récupération
  5. Commencez à mettre en miroir sur les six
  6. Reprendre les sauvegardes

J'ai choisi de les laisser en mode asynchrone jusqu'à ce que nous soyons prêts à les basculer pour réduire la charge sur le réseau, etc. La mise en miroir a une certaine réputation de causer une latence pendant la maintenance (index/statistiques) et d'autres activités à volume élevé, mais je ne l'ai pas fait trouve que c'est vrai. Ils doivent être commutés en mode synchrone avant le basculement manuel.

Au cours de la prochaine fenêtre de maintenance, j'ai basculé manuellement chaque base de données et, après quelques tests de détection de fumée, j'ai désactivé la mise en miroir et finalement supprimé les anciens fichiers de données des serveurs d'origine. Une bizarrerie dans ce processus est que l'échec d'une base de données en miroir laisse l'ancien principal dans un état de récupération, donc à moins que vous soyez à l'aise de les supprimer, vous devez les remettre en ligne puis les détacher, ou quelle que soit votre méthode de suppression préférée. . De plus, je n'ai configuré aucun témoin pour tout cela car je ne voulais pas de basculement automatique. C'était un événement contrôlé.

Veuillez me faire savoir si vous souhaitez plus de détails. J'ai omis les spécifications du serveur et du réseau, mais je peux les fournir si vous le souhaitez.

Merci

16
Erik Darling