Visão geral de FILESTREAM

Muitos dos dados criados diariamente são dados não estruturados, como documentos de texto, imagens e vídeos. Esses dados não estruturados normalmente são armazenados fora do banco de dados, separados dos dados estruturados. Essa separação pode provocar complexidades no gerenciamento de dados. Ou, se os dados estiverem associados a armazenamento estruturado, o desempenho e os recursos de streaming dos arquivos podem ser limitados.

O FILESTREAM integra o Mecanismo de Banco de Dados do SQL Server a um sistema de arquivos NTFS armazenando dados de objetos binários grandes (BLOB) varbinary(max) como arquivos no sistema de arquivos. As instruções Transact-SQL podem inserir, atualizar, consultar, pesquisar e fazer backup de dados FILESTREAM. As interfaces do sistema de arquivos do Win32 fornecem acesso de streaming aos dados.

O FILESTREAM usa o cache do sistema NT para armazenar dados de arquivos. Isso ajuda a reduzir qualquer efeito que os dados FILESTREAM possam ter no desempenho do Mecanismo de Banco de Dados. O pool de buffers do SQL Server não é usado. Portanto essa memória está disponível para processamento de consulta.

ObservaçãoObservação

Os dados de FILESTREAM não são criptografados mesmo quando a criptografia transparente de dados está habilitada.

Para obter instruções passo a passo que mostram como usar FILESTREAM, consulte Guia de introdução ao armazenamento FILESTREAM.

Quando usar FILESTREAM

No SQL Server, os BLOBs podem ser dados varbinary(max) padrão que armazenam os dados em tabelas ou objetos varbinary(max) FILESTREAM que armazenam os dados no sistema de arquivos. O tamanho e o uso dos dados determinam se você deve usar armazenamento de banco de dados ou armazenamento de sistema de arquivos. Se as condições a seguir forem verdadeiras, você deve considerar o uso de FILESTREAM:

  • Os objetos que estão sendo armazenados têm, em média, mais de 1 MB.

  • O acesso rápido para leitura é importante.

  • Você está desenvolvendo aplicativos que usam uma camada intermediária para lógica de aplicativo.

Para objetos menores, o armazenamento de BLOBs varbinary(max) no banco de dados normalmente fornece melhor desempenho de streaming.

Armazenamento de FILESTREAM

O armazenamento de FILESTREAM é implementado como uma coluna varbinary(max) na qual os dados são armazenados como BLOBs no sistema de arquivos. Os tamanhos dos BLOBs são limitados apenas pelo tamanho do volume do sistema de arquivos. A limitação padrão de varbinary(max) tamanhos de arquivos de 2 GB não se aplica a BLOBs que são armazenados no sistema de arquivos.

Para determinar que uma coluna deve armazenar dados no sistema de arquivos, especifique o atributo FILESTREAM em uma coluna varbinary(max). Isso faz com que o Mecanismo de Banco de Dados armazene todos os dados dessa coluna no sistema de arquivos, mas não no arquivo do banco de dados.

Os dados FILESTREAM devem ser armazenados em grupos de arquivos FILESTREAM. Um grupo de arquivos FILESTREAM é um grupo de arquivos especial que contém diretórios do sistema de arquivos em vez dos próprios arquivos. Esses diretórios do sistema de arquivos são chamados de contêineres de dados. Os contêineres de dados são a interface entre armazenamento Mecanismo de Banco de Dados e armazenamento de sistema de arquivos.

Ao usar armazenamento de FILESTREAM, considere o seguinte:

  • Quando uma tabela contém uma coluna FILESTREAM, cada linha deve ter uma ID de linha exclusiva não nula.

  • Contêineres de dados FILESTREAM não podem ser aninhados.

  • Ao usar clustering de failover, os grupos de arquivos FILESTREAM devem estar em recursos de disco compartilhados.

  • Grupos de arquivos FILESTREAM podem estar em volumes compactados.

Segurança integrada

No SQL Server, os dados FILESTREAM são protegidos exatamente como outros dados, com a concessão de permissões em níveis de tabela ou coluna. Se um usuário tiver permissão para a coluna FILESTREAM em uma tabela, ele poderá abrir os arquivos associados.

ObservaçãoObservação

Não há suporte para criptografia em dados FILESTREAM.

Apenas a conta sob a qual a conta de serviço do SQL Server é executada recebe permissões NTFS para o contêiner FILESTREAM. Recomendamos que nenhuma outra conta receba permissões no contêiner de dados.

Gerenciamento integrado

Como o FILESTREAM é implementado como uma coluna varbinary(max) e integrado diretamente ao Mecanismo de Banco de Dados, a maioria das funções e ferramentas de gerenciamento do SQL Server funcionam sem nenhuma modificação para dados FILESTREAM. Por exemplo, é possível usar todos os modelos de backup e recuperação com dados FILESTREAM e o backup dos dados FILESTREAM pode ser feito com os dados estruturados no banco de dados. Se você não desejar fazer backup de dados FILESTREAM com dados relacionais, poderá usar um backup parcial para excluir grupos de arquivos FILESTREAM.

Modelo de programação dupla para acessar dados BLOB

Depois de armazenar dados em uma coluna FILESTREAM, você pode acessar os arquivos usando transações Transact-SQL ou usando APIs do Win32.

Acesso ao Transact-SQL

