1. Propósito
Al realizar el mantenimiento de la base de datos de SQL Server, cuando nuestro jefe nos pide que traslademos docenas de gigabytes de archivos de datos a otros servidores y requiere un tiempo de inactividad mínimo, ¿tenemos algún plan para cumplir con estos requisitos?
Aquí asumimos que las dos máquinas no están en la misma sala de computadoras, por lo que nuestra solución parece más significativa. Si tiene tanta suerte y las dos máquinas están en la misma LAN, felicidades, puede tener muchos más programas. hazlo.
2. Análisis e ideas de diseño.
De hecho, el entorno que asumimos tiene dos características: la primera es que el archivo de la base de datos es relativamente grande y la segunda es que nuestra velocidad de transferencia de archivos puede ser relativamente lenta; Quizás no podamos hacer nada con respecto a la velocidad de transmisión, pero podemos partir del problema del tamaño del archivo y combinarlo con las características de SQL Server, de modo que tengamos la siguiente solución.
Para minimizar el tiempo de inactividad, utilizamos una copia de seguridad completa y una copia de seguridad diferencial para migrar la base de datos. Durante el día, haga una copia de seguridad completa (XXX_full.bak) de la base de datos que necesita migrarse y copie el archivo de copia de seguridad (puede usarlo). Software FTP aquí) Realice la reanudación del punto de interrupción) al servidor de destino para la restauración, espere hasta después del horario laboral y realice una copia de seguridad diferencial (XXX_diff.bak), luego copie esta copia de seguridad diferencial al servidor de destino y realice una restauración diferencial basada en la restauración completa. .
El tiempo de inactividad aquí = tiempo de copia de seguridad diferencial + tiempo de transferencia del archivo de copia de seguridad diferencial + tiempo de restauración del archivo de copia de seguridad diferencial ¿Este tiempo de inactividad le hace sentir que este tiempo es muy corto?
3. Guión de referencia
Preste atención a modificar el nombre de la base de datos en el siguiente script, así como la ruta absoluta.
--1: copia de seguridad completa
declarar @dbname varchar(100)
declarar @sql nvarchar(max)
set @dbname = 'Nombre de la base de datos'
establecer @sql = '
BASE DE DATOS DE RESPALDO ['+@dbname+']
AL DISCO = ''D:DBBackup'+@dbname+'_full.bak''
CON NOFORMAT, NOINIT, NAME = '''+@dbname+' -Copia de seguridad completa de la base de datos'',
SALTAR, SIN VIENTO, SIN CARGA, ESTADÍSTICAS = 10
IR'
Imprimir @sql
--SQL generado
--NombreBaseDatos_full
BASE DE DATOS DE RESPALDO [NombreBaseDatos]
AL DISCO = 'D:DBBackupDataBaseName_full.bak'
CON NOFORMAT, NOINIT, NAME = 'DataBaseName-copia de seguridad completa de la base de datos',
SALTAR, SIN VIENTO, SIN CARGA, ESTADÍSTICAS = 10
IR
--2: copia de seguridad y restauración completa
declarar @dbname varchar(100)
declarar @sql nvarchar(max)
set @dbname = 'Nombre de la base de datos'
establecer @sql = '
--RESTORE '+@nombrebd+'_full
RESTAURAR BASE DE DATOS ['+@dbname+']
DESDE DISCO = ''D:DBBackup'+@dbname+'_full.bak'' CON ARCHIVO = 1,
MOVER N''DataBase_Name'' A N''D:DataBase'+@dbname+'.mdf'',
MOVER N''DataBase_Name_log'' A N''D:DataBase'+@dbname+'_log.ldf'',
NORECOVERY, SIN CARGA, REEMPLAZAR, ESTADÍSTICAS = 10
IR'
imprimir @sql
--SQL generado
--RESTORE NombreBaseDatos_completo
RESTAURAR BASE DE DATOS [NombreBaseDatos]
DESDE DISCO = 'D:DBBackupDataBaseName_full.bak' CON ARCHIVO = 1,
MOVER N'DataBase_Name' A N'D:DataBaseDataBaseName.mdf',
MOVER N'DataBase_Name_log' A N'D:DataBaseDataBaseName_log.ldf',
NORECOVERY, SIN CARGA, REEMPLAZAR, ESTADÍSTICAS = 10
IR
--3: copia de seguridad diferencial
declarar @dbname varchar(100)
declarar @sql nvarchar(max)
set @dbname = 'Nombre de la base de datos'
establecer @sql = '
BASE DE DATOS DE RESPALDO ['+@dbname+']
AL DISCO = N''D:DBBackup'+@dbname+'_diff.bak''
CON DIFERENCIAL, NOFORMAT, NOINIT, NOMBRE = N''+@dbname+' -Copia de seguridad de base de datos diferencial'',
SALTAR, SIN VIENTO, SIN CARGA, ESTADÍSTICAS = 10
IR
'
imprimir @sql
--SQL generado
--NombreBaseDatos_diff
BASE DE DATOS DE RESPALDO [NombreBaseDatos]
AL DISCO = N'D:DBBackupDataBaseName_diff.bak'
CON DIFFERENCIAL, NOFORMAT, NOINIT, NAME = N'DataBaseName-copia de seguridad de base de datos diferencial',
SALTAR, SIN VIENTO, SIN CARGA, ESTADÍSTICAS = 10
IR
--4: Copia de seguridad y restauración diferencial
declarar @dbname varchar(100)
declarar @sql nvarchar(max)
set @dbname = 'Nombre de la base de datos'
establecer @sql = '
--RESTORE '+@nombrebd+'_full
RESTAURAR BASE DE DATOS ['+@dbname+']
DESDE DISCO = ''D:DBBackup'+@dbname+'_diff.bak'' CON ARCHIVO = 1,
SIN DESCARGA, ESTADÍSTICAS = 10
IR'
imprimir @sql
--SQL generado
--RESTORE NombreBaseDatos_completo
RESTAURAR BASE DE DATOS [NombreBaseDatos]
DESDE DISCO = 'D:DBBackupDataBaseName_diff.bak' CON ARCHIVO = 1,
SIN DESCARGA, ESTADÍSTICAS = 10
IR
4. Posdata
Tal vez debería terminar aquí, pero a menudo resulta contraproducente. A veces el tamaño de nuestro archivo de base de datos no es de decenas de gigabytes, entonces, ¿qué debemos hacer? ¿Hay otras soluciones?
Moví un archivo de datos de 700G antes, pero me dieron tiempo suficiente para moverlo. Moví los datos al nuevo servidor a través del trabajo de la base de datos. La ventaja de esto es optimizar la base de datos anterior, como establecer los parámetros de la base de datos. como particiones de tablas y migrar datos con el menor impacto posible en la base de datos anterior. Escribiré el proceso detallado la próxima vez.
(Autor: Escuche el viento y la lluvia Fuente: http://gaizai.cnblogs.com/ )