Como posso fazer backup de um banco de dados grande do SQL Server sem afetar o desempenho?


18

Tivemos relatórios de consultas em execução lenta ou com tempo limite de manhã cedo, e o único trabalho que vejo em execução que acho que poderia afetar esse é o trabalho de backup do banco de dados.

O banco de dados em si tem cerca de 300 GB e o trabalho de backup começa às 4:30 e não termina até um pouco depois das 7:00. A sintaxe atual do nosso trabalho de backup é:

BACKUP DATABASE [DatabaseName]
TO DISK = N'E:\Database Backups\DatabaseName.Bak'
WITH INIT, NOUNLOAD, NAME = N'DatabaseName.Bak',
NOSKIP, STATS = 10, NOFORMAT

E:\ é uma partição no servidor que contém os bancos de dados e os backups do banco de dados.

Também deve ser observado que este é um servidor virtual, não um servidor independente dedicado. Começamos a receber reclamações sobre lentidão durante o processo de backup logo após mudarmos para um servidor virtual, então acho que isso pode estar relacionado.

Existe uma maneira de executar esta tarefa de backup para que ela não afete o desempenho da consulta durante a execução?

Estamos usando o SQL Server 2005

Respostas:


21
  1. Isole a E / S de backup do restante da E / S no seu sistema. Embora possa demorar mais e estar mais propenso a soluços, fazer backup na rede em vez de em um disco local pode ajudar a aliviar o impacto direto na instância. Mesmo em uma máquina virtual, você deve poder expor outro armazenamento para que o SQL Server possa gravar em um subsistema de E / S diferente.
  2. É improvável que faça alguma diferença, mas, se for executado a partir de um trabalho, por que você precisa usar a STATSopção? Tem certeza de que precisa as outras opções ( NOUNLOAD, NOSKIP, NOFORMAT)? Eu não fiz nenhum teste de desempenho extensivo em toda a matriz de opções, mas IMHO você deve usar apenas as opções que sabe que precisa.
  3. Execute seus backups completos em um horário diferente que não interfira na atividade regular do usuário. Isso nem sempre é possível, mas mesmo em operações 24 horas por dia, 7 dias por semana, há períodos de pico e pausa.
  4. Se você mudar para 2008+, poderá aproveitar a compactação de backup (Enterprise em 2008, Standard ou Enterprise em 2008 R2 +). Se você não pode mudar para 2008 ou não possui a edição adequada, existem ferramentas de backup de terceiros que farão a compactação para você, e todas elas são muito boas. Desde 2008, sou capaz de usar a compactação nativa e estou bastante satisfeito com a velocidade e a porcentagem de compactação, sem a necessidade de investir mais em terceiros. Mas, em 2005, lembro-me de ter um bom sucesso com o Red-Gate SQL Backup ; O Quest LiteSpeed também é bastante bom, mas não tenho idéia de que tipo de esforço está sendo feito desde a aquisição da Dell.
  5. Se seus bancos de dados estiverem em recuperação completa, você poderá demorar mais tempo entre os backups completos, trocando isso pelo conhecimento de que, se precisar se recuperar até um determinado momento, você provavelmente terá mais logs para restaurar. Você pode combinar esta opção com a sugestão de Ali de fazer diffs ao longo da semana - se você tivesse que se recuperar na quinta-feira, seria necessário restaurar 1 completo, 1 diff e os logs desde o diff.
  6. Se você tiver muitos dados obsoletos e imutáveis, considere hospedá-los em um banco de dados diferente com um plano de recuperação diferente ou pelo menos em grupos de arquivos diferentes e divida as operações de backup dessa maneira. Se você tiver dados de referência ou arquivamento que podem ser tornados somente leitura e se estiver em recuperação simples, poderá movê-los para seu próprio grupo de arquivos somente leitura, faça backup uma vez e não precisará incluí-los em seus backups noturnos nunca mais. Veja estes tópicos do MSDN:

Executando restaurações fragmentadas

Exemplo: Restauração fragmentada de apenas alguns grupos de arquivos (modelo de recuperação simples)


Você poderia me indicar a direção certa para aprender mais sobre como isolar a E / S de backup do restante da E / S no sistema? O nº 3 (alteração do horário dos backups) não é uma opção, já que as 4h30 é o melhor momento para executar o backup, e falamos sobre a atualização para 2008 (nº 4), mas não acho que isso esteja acontecendo em breve.
Rachel

Não sabe ao certo como apontar na direção certa - você pode expor outro armazenamento à máquina virtual?
Aaron Bertrand

