備份和復原控制器資料庫
部署 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/mssql
之 controldb
pod 的 backups
磁碟區。
復原控制器資料庫
復原可以有兩種不同類型:
controller
已損毀,您只需要還原資料庫即可- 包含
controller
資料和記錄檔的整個儲存體已損毀/消失,您需要復原
損毀的控制器資料庫案例
在這個案例中,所有 Pod 都已啟動並執行,您可以連線 controldb
SQL Server,controller
資料庫可能已損毀。 您只需要從備份還原資料庫即可。
如果 SQL Server 仍在 controldb
Pod 啟動並執行,而且您可以連線到該資料庫,請遵循下列步驟,從備份還原控制器資料庫:
確認裝載
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
包含password
和username
。 您可以使用任何 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"
將控制器 ReplicaSet 縮小為 0 個複本,如下所示:
kubectl scale --replicas=0 rs/control -n <namespace>`
例如:
kubectl scale --replicas=0 rs/control -n arcdataservices
如步驟 1 所述,以
system
的身分連線controldb
SQL Server。使用 T-SQL 刪除損毀的控制器資料庫:
DROP DATABASE controller
從備份還原資料庫 - 卸除損毀的
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
將控制器 ReplicaSet 重新擴大為 1 個複本。
kubectl scale --replicas=1 rs/control -n <namespace>
例如:
kubectl scale --replicas=1 rs/control -n arcdataservices
損毀的儲存體案例
在這個案例中,裝載資料控制器資料和記錄檔的儲存體已損毀、已佈建新的儲存體,而且您需要還原控制器資料庫。
請遵循下列步驟,使用 controldb
StatefulSet 的新儲存體,從備份還原控制器資料庫:
確定您有
controller
資料庫最後已知良好狀態的備份將控制器 ReplicaSet 縮小為 0 個複本,如下所示:
kubectl scale --replicas=0 rs/control -n <namespace>
例如:
kubectl scale --replicas=0 rs/control -n arcdataservices
將
controldb
StatefulSet 縮小為 0 個複本,如下所示:kubectl scale --replicas=0 sts/controldb -n <namespace>
例如:
kubectl scale --replicas=0 sts/controldb -n arcdataservices`
使用下列 YAML 建立名為
controller-sa-secret
的 Kubernete 秘密:apiVersion: v1 kind: Secret metadata: name: controller-sa-secret namespace: <namespace> type: Opaque data: password: <base64 encoded password>
使用
kubectl edit sts controldb -n <namespace>
命令編輯controldb
StatefulSet,在mssql-server
容器加入controller-sa-secret
磁碟區和對應的磁碟區掛接點 (/var/run/secrets/mounts/credentials/mssql-sa-password
)。為
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>
使用下列方法,將
controldb
StatefulSet 調回 1 個複本:kubectl scale --replicas=1 sts/controldb -n <namespace>
使用稍早建立之
controller-sa-secret
祕密中的密碼,以sa
的身分連線controldb
SQL Server。使用
controller-system-secret
Kubernete 祕密中的密碼,建立有系統管理員角色的system
登入,如下所示:CREATE LOGIN [system] WITH PASSWORD = '<password-from-secret>' ALTER SERVER ROLE sysadmin ADD MEMBER [system]
使用
RESTORE
命令還原備份,如下所示:
RESTORE DATABASE [controller] FROM DISK = N'/var/opt/backups/mssql/<controller backup file>.bak' WITH FILE = 1
使用
controller-db-rw-secret
祕密CREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>'
中的密碼建立controldb-rw-user
登入,並將它與控制器 DBALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user]
現有的controldb-rw-user
使用者產生關聯。使用 TSQL 停用
sa
登入 -ALTER LOGIN [sa] DISABLE
。編輯
controldb
StatefulSet,移除controller-sa-secret
磁碟區和對應的磁碟區掛接點。刪除
controller-sa-secret
祕密。使用
kubectl scale
命令,將控制器 ReplicaSet 重新擴大為 1 個複本。