你当前正在访问 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/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 编码的凭据。 机密
controller-system-secret
的 yaml 文件的内容包含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
的 kubernetes 机密: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
kubernetes 机密中的密码创建具有 sysadmin 角色的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 -
ALTER LOGIN [sa] DISABLE
禁用sa
登录名。编辑
controldb
StatefulSet 以删除controller-sa-secret
卷和相应的卷装载。删除
controller-sa-secret
机密。使用
kubectl scale
命令将控制器 ReplicaSet 纵向扩展回 1 个副本。