No se puede reflejar una base de datos SQL Server 2012

11

Al intentar duplicar una base de datos con el siguiente comando

ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ

Obtuve el siguiente error

Msg 1475, Nivel 16, Estado 105, Línea 1 La
base de datos "test0916aj8CJ" podría contener cambios masivos registrados que no han sido respaldados. Realice una copia de seguridad del registro en la base de datos principal o la base de datos primaria. Luego restaure esta copia de seguridad en la base de datos reflejada para habilitar la duplicación de la base de datos o en cada base de datos secundaria para permitirle unirla al grupo de disponibilidad.

¿Se puede hacer esto sin respaldar la base de datos? O debería hacer una copia de seguridad y luego descartar la copia de seguridad. Es para una base de datos recién creada, por lo que no necesito la copia de seguridad de todos modos en este momento.

He probado lo siguiente...

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL
WITH COPY_ONLY, NOFORMAT, INIT,
NAME = Ntest-Full Database Backup’,
SKIP, NOREWIND, NOUNLOAD
GO

pero el método anterior tampoco funcionó.

Gracias

Cuenta
fuente
Un par de cosas ... En realidad, no está reflejando con ese comando, sino agregando una base de datos a un grupo de disponibilidad. Lo que luego me hace preguntar sobre cómo está configurado su AG, en qué modo de recuperación están sus bases de datos y por qué, para solucionar un problema de registro, está realizando una copia de seguridad COPY_ONLY que deja el registro intacto, que no es lo que el error especifica que usted hace ? Me parece que falta algunos pasos o está muy confundido acerca de lo que está tratando de hacer.
Steve Mangiameli

Respuestas:

15

Es fácil reprobar el error que tienes

  • Crear base de datos en modo de recuperación completa en Primaria.
  • Crear base de datos en modo de recuperación completa en Secundario.
  • Inicie la GUI e intente configurar la duplicación entre Primaria y Secundaria.

A continuación se muestra el error que obtendrá:

La base de datos "test_mirroring_kin" podría contener cambios masivos registrados que no han sido respaldados. Realice una copia de seguridad del registro en la base de datos principal o la base de datos primaria. Luego restaure esta copia de seguridad en la base de datos reflejada para habilitar la duplicación de la base de datos o en cada base de datos secundaria para permitirle unirla al grupo de disponibilidad. (Microsoft SQL Server, error: 1475)

ingrese la descripción de la imagen aquí

Vamos a entender cuál es ese error:

Configuraste tu base de datos en modo de recuperación COMPLETA y piensas que la base de datos está en modo de recuperación COMPLETA.

Lo anterior no es cierto. Después de crear la base de datos, si no realiza una copia de seguridad COMPLETA, aunque la base de datos esté en modo de recuperación COMPLETA, está en recuperación pseudo-SIMPLE

Puede verificarlo fácilmente usando dbcc dbinfo-> dbi_dbbackupLSNteniendo valor 0:0:0(0x00000000:00000000:0000)o usando el script de Paul Randal

dbcc traceon (3604)
go
dbcc dbinfo('test_mirroring_kin') with tableresults
go
dbcc traceoff (3604)

ingrese la descripción de la imagen aquí

Editar: incluso tomar una primera copia de seguridad completa con COPY_ONLYopción no establece una cadena de copia de seguridad también

backup database test_mirroring_kin
to disk = 'D:\test_mirroring_kin_FULL.bak'
with init, stats=10, COPY_ONLY

dbcc dbinfo-> dbi_dbbackupLSNsigue teniendo valor de 0:0:0(0x00000000:00000000:0000). Esto significa que la base de datos todavía está en modo de recuperación pseudo-simple.

¿Qué debe hacer para resolver el error anterior?

Debe realizar una copia de seguridad completa + una copia de seguridad del registro de transacciones en el primario y luego restaurarlo en la base de datos secundaria with norecoveryy luego unirse a la base de datos en el grupo AG o Mirroring.

Como nota al margen y para completar, para contar su guión backup to NUL, lea esta publicación de blog de Gail Shaw.

Kin Shah
fuente
5

