Eseguire il backup e il ripristino del database del controller
Quando si distribuiscono i servizi dati di Azure Arc, il controller dei dati di Azure Arc è uno dei componenti più critici distribuiti. Le funzioni del controller dei dati includono:
- Effettuare il provisioning, il deprovisioning e aggiornare le risorse
- Orchestrare la maggior parte delle attività per Istanza gestita di SQL abilitata 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 controller 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 pod controldb-0
.
Questo articolo illustra come eseguire il backup del database controller.
Eseguire il backup del database del controller dei dati
Come parte delle funzionalità predefinite, il backup del database del controller dei dati controller
viene eseguito automaticamente ogni 5 minuti dopo l'abilitazione dei backup. Per abilitare i backup:
- Creare un
backups-controldb
PersistentVolumeClaim
con una classe di archiviazione che supporti l'accessoReadWriteMany
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: backups-controldb
namespace: <namespace>
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 15Gi
storageClassName: <storage-class>
- Modificare la specifica di risorsa personalizzata
DataController
per includere una definizione di archiviazionebackups
:
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 file di .bak
per il database di controller
vengono archiviati nel volume backups
del pod controldb
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 file di dati e di log
controller
è danneggiata/scomparsa ed è necessario il ripristino
Scenario di database del controller danneggiato
In questo scenario, tutti i pod sono operativi, è possibile connettersi a SQL Server controldb
e potrebbe verificarsi un danneggiamento con il database controller
. È sufficiente ripristinare il database da un backup.
Seguire questa procedura per ripristinare il database del controller da un backup, se SQL Server è ancora attivo e in esecuzione nel pod controldb
ed è possibile connettersi al database:
Verificare la connettività al pod di SQL Server che ospita il database
controller
.Recuperare prima di tutto le credenziali per il segreto.
controller-system-secret
è il segreto che contiene le credenziali per l'account utentesystem
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 di decodifica Base64 per decodificare il contenuto delpassword
.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 del 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
Connettersi a SQL Server
controldb
comesystem
come 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
controllerdb
danneggiato. 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 il backup ReplicaSet controller 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 controller dei dati, presenta danneggiamento e ne è stato effettuato il provisioning ed è necessario ripristinare il database del 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 database
controller
Ridimensionare ReplicaSet del 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 il 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 il StatefulSet
controldb
per includere un volumecontroller-sa-secret
e il montaggio del volume corrispondente (/var/run/secrets/mounts/credentials/mssql-sa-password
) nel contenitoremssql-server
, usando il comandokubectl edit sts controldb -n <namespace>
.Creare nuove attestazioni di volume permanente di dati (
data-controldb
) e log (logs-controldb
) per il podcontroldb
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 il StatefulSet
controldb
a 1 replica usando:kubectl scale --replicas=1 sts/controldb -n <namespace>
Connettersi a SQL Server
controldb
comesa
usando la password nel segretocontroller-sa-secret
creato in precedenza.Creare un accesso
system
con il ruolo sysadmin usando la password nel segreto kubernetescontroller-system-secret
come indicato di seguito:CREATE LOGIN [system] WITH PASSWORD = '<password-from-secret>' ALTER SERVER ROLE sysadmin ADD MEMBER [system]
Ripristinare il backup usando il comando
RESTORE
come indicato di seguito:
RESTORE DATABASE [controller] FROM DISK = N'/var/opt/backups/mssql/<controller backup file>.bak' WITH FILE = 1
Creare un accesso
controldb-rw-user
usando la password nel segretocontroller-db-rw-secret
CREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>'
e associarlo con l'utentecontroldb-rw-user
esistente nel database del controllerALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user]
.Disabilitare l'accesso
sa
usando TSQL -ALTER LOGIN [sa] DISABLE
.Modificare StatefulSet
controldb
per rimuovere il volumecontroller-sa-secret
e il montaggio del volume corrispondente.Eliminare il segreto
controller-sa-secret
.Ridimensionare il backup ReplicaSet controller fino a 1 replica usando il comando
kubectl scale
.