Freigeben über


Sichern und Wiederherstellen der Controllerdatenbank

Wenn Sie Azure Arc-Datendienste bereitstellen, ist der Azure Arc-Datencontroller eine der wichtigsten Komponenten, die bereitgestellt werden. Zu den Funktionen des Datencontroller gehören:

  • Bereitstellen, Aufheben der Bereitstellung und Aktualisierung von Ressourcen
  • Koordinieren Sie die meisten Aktivitäten für von Azure Arc aktivierte SQL Managed Instance, z. B. Upgrades, Aufskalieren usw.
  • Erfassen Sie die Abrechnungs- und Nutzungsinformationen jeder von Arc SQL verwalteten Instanz.

Um oben genannte Funktionen auszuführen, muss der Datenverantwortliche eine Bestandsaufnahme aller aktuellen verwalteten Arc SQL-Instanzen, Abrechnungen, Nutzung und aktuellen Status all dieser SQL-verwalteten Instanzen speichern. Alle diese Daten werden in einer Datenbank namens controller gespeichert, die in der SQL Server-Instanz aufgerufen wird, die im controldb-0-Pod bereitgestellt wird.

In diesem Artikel erfahren Sie, wie Sie die Controllerdatenbank sichern.

Sichern der Datencontrollerdatenbank

Im Rahmen der integrierten Funktionen wird die Datencontrollerdatenbank controller alle 5 Minuten automatisch gesichert, sobald Sicherungen aktiviert sind. So aktivieren Sie Sicherungen:

  • Erstellen Sie backups-controldb PersistentVolumeClaim mit einer Speicherklasse, die ReadWriteMany-Zugriff unterstützt:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: backups-controldb
  namespace: <namespace>
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 15Gi
  storageClassName: <storage-class>
  • Bearbeiten Sie die benutzerdefinierte Ressourcenspezifikation DataController, um eine Speicherdefinition backups einzuschließen:
storage:
    backups:
      accessMode: ReadWriteMany
      className: <storage-class>
      size: 15Gi
    data:
      accessMode: ReadWriteOnce
      className: managed-premium
      size: 15Gi
    logs:
      accessMode: ReadWriteOnce
      className: managed-premium
      size: 10Gi

Die .bak-Dateien für die controller-Datenbank werden auf dem backups-Volume des controldb-Pods unter /var/opt/backups/mssql gespeichert.

Wiederherstellen der Controllerdatenbank

Es gibt zwei Arten von Wiederherstellung:

  1. controller ist beschädigt, und Sie müssen nur die Datenbank wiederherstellen
  2. Der gesamte Speicher, der die controller-Daten und Protokolldateien enthält, ist beschädigt/verschwunden, und Sie müssen wiederherstellen

Szenario der beschädigten Controllerdatenbank

In diesem Szenario sind alle Pods in Betrieb, Sie können eine Verbindung zum controldb-SQL Server herstellen, und es liegt möglicherweise eine Störung in der controller-Datenbank vor. Sie müssen die Datenbank nur aus einer Sicherung wiederherstellen.

