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, dieReadWriteMany
-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 Speicherdefinitionbackups
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:
controller
ist beschädigt, und Sie müssen nur die Datenbank wiederherstellen- 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:
Ü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 dassystem
-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 einpassword
undusername
. Sie können ein beliebiges Base64-Decodertool verwenden, um den Inhalt despassword
-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"
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
Stellen Sie eine Verbindung mit dem
controldb
-SQL Server wiesystem
wie in Schritt 1 beschrieben her.Löschen Sie die beschädigte Controllerdatenbank mit T-SQL:
DROP DATABASE controller
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
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:
Stellen Sie sicher, dass Sie über eine Sicherung des letzten bekannten guten Zustands der
controller
-Datenbank verfügenSkalieren 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
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`
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>
Bearbeiten Sie das
controldb
-StatefulSet, um eincontroller-sa-secret
-Volume und die entsprechende Volume-Einbindung (/var/run/secrets/mounts/credentials/mssql-sa-password
) in den Containermssql-server
einzuschließen, indem Sie denkubectl edit sts controldb -n <namespace>
-Befehl verwenden.Erstellen Sie neue Daten (
data-controldb
) und Protokolle (logs-controldb
), persistente Volumenansprüche für dencontroldb
-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>
Skalieren Sie das
controldb
-StatefulSet mit folgendem Replikat auf 1:kubectl scale --replicas=1 sts/controldb -n <namespace>
Stellen Sie eine Verbindung mit dem
controldb
-SQL-Server her, dasa
das Kennwort im zuvor erstelltencontroller-sa-secret
-Geheimnis verwendet.Erstellen Sie eine
system
-Anmeldung mit Sysadmin-Rolle mithilfe des Kennworts imcontroller-system-secret
-Kubernetes-Geheimnis wie folgt:CREATE LOGIN [system] WITH PASSWORD = '<password-from-secret>' ALTER SERVER ROLE sysadmin ADD MEMBER [system]
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
Erstellen Sie eine
controldb-rw-user
-Anmeldung mit dem Kennwort imcontroller-db-rw-secret
-GeheimnisCREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>'
und ordnen Sie sie dem vorhandenencontroldb-rw-user
Benutzer im Controller DB-ALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user]
zu.Deaktivieren Sie die
sa
-Anmeldung mit TSQL -ALTER LOGIN [sa] DISABLE
.Bearbeiten Sie das
controldb
-StatefulSet, um diecontroller-sa-secret
-Volume und die entsprechende Volume-Bereitstellung zu entfernen.Löschen des
controller-sa-secret
-Schlüssels.Skalieren Sie das Controller ReplicaSet mithilfe des
kubectl scale
-Befehls auf 1 Replikat.