Planification Azure SQL Databases–Azure functions

Il y a un peu plus de 20 ans je découvrais SQL Server. Déjà, avec SQL Server 6.5 il existait des assistant dans Management Studio qui facilitaient la vie du DBA.

Tout d’abord, SQL trace ! Certains d’entre vous font l’association avec l’actuel profiler. C’est bien le cas, il s’agissait bien de l’utilitaire graphique permettant de visualiser l’activité du serveur ….

Hydra, SQL Server 6.5, a aussi vu l’apparition d’un assistant qui encore le bonheur des administrateurs : le Database maintenance Plan Wizard. Oui, les plans de maintenance ! Pas tout à fait sous leur forme actuelle. Pas d’agent SQL, mais son ancêtre SQLExecutive.

Il y a donc des tâches qui incombent encore DBA. La sauvegarde, le test d’intégrité, la gestion des index et statistiques d’index.

Et puis Azure SQL Databases vient bousculer les habitudes. Certains s’imaginent que leur métier de DBA va disparaitre. Non, il va seulement se transformer. Probablement en administrateur de données plutôt qu’en administrateur de bases de données.

Lorsque j’interviens sur ces bases « managées », il est fréquent qu’aucune maintenance ne soit effectuée. Certes les sauvegardes sont gérées par l’hébergeur, Microsoft, mais la réindexation, voire les tests d’intégrité restent à la charge du client, vous … Et qui dit pas de réindexation ou de mise à jour de statistique d’index dit problèmes de performance à venir.

Quid des performances dans Azure ? Certes il faut compter avec la latence réseau que l’on ne rencontre pas quand l’applicatif et la base de données sont hébergés dans le même datacenter, proche des utilisateurs. Mais la performance d’une requête est aussi très largement guidée par la présence d’index et par la fraicheur des statistiques d’index. N’hésitez pas à planifier des Update Stats fréquemment.

SQL Server sur Azure, ce n’est pas du SaaS, mais « seulement » du PaaS. Il reste donc des points que vous devez gérer. Comme la maintenance des index !!!

clip_image002

Historiquement les travaux sont planifiés au travers de l’agent SQL Server. Le problème étant qu’il n’y a pas d’agent SQL sur Azure !

Il faut donc trouver des solutions de contournement pour planifier la gestion des index :

  • Créer un plan de maintenance sur une instance SQL disposant d’un agent et modifier le serveur cible en désignant la base SQL Azure
  • Utiliser Azure automation
  • Créer une Azure fonction

Afin de rester cohérant avec la philosophie PaaS, je vais présenter en priorité les solutions serverless. Au passage, si vous êtes en phase de conception d’une nouvelle application, je vous encourage fortement à vous intéresser à ce type d’architecture, plutôt basée micro services (par opposition aux applications monolithiques que l’on rencontrait par le passé).

Dans ce billet, nous allons aborder les fonctions Azure, de manière simple, dans le but d’exécuter du code dans une base de données à intervalle planifié, un job en quelques sortes Smile. Et quoi de plus logique que de planifier la réindexation et la mise à jour des statitiques.

Pour cela, j’ai créé un environnement de test depuis le portail Azure. Un serveur de bases de données, en France puisque la région est à présent disponible, et une base de données.

Un point important à ne pas oublier au sujet de Azure SQL Databases : il n’est pas possible d’exécuter du code Cross-Database. Autrement dit, on ne peut pas généraliser la procédure à l’ensable des bases du « serveur ».

A titre personnel, je préconise et utilise les scripts de Ola Hallengren comme scripts de maintenance. Que ce soit pour les sauvegardes, la gestion des index ou des tests d’intégrité.

Il faudra donc déployer les scripts, en fait les fichiers CommandLog, CommandExecute et IndexOptimize, dans chaque base.

  clip_image003

La tarification et les performances sont liés à la base, il parait logique que les ressources consommées pour la réindexation soient aussi à la charge de la base et non pas liées à une base système ou utilisateur prévue à cet effet.

