Datenbankindizes reorganisieren
Die automatische Bereinigungsfunktion von Connect entfernt eine große Anzahl von Datensätzen, was zu einer Fragmentierung der entsprechenden Datenbankindizes führt. Um dieses Problem zu beheben, sollte das folgende SQL-Skript für die tägliche Datenbankwartung eingeplant werden:
DBCC INDEXDEFRAG(0, 'ContextIndices') DBCC INDEXDEFRAG(0, 'ContextLogs') DBCC INDEXDEFRAG(0, 'Contexts') DBCC INDEXDEFRAG(0, 'PerformanceRecords')
Um alle anwendungsspezifischen Indizes von Connect zu reorganisieren, verwenden Sie das folgende SQL-Skript:
DBCC INDEXDEFRAG(0, 'ConnectObjects') DBCC INDEXDEFRAG(0, 'ConnectObjectsHistory') DBCC INDEXDEFRAG(0, 'ContextIndices') DBCC INDEXDEFRAG(0, 'ContextLogs') DBCC INDEXDEFRAG(0, 'Contexts') DBCC INDEXDEFRAG(0, 'PerformanceRecords') DBCC INDEXDEFRAG(0, 'ScenarioRegistrations') DBCC INDEXDEFRAG(0, 'SecureStoreItems')
Löschen veralteter Daten
Um alle Kontexte und Leistungsdatensätze, die vor einem bestimmten Datum erstellt wurden, zu löschen, kann das folgende Skript verwendet werden. Beachten Sie, dass fragmentierte Indizes während des Löschvorgangs zu Performanceproblemen führen können. Defragmentieren Sie bei Bedarf diese Indizes vor dem Löschen der Daten. Stellen Sie sicher, dass Sie das Datum in der ersten Zeile des Skripts nach Bedarf anpassen:
DECLARE @DeleteBefore DATETIME = CAST('2000-12-31T00:00:00' AS DATETIME); DELETE FROM Contexts WHERE FlowContextId IN (SELECT Id FROM Contexts WHERE FlowContextId IS NULL AND CreateTime < @DeleteBefore); DELETE FROM ContextIndices WHERE FlowContextId IN (SELECT Id FROM Contexts WHERE FlowContextId IS NULL AND CreateTime < @DeleteBefore); DELETE FROM ContextLogs WHERE FlowContextId IN (SELECT Id FROM Contexts WHERE FlowContextId IS NULL AND CreateTime < @DeleteBefore); DELETE FROM Contexts WHERE FlowContextId IS NULL AND CreateTime < @DeleteBefore; DELETE FROM PerformanceRecords WHERE [Time] < @DeleteBefore; DBCC INDEXDEFRAG(0, 'Contexts') DBCC INDEXDEFRAG(0, 'ContextIndices') DBCC INDEXDEFRAG(0, 'ContextLogs') DBCC INDEXDEFRAG(0, 'PerformanceRecords')
Planen Sie die Reorganisation von Indizes bei Verwendung von Azure SQL Database
Schritt 1: Azure Automation-Konto einrichten
Wenn Sie kein bestehendes Azure Automation-Konto haben, müssen Sie ein neues einrichten. Gehen Sie wie folgt vor:
Navigieren Sie zum Azure-Portal.
Klicken Sie auf "Ressource erstellen" und suchen Sie nach "Automation".
Wählen Sie "Automation" und klicken Sie auf "Erstellen".
Geben Sie einen eindeutigen Namen für Ihr Automatisierungskonto ein.
Wählen Sie eine bestehende Ressourcengruppe aus oder erstellen Sie eine neue Gruppe.
Wählen Sie die entsprechende Azure-Region.
Klicken Sie auf "Bewerten + Erstellen" und dann auf "Erstellen".
Schritt 2: Anmeldeinformationen für den Datenbankzugriff hinzufügen
Navigieren Sie im Azure-Portal zu Ihrem neu erstellten Automation-Konto.
Wählen Sie unter Freigegebene Ressourcem die Option Anmeldeinformationen.
Klicken Sie auf "Anmeldeinformationen hinzufügen".
Geben Sie einen Namen ein (z. B. "ConnectDatabaseCredentials").
Geben Sie den Benutzernamen und das Kennwort des Datenbankadministrators ein und bestätigen Sie das Kennwort durch erneute Eingabe.
Klicken Sie auf "Erstellen".
Schritt 3: Erstellen eines Runbooks
Navigieren Sie im Azure-Portal zu Ihrem neu erstellten Automation-Konto.
Wählen Sie unter Prozessautomatisierung die Option Runbooks.
Klicken Sie auf "Runbook erstellen".
Geben Sie einen Namen ein (z. B. "Optimize-ConnectDatabase").
Wählen Sie den Runbooktyp “PowerShell” aus.
Wählen Sie die Laufzeitversion “7.2” aus.
Klicken Sie auf "Bewerten + Erstellen" und dann auf "Erstellen".
Fürgen Sie den untenstehenden Code in den Runbook-Editor ein.
Klicken Sie auf "Speichern".
<# .SYNOPSIS Performs maintenance activities for a Connect database .DESCRIPTION This runbook performs maintenance activities for a Connect database. .PARAMETER SqlServer Name of the SqlServer .PARAMETER SqlServerPort Port of the SqlServer (Default: 1433) .PARAMETER Database Name of the database .PARAMETER CredentialName Name of the Automation PowerShell credential setting from the Automation asset store. This setting stores the username and password for the SQL Azure server #> param( [parameter(Mandatory=$True)] [string] $SqlServer, [parameter(Mandatory=$False)] [int] $SqlServerPort = 1433, [parameter(Mandatory=$True)] [string] $Database, [parameter(Mandatory=$True)] [string] $CredentialName ) $TimestampFormat = "yyyy-MM-dd hhh:mm:ss" # Get the stored username and password from the Automation credential $SqlCredential = Get-AutomationPSCredential -Name $CredentialName if ($SqlCredential -eq $null) { throw "Could not retrieve '$CredentialName' credential asset. Check that you created this first in the Automation service." } $SqlUsername = $SqlCredential.UserName $SqlPassword = $SqlCredential.GetNetworkCredential().Password $SqlConnectionString = "Server=tcp:$SqlServer,$SqlServerPort;Database=$Database;User ID=$SqlUsername;Password=$SqlPassword;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" # Create the list of SQL commands to execute $Commands = @( "DBCC INDEXDEFRAG(0, 'ConnectObjects')", "DBCC INDEXDEFRAG(0, 'ConnectObjectsHistory')", "DBCC INDEXDEFRAG(0, 'ContextIndices')", "DBCC INDEXDEFRAG(0, 'ContextLogs')", "DBCC INDEXDEFRAG(0, 'Contexts')", "DBCC INDEXDEFRAG(0, 'PerformanceRecords')", "DBCC INDEXDEFRAG(0, 'ScenarioRegistrations')", "DBCC INDEXDEFRAG(0, 'SecureStoreItems')" ) # Execute SQL commands from list Try { $SqlConnection = New-Object System.Data.SqlClient.SqlConnection($SqlConnectionString) $SqlConnection.Open() foreach ($Command in $Commands) { Write-Output "$(Get-Date -Format "$TimestampFormat") Executing SQL command: $Command" $SqlCommand = $SqlConnection.CreateCommand() $SqlCommand.CommandText = $Command $SqlCommand.CommandTimeout=1500 Try { $DataSet = New-Object System.Data.DataSet $DataAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($SqlCommand) [void] $DataAdapter.fill($DataSet) foreach ($DataTable in $DataSet.Tables) { $DataTable | Format-Table -RepeatHeader } Write-Output "$(Get-Date -Format "$TimestampFormat") Successful." Write-Output "" } Catch { Write-Error "$(Get-Date -Format "$TimestampFormat") SQL command '$Command' failed." } Write-Output "" } } finally { $SqlConnection.Close() } Write-Output "Finished."
Schritt 4: Testen und veröffentlichen Sie das Runbook
Wählen Sie die Registerkarte "Testbereich".
Geben Sie auf der linken Seite die Parameter ein:
SQLSERVER: Der Hostname des SQL-Servers
DATABASE: Der Name der Datenbank
CREDENTIALNAME: Der Name der SQL Server-Anmeldeinformationen (z. B. "ConnectDatabaseCredentials")Klicken Sie auf “Start”, um das Runbook manuell zu testen.
Sobald der Test erfolgreich abgeschlossen ist, klicken Sie auf das "X" in der oberen linken Ecke, um zum Editor zurückzukehren. Der Browser zeigt ein Dialogfeld an, in dem Sie aufgefordert werden, diese Aktion zu bestätigen.
Klicken Sie auf "Veröffentlichen" und dann auf "Ja".
Schritt 5: Einen Zeitplan erstellen
Navigieren Sie im Azure-Portal zu Ihrem Runbook.
Wählen Sie unter Ressourcen die Option Zeitpläne.
Klicken Sie auf "Planen".
Wählen Sie einen Zeitplan aus oder erstellen Sie eine neuen Zeitplan.
Klicken Sie auf "Parameter".
Geben Sie die Parameter ein:
SQLSERVER: Der Hostname des SQL-Servers
DATABASE: Der Name der Datenbank
CREDENTIALNAME: Der Name der SQL Server-Anmeldeinformationen (z. B. "ConnectDatabaseCredentials")Klicken Sie auf "OK".
Klicken Sie auf "OK".