Usando Transact-SQL, é possível inserir, atualizar e excluir dados FILESTREAM:

  • Você pode usar uma operação de inserção para pré-popular um campo FILESTREAM com um valor nulo, vazio ou com dados embutidos relativamente curtos. No entanto uma quantidade grande de dados é transmitida de maneira mais eficiente em um arquivo que usa interfaces Win32.

  • Ao atualizar um campo FILESTREAM, você modifica os dados BLOB subjacentes no sistema de arquivos. Quando um campo FILESTREAM é definido como NULL, os dados BLOB associados ao campo são excluídos. Não é possível usar uma atualização de Transact-SQL em bloco, implementada como UPDATE**.**Write(), para executar atualizações parciais nos dados.

  • Ao excluir uma linha ou ao excluir ou truncar uma tabela que contém dados FILESTREAM, você também exclui os dados BLOB subjacentes do sistema de arquivos.

Acesso a streaming do sistema de arquivos

O suporte a streaming do Win32 funciona no contexto de uma transação do SQL Server. Dentro de uma transação, é possível usar funções FILESTREAM para obter um caminho do sistema de arquivos UNC lógico de um arquivo. Em seguida, use a API OpenSqlFilestream para obter um identificador de arquivo. Esse identificador pode então ser usado por interfaces de streaming de arquivo do Win32, como ReadFile() e WriteFile(), para acessar e atualizar o arquivo por meio do sistema de arquivos.

Como as operações de arquivo são transacionais, não é possível excluir ou renomear arquivos FILESTREAM por meio do sistema de arquivos.

Modelo de instrução

O acesso ao sistema de arquivos FILESTREAM modela uma instrução Transact-SQL usando abertura e fechamento de arquivo. A instrução inicia quando um identificador de arquivo é aberto e termina quando o identificador é fechado. Por exemplo, quando um identificador de gravação é fechado, qualquer gatilho AFTER que esteja registrado na tabela será acionado como se uma instrução UPDATE fosse concluída.

Namespace de armazenamento

No FILESTREAM, o Mecanismo de Banco de Dados controla o namespace do sistema de arquivos físico do BLOB. Uma nova função intrínseca, PathName, fornece o caminho UNC lógico do BLOB que corresponde a cada célula FILESTREAM na tabela. O aplicativo usa esse caminho lógico para obter o identificador do Win32 e operar nos dados BLOB usando interfaces normais de sistema de arquivos do Win32. A função retornará NULL se o valor da coluna FILESTREAM for NULL.

Acesso a sistema de arquivos transacionado

Uma nova função intrínseca, GET_FILESTREAM_TRANSACTION_CONTEXT(), fornece o token que representa a transação atual à qual a sessão está associada. A transação deve ter sido iniciada e ainda não anulada ou confirmada. Obtendo um token, o aplicativo associa as operações de streaming do sistema de arquivos FILESTREAM a uma transação iniciada. A função retorna NULL no caso de nenhuma transação explicitamente iniciada.

Todos os identificadores de arquivo devem ser fechados antes de a transação ser confirmada ou anulada. Se um identificador for deixado aberto além do escopo da transação, leituras adicionais em relação ao identificador provocarão uma falha. Gravações adicionais em relação ao identificador serão bem-sucedidas, mas os dados reais não serão gravados em disco. De maneira semelhante, se o banco de dados ou a instância do Mecanismo de Banco de Dados for desligado, todos os identificadores abertos serão invalidados.

Durabilidade transacional

Com FILESTREAM, na confirmação da transação, o Mecanismo de Banco de Dados verifica a durabilidade da transação de dados BLOB FILESTREAM que são modificados no acesso de streaming ao sistema de arquivos.

Semântica de isolamento

A semântica de isolamento é governada pelos níveis de isolamento da transação do Mecanismo de Banco de Dados. Apenas o nível de isolamento confirmado por leitura tem suporte para acesso ao sistema de arquivos. Operações de leitura repetidas e também isolamentos de instantâneo e serializáveis têm suporte quando os dados FILESTREAM são acessados usando Transact-SQL. Não há suporte para leitura suja.

As operações de abertura de acesso ao sistema de arquivos não aguardam nenhum bloqueio. Em vez disso, as operações de abertura falham imediatamente caso não possam acessar os dados por causa do isolamento da transação. As chamadas da API de streaming falharão com ERROR_SHARING_VIOLATION se a operação de abertura não puder continuar por causa de violação de isolamento.

Atualizações parciais

Para permitir a realização de atualizações parciais, o aplicativo pode emitir um controle de FS de dispositivo (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) para buscar o conteúdo antigo no arquivo ao qual o identificador aberto faz referência. Isso acionará uma cópia de conteúdo antigo no lado do servidor. Para obter melhor desempenho do aplicativo e evitar a ocorrência de tempos limites potenciais ao trabalhar com arquivos muito grandes, recomendamos usar E/S assíncrona.

Se o FSCTL for emitido após o identificador ter sido gravado, a última operação de gravação persistirá e as gravações anteriores feitas no identificador serão perdidas.

Gravação de clientes remotos

O acesso do sistema de arquivos remoto a dados FILESTREAM é habilitado pelo protocolo SMB. Se o cliente for remoto, nenhuma operação de gravação será armazenada em cache pelo lado do cliente. Os operações de gravação sempre serão enviados ao servidor. Os dados podem ser armazenados em cache no lado de servidor. Recomendamos que aplicativos que estão em execução em clientes remotos consolidem operações de gravação pequenas para fazer menos operações de gravação usando um tamanho maior de dados.

Não há suporte para a criação de exibições mapeadas de memória (E/S mapeada de memória) usando um identificador de FILESTREAM. Se o mapeamento de memória for usado para dados FILESTREAM, o Mecanismo de Banco de Dados não poderá garantir consistência e durabilidade dos dados ou integridade do banco de dados.