Sim, acho que podemos expor outro armazenamento à máquina virtual. Quando você diz "isolando a E / S de backup do restante da E / S no sistema", está se referindo ao backup em uma unidade de rede em vez de uma unidade de disco?
18712 Rachel

3
Não, refiro-me ao backup em qualquer outro subsistema de E / S que não seja o disco em que você também executa simultaneamente leituras e gravações para atividades regulares do banco de dados e tempdb. Pode ser uma unidade de disco diferente no mesmo servidor, um compartilhamento em outra máquina, um LUN diferente na SAN, um compartilhamento em um NAS etc.
Aaron Bertrand

A restauração fragmentada é uma ótima solução em que eu não pensei, obrigado por publicá-la!
Ali Razeghi

8

Esse é um problema comum, existem várias soluções e realmente depende do seu ambiente. Vamos passar por eles:

1- Compactação de backup em tempo real

Em 2008, a compactação de backup R1 tornou-se disponível na empresa, em 2008R2 tornou-se disponível no padrão. Isso é ENORME. Isso poupará muito tempo. Se você pode atualizar, vá em frente. Se não puder, consulte o utilitário HyperBak da RedGate ou o Quest LiteSpeed . Ambos têm uma avaliação gratuita.

2- Backups completos e diferentes

Eu herdei um banco de dados de produtos de 2TB, causando muitos tempos de espera para uma empresa de Internet 24/7 que eu trabalhei. Ativamos backups completos e diferenciais, o que nos poupou muito tempo. Eu faria um backup completo no domingo às 12:00 quando a atividade era baixa e fazia diferenças durante a semana. Isso economizou muito espaço. O trabalho de Diff é diferente dos logs de transações, pois eles trabalham em quais páginas do banco de dados foram alteradas. Todas as páginas alteradas são copiadas. Assim, você faz uma restauração completa e, em seguida, a restauração diff para adicionar as páginas modificadas.

3- Qual é o seu gargalo?

A análise de gargalo é importante para diagnosticar. Você está fazendo backup na mesma matriz de disco que seus arquivos de dados? Seus arquivos de dados estão sendo rastreados? Qual é o seu DISCO SEC / READ e DISK SEC / WRITE para os discos de dados durante os backups? Modifiquei os backups para criar 4 arquivos. Cada arquivo tem seu próprio gravador de threads e em nossa SAN que funcionou muito bem. Teste, raspei 45 minutos criando apenas 4 arquivos de backup. Apenas verifique se as métricas de disco listadas acima estão baixas. Obtenha uma linha de base.

4- Replicar para um servidor diferente e fazer backup disso

Este é um pouco avançado. É necessário garantir que o banco de dados replicado esteja atualizado e você precise de um monitoramento adequado para isso. Se for esse o caso, você pode apenas fazer backup do banco de dados replicado.


Apenas um alerta sobre o HyperBak, ele não fornece ganhos em VLDBs quando o testei no final de 2011. Conversei com o RedGate e eles mencionaram que era um bug, então, esperamos que esteja resolvido agora. Eu não acho que 300 GB seria considerado VLDB de qualquer maneira, mas cuidado com isso se não funcionar como o esperado.
Ali Razeghi

-1

Você pode usar estes parâmetros:

BLOCKSIZE - Escolha o tamanho 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536. (em KB)

BUFFERCOUNT - Especifica o número total de buffers de E / S a serem utilizados para a operação de backup. Você pode especificar qualquer número inteiro positivo; no entanto, um grande número de buffers pode causar erros de "falta de memória" devido ao espaço de endereço virtual inadequado no processo Sqlservr.exe. - do MSDN

MAXTRNASFERSIZE - É de 65536 bytes (64 KB) a 4194304 bytes (4 MB)


-3

Tente. resolveu o problema de tempo limite expirado enquanto o tamanho grande db.

Private Sub Command1_Click()
On Error Resume Next
Dim con As New Connection
Dim tm As String
con.CommandTimeout = 500'''Command timeout should be 500


 With con
    .ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=dbiBMS;Data Source=192.168.103.4"
    .Open
 End With
 tm = CStr(Time)

con.Execute " backup database dbiBMS to disk='E:\Database_Backup\Test1.bak' with format "

con.Close
MsgBox tm
Exit Sub
x:
MsgBox Err.Description

End Sub

3
Não creio que definir o tempo limite para 500ms corrija o problema do tempo limite expirado.
vijayp
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.