Fazer backup e recuperar o banco de dados do controlador

Quando você implanta os 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 responsável pelo tratamento de dados incluem:

  • Provisionamento, desprovisionamento e atualização de recursos
  • Orquestre a maioria das atividades da Instância Gerenciada SQL habilitada pelo Azure Arc, como atualizações, dimensionamento, 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 atuais do Arc SQL, faturamento, uso e o estado atual de todas essas instâncias gerenciadas pelo SQL. Todos esses dados são armazenados em um banco de dados chamado controller dentro da instância do SQL Server que é implantada controldb-0 no pod.

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 ativados. Para habilitar backups:

  • Crie um backups-controldbPersistentVolumeClaim com uma classe de armazenamento que ofereça suporte ao ReadWriteMany acesso:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: backups-controldb
  namespace: <namespace>
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 15Gi
  storageClassName: <storage-class>
  • Edite a especificação de DataController recurso personalizada para incluir uma definição de backups armazenamento:
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 .bak arquivos para o controller banco de dados são armazenados no backups volume do controldb pod em /var/opt/backups/mssql.

Recuperar banco de dados do controlador

Existem 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 e arquivos de controller log está corrompido / desaparecido e você precisa recuperar

Cenário de banco de dados do controlador corrompido

Nesse cenário, todos os pods estão ativos e em execução, você é capaz de se conectar ao controldb SQL Server e pode haver uma corrupção com o controller banco de dados. 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 controldb pod e você puder se conectar a ele:

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

    • Primeiro, recupere as credenciais do segredo. controller-system-secret é o segredo que contém as credenciais da conta de system usuário 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 segredo controller-system-secret contém um 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 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 controlador ReplicaSet 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 controldb SQL Server conforme system 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 a partir do backup - depois que o corrompido controllerdb 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, tem corrupção 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. Certifique-se de ter um backup do último estado válido conhecido do controller banco de dados

  2. Dimensione o controlador ReplicaSet 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 controldb StatefulSet 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 nomeado 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 StatefulSet para incluir um volume e a controller-sa-secret montagem de volume correspondente (/var/run/secrets/mounts/credentials/mssql-sa-password) no contêiner, usando kubectl edit sts controldb -n <namespace> o controldbmssql-server comando.

  6. Crie novas declarações de volume persistentes de dados () e logs (data-controldblogs-controldb) para o controldb pod 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 servidor SQL como sa usando a controller-sa-secret senha no segredo criado anteriormente.

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

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

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

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

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

  4. Exclua o controller-sa-secret segredo.

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

Painéis do Azure Data Studio