Fazer backup e recuperar o banco de dados do controlador
Quando você implanta serviços de dados do Azure Arc, o Controlador de Dados do Azure Arc é um dos componentes mais críticos implantados. As funções do controlador de dados incluem:
- Provisão, desprovisionamento e atualização de recursos
- Organize a maioria das atividades da Instância Gerenciada SQL habilitada pelo Azure Arc, como atualizações, expansão etc.
- Capture as informações de faturamento e uso de cada instância gerenciada do Arc SQL.
Para executar as funções acima, o controlador de dados precisa armazenar um inventário de todas as instâncias gerenciadas Arc SQL atuais, faturamento, uso e o estado atual de todas essas instâncias gerenciadas SQL. Todos esses dados são armazenados em um banco de dados chamado controller
dentro da instância do SQL Server que é implantada no pod controldb-0
.
Este artigo explica como fazer backup do banco de dados do controlador.
Fazer backup do banco de dados do controlador de dados
Como parte dos recursos internos, o backup do banco de dados do controlador de dados controller
é feito automaticamente a cada 5 minutos, uma vez que os backups são habilitados. Para habilitar backups:
- Crie um
backups-controldb
PersistentVolumeClaim
com uma classe de armazenamento que ofereça suporte a acessoReadWriteMany
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: backups-controldb
namespace: <namespace>
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 15Gi
storageClassName: <storage-class>
- Edite a
DataController
especificação de recurso personalizada para incluir uma definição de armazenamentobackups
:
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
Os arquivos .bak
para o banco de dados controller
são armazenados no volume backups
do pod controldb
em /var/opt/backups/mssql
.
Recuperar banco de dados do controlador
Há dois tipos de recuperação possíveis:
controller
está corrompido e você só precisa restaurar o banco de dados- todo o armazenamento que contém os dados
controller
e arquivos de log está corrompido / desaparecido e você precisa recuperar
Cenário de banco de dados de controlador corrompido
Nesse cenário, todos os pods estão em execução, você pode se conectar ao controldb
SQL Server e pode haver uma corrupção com o banco de dados controller
. Você só precisa restaurar o banco de dados a partir de um backup.
Siga estas etapas para restaurar o banco de dados do controlador a partir de um backup, se o SQL Server ainda estiver ativo e em execução no pod controldb
e você puder se conectar a ele:
Verifique a conectividade com o pod do SQL Server que hospeda o banco de dados
controller
.Primeiro, recupere as credenciais para o segredo.
controller-system-secret
é o segredo que contém as credenciais da conta de usuáriosystem
que pode ser usada para se conectar à instância SQL. Execute o seguinte comando para recuperar o conteúdo secreto:kubectl get secret controller-system-secret --namespace [namespace] -o yaml
Por exemplo:
kubectl get secret controller-system-secret --namespace arcdataservices -o yaml
Decodifice as credenciais codificadas em base64. O conteúdo do arquivo yaml do
controller-system-secret
secreto contém umapassword
eusername
. Você pode usar qualquer ferramenta de decodificador base64 para decodificar o conteúdo dopassword
.Verificar conectividade: com as credenciais decodificadas, execute um comando como
SELECT @@SERVERNAME
para verificar a conectividade com o 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"
Dimensione o ReplicaSet do controlador para 0 réplicas da seguinte maneira:
kubectl scale --replicas=0 rs/control -n <namespace>`
Por exemplo:
kubectl scale --replicas=0 rs/control -n arcdataservices
Conecte-se ao
controldb
SQL Serversystem
conforme descrito na etapa 1.Exclua o banco de dados do controlador corrompido usando T-SQL:
DROP DATABASE controller
Restaure o banco de dados do backup - depois que o
controllerdb
corrompido for descartado. Por exemplo: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
Dimensione o controlador ReplicaSet de volta para 1 réplica.
kubectl scale --replicas=1 rs/control -n <namespace>
Por exemplo:
kubectl scale --replicas=1 rs/control -n arcdataservices
Cenário de armazenamento corrompido
Nesse cenário, o armazenamento que hospeda os dados do controlador de dados e arquivos de log, está corrompido e um novo armazenamento foi provisionado e você precisa restaurar o banco de dados do controlador.
Siga estas etapas para restaurar o banco de dados do controlador a partir de um backup com novo armazenamento para o controldb
StatefulSet:
Verifique se você tem um backup do último estado em boas condições do banco de dados
controller
Dimensione o ReplicaSet do controlador para 0 réplicas da seguinte maneira:
kubectl scale --replicas=0 rs/control -n <namespace>
Por exemplo:
kubectl scale --replicas=0 rs/control -n arcdataservices
Dimensione o StatefulSet
controldb
para 0 réplicas, da seguinte maneira:kubectl scale --replicas=0 sts/controldb -n <namespace>
Por exemplo:
kubectl scale --replicas=0 sts/controldb -n arcdataservices`
Crie um segredo kubernetes chamado
controller-sa-secret
com o seguinte YAML:apiVersion: v1 kind: Secret metadata: name: controller-sa-secret namespace: <namespace> type: Opaque data: password: <base64 encoded password>
Edite o
controldb
StatefulSet para incluir um volumecontroller-sa-secret
e uma montagem de volume (/var/run/secrets/mounts/credentials/mssql-sa-password
) correspondente no contêinermssql-server
, usandokubectl edit sts controldb -n <namespace>
comando.Crie novas declarações de volume persistente de dados (
data-controldb
) e logs (logs-controldb
) para o podcontroldb
da seguinte maneira: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>
Dimensione o
controldb
StatefulSet de volta para 1 réplica usando:kubectl scale --replicas=1 sts/controldb -n <namespace>
Conecte-se ao
controldb
SQL Server comosa
usando a senha no segredocontroller-sa-secret
criado anteriormente.Crie um login
system
com a função sysadmin usando a senha no segredo do kubernetescontroller-system-secret
da seguinte maneira:CREATE LOGIN [system] WITH PASSWORD = '<password-from-secret>' ALTER SERVER ROLE sysadmin ADD MEMBER [system]
Restaure o backup usando o comando
RESTORE
da seguinte maneira:
RESTORE DATABASE [controller] FROM DISK = N'/var/opt/backups/mssql/<controller backup file>.bak' WITH FILE = 1
Crie um login
controldb-rw-user
usando a senha noCREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>'
secretocontroller-db-rw-secret
e associe-o ao usuáriocontroldb-rw-user
existente noALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user]
de banco de dados do controlador.Desative o login do
sa
usando TSQL -ALTER LOGIN [sa] DISABLE
.Edite o
controldb
StatefulSet para remover o volumecontroller-sa-secret
e a montagem de volume correspondente.Exclua o segredo
controller-sa-secret
.Dimensione o controlador ReplicaSet de volta para 1 réplica usando o comando
kubectl scale
.