Mantendo pequenos backups (parciais) pequenos ao usar o SQL Server FILESTREAM

12

Eu tenho um banco de dados com quase 1 TB de FILESTREAMdados dos quais não preciso fazer backup (se os dados forem excluídos, eles serão recriados automaticamente em algumas horas, por isso não é importante). A maioria dos dados é alterada a cada dois dias, portanto, os backups diferenciais não ajudam a manter o tamanho baixo.

Eu tinha os backups funcionando da maneira que eu precisava, configurando o Recovery Mode Full, criando um separado FILEGROUPpara o e FILESTREAM, em seguida, fazendo backups apenas do "Primário" FILEGROUP. O problema causado foi que o arquivo de log (que também é copiado) agora é desnecessariamente grande porque inclui os FILESTREAMdados.

SIMPLEO Modo de recuperação retira minha capacidade de fazer backups de FILEGROUPs específicos , então também não acho que isso seja uma opção.

Meu pensamento é apenas mover os FILESTREAMdados para um banco de dados separado, mas agora estou perdendo a integridade referencial e certamente herdando uma série de outros problemas.

Existe alguma maneira de criar backups parciais no Simplemodo de recuperação (sem definir a FILESTREAMtabela como somente leitura)? Caso contrário, existem outras soluções sãs para o meu problema?

David Murdoch
fonte

Respostas:

3

O problema que isso causou foi que o arquivo de log (que também é copiado) agora é desnecessariamente grande porque inclui os dados FILESTREAM.

Não tenho certeza se você quer dizer que o arquivo de log em si é muito grande ou se os backups do arquivo de log se tornam muito grandes.

Se for o primeiro, com que frequência você estava fazendo o backup? Dependendo do design do aplicativo, você poderá reduzir o tamanho fazendo backup com mais frequência (e a cada 5 minutos não é com muita frequência). No entanto, se você já estava fazendo isso e ainda estava balançando, provavelmente está sem sorte. Por que o arquivo de log grande é um problema novamente?

Se for o último, parecia que você estava feliz em continuar com o modelo de recuperação simples e não há restauração pontual se permitir backups menores; nesse caso, permaneça no modo completo e descarte seus backups de log.

Cody Konior
fonte
Não percebi backups de log que geralmente não eram incomuns! Seu "Por que o arquivo de log grande é um problema novamente?" pergunta realmente me fez pensar sobre isso e eu não tive uma resposta. Então, +100 para você!
David Murdoch
3

Uma solução para um banco de dados definido no modo de recuperação SIMPLE é ter os dados FILESTREAM em um grupo de arquivos somente leitura (que não é a sua opção ideal) e, em seguida, fazer backup apenas dos grupos de arquivos de leitura / gravação com DIFFERENTIAL como este:

BACKUP DATABASE [name] READ_WRITE_FILEGROUPS TO DISK = '' WITH DIFFERENTIAL, COMPRESSION;

Ele obterá todos os dados que foram alterados em qualquer grupo de arquivos de leitura / gravação. É o mais fácil, pronto para uso, que você pode manter backups parciais gerenciáveis ​​sem obter os dados do FILESTREAM. No entanto, seria necessário que o processo de carregamento dos dados mencionados precisasse modificar o grupo de arquivos para leitura / gravação, carregar quaisquer dados adicionais e, em seguida, configurar para ler apenas novamente. Certamente não é o ideal.

Stephen Falken
fonte
Isso teria sido perfeito se nosso sistema automatizado tivesse sido projetado para lidar com o FILESTREAM às vezes sendo READONLY. Infelizmente, a refatoração de todos os serviços levaria muito tempo, especialmente porque podemos apenas jogar discos rígidos no problema agora. Graças a você, daqui para frente, todos os novos serviços serão projetados com isso em mente, e os planos para atualizar serviços antigos ao longo do tempo estão em vigor. (Eu gostaria de poder recompensá-lo metade da generosidade!
David Murdoch
2

Sinto-me sujo ao fornecer isso como uma opção, mas se você optar por segregar os dados FILESTREAM em seu próprio banco de dados, poderá manter o RI entre as tabelas nos dbs separados por meio de gatilhos :

Acionadores -> Comentários -> Limitações:
Um acionador é criado apenas no banco de dados atual; no entanto, um gatilho pode fazer referência a objetos fora do banco de dados atual.

Espere que os problemas de desempenho e uma seção do couro cabeludo fiquem sem pêlos depois de puxar tufos de pêlos da cabeça em frustração, mas teoricamente você poderia fazer isso. Eu não recomendo essa abordagem em nenhum nível; em vez disso, sugiro fortemente que você aumente a frequência de seus backups de tlog e / ou mude para o modelo de recuperação com registro em massa e veja quanto espaço você economiza, mas essa é uma solução possível. Você realmente precisaria considerar o benefício de separar esses dados e lidar com um design de banco de dados frankensteiniano, mas é uma opção.

... Eu tenho que ir tomar banho agora ...

John Eisbrener
fonte
1

Sei que esta pergunta já foi respondida, mas há outra solução que pode ajudar outras pessoas. Recentemente, aprendi no blog de Brent Ozar que existe uma opção para descartar seus backups de log imediatamente:

BACKUP LOG MyDb TO DISK='NUL:'

Assim, você pode deixar seu banco de dados no Fullmodo de recuperação e fazer backups de grupos de arquivos. Quando o log de transações ficar muito grande, basta emitir o comando backup log e pronto.

Jörg Weigel
fonte
Eu ainda recomendaria que os backups de log fossem executados como um trabalho agendado, para garantir que atividades inesperadas não aumentem o tamanho do arquivo de registro de maneira não razoável.
precisa saber é o seguinte