Fazer backup e recuperar o banco de dados do controlador

Quando você implanta serviços de dados do Azure Arc, o Controlador de Dados do Azure Arc é um dos componentes mais críticos implantados. As funções do controlador de dados incluem:

  • Provisão, desprovisionamento e atualização de recursos
  • Organize a maioria das atividades da Instância Gerenciada SQL habilitada pelo Azure Arc, como atualizações, expansão etc.
  • Capture as informações de faturamento e uso de cada instância gerenciada do Arc SQL.

Para executar as funções acima, o controlador de dados precisa armazenar um inventário de todas as instâncias gerenciadas Arc SQL atuais, faturamento, uso e o estado atual de todas essas instâncias gerenciadas SQL. Todos esses dados são armazenados em um banco de dados chamado controller dentro da instância do SQL Server que é implantada no pod controldb-0.

Este artigo explica como fazer backup do banco de dados do controlador.

Fazer backup do banco de dados do controlador de dados

Como parte dos recursos internos, o backup do banco de dados do controlador de dados controller é feito automaticamente a cada 5 minutos, uma vez que os backups são habilitados. Para habilitar backups:

  • Crie um backups-controldbPersistentVolumeClaim com uma classe de armazenamento que ofereça suporte a acesso ReadWriteMany:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: backups-controldb
  namespace: <namespace>
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 15Gi
  storageClassName: <storage-class>
  • Edite a DataController especificação de recurso personalizada para incluir uma definição de armazenamento 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

Os arquivos .bak para o banco de dados controller são armazenados no volume backups do pod controldb em /var/opt/backups/mssql.

Recuperar banco de dados do controlador

Há dois tipos de recuperação possíveis:

  1. controller está corrompido e você só precisa restaurar o banco de dados
  2. todo o armazenamento que contém os dados controller e arquivos de log está corrompido / desaparecido e você precisa recuperar

Cenário de banco de dados de controlador corrompido

Nesse cenário, todos os pods estão em execução, você pode se conectar ao controldb SQL Server e pode haver uma corrupção com o banco de dados controller. Você só precisa restaurar o banco de dados a partir de um backup.

Siga estas etapas para restaurar o banco de dados do controlador a partir de um backup, se o SQL Server ainda estiver ativo e em execução no pod controldb e você puder se conectar a ele:

  1. Verifique a conectividade com o pod do SQL Server que hospeda o banco de dados controller.

    • Primeiro, recupere as credenciais para o segredo. controller-system-secret é o segredo que contém as credenciais da conta de usuário system que pode ser usada para se conectar à instância SQL. Execute o seguinte comando para recuperar o conteúdo secreto:

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

      Por exemplo:

      kubectl get secret controller-system-secret --namespace arcdataservices -o yaml
      
    • Decodifice as credenciais codificadas em base64. O conteúdo do arquivo yaml do controller-system-secret secreto contém uma password e username. Você pode usar qualquer ferramenta de decodificador base64 para decodificar o conteúdo do password.

    • Verificar conectividade: com as credenciais decodificadas, execute um comando como SELECT @@SERVERNAME para verificar a conectividade com o 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. Dimensione o ReplicaSet do controlador para 0 réplicas da seguinte maneira:

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

    Por exemplo:

    kubectl scale --replicas=0 rs/control -n arcdataservices
    
  3. Conecte-se ao controldbSQL Server system conforme descrito na etapa 1.

  4. Exclua o banco de dados do controlador corrompido usando T-SQL:

    DROP DATABASE controller
    
  5. Restaure o banco de dados do backup - depois que o controllerdb corrompido for descartado. Por exemplo:

    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. Dimensione o controlador ReplicaSet de volta para 1 réplica.

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

    Por exemplo:

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

Cenário de armazenamento corrompido

Nesse cenário, o armazenamento que hospeda os dados do controlador de dados e arquivos de log, está corrompido e um novo armazenamento foi provisionado e você precisa restaurar o banco de dados do controlador.

Siga estas etapas para restaurar o banco de dados do controlador a partir de um backup com novo armazenamento para o controldb StatefulSet:

  1. Verifique se você tem um backup do último estado em boas condições do banco de dados controller

  2. Dimensione o ReplicaSet do controlador para 0 réplicas da seguinte maneira:

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

    Por exemplo:

    kubectl scale --replicas=0 rs/control -n arcdataservices
    
  3. Dimensione o StatefulSet controldb para 0 réplicas, da seguinte maneira:

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

    Por exemplo:

    kubectl scale --replicas=0 sts/controldb -n arcdataservices`
    
  4. Crie um segredo kubernetes chamado controller-sa-secret com o seguinte YAML:

    apiVersion: v1
    kind: Secret
    metadata:
      name: controller-sa-secret
      namespace: <namespace>
    type: Opaque
    data:
      password: <base64 encoded password>
    
  5. Edite o controldb StatefulSet para incluir um volume controller-sa-secret e uma montagem de volume (/var/run/secrets/mounts/credentials/mssql-sa-password) correspondente no contêiner mssql-server, usando kubectl edit sts controldb -n <namespace> comando.

  6. Crie novas declarações de volume persistente de dados (data-controldb) e logs (logs-controldb) para o pod controldb da seguinte maneira:

     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. Dimensione o controldb StatefulSet de volta para 1 réplica usando:

    kubectl scale --replicas=1 sts/controldb -n <namespace>
    
  8. Conecte-se ao controldb SQL Server como sa usando a senha no segredo controller-sa-secret criado anteriormente.

  9. Crie um login system com a função sysadmin usando a senha no segredo do kubernetes controller-system-secret da seguinte maneira:

    CREATE LOGIN [system] WITH PASSWORD = '<password-from-secret>'
    ALTER SERVER ROLE sysadmin ADD MEMBER [system]
    
  10. Restaure o backup usando o comando RESTORE da seguinte maneira:

RESTORE DATABASE [controller] FROM DISK = N'/var/opt/backups/mssql/<controller backup file>.bak' WITH FILE = 1
  1. Crie um login controldb-rw-user usando a senha no CREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>' secreto controller-db-rw-secret e associe-o ao usuário controldb-rw-user existente no ALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user] de banco de dados do controlador.

  2. Desative o login do sa usando TSQL - ALTER LOGIN [sa] DISABLE.

  3. Edite o controldb StatefulSet para remover o volume controller-sa-secret e a montagem de volume correspondente.

  4. Exclua o segredo controller-sa-secret.

  5. Dimensione o controlador ReplicaSet de volta para 1 réplica usando o comando kubectl scale.

Painéis do Azure Data Studio