Copia de seguridad de múltiples bases de datos en el mismo punto en el tiempo

10

Por lo general, cuando comenzamos la copia de seguridad, no permitimos que los cambios se confirmen o la base de datos no será accesible. Quiero decir que la base de datos estará en modo de usuario único, pero quiero iniciar la copia de seguridad y liberar la base de datos para su uso. Además, una vez que comience la copia de seguridad, no quiero que los cambios en curso se escriban en el archivo de copia de seguridad. Quiero saber cómo puedo lograr esto en Microsoft SQL Server 2012. Por favor, ayúdenme.

Bueno, déjame explicarte mi problema primero. Actualmente estoy configurando la base de datos en modo de usuario único hasta que se complete la copia de seguridad. Este modo servirá a mi propósito de evitar los cambios de datos cuando la copia de seguridad esté en progreso. Pero mi aplicación está vinculada con las múltiples bases de datos (cada una de las bases de datos están interconectadas entre sí y hay varios dbs que se siguen creando mensualmente). Por lo tanto, hacer una copia de seguridad de todas estas bases de datos se ha convertido en un proceso tedioso y, lo que es más importante, tengo que mantener a los usuarios fuera del sistema cuando la copia de seguridad está en curso.

Así que estoy buscando un mecanismo de respaldo que cumpla con los requisitos mencionados a continuación.

  1. Inicie la copia de seguridad de todos los dbs a la vez y libere el db para su uso.
  2. Como las bases de datos están interconectadas entre sí, quiero mantener la consistencia de los datos en los archivos de respaldo. Entonces, debido a este requisito de consistencia de datos, no quiero que los cambios continuos se confirmen en mi archivo de copia de seguridad.

Todo lo que quiero es: copia de seguridad de todos los dbs en un momento dado.

Praveen
fuente
2
No tiene que configurar su base de datos en modo de usuario único cuando realiza copias de seguridad. SQL Server nunca incluirá transacciones no confirmadas en su copia de seguridad. Para obtener una respuesta más completa, edite su publicación para incluir detalles de su modelo de recuperación, ya sea que se refiera a copias de seguridad del registro de transacciones, copias de seguridad completas o incrementales, así como también el problema que está experimentando. Tal como está, su pregunta no está clara.
Daniel Hutmacher
1
¿Qué quieres lograr con esta copia de seguridad? Recuperación total hasta este punto, o algo más? En otras palabras ... Si tiene que restaurar desde esta copia de seguridad, ¿qué debe restaurarse? ¿Cambios en los datos o qué?
setenta
Lo que desea no es posible en SQL 2012. En los días de SQL 7.0, el conjunto de copia de seguridad de la base de datos se usaba para volver a crear la base de datos tal como estaba en el momento en que se inició la instrucción BACKUP. A partir de SQL 2000 y posteriores, se utiliza un conjunto de copia de seguridad de la base de datos para volver a crear la base de datos tal como estaba en el momento en que se completó la instrucción BACKUP.
stacylaray
@DanielHutmacher Estoy buscando copias de seguridad completas.
Praveen

Respuestas:

13

Supongo que su tarea es crear un conjunto de copias de seguridad donde pueda restaurarlas a un único punto estático (sin transacciones abiertas) (todo sincronizado). Similar a lo que un punto de inactividad hará por usted en DB2. Lamentablemente, no hay nada en SQL Server que haga exactamente eso. Sin embargo, suponiendo que sus bases de datos estén en modo de recuperación COMPLETA, puede hacer algo similar.

Puede crear una sola MARKEDtransacción en todas las bases de datos a la vez . Luego, realiza una copia de seguridad del registro de transacciones de cada base de datos. Suponiendo que esté al día con sus copias de seguridad de registros (lo que debería ser de todos modos), las copias de seguridad de registros no toman mucho tiempo. Y no hay necesidad de evitar que alguien esté en el sistema (excepto tal vez lo suficiente como para que pueda crear su transacción marcada).

En este punto, si necesita hacer una restauración, haga una RESTORE STOPBEFOREMARKen cada una de sus bases de datos. Esto restaurará todas las bases de datos al mismo punto (según su transacción). Nota: También hay un STOPATMARK si desea incluir esa transacción.

Si quieres un ejemplo, tengo uno en el enlace de arriba junto con bastante lectura adicional.

Me doy cuenta de que esto no responde exactamente a su pregunta, pero espero que resuelva su problema.

