Share via


備份和復原控制器資料庫

部署 Azure Arc 資料服務時,Azure Arc 資料控制器是數一數二重要的部署元件。 資料控制器的功能包括:

  • 佈建、取消佈建和更新資源
  • 協調 Azure Arc 所啟用之 SQL 受控執行個體大部分的活動,例如升級、擴增等。
  • 擷取每個 Arc SQL 受控執行個體的帳單和使用量資訊。

為了執行上述功能,資料控制器必須儲存所有目前 Arc SQL 受控執行個體的詳細目錄、帳單、使用量,以及所有這些 SQL 受控執行個體目前的狀態。 這些資料全部都會儲存於部署至 controldb-0 Pod 之 SQL Server 執行個體內稱為 controller 的資料庫。

本文說明如何備份控制器資料庫。

備份資料控制器資料庫

資料控制器資料庫 controller 是內建功能的一部分,一旦啟用備份,每隔 5 分鐘就會自動備份一次。 若要啟用備份:

  • 使用支援 ReadWriteMany 存取的儲存類別建立 backups-controldbPersistentVolumeClaim:
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 編碼的認證。 秘密 yaml 檔案的內容 controller-system-secret 包含 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 的 Kubernete 秘密:

    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 Kubernete 祕密中的密碼,建立有系統管理員角色的 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 停用 sa 登入 - ALTER LOGIN [sa] DISABLE

  3. 編輯 controldb StatefulSet,移除 controller-sa-secret 磁碟區和對應的磁碟區掛接點。

  4. 刪除 controller-sa-secret 祕密。

  5. 使用 kubectl scale 命令,將控制器 ReplicaSet 重新擴大為 1 個複本。

Azure Data Studio 儀表板