Copia de seguridad y recuperación de la base de datos del controlador
Al implementar servicios de datos de Azure Arc, el controlador de datos de Azure Arc es uno de los componentes más críticos que se implementan. Las funciones del controlador de datos incluyen:
- Aprovisionamiento, desaprovisionamiento y actualización de recursos
- Organice la mayoría de las actividades de SQL Managed Instance habilitadas por Azure Arc, como actualizaciones, escalado horizontal, etc.
- Capture la información de facturación y uso de cada instancia administrada de Arc SQL.
Para realizar las funciones anteriores, el controlador de datos debe almacenar un inventario de todas las instancias administradas de Arc SQL, la facturación, el uso y el estado actual de todas estas instancias administradas de SQL. Todos estos datos se almacenan en una base de datos denominada controller
dentro de la instancia de SQL Server que se implementa en el pod controldb-0
.
En este artículo se explica cómo realizar una copia de seguridad de la base de datos del controlador.
Copia de seguridad de la base de datos del controlador de datos
Como parte de las funcionalidades integradas, la base de datos del controlador de datos controller
se realiza automáticamente una copia de seguridad cada 5 minutos una vez habilitadas las copias de seguridad. Para habilitar las copias de seguridad:
- Cree un
backups-controldb
PersistentVolumeClaim
con una clase de almacenamiento que admita el accesoReadWriteMany
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: backups-controldb
namespace: <namespace>
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 15Gi
storageClassName: <storage-class>
- Edite la
DataController
especificación de recursos personalizado para incluir una definición de almacenamientobackups
:
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
Los archivos .bak
de la base de datos controller
se almacenan en el volumen backups
del pod controldb
en /var/opt/backups/mssql
.
Recuperación de la base de datos del controlador
Hay dos tipos de recuperación posibles:
controller
está dañado y solo tiene que restaurar la base de datos- todo el almacenamiento que contiene los archivos de datos y de registro
controller
está dañado o desaparecido y necesita recuperarse
Escenario de base de datos del controlador dañado
En este escenario, todos los pods están en funcionamiento, puede conectarse a SQL Server controldb
y puede haber daños en la base de datos controller
. Solo tiene que restaurar la base de datos a partir de una copia de seguridad.
Siga estos pasos para restaurar la base de datos del controlador a partir de una copia de seguridad, si SQL Server sigue en funcionamiento en el pod controldb
y puede conectarse a ella:
Compruebe la conectividad con el pod de SQL Server que hospeda la base de datos
controller
.En primer lugar, recupere las credenciales del secreto.
controller-system-secret
es el secreto que contiene las credenciales de la cuenta de usuariosystem
que se puede usar para conectarse a la instancia de SQL. Ejecute el siguiente comando para recuperar el contenido del secreto:kubectl get secret controller-system-secret --namespace [namespace] -o yaml
Por ejemplo:
kubectl get secret controller-system-secret --namespace arcdataservices -o yaml
Descodifique las credenciales codificadas en base64. El contenido del archivo yaml del secreto
controller-system-secret
contienepassword
yusername
. Puede usar cualquier herramienta de descodificador base64 para descodificar el contenido depassword
.Comprobar la conectividad: con las credenciales descodificadas, ejecute un comando como
SELECT @@SERVERNAME
para comprobar la conectividad con 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"
Escale replicaSet del controlador a 0 réplicas de la siguiente manera:
kubectl scale --replicas=0 rs/control -n <namespace>`
Por ejemplo:
kubectl scale --replicas=0 rs/control -n arcdataservices
Conéctese a SQL Server
controldb
comosystem
se describe en el paso 1.Elimine la base de datos del controlador dañada mediante T-SQL:
DROP DATABASE controller
Restaurar la base de datos a partir de la copia de seguridad: después de quitar la copia de seguridad dañada
controllerdb
. Por ejemplo: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
Escale la copia de seguridad de ReplicaSet del controlador hasta 1 réplica.
kubectl scale --replicas=1 rs/control -n <namespace>
Por ejemplo:
kubectl scale --replicas=1 rs/control -n arcdataservices
Escenario de almacenamiento dañado
En este escenario, el almacenamiento que hospeda los archivos de registro y datos del controlador de datos, tiene daños y se ha aprovisionado un nuevo almacenamiento y necesita restaurar la base de datos del controlador.
Siga estos pasos para restaurar la base de datos del controlador a partir de una copia de seguridad con nuevo almacenamiento para StatefulSet controldb
:
Asegúrese de que tiene una copia de seguridad del último estado correcto conocido de la base de datos
controller
Escale replicaSet del controlador a 0 réplicas de la siguiente manera:
kubectl scale --replicas=0 rs/control -n <namespace>
Por ejemplo:
kubectl scale --replicas=0 rs/control -n arcdataservices
Escale StatefulSet
controldb
a 0 réplicas, como se indica a continuación:kubectl scale --replicas=0 sts/controldb -n <namespace>
Por ejemplo:
kubectl scale --replicas=0 sts/controldb -n arcdataservices`
Cree un secreto de kubernetes denominado
controller-sa-secret
con el siguiente CÓDIGO YAML:apiVersion: v1 kind: Secret metadata: name: controller-sa-secret namespace: <namespace> type: Opaque data: password: <base64 encoded password>
Edite StatefulSet
controldb
para incluir un volumencontroller-sa-secret
y el montaje de volumen correspondiente (/var/run/secrets/mounts/credentials/mssql-sa-password
) en el contenedormssql-server
mediante el comandokubectl edit sts controldb -n <namespace>
.Cree nuevas notificaciones de volumen persistente de datos (
data-controldb
) y registros (logs-controldb
) para el podcontroldb
de la siguiente manera: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>
Vuelva a escalar StatefulSet
controldb
a 1 réplica mediante:kubectl scale --replicas=1 sts/controldb -n <namespace>
Conéctese al servidor SQL Server
controldb
comosa
mediante la contraseña del secreto creadocontroller-sa-secret
anteriormente.Cree un inicio de sesión
system
con el rol sysadmin mediante la contraseña en el secreto de kubernetescontroller-system-secret
de la manera siguiente:CREATE LOGIN [system] WITH PASSWORD = '<password-from-secret>' ALTER SERVER ROLE sysadmin ADD MEMBER [system]
Restaure la copia de seguridad mediante el comando
RESTORE
de la manera siguiente:
RESTORE DATABASE [controller] FROM DISK = N'/var/opt/backups/mssql/<controller backup file>.bak' WITH FILE = 1
Cree un inicio de sesión
controldb-rw-user
con la contraseñacontroller-db-rw-secret
en el secretoCREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>'
y asócielo al usuario existentecontroldb-rw-user
en la base de datos del controladorALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user]
.Deshabilite el inicio de sesión
sa
mediante TSQL:ALTER LOGIN [sa] DISABLE
.Edite StatefulSet
controldb
para quitar el volumen y elcontroller-sa-secret
montaje del volumen correspondiente.Elimine el secreto de
controller-sa-secret
.Escale la copia de seguridad de ReplicaSet del controlador hasta 1 réplica mediante el comando
kubectl scale
.