Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagesql
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

Wenn Um alle Kontexte und Leistungsdatensätze, die vor einem bestimmten Datum erstellt wurden, gelöscht werden sollenzu löschen, kann das folgende Skript verwendet werden. Beachten Sie, dass fragmentierte Indizes während des Löschvorgangs zu Leistungseinbußen 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:

Code Block
languagesql
DECLARE @DeleteBefore DATETIME = CAST('2000-12-31T00:00:00' AS DATETIME);

DELETE FROM Contexts WHERE ContextType = 'ElementContext' AND FlowContextId IN (SELECT Id FROM Contexts WHERE FlowContextIdContextType IS= NULL'FlowContext' AND CreateTime < @DeleteBefore);
DELETE FROM ContextIndices WHERE FlowContextId IN (SELECT Id FROM Contexts WHERE FlowContextIdContextType IS= NULL'FlowContext' AND CreateTime < @DeleteBefore);
DELETE FROM ContextLogs WHERE FlowContextId IN (SELECT Id FROM Contexts WHERE FlowContextIdContextType IS= NULL'FlowContext' AND CreateTime < @DeleteBefore);
DELETE FROM Contexts WHERE FlowContextIdContextType IS= NULL'FlowContext' 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')

Sollen alle Kontexte und Leistungsdatensätze gelöschte werden, kann dieser Vorgang durch die Verwendung von TRUNCATE beschleunigt werden:

Code Block
languagesql
TRUNCATE TABLE Contexts;
TRUNCATE TABLE ContextLogs;
TRUNCATE TABLE ContextIndices;
TRUNCATE TABLE PerformanceRecords;

DBCC INDEXDEFRAG(0, 'Contexts')
DBCC INDEXDEFRAG(0, 'ContextIndices')
DBCC INDEXDEFRAG(0, 'ContextLogs')
DBCC INDEXDEFRAG(0, 'PerformanceRecords')

Verkleinern der Datenbank

Das Löschen einer großen Menge an Daten führt nicht unbedingt dazu, dass auch die Größe der Datenbank abnimmt. In diesem Fall empfiehlt es sich, die Datenbank anzuweisen, den nicht mehr benötigten Platz wieder freizugeben. Dies lässt sich mit folgendem SQL-Skript erreichen:

Code Block
languagesql
DBCC SHRINKDATABASE(0, 10) WITH WAIT_AT_LOW_PRIORITY (ABORT_AFTER_WAIT = SELF)

Der Wert 10 bezieht sich hier auf den Prozentsatz an unbenutzten Speicherplatz, den die Datenbank weiterhin belegen darf. Dies ermöglicht das Einfügen neuer Daten, ohne dass zusätzlicher Speicher reserviert werden muss. Nachdem die Datenbank verkleinert wurde, kann es sinnvoll sein, eine Reorganisation der Indizes durchzuführen.

Planen Sie die Reorganisation von Indizes bei Verwendung von Azure SQL Database

...

  1. Navigieren Sie zum Azure-Portal.

  2. Klicken Sie auf "Eine Ressource erstellen" und suchen Sie nach "AutomatisierungAutomation".

  3. Wählen Sie "AutomatisierungAutomation" und klicken Sie auf "Erstellen".

  4. Geben Sie einen eindeutigen Namen für Ihr Automatisierungskonto ein.

  5. Wählen Sie eine bestehende Ressourcengruppe aus oder erstellen Sie eine neue Gruppe.

  6. Wählen Sie die entsprechende Azure-Region.

  7. Klicken Sie auf "Überprüfen Bewerten + Erstellen" und dann auf "Erstellen".

...

  1. Navigieren Sie im Azure-Portal zu Ihrem neu erstellten Automation-Konto.

  2. Wählen Sie unter Shared Resources Freigegebene Ressourcem die Option CredentialsAnmeldeinformationen.

  3. Klicken Sie auf "Anmeldeinformationen hinzufügen".

  4. Geben Sie einen Namen ein (z. B. "ConnectDatabaseCredentials").

  5. Geben Sie den Benutzernamen und das Kennwort des Datenbankadministrators ein und bestätigen Sie das Kennwort durch erneute Eingabe.

  6. Klicken Sie auf "Erstellen".

...

  1. Navigieren Sie im Azure-Portal zu Ihrem neu erstellten Automation-Konto.

  2. Wählen Sie unter Prozessautomatisierung die Option Runbooks.

  3. Klicken Sie auf "Katalog durchsuchen" und suchen Sie nach "Fragmentierung"Runbook erstellen".

  4. Geben Sie einen Namen ein (z. B. "Optimize-ConnectDatabase").

  5. Wählen Sie den Runbooktyp “PowerShell” aus.

  6. Wählen Sie die Vorlage "Indiziert Tabellen in einer Azure-Datenbank, wenn sie eine hohe Fragmentierung aufweisen"Laufzeitversion “7.2” aus.

  7. Klicken Sie auf "Bewerten + Erstellen" und dann auf "Erstellen".

  8. Fürgen Sie den untenstehenden Code in den Runbook-Editor ein.

  9. Klicken Sie auf "AuswählenSpeichern".

  10. Geben Sie einen Namen ein (z. B. "IndexHighFragmentationTables").

  11. Klicken Sie auf "Importieren".

  12. Navigieren Sie zur ersten Codezeile, die mit "workflow" beginnt (unterhalb der Kommentare).

  13. Ersetzen Sie den Workflow-Namen "Update-SQLIndexRunbook" durch den Namen Ihres Runbooks (z. B. "IndexHighFragmentationTables").

  14. Klicken Sie auf "Speichern".

Code Block
languagepowershell
<#
.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 SHRINKDATABASE(0, 10) WITH WAIT_AT_LOW_PRIORITY (ABORT_AFTER_WAIT = SELF)",
    "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

  1. Wählen Sie die Registerkarte "TestTestbereich".

  2. Geben Sie auf der linken Seite die Parameter ein:
    SQLSERVER: Der Hostname des SQL-Servers
    DATABASE: Der Name der Datenbank
    SQLCREDENTIALNAMECREDENTIALNAME: Der Name der SQL Server-Anmeldeinformationen (z. B. "ConnectDatabaseCredentials")

  3. Klicken Sie auf Start“Start”, um das Runbook manuell zu testen.

  4. 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.

  5. Klicken Sie auf "Veröffentlichen" und dann auf "Ja".

...

  1. Navigieren Sie im Azure-Portal zu Ihrem Runbook.

  2. Wählen Sie unter Ressourcen die Option Zeitpläne.

  3. Klicken Sie auf "Planen".

  4. Wählen Sie eine Scheudle einen Zeitplan aus oder erstellen Sie eine neueneuen Zeitplan.

  5. Klicken Sie auf "Parameter".

  6. Geben Sie die Parameter ein:
    SQLSERVER: Der Hostname des SQL-Servers
    DATABASE: Der Name der Datenbank
    SQLCREDENTIALNAMECREDENTIALNAME: Der Name der SQL Server-Anmeldeinformationen (z. B. "ConnectDatabaseCredentials")

  7. Klicken Sie auf "OK".

  8. Klicken Sie auf "OK".

...