Kenneth Fisher
fuente
2
Así es como BizTalk gestiona las copias de seguridad en un punto en el tiempo de múltiples bases de datos. Si funciona para Microsoft BizTalk, es una característica bastante probada.
Max Vernon el
Lo usamos para bases de datos TFS en el registro de registros que cambiamos a alwaysOn.
Kin Shah
1
Un detalle (implícito pero no dicho) para llevar la respuesta de Ken a casa: no puede tener una copia de seguridad COMPLETA consistente en múltiples bases de datos. Lo más cercano que puede llegar es tomar una ronda de copias de seguridad completas, seguida inmediatamente por una transacción marcada, luego una ronda de copias de seguridad de registros. Esa primera ronda de copias de seguridad de registros "realzaría" la consistencia hasta el punto en el tiempo.
AMtwo
@AMtwo técnicamente podría usar el método OP. Bloquee a todos del sistema, asegúrese de que no haya conexiones activas (tal vez marque las bases de datos como de solo lectura / restringidas), luego realice copias de seguridad completas de cada base de datos. Sin embargo, como dijo el OP, no es el mejor método del mundo.
Kenneth Fisher
7

Su pregunta es similar a la que he respondido: ¿ Hacer copias de seguridad y restaurar 10-20 bases de datos de SQL Server a un estado ~ sincrónico?

Suponiendo que su modelo de recuperación de la base de datos esté COMPLETO, debe realizar una copia de seguridad completa y luego usar las transacciones marcadas .

Vamos a desacreditar tus mitos ...

Inicie la copia de seguridad de todos los dbs a la vez y libere el db para su uso.

De los mitos de respaldo (le recomendamos encarecidamente que lea todos los mitos de respaldo) :

Las operaciones de copia de seguridad no bloquean los objetos del usuario. Las copias de seguridad causan una carga de lectura realmente pesada en el subsistema de E / S, por lo que puede parecer que la carga de trabajo está siendo bloqueada, pero en realidad no lo es. Solo se está ralentizando. Hay un caso especial en el que una copia de seguridad que tiene que recoger extensiones registradas en bloque tomará un bloqueo de archivo que podría bloquear una operación de punto de control, pero DML nunca se bloquea.

Como las bases de datos están interconectadas entre sí, quiero mantener la consistencia de los datos en los archivos de respaldo. Entonces, debido a este requisito de consistencia de datos, no quiero que los cambios continuos se confirmen en mi archivo de copia de seguridad.

Las transacciones marcadas lo ayudarán a realizar copias de seguridad de LOG consistentes y podrá restaurarlas utilizando RESTORE ... WITH STOPBEFOREMARK = '<mark_name>'

Recuerde que las transacciones marcadas para todas las bases de datos en la instancia también se registran en la dbo.logmarkhistorytabla de la MSDBbase de datos.

Kin Shah
fuente
-1
--]---- Begin Code ----[
--–declaring variables
DECLARE @dbname VARCHAR(100) -- database name
DECLARE @bupath VARCHAR(100) -- path for backup location
DECLARE @filename VARCHAR(100) -- filename used for backup files
DECLARE @datestamp VARCHAR(25) -- date used for backup file timestamp
-- specify database backup directory
SET @bupath = 'D:\DB Bkp\'
-- file date formatting
SELECT @datestamp = CONVERT(VARCHAR(20),GETDATE(),112) + REPLACE
(CONVERT(VARCHAR(20),GETDATE(),108),':','')
--specify databases to backup
DECLARE db_cursor CURSOR for
SELECT name
FROM master.dbo.sysdatabases
WHERE name not IN ('tempdb') -- excludes these databases, if excluding multiple databases, seprate them by a comma
--backup process
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
   SET @filename = @bupath + @dbname + '_' + @datestamp + '.bak'
   BACKUP DATABASE @dbname TO DISK = @filename WITH INIT,
   CHECKSUM; --init overwrites existing files with the same name, and checksum verifies the backup
       FETCH NEXT from db_cursor INTO @dbname
END
CLOSE db_cursor
DEALLOCATE db_cursor

para más detalles: https://blogs.technet.microsoft.com/letsdothis/2013/11/06/backup-multiple-sql-databases-in-a-single-swoop/

thambu
fuente
Esto no garantiza copias de seguridad en el mismo punto de tiempo. Es simplemente una secuencia de copias de seguridad consecutivas.
vonPryz