1. Objetivo
Ao fazer a manutenção do banco de dados SQL Server, quando nosso chefe nos pede para mover dezenas de gigabytes de arquivos de dados para outros servidores e exige um tempo de inatividade mínimo, temos algum plano para atender a esses requisitos?
Aqui assumimos que as duas máquinas não estão na mesma sala de computadores, então nossa solução parece mais significativa. Se você tiver sorte e as duas máquinas estiverem na mesma LAN, então parabéns, você pode ter muito mais O programa pode. faça isso.
2. Análise e ideias de design
Na verdade, o ambiente que assumimos tem duas características: a primeira é que o arquivo de banco de dados é relativamente grande; a segunda é que nossa velocidade de transferência de arquivos pode ser relativamente lenta; Talvez não haja nada que possamos fazer quanto à velocidade de transmissão, mas podemos partir do problema do tamanho do arquivo e combiná-lo com as características do SQL Server, para que tenhamos a seguinte solução.
Para minimizar o tempo de inatividade, usamos backup completo e backup diferencial para migrar o banco de dados. Durante o dia, faça um backup completo (XXX_full.bak) do banco de dados que precisa ser migrado e copie o arquivo de backup (você pode usar). Software FTP aqui) Execute a retomada do ponto de interrupção) para o servidor de destino para restauração, espere até depois do horário de trabalho e execute um backup diferencial (XXX_diff.bak), depois copie esse backup diferencial para o servidor de destino e execute a restauração diferencial com base na restauração completa .
O tempo de inatividade aqui = tempo de backup diferencial + tempo de transferência do arquivo de backup diferencial + tempo de restauração do arquivo de backup diferencial Esse tempo de inatividade faz você sentir que esse tempo é muito curto?
3. Roteiro de referência
Preste atenção ao modificar o nome do banco de dados no script abaixo, bem como o caminho absoluto.
--1: backup completo
declare @nomedobd varchar(100)
declare @sql nvarchar(máx.)
definir @dbname = 'DataBaseName'
definir @sql = '
BANCO DE DADOS DE BACKUP ['+@dbname+']
PARA O DISCO = ''D:DBBackup'+@dbname+'_full.bak''
COM NOFORMAT, NOINIT, NAME = '''+@dbname+' -Backup completo do banco de dados'',
Pular, NOREWIND, NOUNLOAD, ESTATÍSTICAS = 10
IR'
Imprimir @sql
--SQL gerado
--DataBaseName_full
BACKUP DE BANCO DE DADOS [DataBaseName]
TO DISK = 'D:DBBackupDataBaseName_full.bak'
COM NOFORMAT, NOINIT, NAME = 'backup completo do banco de dados DataBaseName',
SKIP, NOREWIND, NOUNLOAD, ESTATÍSTICAS = 10
IR
--2: Backup e restauração completos
declare @nomedobd varchar(100)
declare @sql nvarchar(máx.)
definir @dbname = 'DataBaseName'
definir @sql = '
--RESTORE '+@dbname+'_full
RESTAURAR BANCO DE DADOS ['+@dbname+']
FROM DISK = ''D:DBBackup'+@dbname+'_full.bak'' COM ARQUIVO = 1,
MOVE N''DataBase_Name'' PARA N''D:DataBase'+@dbname+'.mdf'',
MOVE N''DataBase_Name_log'' PARA N''D:DataBase'+@dbname+'_log.ldf'',
NORECOVERY, NOUNLOAD, REPLACE, ESTATÍSTICAS = 10
IR'
imprimir @sql
--SQL gerado
--RESTORE DataBaseName_full
RESTAURAR BANCO DE DADOS [DataBaseName]
FROM DISK = 'D:DBBackupDataBaseName_full.bak' COM ARQUIVO = 1,
MOVE N'DataBase_Name' PARA N'D:DataBaseDataBaseName.mdf',
MOVE N'DataBase_Name_log' PARA N'D:DataBaseDataBaseName_log.ldf',
NORECOVERY, NOUNLOAD, REPLACE, ESTATÍSTICAS = 10
IR
--3: Backup diferencial
declare @nomedobd varchar(100)
declare @sql nvarchar(máx.)
definir @dbname = 'DataBaseName'
definir @sql = '
BANCO DE DADOS DE BACKUP ['+@dbname+']
PARA O DISCO = N''D:DBBackup'+@dbname+'_diff.bak''
COM DIFERENCIAL, NOFORMAT, NOINIT, NAME = N'''+@dbname+' -Backup diferencial do banco de dados'',
SKIP, NOREWIND, NOUNLOAD, ESTATÍSTICAS = 10
IR
'
imprimir @sql
--SQL gerado
--DataBaseName_diff
BACKUP DE BANCO DE DADOS [DataBaseName]
PARA O DISCO = N'D:DBBackupDataBaseName_diff.bak'
COM DIFERENCIAL, NOFORMAT, NOINIT, NAME = N'DataBaseName-backup de banco de dados diferencial',
SKIP, NOREWIND, NOUNLOAD, ESTATÍSTICAS = 10
IR
--4: Backup e restauração diferencial
declare @nomedobd varchar(100)
declare @sql nvarchar(máx.)
definir @dbname = 'DataBaseName'
definir @sql = '
--RESTORE '+@dbname+'_full
RESTAURAR BANCO DE DADOS ['+@dbname+']
FROM DISK = ''D:DBBackup'+@dbname+'_diff.bak'' COM ARQUIVO = 1,
NOUNLOAD, ESTATÍSTICAS = 10
IR'
imprimir @sql
--SQL gerado
--RESTORE DataBaseName_full
RESTAURAR BANCO DE DADOS [DataBaseName]
FROM DISK = 'D:DBBackupDataBaseName_diff.bak' COM ARQUIVO = 1,
NOUNLOAD, ESTATÍSTICAS = 10
IR
4. Pós-escrito
Talvez devesse estar aqui, mas muitas vezes o tiro sai pela culatra. Às vezes, o tamanho do nosso arquivo de banco de dados não é de dezenas de gigabytes, então o que devemos fazer? Existem outras soluções?
Já movi um arquivo de dados 700G antes, mas tive tempo suficiente para movê-lo. Mudei os dados para o novo servidor por meio do trabalho de banco de dados. A vantagem disso é otimizar o banco de dados anterior, como Definir parâmetros do banco de dados. como partições de tabela e migrar dados com o mínimo impacto possível no banco de dados anterior. Escreverei o processo detalhado na próxima vez.
(Autor: Ouça o Vento e a Chuva Fonte: http://gaizai.cnblogs.com/ )