你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

备份和恢复控制器数据库

部署 Azure Arc 数据服务时,Azure Arc 数据控制器是部署的最关键组件之一。 数据控制器的功能包括:

  • 预配、取消预配和更新资源
  • 协调 Azure Arc 启用的 SQL 托管实例的大部分活动,例如升级、横向扩展等。
  • 捕获每个 Arc SQL 托管实例的计费和使用情况信息。

为了执行上述功能,数据控制器需要存储所有当前 Arc SQL 托管实例的清单、计费、使用情况以及所有这些 SQL 托管实例的当前状态。 所有这些数据存储在部署到 controldb-0 Pod 的 SQL Server 实例中名为 controller 的数据库。

本文介绍如何备份控制器数据库。

备份数据控制器数据库

作为内置功能的一部分,启用备份后,数据控制器数据库 controller 每 5 分钟自动备份一次。 若要启用备份,请执行以下操作:

  • 使用支持 ReadWriteMany 访问的存储类创建 backups-controldb PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: backups-controldb
  namespace: <namespace>
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 15Gi
  storageClassName: <storage-class>
  • 编辑 DataController 自定义资源规范以包含 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

controller 数据库的 .bak 文件存储在 /var/opt/backups/mssqlcontroldb Pod 的 backups 卷上。

恢复控制器数据库

可以进行两种类型的恢复:

  1. controller 已损坏,只需还原数据库
  2. 包含 controller 数据和日志文件的整个存储已损坏/消失,需要恢复

损坏的控制器数据库方案

在此场景中,所有 Pod 都已启动并且正在运行,可以连接到 controldb SQL Server,并且 controller 数据库可能存在损坏。 只需从备份还原数据库。

按照以下步骤从备份还原控制器数据库,如果 SQL Server 仍在 controldb Pod 上启动并正在运行,并且能够连接到该数据库:

  1. 验证与托管 controller 数据库的 SQL Server Pod 的连接。

    • 首先,检索机密的凭据。 controller-system-secret 是保存可用于连接到 SQL 实例的 system 用户帐户凭据的机密。 运行以下命令以检索机密内容:

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

      例如:

      kubectl get secret controller-system-secret --namespace arcdataservices -o yaml
      
    • 解码 base64 编码的凭据。 机密 controller-system-secret 的 yaml 文件的内容包含 passwordusername。 可以使用任何 base64 解码器工具来解码 password 的内容。

    • 验证连接性:使用解码的凭据,运行 SELECT @@SERVERNAME 等命令来验证与 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. 将控制器 ReplicaSet 缩减到 0 个副本,如下所示:

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

    例如:

    kubectl scale --replicas=0 rs/control -n arcdataservices
    
  3. 如步骤 1 所述,以 system 身份连接到 controldb SQL Server。

  4. 使用 T-SQL 删除损坏的控制器数据库:

    DROP DATABASE controller
    
  5. 从备份还原数据库 - 删除损坏的 controllerdb 后。 例如:

    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. 将控制器 ReplicaSet 纵向扩展回 1 个副本。

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

    例如:

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

损坏的存储方案

在此方案中,托管数据控制器数据和日志文件的存储已损坏,并预配了新的存储,需要还原控制器数据库。

按照以下步骤从具有 controldb StatefulSet 的新存储的备份中恢复控制器数据库:

  1. 确保备份 controller 数据库的最后一个已知良好状态

  2. 将控制器 ReplicaSet 缩减到 0 个副本,如下所示:

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

    例如:

    kubectl scale --replicas=0 rs/control -n arcdataservices
    
  3. controldb StatefulSet 纵向缩减到 0 个副本,如下所示:

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

    例如:

    kubectl scale --replicas=0 sts/controldb -n arcdataservices`
    
  4. 使用以下 YAML 创建名为 controller-sa-secret 的 kubernetes 机密:

    apiVersion: v1
    kind: Secret
    metadata:
      name: controller-sa-secret
      namespace: <namespace>
    type: Opaque
    data:
      password: <base64 encoded password>
    
  5. 使用 kubectl edit sts controldb -n <namespace> 命令编辑 controldb StatefulSet,以在 mssql-server 容器中包含 controller-sa-secret 卷和相应的卷装载 (/var/run/secrets/mounts/credentials/mssql-sa-password)。

  6. controldb Pod 创建新的数据 (data-controldb) 和日志 (logs-controldb) 永久性卷声明,如下所示:

     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. 使用以下命令将 controldb StatefulSet 缩减回 1 个副本:

    kubectl scale --replicas=1 sts/controldb -n <namespace>
    
  8. 使用前面创建的 controller-sa-secret 机密中的密码,以 sa 身份连接到 controldb SQL Server。

  9. 使用 controller-system-secret kubernetes 机密中的密码创建具有 sysadmin 角色的 system 登录名,如下所示:

    CREATE LOGIN [system] WITH PASSWORD = '<password-from-secret>'
    ALTER SERVER ROLE sysadmin ADD MEMBER [system]
    
  10. 使用 RESTORE 命令还原备份,如下所示:

RESTORE DATABASE [controller] FROM DISK = N'/var/opt/backups/mssql/<controller backup file>.bak' WITH FILE = 1
  1. 使用 controller-db-rw-secret 机密 CREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>' 中的密码创建 controldb-rw-user 登录名,并将其与控制器 DB ALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user] 中的现有 controldb-rw-user 用户相关联。

  2. 使用 TSQL - ALTER LOGIN [sa] DISABLE 禁用 sa 登录名。

  3. 编辑 controldb StatefulSet 以删除 controller-sa-secret 卷和相应的卷装载。

  4. 删除 controller-sa-secret 机密。

  5. 使用 kubectl scale 命令将控制器 ReplicaSet 纵向扩展回 1 个副本。

Azure Data Studio 仪表板