Etant donné que les bases partiellement contenues sont disponibles dans Azure, nous allons créer un User with Password:

CREATE USER [Maintenance.User] 
WITH PASSWORD = '<str0ng_p@ssw0rd>'
GO
EXEC sp_addrolemember N'db_owner', 
                      N'Maintenance.User'
GO

Il reste à présent à configurer la fonction Azure pour appeler la procédure stockée.

Depuis le portail Azure, il suffit de rechercher le mot clé « Function »

image

Et de démarrer la configuration

clip_image006

Une fois terminé l’app service est présent.

image

Il faut maintenant configurer la fonction en y ajoutant le code que l’on souhaite exécuter, comme nous y invite l’interface graphique.

clip_image010

L’assistant nous propose différentes options pour coder la fonction. Il est possible d’utiliser Visual Studio ou Visual Studio Code, ou bien de passer par l’éditeur de Azure.

clip_image012

S’agissant d’une fonction, il est possible d’opter pour un déclanchement au travers d’un appel HTTP ou bien d’utiliser un déclencheur basé sur un minuteur. C’est cette dernière option que nous choisirons.

clip_image014

Et d’utiliser quelques lignes de C# :

#r "System.Configuration"
#r "System.Data"

using System;
using System.Text;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Threading.Tasks;

public static void Run(TimerInfo myTimer, TraceWriter log)
{
    log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
    var str = "Server=tcp:sqlagent.database.windows.net,1433;Initial Catalog=AdventureWorks;Persist Security Info=False;User ID=Maintenance.User;Password=;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;";
    using (SqlConnection conn = new SqlConnection(str))
    {                    
        StringBuilder sb = new StringBuilder();                    
        sb.Append("exec [dbo].[IndexOptimize] @Databases ='AdventureWorks'");
        String sql = sb.ToString();                    
        using (SqlCommand command = new SqlCommand(sql, conn))
        {
            command.Connection.Open();
            command.ExecuteNonQuery();
        }                                   
    }
}

clip_image016

Il est possible de tester la fonction au travers du bouton exécuter.

clip_image018

Une fois le test effectué, vient l’étape de la planificiation.

image

Le format utiliser est similaire au Crontab que connaissent les Linuxiens. Heureusement pour nous, une aide précieuse est disponible dans l’interface, ou bien une recherche dans votre moteur favoris vous en dira plus.

Il est possible de désactiver la planification au travers d’un switch spécifique :

image

La fonction, elle, peut être stoppée, comme si l’on stoppait le site Web.

Deux principaux inconvénients quant à l’utilisation des fonctions :

  • Une durée d’exécution limitée même s’il est possible de modifier les 5 minutes par défaut (un peu juste pour de la réindexation sur de grosses bases)
  • Par défaut, pas de possibilité de stocker les crédentials de la chaine de connexion et donc de devoir avoir les informations en clair.

Happy scheduling

Publicités
Publié dans Azure Function, SQL Azure | Tagué | 2 commentaires

Export de la structure d’une base de donnes SQL Server

Pourquoi un billet sur ce qui est à priori une problématique simple dans SQL Server ?

Oui, pourquoi ne pas simplement utiliser l’assistant de SSMS qui permet de scripter une base de données, la structure de tous les objets ?

Tout simplement parce qu’il est cas où l’on veut planifier de manière régulière cette opération. Il est donc hors de question que cela soit une opération manuelle dans SQL Server Management Studio.

Pourquoi ne pas simplement faire un backup de la base de donnes ?
Lorsque la taille des bases de données devient importante (500GB, 1TB) on se trouve confrontés à des problématiques d’espace sur les volumes de backup, de rétention, le temps de sauvegarde et de restauration. Certaines bases voient 95% du contenu être rafraichi tous les jours !

C’est là ma problématique. Une base de type DataWharehouse de volumétrie vraiment conséquente et donc les données sont réintégrées en totalité toues les nuits. Le backup ne me “sert” finalement pas à grand chose. Car une fois la restore effectuée, on relance les scripts d’importation de données depuis divers environnements.

