Azure SQL Database – Créer un xEvent

Un des freins à l’adoption remonté par mes clients concernant Azure SQL Databases est sans conteste la perte de maitrise de la part du DBA.

Même si je fais partie des « vieux » DBA, j’ai appris que quand le vent souffle il est préférable de construire un moulin plutôt qu’un mur. Depuis plus d’une décennie déjà un pan de notre activité a disparue avec la virtualisation. Et cela devrait continuer avec la containerisation.

Et pour autant, les DBAs ont autant de travail. Il faut dire que le nombre d’instances / bases explose, les types de stockage de multiplient avec en point de mire le fameux « Big Data ».

Bref, je pense que notre métier ne va pas disparaitre, mais de toute évidence il se transforme. D’administrateur de bases de données, nous devons devenir administrateur de données.

En première ligne des « nouveautés » à appréhender figure Azure SQL Databses. Nouveauté avec des guillemets car cela fait 10 ans (la maturité ?) que le service existe … Oui, il est présent depuis le lancement de Azure, SQL Server faisait partie des premières offres de services !!!

Avec SQL Azure, les tâches à effectuer sont légèrement différentes. Je reste persuadé que le travail d’optimisation opéré par le DBA devient crucial une fois basculé sur du PaaS. Et il faut avouer que l’optimisation, le gain de performance, offre une certaine satisfaction, voire reconnaissance (en revanche, on ne m’a jamais félicité pour un backup réussi !).

Corolaire, il faut auparavant déterminer les goulets d’étranglement, les requêtes posant des problèmes de performance, un nombre de lectures logiques trop important… Le portail Azure propose des fonctionnalités, mais ne brusquons par le DBA, capitalisons sur les acquis …

Les évènements étendus …

Cela fait un certain temps que je vous suggère de franchir le pas, de passer du Profiler au xEvents.

Il ne vous aura pas échappé que les sessions d’évènement sont disponibles dans la base de données à compter du moment où vous êtes connectés sur un « serveur » Azure SQL.

Il est possible de stocker le résultat de la trace en mémoire, le fameux « Ring buffer » mais également sous forme de fichier… Mais comment traiter la notion de « fichier » lorsque l’on n’a pas accès au système d’exploitation ?

Azure propose la notion de Conteneurs dans un compte de stockage. Et c’est précisément cela que nous allons utiliser.

Dans un premier temps, il faut créer une master key et un credential pour donner accès au compte de stockage. Depuis SQL Server 2016, il est possible de créer un credential dans une base de données.

CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘aSuperS3cretP@ssw0rd!’
GO


CREATE DATABASE SCOPED CREDENTIAL
        [https://conseilitazurefile.blob.core.windows.net/sqlserver-xevent-files]
    WITH
        IDENTITY = ‘SHARED ACCESS SIGNATURE’,  
        SECRET = ‘sv=………………’
    ;
GO

Une fois fait, il suffit de créer la session d’évènement étendu. Notez le « ON DATABASE ».

CREATE EVENT SESSION [Long running Queries] ON DATABASE 
ADD EVENT sqlserver.blocked_process_report(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.query_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.username)),
ADD EVENT sqlserver.rpc_completed(SET collect_statement=(1)
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.query_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.username)
    WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [package0].[greater_than_equal_uint64]([duration],(250000)))),
ADD EVENT sqlserver.sql_batch_completed(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.query_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.username)
    WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [package0].[greater_than_equal_uint64]([duration],(250000))))
ADD TARGET package0.event_file(SET filename=N’https://conseilitazurefile.blob.core.windows.net/sqlserver-xevent-files/adventureworks-
ongrunningqueires.xel’)
WITH (MAX_MEMORY = 10 MB, MAX_DISPATCH_LATENCY = 10 SECONDS)

Le code pour démarrer la session est identique, au scope près.

ALTER EVENT SESSION [Long running Queries] ON DATABASE
STATE = START;

Tous les évènements ne sont pas disponibles sur SQLAzure, contrairement à SQL Server. La requête suivante permet de les lister.

SELECT
        o.object_type,
        p.name         AS [package_name],
        o.name         AS [db_object_name],
        o.description  AS [db_obj_description]
    FROM
                   sys.dm_xe_objects  AS o
        INNER JOIN sys.dm_xe_packages AS p  ON p.guid = o.package_guid
    WHERE
        o.object_type in
            (
            ‘action’,  ‘event’,  ‘target’
            )
    ORDER BY
        o.object_type,
        p.name,
        o.name;

L’évènement Blocked Process Report comporte un paramétrage côté serveur, mais qui ici n’est pas accessible. La valeur est fixée à 20 secondes.

Pour lire les données, la fonction est identique : sys.fn_xe_file_target_read_file :

SELECT
        *,
        CAST(event_data AS XML) AS [event_data_XML]  
    FROM
        sys.fn_xe_file_target_read_file
            (
                ‘https://conseilitazurefile.blob.core.windows.net/sqlserver-xevent-files/adventureworks-longrunningqueires’,
                null, null, null
            );
GO

Le champs XML vous donnera le détail des informations de l’évènement, comme auparavant …

Comme quoi les « vieux » outils ne sont pas à jeter lors du passage au Cloud !

Happy xEvents

A propos Christophe

Consultant SQL Server Formateur certifié Microsoft MVP SQL Server MCM/MCSM SQL Server
Cet article, publié dans Azure, Non classé, SQL Azure, est tagué , . Ajoutez ce permalien à vos favoris.

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s