Condividi tramite


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'accesso ReadWriteMany:
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 archiviazione backups:
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:

  1. controller è danneggiato ed è sufficiente ripristinare il database
  2. 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:

  1. 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 utente system 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 un password e username. È possibile usare qualsiasi strumento di decodifica Base64 per decodificare il contenuto del password.

    • 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"
      
  2. 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
    
  3. Connettersi a SQL Server controldb come system come descritto nel passaggio 1.

  4. Eliminare il database del controller danneggiato usando T-SQL:

    DROP DATABASE controller
    
  5. 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
    
  6. 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:

  1. Assicurarsi di disporre di un backup dell'ultimo stato valido noto del database controller

  2. 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
    
  3. 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`
    
  4. 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>
    
  5. Modificare il StatefulSet controldb per includere un volume controller-sa-secret e il montaggio del volume corrispondente (/var/run/secrets/mounts/credentials/mssql-sa-password) nel contenitore mssql-server, usando il comando kubectl edit sts controldb -n <namespace>.

  6. Creare nuove attestazioni di volume permanente di dati (data-controldb) e log (logs-controldb) per il pod controldb 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>
    
  7. Ridimensionare il StatefulSet controldb a 1 replica usando:

    kubectl scale --replicas=1 sts/controldb -n <namespace>
    
  8. Connettersi a SQL Server controldb come sa usando la password nel segreto controller-sa-secret creato in precedenza.

  9. Creare un accesso system con il ruolo sysadmin usando la password nel segreto kubernetes controller-system-secret come indicato di seguito:

    CREATE LOGIN [system] WITH PASSWORD = '<password-from-secret>'
    ALTER SERVER ROLE sysadmin ADD MEMBER [system]
    
  10. 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
  1. Creare un accesso controldb-rw-user usando la password nel segreto controller-db-rw-secretCREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>' e associarlo con l'utente controldb-rw-user esistente nel database del controller ALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user].

  2. Disabilitare l'accesso sa usando TSQL - ALTER LOGIN [sa] DISABLE.

  3. Modificare StatefulSet controldb per rimuovere il volume controller-sa-secret e il montaggio del volume corrispondente.

  4. Eliminare il segreto controller-sa-secret.

  5. Ridimensionare il backup ReplicaSet controller fino a 1 replica usando il comando kubectl scale.

Dashboard di Azure Data Studio