Führen Sie die folgenden Schritte aus, um die Controllerdatenbank aus einer Sicherung wiederherzustellen, wenn der SQL Server weiterhin auf dem controldb-Pod ausgeführt wird und Sie eine Verbindung damit herstellen können:

  1. Überprüfen Sie die Verbindung mit SQL Server-Pod, in der die controller-Datenbank gehostet wird.

    • Rufen Sie zunächst die Anmeldeinformationen für den geheimen Schlüssel ab. controller-system-secret ist der geheime Schlüssel, der die Anmeldeinformationen für das system-Benutzerkonto enthält, das zum Herstellen einer Verbindung mit der SQL-Instanz verwendet werden kann. Führen Sie den folgenden Befehl aus, um den geheimen Inhalt abzurufen:

      kubectl get secret controller-system-secret --namespace [namespace] -o yaml
      

      Beispiel:

      kubectl get secret controller-system-secret --namespace arcdataservices -o yaml
      
    • Decodieren Sie die base64-codierten Anmeldeinformationen. Der Inhalt der Yaml-Datei des Geheimnis controller-system-secret enthält ein password und username. Sie können ein beliebiges Base64-Decodertool verwenden, um den Inhalt des password-Codes zu decodieren.

    • Überprüfen Sie die Konnektivität: Führen Sie mit den entschlüsselten Anmeldeinformationen einen Befehl wie SELECT @@SERVERNAME aus, um die Konnektivität mit dem SQL Server zu überprüfen.

      kubectl exec controldb-0 -n <namespace> -c  mssql-server -- /opt/mssql-tools/bin/sqlcmd -S localhost -U system -P "<password>" -Q "SELECT @@SERVERNAME"
      
      kubectl exec controldb-0 -n contosons -c  mssql-server -- /opt/mssql-tools/bin/sqlcmd -S localhost -U system -P "<password>" -Q "SELECT @@SERVERNAME"
      
  2. Skalieren Sie den Controller ReplicaSet auf 0 Replikate wie folgt:

    kubectl scale --replicas=0 rs/control -n <namespace>`
    

    Beispiel:

    kubectl scale --replicas=0 rs/control -n arcdataservices
    
  3. Stellen Sie eine Verbindung mit dem controldb-SQL Server wie system wie in Schritt 1 beschrieben her.

  4. Löschen Sie die beschädigte Controllerdatenbank mit T-SQL:

    DROP DATABASE controller
    
  5. Stellen Sie die Datenbank aus der Sicherung wieder her – nachdem die beschädigte controllerdb gelöscht wurde. Beispiel:

    RESTORE DATABASE test FROM DISK = '/var/opt/backups/mssql/<controller backup file>.bak'
    WITH MOVE 'controller' to '/var/opt/mssql/data/controller.mdf
    ,MOVE 'controller' to '/var/opt/mssql/data/controller_log.ldf' 
    ,RECOVERY;
    GO
    
  6. Skalieren Sie den Controller ReplicaSet auf 1 Replikat.

    kubectl scale --replicas=1 rs/control -n <namespace>
    

    Beispiel:

    kubectl scale --replicas=1 rs/control -n arcdataservices
    

Fehlerhaftes Speicherszenario

In diesem Szenario ist der Speicher, auf dem die Daten des Datencontrollers und die Protokolldateien gespeichert sind, beschädigt, und es wurde ein neuer Speicher bereitgestellt.

Führen Sie die folgenden Schritte aus, um die Controllerdatenbank aus einer Sicherung mit neuem Speicher für das controldb-StatefulSet wiederherzustellen:

  1. Stellen Sie sicher, dass Sie über eine Sicherung des letzten bekannten guten Zustands der controller-Datenbank verfügen

  2. Skalieren Sie den Controller ReplicaSet auf 0 Replikate wie folgt:

    kubectl scale --replicas=0 rs/control -n <namespace>
    

    Beispiel:

    kubectl scale --replicas=0 rs/control -n arcdataservices
    
  3. Skalieren Sie die controldb-StatefulSet auf 0 Replikate wie folgt:

    kubectl scale --replicas=0 sts/controldb -n <namespace>
    

    Beispiel:

    kubectl scale --replicas=0 sts/controldb -n arcdataservices`
    
  4. Erstellen Sie ein Kubernetes-Geheimnis namens controller-sa-secret mit dem folgenden YAML:

    apiVersion: v1
    kind: Secret
    metadata:
      name: controller-sa-secret
      namespace: <namespace>
    type: Opaque
    data:
      password: <base64 encoded password>
    
  5. Bearbeiten Sie das controldb-StatefulSet, um ein controller-sa-secret-Volume und die entsprechende Volume-Einbindung (/var/run/secrets/mounts/credentials/mssql-sa-password) in den Container mssql-server einzuschließen, indem Sie den kubectl edit sts controldb -n <namespace>-Befehl verwenden.

  6. Erstellen Sie neue Daten (data-controldb) und Protokolle (logs-controldb), persistente Volumenansprüche für den controldb-Pod wie folgt:

     apiVersion: v1
     kind: PersistentVolumeClaim
     metadata:
       name: data-controldb
       namespace: <namespace>
     spec:
       accessModes:
         - ReadWriteOnce
       resources:
         requests:
           storage: 15Gi
       storageClassName: <storage class>
    
     ---
     apiVersion: v1
     kind: PersistentVolumeClaim
     metadata:
       name: logs-controldb
       namespace: <namespace>
     spec:
       accessModes:
         - ReadWriteOnce
       resources:
         requests:
           storage: 10Gi
       storageClassName: <storage class>
    
  7. Skalieren Sie das controldb-StatefulSet mit folgendem Replikat auf 1:

    kubectl scale --replicas=1 sts/controldb -n <namespace>
    
  8. Stellen Sie eine Verbindung mit dem controldb-SQL-Server her, da sa das Kennwort im zuvor erstellten controller-sa-secret-Geheimnis verwendet.

  9. Erstellen Sie eine system-Anmeldung mit Sysadmin-Rolle mithilfe des Kennworts im controller-system-secret-Kubernetes-Geheimnis wie folgt:

    CREATE LOGIN [system] WITH PASSWORD = '<password-from-secret>'
    ALTER SERVER ROLE sysadmin ADD MEMBER [system]
    
  10. Stellen Sie die Sicherung mit dem Befehl RESTORE wie folgt wieder her:

RESTORE DATABASE [controller] FROM DISK = N'/var/opt/backups/mssql/<controller backup file>.bak' WITH FILE = 1
  1. Erstellen Sie eine controldb-rw-user-Anmeldung mit dem Kennwort im controller-db-rw-secret-Geheimnis CREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>' und ordnen Sie sie dem vorhandenen controldb-rw-user Benutzer im Controller DB-ALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user] zu.

  2. Deaktivieren Sie die sa-Anmeldung mit TSQL - ALTER LOGIN [sa] DISABLE.

  3. Bearbeiten Sie das controldb-StatefulSet, um die controller-sa-secret-Volume und die entsprechende Volume-Bereitstellung zu entfernen.

  4. Löschen des controller-sa-secret-Schlüssels.

  5. Skalieren Sie das Controller ReplicaSet mithilfe des kubectl scale-Befehls auf 1 Replikat.

Azure Data Studio Dashboards