Au final il est apparu que seule la structure de la base était utile, d’un point de vue sauvegarde. D’où la question : comment exporter la structure d’une base ?

Alors, oui, en puriste, je devrais dire qu’il y a un gestionnaire de code source avec son versionning qui détient LA bonne version. mais dans la vraie vie ….

S’offre alors à nous plusieurs solutions …

J’avais par le passé travaillé avec du PowerShell et l’objet Scripter de SMO.

 $Scripter.Options.DriAll=$False ;
 $Scripter.Options.IncludeHeaders=$False ;
 $Scripter.Options.ToFileOnly=$True ;
 $Scripter.Options.WithDependencies=$True  ;
 $Scripter.Options.FileName=$Sqlfile ;
 $Scripter.Options.ScriptDrops=$False ; 
 $Scripter.Options.IncludeIfNotExists=$False ; 
 $Scripter.Options.AppendToFile=$True ;

Il suffisait ensuite de boucler ave du ForEach sur les différents objets pour obtenir le résultat escompté.

On peut aussi utiliser le Data-tier Application Framework (DACFx). Il suffit alors de créer un DacPac (attention, pas le BacPac, qui, lui contient aussi les données … ). Encore une fois, cette opération est manuelle dans SSMS. Mais avec un peu d’imagination on peut tout a fait programmer tout cela via du PowerShell et l’ordonnancer avec un Agent SQL ou autre.
J’avoue que je ne suis pas vraiment fan de cette solution (tout n’est pas supporté d’un point de vue de la structure) même si au travers des modules fournis dans l’incontournable pack @psdbatools (http://dbatools.io) il est simple d’appeler la commande Export-DbaDacpac pour ensuite l’automatiser.

Export-DbaDacpac -sqlinstance MyInstance -Database MyDatabase  -Path C:\temp 

Une dernière possibilité s’offre à nous … très simple à mettre en œuvre!

Tout d’abord il suffit de faire appel à la commande DBCC CLONEDATABASE qui permet de créer un clone de la base de données … sans les données. On obtient donc la structure. A nous de juger si les valeurs de statistiques d’index sont pertinentes ou pas. J’avais déjà présenté cette fonctionnalité qui est a présent disponible dans toutes les versions de SQL Server à compter de SQL Server 2012 SP4.

DBCC CLONEDATABASE (MyDatabase, MyClone) WITH NO_STATISTICS

ou bien, au travers des dbaTools :

Invoke-DbaDatabaseClone -SqlInstance MyInstance -Database MyDatabase -CloneDatabase MyClone 

Une fois le clone terminé, il ne reste plus qu’à sauvegarder cette base comme une base lambda.

Et le tour est joué. Certes, ce n’est pas du script de base à proprement parler, mais pour qui veut archiver la structure d’une base sans ses données, la solution reste élégante. On peut ensuite restaurer cette base sur n’importe quel serveur et en extraire les scripts au besoin.

Happy scripting

Publié dans SQL Server | Laisser un commentaire

SQLSatParis–Installation de SQL Server sous Docker

Lors de ma session “SQL Server & Docker, les premiers pas”, une erreur était survenue lors de l’installation manuelle de SQL Server dans un conteneur Windows Server Core démarré en mode interactif.

Cette démo relativement simple et sans surprise avait parfaitement fonctionné lors de plusieurs Events. J’ai pensé en premier lieu que le problème était dû à une mise à jour de l’image Windows Core (1709 ou 1803 ?).

image

Le détail de l’erreur ne permet pas spécialement de se prononcer sur la root cause. J’ai vu ce genre de message quand le chemin d’installation était relativement long. Ce qui n’était pas le cas ici.   

J’ai pris quelques minutes pour rejouer la démo. Et aucune erreur n’est survenue. Tout a parfaitement fonctionné.

image

Peut-être une erreur sporadique, difficilement reproductible, peut-être que l’image de Windows que j’ai utilisée aujourd’hui, publiée il y a 6 jours, a corrigé quelque chose. Malheureusement, je n’aurais pas encore le fin mot de l’histoire.

Si vous rencontrez un problème, n’hésitez pas à m’envoyer un message.

Publié dans Evènements | Tagué | Laisser un commentaire

SQLSaturday #762 – Paris 2018–SQL Server et Docker, les premiers pas–les slides

Samedi 7 juillet se tenait à Paris l’édition 2018 du SQL Saturday. Beau temps, bonne humeur et des speakers passionnés étaient au rendez-vous.

Malheureusement, moins de participants qu’à l’accoutumée. Certes il est compliqué de se mobiliser en période estivale, de surcroit pendant la coupe du monde et après une première édition du Power Saturday. Allez, gageons que la prochaine édition sera un vrai succès. N’hésitez pas à nous faire part (nous, organisateurs bénévoles) de vos remarques pour faire que ces évènements répondent à vos attentes et soient un vrai succès communautaire. Nous sommes attentifs à tous les retours positifs ou négatifs.

Pour ma part, j’ai eu le plaisir d’animer une session décrivant les premiers pas de SQL Server et Docker, une session de découverte pour DBA soucieux de se préparer à la virtualisation version 2.0.

image

Les slides et les démonstrations sont téléchargeable sur mon OneDrive ainsi que sur le site du SQL Saturday.

Enjoy !

Publié dans Evènements | Tagué , | Laisser un commentaire

Renouvèlement MVP

Et hop, une année supplémentaire … L’email est arrivé hier, mais je n’avais pas eu le temps de partager.

Toujours est-il que je suis ravi et honoré de rester un an de plus dans la grande famille des MVP, dans mon domaine de prédilection, SQL Server.

image

Je ne compte pas pour autant freiner mes engagements envers la communauté. Rendez- vous donc ce week-end au SQLSaturday Paris

Pensez à vous incrire. Il reste également des place pour les préconf … Il est grand temps de cliquer.

Happy MVP day !

Publié dans CV | Tagué | Laisser un commentaire

SQLSaturday #762 – Paris 2018 – Préconférences et agenda

Le SQLSaturday 762 Paris 2018 se profile à l’horizon. L’agenda de la journée est à présent disponible.

DgHsZdTXcAAZ6Fq

Mais n’oubliez pas de vous inscrire aux Préconf qui auront lieu de le vendredi 6 juillet. Une journée de formation à prix ultra-compétitif pour vous former aux algorithmes prédictifs avec Paul Peton (@paulpeton), ou bien aborder les nouvelles plateformes de données Big Data avec Fabien Adato (@FabienAD). Pour les DBA, je ne saurais que trop vous conseiller de passer une journée avec David Barbarin (@mikedavem) pour appréhender entre autres l’installation de SQL Server sur Linux et Docker.

 

Pour vous inscrire, cela se passe ici : http://www.sqlsaturday.com/762/EventHome.aspx 

Happy #SQLSatParis 2018

Publié dans Evènements | Tagué | 1 commentaire

SQLSaturday #758–Montréal 2018-Les bases du dépannage SQL server–Les slides

Voici un petit lien pour télécharger les slides de ma session sur les bases du dépannage dans SQL Server.

Encore une fois, merveilleusement accueillis par nos amis Québécois, le SQLSaturday a tenu ses promesses avec une belle affluence et des sessions qui méritaient le détour.

See you next year

2018-06-02 18.13.19

Publié dans Evènements | Tagué | Laisser un commentaire

SQLSaturday #758–Montréal 2018-Les bases du dépannage SQL server

Pour la seconde année consécutive j’ai la chance d’avoir été sélectionné pour animer une session lors du SQLSaturday Montréal.

image

Pour ceux qui souhaiteraient passer un Week-End dans une ville formidable et passer du bon temps avec nos cousins Francophones, voilà donc une belle occasion de mêler  travail et détente.

Pour ma part, je présenterai une session sur les bases du dépannage SQL Server. Quelques anciennes figures connues du monde SQL Server en France seront présentes car ont décidée de franchir l’atlantique. Si vous voulez revoir Franc Mercier et Nicolas Soukoff c’est encore une bonne occasion de venir à Montréal

Le planning des sessions est disponible ici.

Pensez à vous enregistrer !

See you there …

Publié dans Evènements | Tagué | 2 commentaires

SQLSaturday #735–Helsinki 2018–Les slides et démos

The SQLSaturday #735 took place in Helsinki last week-end. Great city and amazing people there.

2018-05-12 19.09.42
2018-05-13 11.25.402018-05-13 13.13.242018-05-11 16.46.512018-05-13 12.04.522018-05-13 11.27.07

For all of you who attended my session about SQL Server inside a Docker container, the PowerPoint Slides and the demo files can be downloaded on my OneDrive.

Enjoy

Publié dans Docker, Evènements, SQL Server | Tagué | Laisser un commentaire

SQL Server 2016 SP2

Autant la sortie du Service Pack 1 de SQL Server 2016 avait constitué une petite “révolution”, grâce notamment à l’uniformisation de la surface de programmation dans SQL Server. Cela permet en effet de bénéficier dans toutes les éditions de fonctionnalités comme les tables partitionnées, le columnstore index, le moteur InMemory Hekaton, la compression des données, le Database Snapshot (qui permet au passage en édition standard d’avoir un accès en lecture seule à une base en Database Mirroring / Groupe de disponibilité basique) , le Dynamic Data Masking et el Row Level Security, mais encore Polybase et bien d’autres …

Finalement, la différence entre les éditions, à peu de choses près, réside dans l’accès aux ressources mémoire et CPU et dans les fonctionnalités liées à la haute disponibilité.

Le Service Pack 2 pour SQL Server 2016 est paru il y a quelques jours sans pour autant faire grand bruit. Certes pas de grande révolution cette fois ci mais quelques points qui méritent vraiment notre attention.

Si vous êtes fan de Troubleshooting comme moi, la DMV sys.dm_exec_query_stats se voir ajouter des informations relatives à la lecture de données dans mes segments d’un index columnstore. De même, des colonnes supplémentaires relatives à l’écriture de données en TempDB sont aussi ajoutées à cette DMV (tout comme à sys.dm_exec_procedure_stats, sys.dm_exec_trigger_stats) et aux xEvent sql_statement_completed, sp_statement_completed, and sql_batch_completed. A noter aussi la création de la DMV sys.dm_db_log_info  (déjà présente dans SQL Server 2017) en remplacement du bon vieux DBCC LOGINFO. Egalement présente dans SQL Server 2017, la DMV sys.dm_tran_version_store_space_usage est disponible dans le SP2 de SQL Server 2016.

Un certain nombre d’améliorations de performances sont à noter, sur les tables partitionnées, le cleanup de la base distribution et du change tracking. Il en va de même pour le backup sur les instances disposant de beaucoup de mémoire, le support de MAXDOP pour la création/modification des statistiques d’index.

Autre point notable, le fait de pouvoir spécifier un FileGroup autre que Default sur une opération de type SELECT INTO.

Vous l’aurez compris, la liste est longue.

Mais ce que je retiens en premier lieu et le support complet de MSTDC pour les bases faisant partie d’un groupe de disponibilité. Le support n’était que partiel avec SQL Server 2016 (et SP1), voilà donc tous les scénario accessibles, comme c’est le cas avec SQL Server 2017.

Je ne saurais que trop vous conseiller de télécharger et installer ce Service Pack sorti le 24 avril.

Notez au passage que, concernant SQL Server 2017 et les futures version, Microsoft a modifié la politique de mise à jour. Il n’y aura pas de service pack. Seulement des CU (Cumulative Update) dont la fréquence de publication est mensuelle pour la première année de vie du produit et tous les trimestres ensuite.

Happy SQL Server 2016 SP2

Publié dans SQL Server | Tagué , | Laisser un commentaire