Eseguire il backup e il ripristino del database controller
Quando si distribuiscono i servizi dati di Azure Arc, il controller di dati di Azure Arc è uno dei componenti più critici distribuiti. Le funzioni del titolare del trattamento dei dati includono:
- Effettuare il provisioning, il deprovisioning e aggiornare le risorse
- Orchestrare la maggior parte delle attività per Istanza gestita di SQL abilitate da Azure Arc, ad esempio aggiornamenti, aumento del numero di istanze e così via.
- Acquisire le informazioni di fatturazione e utilizzo di ogni istanza gestita di Arc SQL.
Per eseguire le funzioni precedenti, il titolare del trattamento dei dati deve archiviare un inventario di tutte le istanze gestite di Arc SQL correnti, la fatturazione, l'utilizzo e lo stato corrente di tutte queste istanze gestite di SQL. Tutti questi dati vengono archiviati in un database denominato controller
all'interno dell'istanza di SQL Server distribuita nel controldb-0
pod.
Questo articolo illustra come eseguire il backup del database controller.
Eseguire il backup del database del controller di dati
Come parte delle funzionalità predefinite, il backup del database controller
del controller di dati viene eseguito automaticamente ogni 5 minuti dopo l'abilitazione dei backup. Per abilitare i backup:
- Creare un
backups-controldb
PersistentVolumeClaim
oggetto con una classe di archiviazione che supportaReadWriteMany
l'accesso:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: backups-controldb
namespace: <namespace>
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 15Gi
storageClassName: <storage-class>
- Modificare la
DataController
specifica di risorsa personalizzata per includere unabackups
definizione di archiviazione:
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
I .bak
file per il controller
database vengono archiviati nel backups
volume del controldb
pod in /var/opt/backups/mssql
.
Ripristinare il database del controller
Esistono due tipi di ripristino possibili:
controller
è danneggiato ed è sufficiente ripristinare il database- l'intera risorsa di archiviazione che contiene i
controller
file di dati e di log è danneggiata/scomparsa ed è necessario ripristinare
Scenario di database controller danneggiato
In questo scenario, tutti i pod sono operativi, è possibile connettersi a controldb
SQL Server e potrebbe verificarsi un danneggiamento con il controller
database. È sufficiente ripristinare il database da un backup.
Seguire questa procedura per ripristinare il database controller da un backup, se SQL Server è ancora attivo e in esecuzione nel controldb
pod ed è possibile connettersi al database:
Verificare la connettività al pod di SQL Server che ospita il
controller
database.Recuperare prima di tutto le credenziali per il segreto.
controller-system-secret
è il segreto che contiene le credenziali per l'accountsystem
utente che può essere usato per connettersi all'istanza di SQL. Eseguire il comando seguente per recuperare il contenuto del segreto:kubectl get secret controller-system-secret --namespace [namespace] -o yaml
Ad esempio:
kubectl get secret controller-system-secret --namespace arcdataservices -o yaml
Decodificare le credenziali con codifica Base64. Il contenuto del file yaml del segreto
controller-system-secret
contiene unpassword
eusername
. È possibile usare qualsiasi strumento decodificatore base64 per decodificare il contenuto dipassword
.Verificare la connettività: con le credenziali decodificate, eseguire un comando come
SELECT @@SERVERNAME
per verificare la connettività a SQL Server.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"
Ridimensionare replicaset di controller fino a 0 repliche come indicato di seguito:
kubectl scale --replicas=0 rs/control -n <namespace>`
Ad esempio:
kubectl scale --replicas=0 rs/control -n arcdataservices
Connessione al
controldb
SQL Server comesystem
descritto nel passaggio 1.Eliminare il database del controller danneggiato usando T-SQL:
DROP DATABASE controller
Ripristinare il database dal backup: dopo l'eliminazione del file danneggiato
controllerdb
. Ad esempio: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
Ridimensionare replicaset controller eseguire il backup fino a 1 replica.
kubectl scale --replicas=1 rs/control -n <namespace>
Ad esempio:
kubectl scale --replicas=1 rs/control -n arcdataservices
Scenario di archiviazione danneggiato
In questo scenario, l'archiviazione che ospita i file di dati e di log del titolare del trattamento dei dati, presenta danneggiamento e ne è stato effettuato il provisioning ed è necessario ripristinare il database controller.
Seguire questa procedura per ripristinare il database del controller da un backup con una nuova risorsa di archiviazione per StatefulSet controldb
:
Assicurarsi di disporre di un backup dell'ultimo stato valido noto del
controller
databaseRidimensionare replicaset di controller fino a 0 repliche come indicato di seguito:
kubectl scale --replicas=0 rs/control -n <namespace>
Ad esempio:
kubectl scale --replicas=0 rs/control -n arcdataservices
Ridimensionare statefulSet
controldb
fino a 0 repliche, come indicato di seguito:kubectl scale --replicas=0 sts/controldb -n <namespace>
Ad esempio:
kubectl scale --replicas=0 sts/controldb -n arcdataservices`
Creare un segreto kubernetes denominato
controller-sa-secret
con il codice YAML seguente:apiVersion: v1 kind: Secret metadata: name: controller-sa-secret namespace: <namespace> type: Opaque data: password: <base64 encoded password>
Modificare StatefulSet
controldb
per includere un volume e ilcontroller-sa-secret
montaggio del volume corrispondente (/var/run/secrets/mounts/credentials/mssql-sa-password
) nel contenitore usandokubectl edit sts controldb -n <namespace>
ilmssql-server
comando .Creare nuove attestazioni di volume permanente di dati (
data-controldb
) e log (logs-controldb
) per ilcontroldb
pod come indicato di seguito: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>
Ridimensionare statefulSet
controldb
a 1 replica usando:kubectl scale --replicas=1 sts/controldb -n <namespace>
Connessione al
controldb
SQL Server comesa
uso della password nel segreto creato incontroller-sa-secret
precedenza.Creare un
system
account di accesso con il ruolo sysadmin usando la password nelcontroller-system-secret
segreto kubernetes come indicato di seguito:CREATE LOGIN [system] WITH PASSWORD = '<password-from-secret>' ALTER SERVER ROLE sysadmin ADD MEMBER [system]
Ripristinare il backup usando il
RESTORE
comando come indicato di seguito:
RESTORE DATABASE [controller] FROM DISK = N'/var/opt/backups/mssql/<controller backup file>.bak' WITH FILE = 1
Creare un
controldb-rw-user
account di accesso usando la password nelcontroller-db-rw-secret
segretoCREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>'
e associarlo all'utente esistentecontroldb-rw-user
nel database del controllerALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user]
.Disabilitare l'account
sa
di accesso usando TSQL -ALTER LOGIN [sa] DISABLE
.Modificare StatefulSet
controldb
per rimuovere il volume e ilcontroller-sa-secret
montaggio del volume corrispondente.Eliminare il
controller-sa-secret
segreto.Ridimensionare il controller ReplicaSet di backup fino a 1 replica usando il
kubectl scale
comando .