Copia de seguridad y recuperación de la base de datos del controlador

Al implementar servicios de datos de Azure Arc, el controlador de datos de Azure Arc es uno de los componentes más críticos que se implementan. Las funciones del controlador de datos incluyen:

  • Aprovisionamiento, desaprovisionamiento y actualización de recursos
  • Organice la mayoría de las actividades de SQL Managed Instance habilitadas por Azure Arc, como actualizaciones, escalado horizontal, etc.
  • Capture la información de facturación y uso de cada instancia administrada de Arc SQL.

Para realizar las funciones anteriores, el controlador de datos debe almacenar un inventario de todas las instancias administradas de Arc SQL, la facturación, el uso y el estado actual de todas estas instancias administradas de SQL. Todos estos datos se almacenan en una base de datos denominada controller dentro de la instancia de SQL Server que se implementa en el pod controldb-0.

En este artículo se explica cómo realizar una copia de seguridad de la base de datos del controlador.

Copia de seguridad de la base de datos del controlador de datos

Como parte de las funcionalidades integradas, la base de datos del controlador de datos controller se realiza automáticamente una copia de seguridad cada 5 minutos una vez habilitadas las copias de seguridad. Para habilitar las copias de seguridad:

  • Cree un backups-controldbPersistentVolumeClaim con una clase de almacenamiento que admita el accesoReadWriteMany:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: backups-controldb
  namespace: <namespace>
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 15Gi
  storageClassName: <storage-class>
  • Edite la DataController especificación de recursos personalizado para incluir una definición de almacenamientobackups:
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

Los archivos .bak de la base de datos controller se almacenan en el volumen backupsdel pod controldb en /var/opt/backups/mssql.

Recuperación de la base de datos del controlador

Hay dos tipos de recuperación posibles:

  1. controller está dañado y solo tiene que restaurar la base de datos
  2. todo el almacenamiento que contiene los archivos de datos y de registro controller está dañado o desaparecido y necesita recuperarse

Escenario de base de datos del controlador dañado

En este escenario, todos los pods están en funcionamiento, puede conectarse a SQL Server controldb y puede haber daños en la base de datos controller. Solo tiene que restaurar la base de datos a partir de una copia de seguridad.

Siga estos pasos para restaurar la base de datos del controlador a partir de una copia de seguridad, si SQL Server sigue en funcionamiento en el pod controldb y puede conectarse a ella:

  1. Compruebe la conectividad con el pod de SQL Server que hospeda la base de datos controller.

    • En primer lugar, recupere las credenciales del secreto. controller-system-secret es el secreto que contiene las credenciales de la cuenta de usuario system que se puede usar para conectarse a la instancia de SQL. Ejecute el siguiente comando para recuperar el contenido del secreto:

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

      Por ejemplo:

      kubectl get secret controller-system-secret --namespace arcdataservices -o yaml
      
    • Descodifique las credenciales codificadas en base64. El contenido del archivo yaml del secreto controller-system-secret contiene password y username. Puede usar cualquier herramienta de descodificador base64 para descodificar el contenido de password.

    • Comprobar la conectividad: con las credenciales descodificadas, ejecute un comando como SELECT @@SERVERNAME para comprobar la conectividad con 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. Escale replicaSet del controlador a 0 réplicas de la siguiente manera:

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

    Por ejemplo:

    kubectl scale --replicas=0 rs/control -n arcdataservices
    
  3. Conéctese a SQL Server controldb como system se describe en el paso 1.

  4. Elimine la base de datos del controlador dañada mediante T-SQL:

    DROP DATABASE controller
    
  5. Restaurar la base de datos a partir de la copia de seguridad: después de quitar la copia de seguridad dañada controllerdb. Por ejemplo:

    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. Escale la copia de seguridad de ReplicaSet del controlador hasta 1 réplica.

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

    Por ejemplo:

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

Escenario de almacenamiento dañado

En este escenario, el almacenamiento que hospeda los archivos de registro y datos del controlador de datos, tiene daños y se ha aprovisionado un nuevo almacenamiento y necesita restaurar la base de datos del controlador.

Siga estos pasos para restaurar la base de datos del controlador a partir de una copia de seguridad con nuevo almacenamiento para StatefulSet controldb:

  1. Asegúrese de que tiene una copia de seguridad del último estado correcto conocido de la base de datos controller

  2. Escale replicaSet del controlador a 0 réplicas de la siguiente manera:

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

    Por ejemplo:

    kubectl scale --replicas=0 rs/control -n arcdataservices
    
  3. Escale StatefulSet controldb a 0 réplicas, como se indica a continuación:

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

    Por ejemplo:

    kubectl scale --replicas=0 sts/controldb -n arcdataservices`
    
  4. Cree un secreto de kubernetes denominado controller-sa-secret con el siguiente CÓDIGO YAML:

    apiVersion: v1
    kind: Secret
    metadata:
      name: controller-sa-secret
      namespace: <namespace>
    type: Opaque
    data:
      password: <base64 encoded password>
    
  5. Edite StatefulSet controldb para incluir un volumen controller-sa-secret y el montaje de volumen correspondiente (/var/run/secrets/mounts/credentials/mssql-sa-password) en el contenedor mssql-server mediante el comandokubectl edit sts controldb -n <namespace>.

  6. Cree nuevas notificaciones de volumen persistente de datos (data-controldb) y registros (logs-controldb) para el pod controldb de la siguiente manera:

     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. Vuelva a escalar StatefulSet controldb a 1 réplica mediante:

    kubectl scale --replicas=1 sts/controldb -n <namespace>
    
  8. Conéctese al servidor SQL Server controldb como sa mediante la contraseña del secreto creado controller-sa-secret anteriormente.

  9. Cree un inicio de sesión system con el rol sysadmin mediante la contraseña en el secreto de kubernetescontroller-system-secretde la manera siguiente:

    CREATE LOGIN [system] WITH PASSWORD = '<password-from-secret>'
    ALTER SERVER ROLE sysadmin ADD MEMBER [system]
    
  10. Restaure la copia de seguridad mediante el comandoRESTORE de la manera siguiente:

RESTORE DATABASE [controller] FROM DISK = N'/var/opt/backups/mssql/<controller backup file>.bak' WITH FILE = 1
  1. Cree un inicio de sesión controldb-rw-user con la contraseña controller-db-rw-secret en el secreto CREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>' y asócielo al usuario existente controldb-rw-user en la base de datos del controlador ALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user].

  2. Deshabilite el inicio de sesión sa mediante TSQL: ALTER LOGIN [sa] DISABLE.

  3. Edite StatefulSet controldb para quitar el volumen y el controller-sa-secret montaje del volumen correspondiente.

  4. Elimine el secreto de controller-sa-secret.

  5. Escale la copia de seguridad de ReplicaSet del controlador hasta 1 réplica mediante el comando kubectl scale.

Paneles de Azure Data Studio