web-dev-qa-db-fra.com

Quel est le bon outil pour traiter les gros fichiers .xel (journaux d'événements étendus SQL Server)?

Mon objectif est d'auditer toutes les requêtes sur une instance, qui les exécute et d'où, combien de lectures, afin de consolider/migrer sur une autre instance.

Compris le meilleur moyen est via des événements étendus vers des fichiers .xel, sur 2 semaines, copiez-les et analysez sur mon bureau bien spécifié. Configurez la capture avec le nombre minimal de détails (champs), donc ne pouvez vraiment pas la rendre plus petite - environ 12 Go en 12 fichiers. Utiliser "Fusionner les fichiers d'événements étendus" dans SSMS pour charger les fichiers .xel et traiter comme détaillé dans https://docs.Microsoft.com/en-us/sql/relational-databases/extended-events/advanced- affichage-des-données-cibles-des-événements-étendus-dans-le-serveur-sql? view = sql-server-2017

Est-ce vraiment la meilleure façon de procéder? Existe-t-il un meilleur outil pour charger les fichiers? C'est vraiment lent avec SSMS 17.7 - exemple: avec seulement 4 filtres jusqu'à présent (avant d'entrer dans le regroupement et les agrégats), il a fallu plus de 12h pour arriver à passer au crible 50% des journaux.

7
Razvan Zoitanu

Pour les fichiers de trace XE volumineux, j'utilise des outils personnalisés avec QueryableXEventData . J'ai trouvé que c'était beaucoup plus rapide que l'analyse XML dans T-SQL.

Vous trouverez ci-dessous un PowerShell de base qui importe les champs et actions sélectionnés à partir d'un rpc_completed trace d'événement dans une table par lots de 10K. Vous devrez inclure un Add-Type commande pour le Microsoft.SqlServer.XE.Core.dll et Microsoft.SqlServer.XEvent.Linq.dll assemblys, qui se trouveront dans votre dossier d'installation de SQL Server et dont l'emplacement exact variera en fonction de la version de SQL et de l'emplacement d'installation choisi.

$SharedPath = "C:\Program Files\Microsoft SQL Server\140\Shared";
$SqlInstanceName = "";

$xeCore = [System.IO.Path]::Combine($SharedPath, "Microsoft.SqlServer.XE.Core.dll");
$xeLinq = [System.IO.Path]::Combine($SharedPath, "Microsoft.SqlServer.XEvent.Linq.dll");
Add-Type -Path $xeLinq;

if( [System.IO.File]::Exists($xeCore) )
{
    Add-Type -Path $xeCore;
}

Notez qu'il existe des collections Fields et Actions distinctes dans la classe PublishedEvent , vous devrez donc extraire les valeurs de la connexion appropriée.

# create target table
$connectionString = "Data Source=.;Initial Catalog=tempdb;Integrated Security=SSPI"
$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$command = New-Object System.Data.SqlClient.SqlCommand(@"
CREATE TABLE dbo.rpc_completed(
      event_name sysname
    , timestamp datetimeoffset
    , statement nvarchar(MAX)
    , username nvarchar(256)
);
"@, $connection)
$connection.Open()
[void]$command.ExecuteNonQuery()
$connection.Close()

# data table for SqlBulkCopy
$dt = New-Object System.Data.DataTable
[void]$dt.Columns.Add("event_name", [System.Type]::GetType("System.String"))
$dt.Columns["event_name"].MaxLength = 256
[void]$dt.Columns.Add("timestamp", [System.Type]::GetType("System.DateTimeOffset"))
[void]$dt.Columns.Add("statement", [System.Type]::GetType("System.String"))
[void]$dt.Columns.Add("username", [System.Type]::GetType("System.String"))
$dt.Columns["username"].MaxLength = 128
$dt.Columns["statement"].MaxLength = -1

$events = new-object Microsoft.SqlServer.XEvent.Linq.QueryableXEventData("D:\TraceFiles\Log\rpc_completed*.xel")

# import XE events from file(s)
$bcp = New-Object System.Data.SqlClient.SqlBulkCopy($connectionString)
$bcp.DestinationTableName = "dbo.rpc_completed"
$eventCount = 0
foreach($event in $events) {
    $eventCount += 1
    $row = $dt.NewRow()
    $dt.Rows.Add($row)
    $row["event_name"] = $event.Name
    $row["timestamp"] = $event.Timestamp
    $row["statement"] = $event.Fields["statement"].Value
    # username is a collected action
    $row["username"] = $event.Actions["username"].Value
    if($eventCount % 10000 -eq 0) {
        $bcp.WriteToServer($dt)
        $dt.Rows.Clear()
    }
}
$bcp.WriteToServer($dt) # write last batch
Write-Host "$eventCount records imported"
8
Dan Guzman

Le moyen le plus rapide pour lire et analyser XEvents est actuellement en utilisant la nouvelle bibliothèque XELite de Microsoft. Vous pouvez le trouver ici: XELite dans NuGet.org Si vous êtes un gars PowerShell, vous pouvez utiliser le module SQLServer mis à jour qui est basé sur la bibliothèque XELite. Vous pouvez le trouver dans la galerie: SQLServer .

1
Tomer - MSFT