¿Por qué TO DISK = N’NUL’?

No entiendo por qué estás usando TO DISK = N’NUL’:

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL

Si hace eso, la copia de seguridad se guarda en NUL(es decir, en ninguna parte / nada) y no se puede usar porque su archivo no existe.

Si bien NULtambién se puede usar como destino para las copias de seguridad de LOG, tampoco se debe usar, especialmente en los servidores Prod porque los registros se perderán y la cadena de copias de seguridad se romperá. (~ similar a a SHRINKFILE)

LOG Backup

Antes de agregar una base de datos al grupo, debe prepararla. Cuando desee preparar una base de datos secundaria, se debe tomar y restaurar al menos 1 copia de seguridad del registro de transacciones. El espejo lo utiliza para determinar qué transacciones ya se han sincronizado en la base de datos secundaria y qué transacciones aún no están sincronizadas con la base de datos primaria.

Por lo tanto, debe hacer una copia de seguridad de los registros de transacciones en la base de datos primaria:

BACKUP LOG [test0916aj8CJ] TO  DISK = N'....bak' 
WITH  COPY_ONLY, FORMAT, INIT,  NAME = N'test0916aj8CJ-Transaction Log  Backup', STATS = 10

La COPY_ONLYopción debe ser utilizada. Se asegura de que los registros no estén truncados al final de la copia de seguridad del REGISTRO.

Cadena de respaldo de base de datos primaria

Sin embargo, no puede restaurar una copia de seguridad de registro solo, es decir, sin una cadena de copia de seguridad (consulte la respuesta de Kin también). Esto significa que la copia de seguridad del registro de transacciones debe tomarse después de una copia de seguridad de la base de datos COMPLETA (+ un diferencial opcional si es necesario).

Dado que la COPY_ONLYopción no rompe la cadena de respaldo, tampoco crea una cadena de respaldo. La COPY_ONLYopción no se puede utilizar para la Copia de seguridad de la base de datos.

Copias de seguridad en orden:

  • Copia de seguridad completa de la base de datos sin la COPY_ONLYopción
  • Copia de seguridad diferencial opcional
  • 1 LOG Backup con COPY_ONLYopción
  • otra (o más) LOG de respaldo si es necesario ...

Restaurar la base de datos secundaria

Entonces la copia de seguridad de la base de datos debe restaurarse (+ diferencial) en el secundario.

Debe restaurarse con la NORECOVERYopción porque también desea restaurar las copias de seguridad del REGISTRO una vez que se haya restaurado la copia de seguridad COMPLETA.

Finalmente, restaurará la copia de seguridad de LOG. Aún necesita usar la NORECOVERYopción porque el espejo seguirá restaurando las transacciones una vez en su lugar.

  • Restaurar la copia de seguridad COMPLETA con la NORECOVERYopción
  • Restaurar la copia de seguridad DIFF con la NORECOVERYopción
  • Restaure todas las copias de seguridad de LOG en orden con la NORECOVERYopción

Vamos a poner todo junto (adaptarlo a su entorno)

  • En el servidor primario, ejecute:

    USE master
    Go
    BACKUP DATABASE [test0916aj8CJ] TO DISK = N'....bak'
    WITH FORMAT, INIT, NAME = N'test0916aj8CJ-Full Database Backup', STATS = 10
    GO
    BACKUP LOG [test0916aj8CJ] TO DISK = N'....bak' 
    WITH COPY_ONLY, FORMAT, INIT, NAME = N'test0916aj8CJ-Transaction Log Backup', STATS = 10
    GO
  • En el servidor secundario, ejecute:

    USE master
    Go
    RESTORE DATABASE [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
    GO
    RESTORE LOG [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
  • Luego puede continuar agregando el nuevo DB secundario al grupo de disponibilidad ...

Acciones opcionales

  • Es mejor configurar la opción DISCO en una carpeta compartida que esté disponible tanto en el servidor primario como en el secundario.
  • También es mejor almacenar archivos DB en discos y ubicaciones similares en los servidores primario y secundario.
Julien Vavasseur
fuente