Serveur d'impression

Une migration monumentale vers SQL Server 2016 – Bien choisir son serveur d impression

Le 2 mai 2019 - 9 minutes de lecture

Dans mon précédent article, j'avais décrit les préparatifs entrepris pour migrer une instance SQL Server 2008R2 volumineuse vers SQL Server 2016. Cet article détaille le jour de la migration.

Préparation finale

Nous avons terminé nos sauvegardes nocturnes comme d'habitude vendredi soir, alors quand je suis arrivé samedi, j'ai lancé une dernière sauvegarde différentielle pour prendre en compte les modifications nocturnes. Nous avons créé plusieurs tâches dans le script de sauvegarde Ola multithread et je les ai toutes démarrées en même temps avec (bien sûr) PowerShell.

Get-DbaAgentJob -SqlInstance $ OldInstance | Where-Object $ _. Name -like 'sauvegardes de la base de données utilisateur - diff *' | ForEach-Object $ _. Start ();

J'ai estimé que les sauvegardes des diff prendraient environ 90 minutes sur la base de quelques tests; ils ont pris 100 minutes (pas trop minable!). Pendant que cela fonctionnait, j'ai réexporté les travaux de l'agent. juste pour être sûr que j'ai tout capturé là-bas. J'ai également copié quelques bases de données sur une autre instance 2008R2 au cas où elles seraient nécessaires à des fins de débogage.

La toute dernière étape a consisté à extraire une liste de toutes nos bases de données et des chemins d'accès complets aux données physiques et aux fichiers journaux, puis à les scinder en dix fichiers. La méthode que j’utilisais pour attacher les bases de données n’était pas évolutive pour pouvoir l’exécuter simultanément sur les huit mille bases de données, ce qui me permettait de contrôler facilement la taille des lots.

Le fichier CSV résultant m'a donné chaque fichier de base de données, le type de fichier (données ou journal) et le nom de la base de données lui-même.

base_de_données prénom Type de fichier nom_périphérique
7 Ma base de données ROWS S: Very Long Path MyDatabase.mdf
7 Ma base de données BÛCHE S: Very Long Path MyDatabase_1.ldf

C'est le moment de partir

Une fois tout notre travail de pré-migration terminé, nous avons arrêté l'instance SQL Server 2008R2. Ensuite, nous avons confié les tâches aux personnes du centre de données pour détacher le LUN de stockage, prendre l'instantané et associer le LUN à la nouvelle instance. Une fois leur travail terminé, ils m'ont passé le flambeau pour déplacer les fichiers et attacher les bases de données.

Attachement des bases de données

Avant de lire cette section, je vous suggère de lire deux autres articles récents, Multithreading PowerShell avec PoshRSJob et Journalisation PowerShell Thread-safe avec PSFramework, car ils fourniront un aperçu de la manière dont cela a été effectué.

