SQL Server: Como reduzir arquivos FileStream?

4

Para um projeto, estou usando um SQL Server 2008 R2. Uma tabela tem uma coluna de fluxo de texto.

Eu fiz alguns testes de carga, e agora o banco de dados tem ~ 20GB usado.

Eu tenho tabelas vazias, exceto várias (tabelas de configuração). Mas meu banco de dados ainda estava usando muito espaço. Então eu usei o Task -> Shrink -> Database / Files Mas meu banco de dados ainda está usando algo como 16GB.

Descobri que o arquivo filestream ainda está usando muito espaço.

O problema é que eu preciso fazer backup deste banco de dados para exportá-lo no servidor de produção final, e caso eu indique para compactar o backup, recebi um arquivo de mais de 3.5Go. Não é conveniente armazenar e fazer o upload.

E estou planejando um teste muito maior, por isso quero saber como reduzir esse espaço vazio.

Quando estou tentando:

Eureceboestaexceção:

The properties SIZE, MAXSIZE, or FILEGROWTH cannot be specified for the FILESTREAM data
file 'FileStreamFile'. (Microsoft SQL Server, Error: 5509)

Então, o que devo fazer?

Encontrei vários tópicos com este erro, mas eles estavam prestes a remover a coluna do fluxo de arquivos.

    
por J4N 22.06.2012 / 14:02

2 respostas

2

Versões antigas de arquivos são removidas do fluxo de arquivos por meio de um processo de coleta da garabage que é executado durante o processo do ponto de verificação.

veja link para uma explicação completa.

então - você percorre todos os aros, executa um backup de log, um ponto de verificação e então ... espere, porque o coletor de lixo estúpido apenas exclui arquivos a uma taxa de aproximadamente 4 ou 5 por segundo.

novo em 2012, eu acho? é sp_filestream_force_garbage_collection ( link ) - mas não o usei, por isso não posso dizer como eficaz é.

    
por 23.06.2012 / 03:02
0

O problema é que o espaço não será liberado até que a coleta de lixo seja concluída. Infelizmente não há como forçar isso.

Eu usei um script PowerShell para percorrer os arquivos do fluxo de arquivos e esvaziar o conteúdo deles. (observe que isso removerá os dados do fluxo de todos os registros, contanto que você não precise deles). Isso deixará o arquivo associado ao registro, mas parecerá que o campo estava vazio.

Você precisará alterar o caminho para a sua pasta de filesteam, mas isso é essencialmente o que eu usei.

$files = Get-ChildItem -Path "C:\MSSQL\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\MyDbRestore_9.MyDbRestore_Filestream" -Recurse -File -Exclude "*.hdr"

ForEach ($file in $files) { Clear-Content $file.FullName }
    
por 17.11.2016 / 18:52