Participar dos grupos do Whatsapp tem muita coisa ruim (haja treta, gifs, imagens, piadas e etc para suportar), mas tem várias coisas bem boas também. E uma delas diz respeito ao aprendizado diário que a comunidade te proporciona, se você estiver inserido no grupo certo.
Em um dos grupos do WhatsApp que eu participo, surgiu a seguinte pergunta (há um bom tempo, mas só agora resolvi escrever a respeito):
“Alguém poderia me ajudar com script para compactar o backup assim que concluir o bak, usando o 7zip, winrar ou zip?”
Pela pergunta, de imediato, já imaginei que ele estava usando o SQL 2000 ou 2005 e não poderia usar a opção COMPRESSION do backup e sugeri usar o xp_cmdshell (IMHO, uma solução usando powershell e/ou o task scheduler seria muito melhor, mas como nem todo mundo sabe usar ele – apesar de precisar saber – optei pelo xp_cmdshell e seus perigos intrínsecos).
Até que o Edvaldo Castro citou a opção do COMPRESSION e a resposta foi: Já está usando.
Aí você se pergunta: Mas se ele já usa, qual seria o motivo para querer tentar compactar ainda mais o arquivo?
Explico: Ele precisava, também, quebrar esse backup em “N” pedaços, para poder enviar para um outro local e tentar garantir que a transferência não deixe o todo arquivo corrompido, tendo que refazer todo o processo.
Como a compactação já estava sendo realizada, deixar o servidor responsável por mais essa etapa, vai apenas consumir CPU e não vai ter ganho.
Após algumas sugestões, o Edvaldo, novamente, veio com a mágica:
1 2 3 4 5 |
BACKUP DATABASE XXX to disk= N'C:\TMP\arq1.bak', disk = N'C:\TMP\arq2.bak', disk = N'C:\TMP\arq3.bak', -- etc WITH COMPRESSION |
Isso faz com que o SQL realize essa quebra do arquivo em “N” pedaços, já realizando a compactação, removendo a necessidade de realizar os procedimentos extras.
E o restore?
1 2 3 4 |
RESTORE DATABASE XXX from disk = N'C:\TMP\arq1.bak', disk = N'C:\TMP\arq2.bak', disk = N'C:\TMP\arq3.bak', -- etc |
Vejam um exemplo:
1 2 3 4 5 6 7 8 9 10 11 |
/* Criação da base para teste */ create database BackupDividido GO use BackupDividido go create table Tbl_Teste (a char(8000)) GO insert into Tbl_Teste values (REPLICATE('',8000)) GO 100000 |
Agora, os scripts de backup:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
backup database BackupDividido to disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupComQuebraECompactado1.bak', disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupComQuebraECompactado2.bak', disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupComQuebraECompactado3.bak' WITH COMPRESSION backup database BackupDividido to disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupSemQuebraECompactado.bak' WITH COMPRESSION backup database BackupDividido to disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupComQuebraNaoCompactado1.bak', disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupComQuebraNaoCompactado2.bak', disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupComQuebraNaoCompactado3.bak' backup database BackupDividido to disk = N'C:\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\BakupSemQuebraNaoCompactado.bak' |
Claro, desta forma, você precisa pré-determinar em quantos arquivos deseja quebrar, mas nada te impede de desenvolver algo que faça esse cálculo e usar isso dinamicamente, caso precise.
Apenas como curiosidade, veja como ficaram os arquivos, com e sem compactação
Como sempre falo, de todas as comunidades que eu já participei, a de SQL Server é a que mais me surpreende, por manter esse espírito de colaboração de forma tão orgânica e natural, que o estranho hoje – para mim – é a pessoa que não faz parte desse mundo.
Vamos participar também?