Contexto
Estamos desenvolvendo um sistema com um grande banco de dados na parte inferior. É um banco de dados MS SQL em execução no SQL Server 2008 R2. O tamanho total do banco de dados é de cerca de 12 GB.
Desses, aproximadamente 8,5 GB estão em uma única tabela BinaryContent
. Como o nome sugere, esta é uma tabela na qual armazenamos arquivos simples, de qualquer tipo, diretamente na tabela como um BLOB. Recentemente, testamos a possibilidade de mover todos esses arquivos para fora do banco de dados para o sistema de arquivos usando FILESTREAM.
Fizemos as modificações necessárias em nosso banco de dados sem problemas e nosso sistema ainda está funcionando bem após a migração. A BinaryContent
tabela é mais ou menos assim:
CREATE TABLE [dbo].[BinaryContent](
[BinaryContentID] [int] IDENTITY(1,1) NOT NULL,
[FileName] [varchar](50) NOT NULL,
[BinaryContentRowGUID] [uniqueidentifier] ROWGUIDCOL NOT NULL
) ON [PRIMARY] FILESTREAM_ON [FileStreamContentFG]
ALTER TABLE [dbo].[BinaryContent] ADD [FileContentBinary] [varbinary](max) FILESTREAM NULL
ALTER TABLE [dbo].[BinaryContent] ADD CONSTRAINT [DFBinaryContentRowGUID] DEFAULT (newsequentialid()) FOR [BinaryContentRowGUID]
Com tudo residindo no PRIMARY
grupo de arquivos, exceto o campo FileBinaryContent
que está em um grupo de arquivos separado FileStreamContentFG
.
Cenário
Do ponto de vista do desenvolvedor, muitas vezes gostaríamos de uma cópia nova do banco de dados do nosso ambiente de produção, para poder trabalhar com os dados mais recentes. Nesses casos, raramente estamos interessados nos arquivos armazenados no BinaryContent (agora usando FILESTREAM).
Temos isso quase funcionando como gostaríamos. Fazemos backup do banco de dados, sem o fluxo de arquivos como este:
BACKUP DATABASE FileStreamDB
FILEGROUP = 'PRIMARY'
TO DISK = 'c:\backup\FileStreamDB_WithoutFS.bak' WITH INIT
E restaure-o assim:
RESTORE DATABASE FileStreamDB
FROM DISK = 'c:\backup\FileStreamDB_WithoutFS.bak'
Isso parece estar funcionando bem, e nosso sistema funciona desde que evitemos as peças que usam o FileBinaryContent
campo. Por exemplo, podemos executar a seguinte consulta sem problemas:
SELECT TOP 10 [BinaryContentID],[FileName],[BinaryContentRowGUID]
--,[FileContentBinary]
FROM [dbo].[BinaryContent]
Naturalmente, se eu cancelar o comentário da linha acima, inclusive FileContentBinary
na consulta, recebo um erro:
Os dados do objeto grande (LOB) da tabela "dbo.BinaryContent" residem em um grupo de arquivos offline ("FileStreamContentFG") que não pode ser acessado.
Nossos alças do sistema de arquivos onde o conteúdo está definido para null
, assim que eu gosto de fazer é algo como isto:
UPDATE [dbo].[BinaryContent]
SET [FileContentBinary] = null
Mas isso, obviamente, me dá o mesmo erro acima. Neste ponto, eu estou preso.
Pergunta
Existe alguma maneira de restaurar o banco de dados sem precisar também restaurar tudo do FileStreamContentFG
grupo de arquivos? Atualizando os valores para null como estou tentando acima, ou o padrão para null quando o arquivo está faltando ou algo assim?
Ou talvez eu esteja abordando o problema da maneira errada?
Sou um desenvolvedor por natureza e não tem muito conhecimento como DBA, por isso, desculpe-me se estou negligenciando alguma coisa trivial aqui.
Respostas:
O que você está tentando fazer deixaria o banco de dados em um estado inconsistente (transacionalmente), portanto, não é possível.
O white paper Disponibilidade parcial do banco de dados é um guia de referência útil e inclui um exemplo de como verificar se uma tabela ou arquivo específico está online. Se o seu acesso a dados for realizado através de procedimentos armazenados, você poderá incorporar essa verificação com relativa facilidade.
Uma abordagem alternativa (mas um tanto hacky) que pode valer uma olhada no seu cenário seria ocultar a tabela e substituí-la por uma visualização.
fonte
Você pode isolar a tabela com a
FILESTREAM
em um banco de dados separado e criar uma referência a ela noPRODUCTION
banco de dados usando uma visualização.Isso permitiria que você fizesse o que deseja sem recorrer a hacks.
fonte