J'ai créé ma propre fonction en tant que wrapper pour Mount-DbaDatabase de dbatools, en ajoutant les fonctionnalités supplémentaires dont j'avais besoin (ou la pensée dont j'avais besoin):

  • Enregistrement
  • Multi-threading
  • Renommer logiquement les fichiers
  • Définir le propriétaire de la base de données de manière appropriée
  • Reconstruction des index
  • Mise à niveau du CompatibilityLevel

En pratique, je n'ai utilisé que les quatre premiers dans la pièce jointe initiale des bases de données pour la mise à niveau. Exemple d'exécution:

Get-MountProgress est une variation de l’une des fonctions de mon article multithreading ci-dessus, qui me permet de garder un œil sur l’avancement de l’exécution de la fonction. J'ai exécuté le code ci-dessus dix (bien, onze) fois, une fois pour chaque «lot» de 10% des bases de données. Le premier groupe a bien fonctionné! Seulement environ 6 minutes pour attacher les bases de données. Le lot suivant était de 10 minutes. Puis 16. Et ensuite, et ensuite, et ensuite…

Les progrès continuent de ralentir

D'après les horodatages des fichiers journaux, vous pouvez constater que chaque lot a pris de plus en plus de temps. C'était angoissant une fois que nous avons passé le 5ème groupe. J'ai observé que l'énumération de SMO lors de la connexion à une instance de base de données peut être longue avec un grand nombre de bases de données sur l'instance, ce qui correspondrait à ce que j'ai observé; plus je dispose de bases de données, plus cela prend de temps. Mais je ne peux pas complètement attribuer le ralentissement à cela.

En cours de route, nous avons un peu changé de vitesse et j’ai exploité un groupe spécial de bases de données qui n’avaient pas encore été rattachées, mais l’équipe d’assurance qualité avait besoin de tests. Cela leur a permis de lancer leurs plans de test sans attendre plus longtemps.

Consommation de mémoire pour Powershell.exe était également très élevé et continuait à croître avec chaque lot. Après le troisième lot, j'ai décidé que je devais quitter PowerShell après chaque cycle et le redémarrer simplement pour éviter que cela ne dégénère. Je ne sais pas ce qui s’est passé là-bas; peut-être une fuite de mémoire runspace?

J'avais estimé que la connexion des bases de données prendrait environ une heure. Il a fallu plus de six ans et demi. Personne n'était plus contrarié que moi par cela. Du côté positif, les journaux n’ont montré que du succès.

Validation

Une fois que nous avons réalisé que la connexion des bases de données allait durer plus longtemps que prévu, nos développeurs et notre équipe d’assurance qualité ont pu tester ce qu’ils pouvaient avec les bases de données que nous avions attachées plus tôt. Avec le recul, j'aurais dû leur demander les bases de données dont ils avaient besoin pour leurs plans de test et les joindre immédiatement, afin qu'ils puissent tester pendant que les autres bases de données fonctionnaient. Mais, bonne nouvelle! Ils n’ont trouvé aucun problème pouvant être directement attribué à la manière dont nous avons procédé à la migration des données.

J'ai ré-exécuté mon précédent PowerShell pour récupérer les bases de données et leurs fichiers sys.databases contre la nouvelle instance et comparé à l'original; tout correspondait! Confirmation que toutes les bases de données ont été attachées.

Étapes finales

Nous avons manqué le temps estimé pour notre décision d'aller / non-aller par cinq minutes. Avec le nombre de pièces mobiles, les bases de données en jeu, les retards inattendus et les nombreux tests que nous avons dû faire, c’est très bien! Mon collègue et moi avons eu un travail supplémentaire dont nous devions nous occuper après que l'équipe eut déclaré la migration réussie. Les tâches d'agent devaient être activées, les démarrages de tâches du jour au lendemain contrôlés, etc. Nous avons appelé un jour après environ 14 heures au bureau.

Le lendemain, nous avions encore d'autres tâches à accomplir. Par un blog écrit par Erin Stellato (blog |gazouillement) en mai, en raison de la mise à niveau de 2008R2 à 2016, une reconstruction d'indice était recommandée pour tous nos index non clusterisés. Je l’ai fait via Red Script Multi Script et un SQL dynamique au lieu de PowerShell cette fois-ci, en parcourant tous les index NC de chaque base de données et en cours d’exécution. ALTER INDEX RECONSTRUIT.

Conséquences

Nos premiers jours après la mise à niveau ne se sont pas bien passés. L'utilisation du processeur et les temps de réponse étaient terribles et, après des vérifications minutieuses effectuées pendant des jours, nous en sommes finalement revenus à un élément de code qui cherchait toujours l'ancienne instance de SQL Server 2008R2. Une fois que cela a été corrigé, tout est revenu à la normale.

Quelques jours après la migration, nous avons eu un problème causé par une modification de SQL Server 2016. Il semble que SQL Server soit devenu un peu plus strict quant à la soustraction d'entiers de temps types (au lieu d'utiliser dateadd ()). La corriger était assez facile car elle était limitée à quelques procédures stockées utilisées dans une capacité limitée.

Leçons apprises

Ce n’est pas un bon projet sans de solides leçons apprises! Qu'aurions-nous pu faire pour faciliter la journée de la migration?

  • Déterminez quelles bases de données doivent être disponibles pour effectuer les vérifications postérieures à la mise à niveau et attachez-les en premier.
  • Travaillez en petites quantités (je ne sais pas dans quelle mesure cela aurait aidé)
  • Avoir un environnement de test aussi proche que possible de la production dans tous les aspects

Conclusion

Je suppose que vous vous attendez à ce que je dise quelque chose de profond ici. La chose la plus surprenante pour moi à propos de cette migration est qu’il n’ya pas eu de surprise majeure. Mis à part une portion prenant plus de temps que prévu et ces deux petits morceaux de code, tout s'est déroulé comme prévu.

Dans l’ensemble, notre migration a été un succès et après avoir réglé quelques problèmes dans la semaine ou les deux suivantes, les choses se sont bien passées. Nous sommes sur une version moderne en ce moment, et nous sommes impatients de tirer parti des nouvelles fonctionnalités dont nous disposons maintenant.

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.