armazenamento FILESTREAM - Microsoft Center

Propaganda
Artigo técnico do SQL Server
Autor: Paul S. Randal (SQLskills.com)
Revisor técnico: Alexandru Chirica, Arkadi Brjazovski, Prem Mehra, Joanna Omel,
Mike Ruthruff, Robin Dhamankar
Publicado em: outubro de 2008
Aplica-se a: SQL Server 2008
Resumo: este white paper descreve o recurso FILESTREAM do SQL Server 2008, que permite
o armazenamento de dados BLOB e o acesso eficiente a eles por meio de uma combinação
do SQL Server 2008 e do sistema de arquivos NTFS. O documento aborda as opções de
armazenamento BLOB, a configuração do Windows e do SQL Server para uso de dados
FILESTREAM, considerações sobre a combinação do FILESTREAM com outros recursos
e detalhes da implementação, como particionamento e desempenho.
Este white paper é destinado a arquitetos, profissionais de TI e DBAs responsáveis por avaliar
ou implementar o FILESTREAM. Ele supõe que o leitor esteja familiarizado com o Windows
e o SQL Server, e que tenha pelo menos um conhecimento básico dos conceitos de banco de
dados, como transações, por exemplo.
Introdução
Na sociedade atual, os dados são gerados em proporções inacreditáveis e, frequentemente, precisam
ser armazenados e acessados de maneira controlada e eficiente. Existem várias tecnologias para
se fazer isso, e a melhor opção muitas vezes depende da natureza dos dados que estão sendo
armazenados – estruturados, semiestruturados ou não estruturados:

Os dados estruturados são aqueles que podem ser facilmente armazenados em um esquema
relacional, como os que representam os dados de vendas de uma empresa. Eles podem ser
armazenados em um banco de dados com uma tabela de informações sobre produtos que
a empresa vende, outra com informações sobre clientes e outra que detalhe as vendas dos
produtos aos clientes. Os dados podem ser acessados e manipulados por meio de uma
linguagem de consulta avançada, como Transact-SQL.


Os dados semiestruturados são os dados que se adaptam a um esquema impreciso, mas não
servem para serem armazenados em um conjunto de tabelas de banco de dados, por exemplo,
dados em que cada ponto de dados pode ter atributos radicalmente diferentes. Os dados
semiestruturados muitas vezes são armazenados com o uso do tipo de dados xml no software
de banco de dados Microsoft® SQL Server® e acessados com uma linguagem de consulta
baseada em elemento, como XQuery.
Os dados não estruturados podem não ter absolutamente nenhum esquema (como uma porção
de dados criptografados) ou podem ser uma grande quantidade de dados binários (muitos MBs
ou até mesmo GBs) que podem parecer não ter um esquema, mas na realidade têm um
esquema muito simples inerente a eles, como arquivos de imagens, vídeos de streaming ou
clipes de som. Nesse caso, dados binários se referem a dados que podem ter qualquer valor,
não apenas aqueles que podem ser inseridos em um teclado. Esses valores de dados
geralmente são conhecidos como Objetos Binários Grandes, ou simplesmente BLOBs.
Este white paper descreve o recurso FILESTREAM do SQL Server 2008, que permite o armazenamento
de dados BLOB e o acesso eficiente a eles por meio de uma combinação do SQL Server 2008 e do
sistema de arquivos NTFS. O documento aborda o recurso FILESTREAM propriamente dito, opções
de armazenamento de BLOB, configuração do sistema operacional Windows® e do SQL Server para
usar dados FILESTREAM, considerações sobre a combinação do FILESTREAM com outros recursos
e detalhes de implementação, como particionamento e desempenho.
Opções para o armazenamento de BLOB
Embora os dados estruturados e semiestruturados possam ser armazenados com facilidade em um
banco de dados relacional, a escolha de onde armazenar dados não estruturados ou BLOB é mais
complicada. Ao decidir onde armazenar dados BLOB, considere os seguintes requisitos:




2
Desempenho: a maneira como os dados serão usados é um fator crítico. Se o acesso streaming
for necessário, armazenar os dados em um banco de dados do SQL Server pode ser mais lento
do que armazená-los externamente em um local como o sistema de arquivos NTFS. Usando
o armazenamento do sistema de arquivos, os dados são lidos no arquivo e transferidos para
o aplicativo cliente (diretamente ou com buffer adicional). Quando o BLOB é armazenado em um
banco de dados do SQL Server, primeiro os dados devem ser lidos na memória do SQL Server
(o pool de buffers) e depois transferidos de volta por meio de uma conexão do cliente ao
aplicativo cliente. Isso não só significa que os dados passam por uma etapa de processamento
extra, mas também que a memória do SQL Server é desnecessariamente "poluída" com dados
BLOB, o que pode causar problemas de desempenho em operações futuras do SQL Server.
Segurança: os dados confidenciais que precisam ter acesso rigidamente gerenciado podem
ser armazenados em um banco de dados, e a segurança pode ser controlada com os controles
de acesso normais do SQL Server. Se os mesmos dados forem armazenados no sistema de
arquivos, deverão ser implementados outros métodos de segurança, como as ACLs (listas de
controle de acesso).
Tamanho dos dados: com base na pesquisa citada mais adiante neste white paper, os BLOBs
com menos de 256 KB (como ícones do widget) são mais bem armazenados dentro de um
banco de dados, e os BLOBs com mais de 1 MB são mais bem armazenados fora do banco de
dados. Para esses dados com tamanhos entre 256 KB e 1 MB, a solução de armazenamento
mais eficiente depende da proporção de leitura e gravação dos dados, bem como da taxa
de "substituição". O armazenamento de dados BLOB exclusivamente no banco de dados
(por exemplo, usando o tipo de dados varbinary (max)) é limitado a 2 GB por BLOB.
Acesso para cliente: o protocolo que o cliente usa para acessar dados do SQL Server, como
o ODBC, pode não ser adequado para aplicações como o streaming de arquivos grandes de
vídeo. Isso pode exigir o armazenamento de dados no sistema de arquivos.




Semântica transacional: se os dados BLOB tiverem sido associados a dados estruturados
que serão armazenados no banco de dados, as alterações nos dados BLOB precisarão aderir
à semântica transacional para que os dois conjuntos de dados permaneçam sincronizados.
Por exemplo, se uma transação criar dados BLOB e uma linha em uma tabela de banco de
dados, mas, em seguida, for revertida, a criação dos dados BLOB também deverá ser revertida,
assim como a criação da linha de tabela. Isso pode se tornar bastante complexo se os dados
BLOB forem armazenados no sistema de arquivos sem nenhum vínculo com o banco de dados.
Fragmentação de dados: atualizações e substituições frequentes farão com que os BLOBs se
movam, seja dentro dos arquivos de banco de dados do SQL Server ou dentro do sistema de
arquivos, dependendo de onde os dados estiverem armazenados. Nesse caso, se os BLOBs
forem grandes, eles poderão ser fragmentados (isto é, não armazenados em uma parte contígua
do disco). É mais fácil lidar com essa fragmentação quando se usa o sistema de arquivos em vez
do SQL Server.
Capacidade de gerenciamento: uma solução que usa várias tecnologias que não são integradas
apresentará um gerenciamento mais complexo e caro do que uma solução integrada.
Custo: o custo da solução de armazenamento varia de acordo com a tecnologia usada.
As explicações acima em relação ao tamanho e à fragmentação são baseadas no conhecido documento
do Microsoft Research intitulado Para BLOB ou não: armazenamento de objeto grande em um banco de
dados ou sistema de arquivos? (Gray, Van Ingen e Sears). O documento apresenta mais informações
sobre as compensações envolvidas e pode ser baixado em:
http://research.microsoft.com/research/pubs/view.aspx?msr_tr_id=MSR-TR-2006-45
Há uma variedade de soluções para o armazenamento de BLOB, cada uma com seus prós e contras
baseados nos requisitos acima. A tabela a seguir compara três opções comuns de armazenamento de
dados BLOB, incluindo o FILESTREAM, no SQL Server 2008.
Ponto de
comparação
Tamanho máximo
do BLOB
Desempenho do
streaming de
BLOBs grandes
Segurança
Solução de armazenamento
Servidor de arquivos SQL Server (usando
FILESTREAM
/ sistema de arquivos varbinary(max))
Tamanho do volume
2 GB – 1 byte
Tamanho do volume
NTFS
NTFS
Excelente
Fraco
Excelente
ACLs manuais
Integrada
ACLs integradas +
automáticas
Baixo
Integrada
Custo por GB
Baixo
Alto
Capacidade de
Difícil
Integrada
gerenciamento
Integração com
Difícil
Consistência no nível
Consistência no nível
dados estruturados
de dados
de dados
Desenvolvimento
Mais complexo
Mais simples
Mais simples
e implantação
de aplicativos
Recuperação
Excelente
Fraca
Excelente
da fragmentação
de dados
Desempenho
Excelente
Moderado
Fraco
de atualizações
frequentes
e pequenas
Tabela 1: Comparação de tecnologias de armazenamento de BLOB anteriores ao SQL Server 2008
3
O FILESTREAM é a única solução que proporciona consistência transacional a dados estruturados
e não estruturados, assim como gerenciamento integrado, segurança, baixo custo e excelente
desempenho de streaming. Esses benefícios resultam do armazenamento de dados estruturados
nos arquivos de banco de dados e de dados BLOB não estruturados no sistema de arquivos,
enquanto se mantém a consistência transacional entre os dois repositórios. Mais detalhes da arquitetura
FILESTREAM são fornecidos na seção "Visão geral do FILESTREAM", mais adiante neste white paper.
Visão geral do FILESTREAM
O FILESTREAM é um novo recurso na versão SQL Server 2008. Ele permite que dados estruturados
sejam armazenados no banco de dados e que os dados associados não estruturados (isto é, BLOB)
sejam armazenados diretamente no sistema de arquivos NTFS. Você pode acessar os dados BLOB por
meio das APIs de streaming de alto desempenho do Win32®, em vez de se prejudicar com a perda de
desempenho por acessar dados BLOB usando o SQL Server.
O FILESTREAM mantém a consistência transacional entre os dados estruturados e não estruturados
o tempo todo, permitindo até mesmo a recuperação pontual dos dados FILESTREAM usando backups
de log. A consistência é mantida automaticamente pelo SQL Server e não requer nenhuma lógica
personalizada no aplicativo. O mecanismo do FILESTREAM faz isso mantendo o equivalente de um
log de transações do banco de dados, que contém muitos dos mesmos requisitos de gerenciamento
(descritos mais detalhadamente na seção "Configurando a coleta de lixo do FILESTREAM", mais adiante
neste white paper). A combinação do log de transações do banco de dados com o log de transações
do FILESTREAM permite que os dados FILESTREAM e estruturados sejam recuperados de modo
transacional e correto.
Em vez de ser um tipo de dados completamente novo, o FILESTREAM é um atributo de armazenamento
do tipo de dados varbinary (max) existente. O FILESTREAM preserva a maior parte do comportamento
existente do tipo de dados varbinary (max). Ele altera a forma como os dados BLOB são armazenados no sistema de arquivos, e não nos arquivos de dados do SQL Server. Como o FILESTREAM é implementado
como uma coluna varbinary (max) e é integrado diretamente a um mecanismo de banco de dados,
a maioria das ferramentas e funções de gerenciamento do SQL Server funciona sem modificação nos
dados FILESTREAM.
Deve ser observado que o comportamento do tipo de dados varbinary (max) regular permanece
completamente inalterado no SQL Server 2008, incluindo o limite de tamanho de 2 GB. A adição do
atributo FILESTREAM faz com que uma coluna varbinary (max) seja essencialmente ilimitada em
tamanho (na realidade, o tamanho limita-se ao do volume NTFS subjacente).
Os dados FILESTREAM são armazenados no sistema de arquivos em um conjunto de diretórios NTFS
chamados contêineres de dados, que correspondem aos grupos de arquivos especiais no banco de
dados. O acesso transacional a dados FILESTREAM é controlado pelo SQL Server e por um driver de
filtro do sistema de arquivos que é instalado como parte da habilitação do FILESTREAM no nível do
Windows. O uso de um driver de filtro do sistema de arquivos também permite o acesso remoto a dados
FILESTREAM por meio de um caminho UNC. O SQL Server mantém um vínculo de classificações das
linhas da tabela com os arquivos FILESTREAM associados a elas. Isso significa que excluir ou renomear
qualquer arquivo FILESTREAM diretamente pelo sistema de arquivos corromperá o banco de dados.
4
O uso do FILESTREAM exige várias modificações de esquema nas tabelas de dados (especialmente
o requisito de que cada linha deve ter uma ID de linha exclusiva) e também tem algumas restrições
quando combinado a outros recursos (como a incapacidade de criptografar dados FILESTREAM).
Tudo isso é descrito em detalhes na seção "Configurando o SQL Server para o FILESTREAM",
mais adiante neste white paper.
Os dados FILESTREAM podem ser acessados e manipulados de duas maneiras: com o modelo
de programação padrão Transact-SQL ou por meio das APIs de streaming do Win32. Ambos os
mecanismos são totalmente habilitados para transações e oferecem suporte à maioria das operações
DML, incluindo inserção, atualização, exclusão e seleção. Os dados FILESTREAM também contam com
o suporte das operações de manutenção, como backup, restauração e verificação de consistência.
A grande exceção é que não há suporte às atualizações parciais nos dados FILESTREAM. Qualquer
atualização em um valor dos dados FILESTREAM converte-se na criação de uma cópia do arquivo de
dados FILESTREAM. O arquivo antigo é removido de modo assíncrono, conforme descrito na seção
"Configurando a coleta de lixo do FILESTREAM", mais adiante neste white paper.
Acesso a dados BLOB pelo modelo de programação dupla
Depois que os dados são armazenados em uma coluna FILESTREAM, é possível acessá-los usando
transações Transact-SQL ou APIs do Win32. Esta seção fornece alguns detalhes de alto nível dos
modelos de programação e de como usá-los.
Acesso por Transact-SQL
Usando o Transact-SQL, os dados FILESTREAM podem ser inseridos, atualizados e excluídos da
seguinte forma:



É possível pré-popular os campos FILESTREAM usando uma operação de inserção
(com um valor vazio ou valores pequenos não nulos). No entanto, as interfaces do Win32
são uma maneira mais eficiente de transmitir uma grande quantidade de dados.
Quando os dados FILESTREAM são atualizados, os dados BLOB subjacentes no sistema
de arquivos são modificados. Quando um campo FILESTREAM é definido como NULL,
os dados BLOB associados ao campo são excluídos. As atualizações em partes do TransactSQL implementadas como UPDATE.Write() não podem ser usadas para executar atualizações
parciais nos dados FILESTREAM.
Quando uma linha que contém dados FILESTREAM é excluída ou uma tabela que contém dados
FILESTREAM é excluída ou truncada, os dados BLOB subjacentes no sistema de arquivos
também são excluídos. A remoção física real dos arquivos FILESTREAM é um processo em
segundo plano assíncrono, conforme explicado na seção "Configurando a coleta de lixo do
FILESTREAM", mais adiante neste white paper.
Para obter mais informações e exemplos de como usar o Transact-SQL para acessar dados
FILESTREAM, consulte o tópico "Gerenciando dados FILESTREAM usando o Transact-SQL" nos
Manuais Online do SQL Server 2008 (http://msdn.microsoft.com/pt-br/library/cc645962.aspx).
5
Acesso por streaming do Win32
Para permitir o acesso do sistema de arquivos transacional aos dados FILESTREAM, 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
confirmada ou revertida. Ao obter 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 quando nenhuma transação
foi explicitamente iniciada. É necessário obter um token para que os arquivos FILESTREAM possam ser
acessados.
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 campo 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. Portanto, um arquivo
FILESTREAM deve ser pré-criado para que possa ser acessado nível do Win32. Isso pode ser feito
conforme descrito anteriormente.
O suporte ao streaming do Win32 funciona no contexto de uma transação do SQL Server. Depois de
obter um token da transação e um nome de caminho, a API OpenSqlFilestream do Win32 é usada
para obter um identificador de arquivo do Win32. Como alternativa, é possível usar a API SqlFileStream
gerenciada. Esse identificador pode então ser usado pelas interfaces de streaming do Win32, como
ReadFile() e WriteFile(), para acessar e atualizar o arquivo por meio do sistema de arquivos. Novamente,
observe que os arquivos FILESTREAM não podem ser excluídos diretamente e não podem ser renomeados
com o sistema de arquivos. Caso contrário, a consistência no nível de vínculo entre o banco de dados
e o sistema de arquivos será perdida (isto é, o banco de dados basicamente torna-se corrompido).
O acesso do 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
tivesse sido concluída.
Para obter mais informações e exemplos de como usar as APIs do Win32 para acessar dados
FILESTREAM, consulte o tópico "Gerenciando dados FILESTREAM usando o Win32" nos Manuais
Online do SQL Server 2008 (http://msdn.microsoft.com/pt-br/library/cc645940.aspx).
Semântica transacional
Todos os identificadores de arquivo devem ser fechados antes da confirmação ou reversão da transação.
Se um identificador for deixado aberto quando ocorrer a confirmação de uma transação, haverá falha
na confirmação e leituras e gravações adicionais no identificador causarão uma falha, como é esperado.
Assim, a transação deverá ser revertida. 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.
Sempre que um arquivo FILESTREAM é aberto para uma operação de gravação, um novo arquivo de
comprimento zero é criado e todo o valor dos dados FILESTREAM atualizados é gravado nele. O arquivo
antigo é removido de modo assíncrono, conforme descrito na seção "Configurando a coleta de lixo do
FILESTREAM", mais adiante neste white paper.
6
Com o FILESTREAM, o mecanismo de banco de dados garante a durabilidade da transação na
confirmação de dados BLOB FILESTREAM que são modificados no acesso streaming ao sistema de
arquivos. Isso é feito usando o log do FILESTREAM mencionado anteriormente e uma liberação explícita
do conteúdo do arquivo FILESTREAM no disco.
Semântica de isolamento
A semântica de isolamento é administrada pelos níveis de isolamento da transação do mecanismo do
banco de dados. Quando os dados FILESTREAM são acessados por meio das APIs do Win32, apenas
o nível de isolamento confirmado por leitura tem suporte. O acesso Transact-SQL também permite os
níveis de isolamento serializáveis e de leitura repetida. Além disso, usando o acesso Transact-SQL,
as leituras sujas são permitidas por meio do nível de isolamento não confirmado por leitura ou pela dica
de consulta NOLOCK, mas esse acesso não mostrará atualizações em curso dos dados FILESTREAM.
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. Também é possível fazer isso usando a API
gerenciada SqlFileStream com o sinalizador ReadWrite. Isso dispara uma cópia do conteúdo antigo
no lado do servidor, conforme explicado anteriormente. Para obter melhor desempenho do aplicativo
e evitar possíveis tempos limites ao trabalhar com arquivos muito grandes, você deve 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.
Para obter mais informações sobre atualizações parciais, consulte o tópico
"FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT" nos Manuais Online do SQL Server 2008
(http://technet.microsoft.com/pt-br/library/cc627407.aspx).
Write-Through de clientes remotos
O acesso do sistema de arquivos remoto a dados FILESTREAM é habilitado pelo protocolo SMB (Server
Message Block). Se o cliente for remoto, o cache de operações de gravação dependerá das opções
especificadas na API usada. Por exemplo, o padrão para APIs de código nativo é executar write-through,
ao passo que, para as APIs gerenciadas, o padrão é usar o buffer. Essa diferença reflete comentários
do cliente em várias APIs e seus usos em versões CTP de pré-lançamento do SQL Server 2008.
É recomendável que os aplicativos em execução em clientes remotos consolidem operações de
gravação pequenas (por meio de buffer) para fazer menos operações de gravação usando um tamanho
maior de dados. Além disso, se o buffer estiver sendo usado, uma liberação explícita deverá ser emitida
pelo cliente antes da confirmação da transação.
Não há suporte para a criação de exibições mapeadas de memória (E/S mapeada de memória) usando
um identificador FILESTREAM. Se o mapeamento de memória for usado para dados FILESTREAM,
o mecanismo de banco de dados não poderá garantir a consistência e a durabilidade dos dados ou
a integridade do banco de dados.
7
Quando usar FILESTREAM
Embora a tecnologia FILESTREAM tenha muitos recursos atraentes, talvez ela não seja a melhor opção
em todas as situações. Conforme mencionado anteriormente, o tamanho dos dados BLOB e os padrões
de acesso são os fatores mais significativos quando é necessário tomar a decisão de armazenar os
dados BLOB totalmente no banco de dados ou usando FILESTREAM.
O tamanho afeta os seguintes itens:


A eficiência com que os dados BLOB podem ser acessados com qualquer um dos mecanismos
de armazenamento. Como mencionado anteriormente, o acesso streaming de dados BLOB
volumosos é mais eficiente usando FILESTREAM, mas as atualizações parciais são
(potencialmente muito) mais lentas.
A eficiência do backup de dados BLOB e estruturados combinados com qualquer um dos
mecanismos de armazenamento. Um backup que combina arquivos de banco de dados do SQL
Server e um número grande de arquivos FILESTREAM é mais lento do que um backup somente
de arquivos de banco de dados do SQL Server de um tamanho total equivalente. Isso se deve
à sobrecarga adicional do backup de cada arquivo NTFS (um por valor de dados FILESTREAM).
Essa sobrecarga se tornará mais perceptível quando os arquivos FILESTREAM forem menores
(pois a sobrecarga de tempo torna-se uma porcentagem maior do tempo total para o backup por
MB de dados).
Como exemplo, o gráfico a seguir mostra a taxa de transferência relativa de leituras locais de vários
tamanhos de dados BLOB usando varbinary (max), FILESTREAM com Transact-SQL e FILESTREAM
com NTFS. Pode ser visto (na linha azul) que o acesso Win32 dos dados FILESTREAM torna-se várias
vezes mais rápido do que o acesso Transact-SQL dos dados varbinary (max) à medida que o tamanho
dos dados aumenta. Observe que as medidas de taxa de transferência estão em megabits por segundo
(Mbps).
Figura 1: Desempenho de leitura de vários tamanhos de BLOB
8
Os números de NTFS incluem o tempo necessário para iniciar uma transação, recuperar o nome do
caminho e o contexto de transação do SQL Server, e abrir um identificador do Win32 para os dados
FILESTREAM. Cada teste foi executado usando o mesmo computador com quatro núcleos de
processador e um pool de buffers do SQL Server a quente.
O outro fator a ser considerado é se o cliente ou a camada intermediária podem ser gravados
(ou alterados) para usar as APIs de streaming do Win32, bem como o acesso normal ao SQL Server.
Se esse não for o caso, o FILESTREAM não será adequado, pois o melhor desempenho é obtido com
as APIs de streaming do Win32.
Configurando o Windows para FILESTREAM
Assim como em qualquer outra implantação, antes de implantar um aplicativo que usa FILESTREAM,
é importante preparar o servidor Windows que hospedará o banco de dados do SQL Server e os
contêineres de dados FILESTREAM associados. Esta seção explica como configurar o hardware de
armazenamento e o sistema de arquivos NTFS em preparação para usar o FILESTREAM. A seção
mostra como habilitar o FILESTREAM no nível do Windows.
Seleção e configuração de hardware
Uma das causas mais comuns do desempenho insatisfatório de uma carga de trabalho é uma
configuração de hardware inadequada. Às vezes, a causa é insuficiência de memória, o que resulta
em "sobrecarga" no pool de buffers do SQL Server e, às vezes, a causa é simplesmente o fato de que
o hardware de armazenamento não tem a capacidade de taxa de transferência de E/S que a carga de
trabalho demanda. Para aplicativos que usarão o FILESTREAM para streaming de alto desempenho dos
dados BLOB usando as APIs do Win32, a escolha e a configuração do hardware de armazenamento são
essenciais.
As seções a seguir descrevem algumas práticas recomendadas sobre a escolha e o layout do
armazenamento. Para ver uma discussão detalhada sobre isso, consulte o white paper "Design de
armazenamento do banco de dados físico" do TechNet (http://www.microsoft.com/technet/prodtechnol/
sql/2005/physdbstor.mspx). Depois de criar um layout ideal, convém executar testes de carga para
validar a capacidade de desempenho do subsistema de E/S. Isso é discutido em detalhes no artigo sobre
práticas recomendadas do SQL Server no TechNet, "Práticas recomendadas de pré-implantação de E/S"
(http://www.microsoft.com/technet/prodtechnol/sql/bestpractice/pdpliobp.mspx).
Layout do armazenamento físico
Lembre-se de levar em consideração a carga de trabalho prevista em um contêiner de dados
FILESTREAM quando estiver decidindo onde colocá-la, bem como as cargas de trabalho em qualquer
contêiner de dados colocalizado ou arquivos do SQL Server. Cada contêiner de dados FILESTREAM
pode precisar estar em seu próprio volume, uma vez que ter vários contêineres de dados com cargas de
trabalho pesadas em um único volume pode resultar em contenção.
O ponto a ser considerado aqui é que, sem pensar nas cargas de trabalho envolvidas, simplesmente
colocar de tudo em um único volume pode gerar problemas de desempenho. O grau de separação
exigido variará de cliente para cliente.
Também é possível criar um esquema de tabela dentro do SQL Server que permita o balanceamento
de carga bruto de dados FILESTREAM entre vários volumes. Isso é descrito na seção "Balanceamento
de carga de dados FILESTREAM".
9
Escolha do nível de RAID
Os benefícios de usar a tecnologia RAID são conhecidos, e muito já foi escrito sobre como escolher um
nível de RAID apropriado para os requisitos do aplicativo, portanto este white paper não tentará repetir
todas essas informações. O white paper já mencionado, "Design de armazenamento do banco de dados
físico", tem uma excelente seção sobre níveis de RAID e opções de nível de RAID. O que se segue aqui
é uma visão geral simples dos fatores a serem considerados.
Os níveis de RAID diferem de várias formas, especialmente em termos de desempenho de
leitura/gravação, resiliência a falhas e custo. Por exemplo, o RAID 5 tem um custo relativamente baixo,
pode tratar a falha de apenas uma unidade na matriz RAID e pode ser inadequado para cargas de
trabalho de intensa gravação. Por outro lado, o RAID 10 fornece excelente desempenho de leitura
e gravação, além de poder tratar várias falhas de unidade (dependendo do grau de espelhamento
envolvido), mas é mais caro, já que pelo menos 50% das unidades na matriz RAID são redundantes.
Esses são os três principais fatores envolvidos na escolha de um nível de RAID. A escolha do nível
de RAID pode ser diferente para o volume em que cada banco de dados de usuário é armazenado,
podendo ser diferente até mesmo entre o volume que está armazenando os arquivos de dados e o que
está armazenando os arquivos de log para um único banco de dados.
Se a carga de trabalho for envolver streaming de alto desempenho de dados FILESTREAM, a opção
imediata talvez seja a de que o volume do contêiner de dados FILESTREAM use o nível de RAID que
ofereça o desempenho de leitura mais alto. No entanto, isso talvez não proporcione um alto grau de
resiliência contra falhas. Por outro lado, a opção imediata pode ser usar o mesmo nível de RAID usado
para outros volumes que armazenam os dados do banco de dados, mas isso pode não oferecer os
níveis de desempenho que a carga de trabalho demanda.
Neste white paper, o ponto a ser enfatizado é que uma escolha consciente do nível de RAID deve
ser feita para os volumes de contêiner de dados FILESTREAM após a avaliação das compensações
envolvidas, e não apenas decidir com base em um único fator.
Escolha da interface da unidade
Em bancos de dados comuns que envolvem dados BLOB, o tamanho total dos dados BLOB muitas
vezes pode ser maior do que o tamanho total dos dados estruturados. Ao implementar uma solução
que envolve os dados FILESTREAM armazenados em volumes separados, você pode usar um
armazenamento mais barato para o volume, como IDE ou SATA (daqui por diante simplesmente
chamado de "SATA"), em vez de um armazenamento SCSI mais caro. Antes de fazer essa escolha,
é necessário entender os prós e contras envolvidos. Esta seção fornece uma visão geral das diferentes
características do SCSI em oposição ao IDE/SATA para permitir que seja feita uma escolha informada
com base no desempenho e na confiabilidade, bem como no custo.
Capacidade e desempenho
As unidades SATA tendem a ter uma capacidade mais alta do que as unidades SCSI, mas elas têm uma
velocidade de rotação (RPM) mais lenta do que as unidades SCSI. Embora haja algumas unidades SATA
de 10.000 RPM, a maioria é de 5.400 ou 7.200 RPM. As unidades SCSI de alto desempenho que estão
disponíveis são de 10.000 e até 15.000 RPM. Embora a RPM possa ser uma métrica de comparação útil,
os dois números que devem ser realmente usados para uma comparação são as taxas de latência
(o tempo que o cabeçote do disco leva para ficar na posição correta sobre a superfície do disco) e as
taxas médias de transferência (a quantidade de dados que pode ser transferida para dentro e para fora
da superfície do disco por segundo). Também é importante que as unidades possam processar padrões
complexo de E/S com eficiência. Ao escolher unidades, verifique se as unidades SATA oferecem suporte
a NCQ (Native Command Queue) e as unidades SCSI oferecem suporte a CTQ (Command Tag Queu),
para que possam processar várias operações de E/S de disco intercaladas para proporcionar um melhor
desempenho efetivo.
10
Resumindo, as unidades SCSI geralmente apresentam melhores taxas de transferência e latência,
de modo que fornecerão melhor desempenho de streaming, mas possivelmente a um custo mais alto.
Confiabilidade
O SQL Server se baseia em ordenação de gravação e durabilidade garantidas para oferecer
confiabilidade e chances de recuperação por meio de seu mecanismo de log write-ahead. Para obter
mais informações sobre esses requisitos de E/S, consulte o white paper "Noções básicas de E/S do
SQL Server" no TechNet (http://www.microsoft.com/technet/prodtechnol/sql/2005/iobasics.mspx).
Para confiabilidade, o SCSI geralmente é melhor do que o SATA, pois oferece suporte à imposição de
dados a serem gravados no disco, diferentemente do SATA. Isso é feito com suporte a write-through,
onde os dados a serem gravados não são de modo algum armazenados em cache, ou o suporte
à liberação forçada do conteúdo do cache no disco. A falta de um deles pode afetar as chances de
recuperação após uma falha de hardware, software ou energia. Todos os tipos de interfaces podem
oferecer suporte à permutação automática, de modo a permitir reparos enquanto a disponibilidade
é mantida.
O recurso FILESTREAM se baseia em duas garantias - ordenação de gravação e durabilidade:


Durabilidade de dados no momento da confirmação da transação
Log write-ahead para a criação e a exclusão de arquivos FILESTREAM
A durabilidade dos dados é atingida pelo driver do sistema de arquivos FILESTREAM que emite
uma liberação explícita de arquivos que foram modificados antes da confirmação de uma transação
(os detalhes do mecanismo estão além do escopo deste white paper). Isso garante que, em caso de queda
de energia, os discos sem cache com reserva de bateria suficiente não percam os dados FILESTREAM
confirmados que não foram liberados. Se as unidades SATA não oferecerem suporte a uma operação de
liberação forçada, as chances de recuperação poderão ser afetadas e os dados poderão ser perdidos.
O log write-ahead se baseia na consistência dos metadados NTFS. Isso, por si só, depende da
confiabilidade das unidades subjacentes. Não há nenhum problema com o SCSI, mas se as unidades
SATA não derem suporte à liberação forçada, algumas alterações de metadados NTFS poderão ser
perdidas em uma situação de falha de energia. Isso pode resultar em vários cenários:



O NTFS não pode ser recuperado e o volume não pode ser montado (isto é, o contêiner de
dados FILESTREAM está basicamente offline.
O NTFS é recuperado, mas as alterações dos metadados do NTFS são perdidas e o SQL Server
não sabe reverter uma transação não confirmada que executa uma inserção de dados
FILESTREAM (isto é, os dados FILESTREAM são "perdidos").
O NTFS é recuperado, mas as alterações dos metadados são perdidas e o SQL Server não
sabe reverter uma transação não confirmada que executa uma exclusão de dados FILESTREAM
(isto é, os dados FILESTREAM são perdidos).
Deve ser lembrado que todos os três cenários não são piores do que se os dados BLOB estivessem
armazenados fora do banco de dados em um volume NTFS com unidades SATA subjacentes sem
suporte para a imposição de dados no disco. O uso de FILESTREAM em um volume com unidades
SATA subjacentes nesse caso é realmente melhor do que armazenar os dados BLOB em arquivos
NTFS brutos no mesmo volume, pois a consistência em nível de vinculação do FILESTREAM fornece
um mecanismo para detectar quando tais "corrupções" ocorreram (por meio da execução de DBCC
CHECKDB no banco de dados).
11
Resumindo, os dados FILESTREAM podem ser confiavelmente armazenados em volumes com
armazenamento SATA subjacente, desde que as unidades SATA ofereçam suporte à imposição
de dados no disco por meio da liberação do cache.
Configuração de NTFS
Mesmo o subsistema de E/S mais bem-desenvolvido sendo executado em um hardware de alto
desempenho poderá não funcionar da forma desejada se o sistema de arquivos (nesse caso, NTFS)
não estiver configurado corretamente. Esta seção descreve algumas das opções de configuração que
podem afetar uma carga de trabalho que envolve dados FILESTREAM.
Para obter uma visão geral mais completa do NTFS, consulte os artigos da Biblioteca TechNet
"Referência técnica do NTFS" (http://technet.microsoft.com/pt-br/library/cc758691.aspx) e "Como
trabalhar com sistemas de arquivos" (http://technet.microsoft.com/pt-br/library/bb457112.aspx).
Otimizando o desempenho do NTFS
Por padrão, o NTFS não está configurado para manipular uma carga de trabalho de alto desempenho
com dezenas de milhares de arquivos em um diretório individual do sistema de arquivos (isto é, o cenário
de FILESTREAM). Há duas opções de NTFS que precisam ser configuradas para facilitar o desempenho
do FILESTREAM. É especialmente importante definir essas opções da forma correta antes de se
comprometer com qualquer avaliação de desempenho; caso contrário, os resultados não representarão
o desempenho real do FILESTREAM.
A primeira opção de configuração é desabilitar a geração de nomes 8.3 quando novos arquivos são
criados (ou renomeados). Esse processo gera um nome secundário para cada arquivo que serve apenas
para compatibilidade com aplicativos de 16 bits de versões anteriores. O algoritmo gera um novo nome
8.3 e, em seguida, precisa verificar todos os nomes de arquivo 8.3 existentes no diretório para garantir
que o novo nome seja exclusivo. À medida que o número de arquivos no diretório aumenta (geralmente
acima de 300.000), esse processo se torna cada vez mais demorado. O tempo de criação de um arquivo
por sua vez aumenta e o desempenho diminui; portanto, desativar esse processo pode aumentar
consideravelmente o desempenho. Para desativar esse processo, digite o seguinte em um prompt
de comando e reinicie o computador:
fsutil behavior set disable8dot3 1
Observação: essa opção desabilita a geração de nomes 8.3 em todos os volumes NTFS no servidor.
Se algum volume estiver sendo usado por aplicativos de 16 bits, estes poderão enfrentar problemas
depois que você alterar esse comportamento.
A segunda opção para desativação é atualizar a hora do último acesso de um arquivo quando ele for
acessado. Se a carga de trabalho acessar brevemente muitos arquivos, uma quantidade de tempo
desproporcional será gasta atualizando a hora do último acesso de cada arquivo. Desativar essa
opção também pode aumentar significativamente o desempenho. Para desativar esse processo,
digite o seguinte em um prompt de comando e reinicie o computador:
fsutil behavior set disablelastaccess 1
12
Tamanho do cluster
Todos os sistemas de arquivos do Windows têm o conceito de um "cluster", que é a unidade de alocação
quando o espaço em disco é alocado. Uma vez que um cluster é a menor quantidade de espaço em
disco que pode ser alocada, se um arquivo for muito pequeno, alguns dos clusters podem ser inutilizados
(basicamente, desperdiçados). Desse modo, o tamanho do cluster geralmente é pequeno o suficiente
para que os arquivos pequenos não desperdicem espaço em disco.
Os arquivos grandes podem ter muitos clusters alocados para eles ou os arquivos podem aumentar
ao longo do tempo e os clusters são alocados à medida que eles aumentam. Se um arquivo aumentar
muito, mas em pequenas partes, os clusters alocados provavelmente não serão contíguos no disco
(isto é, eles serão "fragmentos"). Isso significa que quanto menores forem os clusters, e quanto mais
um arquivo aumentar, mais "fragmentado" ele se tornará.
O tamanho do cluster é, portanto, uma compensação entre o desperdício do espaço em disco e a redução
da fragmentação. Mais detalhes sobre os vários tamanhos de clusters nos sistemas de arquivos do
Windows podem ser encontrados no artigo da Base de Dados de Conhecimento "Tamanho de cluster
padrão para FAT e NTFS" (http://support.microsoft.com/kb/140365).
A recomendação para usar o FILESTREAM é quando as unidades individuais de dados BLOB tiverem
um tamanho de 1 MB ou superior. Se esse for o caso, é recomendável que o tamanho do cluster NTFS
para o volume do contêiner de dados FILESTREAM seja definido para 64 KB, de modo a reduzir a
fragmentação. Isso deve ser feito manualmente, uma vez que o padrão para volumes NTFS de até 2 TB
(terabytes) é 4 KB. Para fazer isso, você pode usar a opção /A do comando de formato. Por exemplo, em
um prompt de comando, digite:
format F: /FS:NTFS /V:MyFILESTREAMContainer /A:64K
Essa configuração deve ser combinada com tamanhos de buffer maiores, conforme descrito na seção
"Considerações sobre avaliação e ajuste de desempenho", mais adiante neste white paper.
Gerenciando a fragmentação
Conforme descrito anteriormente, quando muitos arquivos em um volume aumentam, eles se tornam
fragmentados. Isso significa que a coleção de clusters alocada para o arquivo não é contígua. Quando
o arquivo é lido em sequência, os cabeçotes de disco subjacentes precisam ler todos os clusters em
sequência, o que pode significar que precisam ler diferentes partes do disco. Mesmo que os arquivos
não aumentem depois que são criados, se forem criados em um volume em que o espaço livre
disponível não esteja em uma única parte contígua, eles poderão ser fragmentados imediatamente,
pois os clusters necessários para acomodá-los não estão disponíveis de modo contíguo.
Essa fragmentação faz com que o desempenho sequencial de leitura seja menor do que quando não há
nenhuma (ou pouca) fragmentação. O problema é bastante semelhante ao da fragmentação do índice
em um banco de dados que reduz o desempenho de verificação do intervalo de consultas.
Portanto, é essencial que a fragmentação seja periodicamente removida com uma ferramenta de
desfragmentação de disco para manter o desempenho de leitura sequencial. Além disso, se o volume
que será usado para hospedar o contêiner de dados FILESTREAM foi usado anteriormente, ou se ele
ainda contiver outros dados, o nível de fragmentação deverá ser verificado e corrigido, se necessário.
13
Compactação
Os dados armazenados em NTFS podem ser compactados para economizar espaço em disco, mas
à custa de CPU adicional para compactar e descompactar os dados quando eles são gravados ou lidos,
respectivamente. A compactação também não será útil se os dados forem basicamente incompactáveis.
Por exemplo, dados aleatórios, dados criptografados ou dados que já tenham sido compactados não
terão uma boa compactação, mas mesmo assim deverão passar pelo algoritmo de compactação NTFS
e incorrerão em sobrecarga de CPU.
Por esses motivos, só faz sentido habilitar a compactação quando os dados puderem ser altamente
compactados e quando a CPU extra exigida não causar redução de desempenho da carga de trabalho.
Também deve ser observado que a compactação pode ser habilitada somente quando o tamanho do
cluster NTFS tem 4.096 bytes ou menos.
A compactação pode ser habilitada no volume do contêiner de dados FILESTREAM quando ele
é formatado com a opção /C do comando format. Por exemplo:
format F: /FS:NTFS /V:MyFILESTREAMContainer /A:4096 /C
Um volume existente também pode ser habilitado para compactação por meio das seguintes etapas:
1. Em Meu Computador ou no Windows Explorer, clique com o botão direito do mouse no volume
a ser compactado ou descompactado.
2. Clique em Propriedades para exibir a caixa de diálogo Propriedades.
3. Na guia Geral, marque ou desmarque a caixa de seleção Compactar disco para economizar
espaço e clique em OK.
4. Na caixa de diálogo Confirmar Alterações de Atributo, selecione se a compactação se aplica
ao volume inteiro ou somente à pasta raiz.
Isso é mostrado na figura a seguir.
14
Figura 2: Compactando um volume existente usando o Windows Explorer
Gerenciamento de espaço
Embora vários contêineres de dados FILESTREAM possam ser colocados em um único volume NTFS,
há motivo para ter um mapeamento 1:1 entre os contêineres de dados e os volumes NTFS. À exceção
do potencial para contenção dependente da carga de trabalho, não há como gerenciar o uso do espaço
do contêiner de dados FILESTREAM de dentro do SQL Server, portanto será necessário usar cotas de
disco NTFS se isso for uma exigência. As cotas de disco são rastreadas por usuário e por volume; por
isso o fato de ter vários contêineres de dados FILESTREAM em um único volume torna difícil saber qual
contêiner de dados está usando mais espaço em disco. Observe que todos os arquivos FILESTREAM
serão criados sob a conta de serviço do SQL Server. Se isso for alterado, o espaço em disco começará
a ser carregado para a nova conta de serviço.
Há um único driver de filtro do sistema de arquivos FILESTREAM para cada volume NTFS que tenha um
contêiner de dados FILESTREAM, assim como há um para cada versão do SQL Server que tenha um
contêiner de dados FILESTREAM no volume. Cada driver de filtro é responsável por gerenciar todos os
contêineres de dados FILESTREAM desse volume, para todas as instâncias que usam uma versão
específica do SQL Server.
15
Por exemplo, um volume NTFS que está hospedando três contêineres de dados FILESTREAM, um para
cada uma das três instâncias do SQL Server 2008, terá apenas um driver de filtro do sistema de arquivos
FILESTREAM do SQL Server 2008.
Segurança
Há dois requisitos de segurança para usar o recurso FILESTREAM. Em primeiro lugar, o SQL Server
deve ser configurado para a segurança integrada. Em segundo lugar, se o acesso remoto for usado,
a porta SMB (445) deverá ser habilitada em todos os sistemas de firewall. Esse requisito é o mesmo
exigido para acesso regular ao compartilhamento remoto. Para obter mais informações, consulte o artigo
da Base de Dados de Conhecimento "Visão geral de serviços e requisitos de porta de rede para
o sistema do Windows Server" (http://support.microsoft.com/kb/832017).
Considerações sobre antivírus
O software antivírus é onipresente no ambiente atual. O FILESTREAM não pode impedir o software
antivírus de verificar os arquivos no contêiner de dados FILESTREAM (isso criaria problemas de
segurança). Normalmente, o software tem uma configuração de política sobre o que fazer em um
arquivo que é suspeito de estar contaminado com um vírus: excluir o arquivo ou restringir o acesso a ele
(conhecido como colocar o arquivo em "quarentena"). Em ambos os casos, o acesso aos dados BLOB
no arquivo afetado será impedido e, para o SQL Server, o arquivo parecerá ter sido excluído.
É recomendável que o software antivírus seja definido para colocar arquivos em quarentena, não para
excluí-los. O DBCC CHECKDB pode ser usado no SQL Server para descobrir quais arquivos parecem
estar ausentes e, em seguida, o administrador do Windows pode correlacionar os nomes de arquivo com
o log do software antivírus e tomar uma medida corretiva.
Habilitando o FILESTREAM no Windows
O FILESTREAM é um recurso híbrido que exige que o administrador do Windows e o administrador
do SQL Server executem ações para que o recurso seja habilitado. Isso é necessário para preservar
a separação de tarefas entre os dois administradores, especialmente se o administrador do SQL Server
não for também o administrador do Windows. Habilitar o FILESTREAM no nível do Windows instala um
driver de filtro do sistema de arquivos, que é algo que somente um administrador do Windows tem
privilégios para fazer.
No nível do Windows, o FILESTREAM é habilitado durante a instalação do SQL Server 2008 ou pela
execução do SQL Server Configuration Manager. Veja as etapas a serem seguidas:
1.
2.
3.
4.
5.
6.
7.
16
No menu Iniciar, aponte para Todos os Programas, para Microsoft SQL Server 2008,
para Ferramentas de Configuração e clique em SQL Server Configuration Manager.
Na lista de serviços, clique com o botão direito do mouse em Serviços do SQL Server
e clique em Abrir.
No snap-in SQL Server Configuration Manager, localize a instância do SQL Server na qual
deseja habilitar o FILESTREAM.
Clique com o botão direito do mouse na instância e clique em Propriedades.
Na caixa de diálogo Propriedades do SQL Server, clique na guia FILESTREAM.
Marque a caixa de seleção Habilitar FILESTREAM para Acesso Transact-SQL.
Se desejar ler e gravar dados FILESTREAM do Windows, clique em Habilitar FILESTREAM
para acesso streaming de E/S de arquivo. Insira o nome do compartilhamento do
Windows na caixa Nome de Compartilhamento do Windows.
8.
9.
Se os clientes remotos precisarem acessar os dados FILESTREAM armazenados nesse
compartilhamento, selecione Permitir que os clientes remotos tenham acesso streaming
aos dados FILESTREAM.
Clique em Aplicar.
A figura a seguir mostra a guia FILESTREAM, conforme descrito no procedimento.
Figura 3: Configurando o FILESTREAM usando o SQL Server Configuration Manager
Esse procedimento deve ser concluído para cada instância do SQL Server que usará o recurso
FILESTREAM, para que ele possa ser usado pelo SQL Server. Observe que não há especificação do
contêiner de dados FILESTREAM nessa fase – que é feita quando um grupo de arquivos FILESTREAM
é criado em um banco de dados depois que FILESTREAM tiver sido habilitado no SQL Server.
Observe que é possível desabilitar o acesso ao FILESTREAM no nível do Windows mesmo que o SQL
Server o tenha habilitado. Nesse caso, depois que a instância do SQL Server for reiniciada, todos os
dados FILESTREAM estarão indisponíveis. O aviso a seguir será exibido.
17
Figura 4: Aviso exibido ao desabilitar o FILESTREAM usando o SQL Server Configuration Manager
Configurando o SQL Server para FILESTREAM
Cada instância do SQL Server que usará o recurso FILESTREAM deverá ser configurada
separadamente, tanto no nível do Windows como no do SQL Server. Depois que o FILESTREAM estiver
habilitado, um banco de dados deverá ser configurado para armazenar dados FILESTREAM, e só então
as tabelas que incluem colunas FILESTREAM poderão ser definidas. Esta seção descreve como configurar
o FILESTREAM no nível do SQL Server e como criar tabelas e bancos de dados habilitados para
FILESTREAM, além de explicar como o FILESTREAM interage com outros recursos do SQL Server 2008.
Considerações sobre segurança
O FILESTREAM requer o uso de segurança integrada (isto é, a Autenticação do Windows). Quando um
aplicativo que usa o Win32 tentar acessar dados FILESTREAM, o usuário do Windows será validado
por meio do SQL Server. Se o usuário tiver acesso Transact-SQL aos dados FILESTREAM, o acesso
também será concedido no nível do Win32, desde que o token de transação seja obtido no contexto de
segurança do usuário do Windows que está abrindo o arquivo.
O requisito para Autenticação do Windows se deve à natureza das APIs de E/S do Arquivo do Windows.
A única maneira de passar a identidade do cliente do aplicativo cliente para o SQL Server durante uma
operação de E/S de Arquivo é usar o token do Windows associado ao thread do cliente.
Quando o contêiner de dados FILESTREAM é criado, ele é automaticamente protegido para que apenas
a conta de serviço do SQL Server e os membros do grupo BUILTIN\Administradores possam acessar
a árvore de diretórios do contêiner de dados. É preciso tomar cuidado para que o conteúdo do contêiner
de dados nunca seja alterado, exceto por meio de métodos transacionais com suporte, pois a alteração
por outros métodos resultará na corrupção do contêiner.
Habilitando o FILESTREAM no SQL Server
A segunda etapa para habilitar o FILESTREAM é executada na instância do SQL Server 2008. Isso não
pode ser feito até que o FILESTREAM tenha sido habilitado no nível do Windows, e o volume NTFS que
armazenará os dados FILESTREAM tenha sido preparado adequadamente (conforme descrito na seção
anterior "Configurando o Windows para o FILESTREAM").
O acesso ao FILESTREAM é controlado no SQL Server usando sp_configure para definir a opção de
configuração filestream_access_level para uma das três configurações. As configurações possíveis são:



18
0 – desabilitar o suporte a FILESTREAM nesta instância
1 – habilitar FILESTREAM para acesso Transact-SQL
2 – habilitar FILESTREAM para acesso Transact-SQL e acesso streaming do Win32
O exemplo a seguir mostra como habilitar o FILESTREAM para Transact-SQL e acesso streaming do
Win32.
EXEC sp_configure filestream_access_level, 2;
GO
RECONFIGURE;
GO
A instrução RECONFIGURE é necessária para que o valor recém-configurado entre em vigor. Observe
que, se FILESTREAM não estiver habilitado no nível do Windows, ele não será habilitado no nível do
SQL Server quando o código acima for executado. O valor configurado atual pode ser localizado com
o código a seguir.
EXEC sp_configure filestream_access_level;
GO
Se FILESTREAM não estiver configurado no nível do Windows, "config_value" na saída sp_configure
será diferente (isto é, 0) de "run_value" depois que a instrução RECONFIGURE tiver sido executada.
Criando um banco de dados habilitado para FILESTREAM
Depois que FILESTREAM estiver habilitado nos níveis do Windows e do SQL Server, um contêiner de
dados FILESTREAM poderá ser definido. Faça isso definindo um grupo de arquivos FILESTREAM em
um banco de dados. Há um mapeamento 1:1 entre grupos de arquivos FILESTREAM e contêineres de
dados FILESTREAM.
Um grupo de arquivos FILESTREAM pode ser definido quando um banco de dados é criado, ou pode
ser criado separadamente com uma instrução ALTER DATABASE. O exemplo a seguir cria um grupo de
arquivos FILESTREAM em um banco de dados existente.
ALTER DATABASE Production ADD
FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM;
GO
19
A cláusula CONTAINS FILESTREAM é necessária para distinguir o novo grupo de arquivos dos grupos
de arquivos normais de banco de dados. Se o recurso FILESTREAM for desabilitado, essa instrução
falhará com o erro a seguir.
Msg 5591, Level 16, State 3, Line 1
FILESTREAM feature is disabled.
Supondo-se que o FILESTREAM esteja habilitado nos níveis do Windows e do SQL Server, o grupo de
arquivos será criado. Nesse ponto, o contêiner de dados FILESTREAM é definido pela adição de um
único arquivo ao grupo de arquivos. O nome de caminho especificado é o nome do caminho do diretório
que será criado como a raiz do contêiner de dados. O nome de caminho inteiro até, mas não incluindo,
o nome do diretório final já devem existir. O exemplo a seguir define o contêiner de dados para o grupo
de arquivos FileStreamGroup1 criado anteriormente.
ALTER DATABASE Production ADD FILE (
NAME = FSGroup1File,
FILENAME = 'F:\Production\FSDATA')
TO FILEGROUP FileStreamGroup1;
GO
Neste ponto, o diretório FSDATA será criado. Ele estará vazio, com exceção de dois elementos:


O arquivo filestream.hdr. Este é o metadados FILESTREAM para o contêiner de dados.
O diretório $FSLOG. Esse é o equivalente FILESTREAM de um log de transações do banco
de dados.
Deve ser observado que um banco de dados pode ter vários grupos de arquivos FILESTREAM.
Isso pode ser útil para separar o armazenamento BLOB para várias tabelas no banco de dados.
Criando uma tabela para armazenar dados FILESTREAM
Assim que o banco de dados tiver um grupo de arquivos FILESTREAM, tabelas que contenham colunas
FILESTREAM poderão ser criadas. Como mencionado anteriormente, uma coluna FILESTREAM
é definida como uma coluna varbinary (max) que tem o atributo FILESTREAM. O código a seguir cria
uma tabela com uma única coluna FILESTREAM.
USE Production;
GO
20
CREATE TABLE DocumentStore (
DocumentID INT IDENTITY PRIMARY KEY,
Document VARBINARY (MAX) FILESTREAM NULL,
DocGUID UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL
UNIQUE DEFAULT NEWID ())
FILESTREAM_ON FileStreamGroup1;
GO
Uma tabela pode ter várias colunas FILESTREAM, mas os dados de todas as colunas FILESTREAM
em uma tabela devem ser armazenados no mesmo grupo de arquivos FILESTREAM. Se a cláusula
FILESTREAM_ON não for especificada, qualquer grupo de arquivos FILESTREAM será definido para
ser o padrão que será usado. Essa pode não ser a configuração desejada e pode gerar problemas de
desempenho.
Uma vez que a tabela seja criada, o contêiner de dados FILESTREAM conterá outro diretório, correspondente
à tabela, com um subdiretório que corresponde à coluna FILESTREAM na tabela. Esse subdiretório
conterá os arquivos de dados uma vez que os dados sejam inseridos na tabela. A estrutura do diretório
variará conforme o número de colunas FILESTREAM na tabela e se a tabela é particionada ou não.
Observe que, para que uma tabela contenha uma ou mais colunas FILESTREAM, ela também deverá
conter uma coluna do tipo de dados uniqueidentifier que tenha o atributo ROWGUIDCOL. Essa coluna
não deve permitir valores nulos e deve ter uma restrição de coluna única UNIQUE ou PRIMARY KEY.
O valor GUID da coluna deve ser fornecido por um aplicativo na inserção de dados ou por uma restrição
DEFAULT que use a função NEWID() (ou NEWSEQUENTIALID() se a replicação de mesclagem estiver
configurada, conforme mencionado na seção "Combinações e restrições de recursos", mais adiante).
Para obter mais informações sobre os detalhes e as restrições no esquema de tabela necessário e sobre
as opções, consulte o tópico "CREATE TABLE (Transact-SQL)" nos Manuais Online do SQL Server 2008
(http://msdn.microsoft.com/pt-br/library/ms174979.aspx).
Configurando a coleta de lixo do FILESTREAM
Os arquivos de dados FILESTREAM no contêiner de dados FILESTREAM não podem ser parcialmente
atualizados. Isso significa que qualquer alteração nos dados BLOB da coluna FILESTREAM criará um
arquivo de dados FILESTREAM totalmente novo. O arquivo "antigo" deve ser preservado até que não
seja mais necessário para fins de recuperação. Os arquivos que representam dados FILESTREAM
excluídos, ou as inserções revertidas de dados FILESTREAM, são preservados de forma semelhante.
Os arquivos que não são mais necessários são removidos por um processo de coleta de lixo.
Esse processo é automático, ao contrário dos serviços do Windows SharePoint® Services, em que
a coleta de lixo deve ser implementada manualmente no repositório de BLOB externo.
21
Todas as operações de arquivo FILESTREAM são mapeadas para um LSN (número de sequência de
log) no log de transações do banco de dados. Uma vez que o log de transações tenha sido truncado
após a operação LSN do FILESTREAM, o arquivo não é mais necessário e pode ser coletado pela
lixeira. Desse modo, tudo que possa impedir o truncamento do log de transações também pode evitar
que um arquivo FILESTREAM seja excluído fisicamente. Alguns exemplos são:



Os backups de log não foram executados no modelo de recuperação FULL ou BULK_LOGGED.
Há uma transação ativa de execução longa.
O trabalho do leitor do log de replicação não foi executado.
A coleta de lixo do FILESTREAM é uma tarefa em segundo plano que é disparada pelo processo de
ponto de verificação do banco de dados. Um ponto de verificação será executado automaticamente
quando logs de transações suficientes tiverem sido gerados. Para obter mais informações, consulte
o tópico "PONTO DE VERIFICAÇÃO e a parte ativa do log" nos Manuais Online do SQL Server 2008
(http://msdn.microsoft.com/pt-br/library/ms189573.aspx). Considerando que as operações de arquivo
FILESTREAM são minimamente registradas no log de transações do banco de dados, pode demorar
um pouco para que o número de registros do log de transações gerado dispare um processo de ponto
de verificação e ocorra uma coleta de lixo. Se isso se tornar um problema, você poderá forçar a coleta
de lixo usando a instrução CHECKPOINT.
Considerações sobre particionamento
Se a tabela que contém dados FILESTREAM for particionada, a cláusula FILESTREAM_ON deverá
especificar um esquema de particionamento envolvendo grupos de arquivos FILESTREAM e baseados
na função de particionamento da tabela. Isso é necessário porque o esquema normal de particionamento
envolverá grupos de arquivos regulares que não podem ser usados para armazenar dados FILESTREAM.
A definição de tabela (em uma instrução CREATE TABLE ou CREATE CLUSTERED INDEX … WITH
DROP_EXISTING) especifica ambos os esquemas de particionamento.
O esquema de particionamento FILESTREAM pode especificar que todas as partições sejam mapeadas
para um único grupo de arquivos, mas isso não é recomendado porque pode resultar em problemas de
desempenho.
O exemplo (inventado) a seguir mostra essa sintaxe.
CREATE PARTITION FUNCTION DocPartFunction (INT)
AS RANGE RIGHT FOR VALUES (100000, 200000);
GO
CREATE PARTITION SCHEME DocPartScheme AS
PARTITION DocPartFunction TO (Data_FG1, Data_FG2, Data_FG3);
GO
22
CREATE PARTITION SCHEME DocFSPartScheme AS
PARTITION DocPartFunction TO (FS_FG1, FS_FG2, FS_FG3);
GO
CREATE TABLE DocumentStore (
DocumentID INT IDENTITY PRIMARY KEY,
Document VARBINARY (MAX) FILESTREAM NULL,
DocGUID UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL
UNIQUE DEFAULT NEWID () ON Data_FG1)
ON DocPartScheme (DocumentID)
FILESTREAM_ON DocFSPartScheme;
GO
Observe que, para usar a coluna DocumentID como a coluna de particionamento, o índice não clusterizado
subjacente que aplica a restrição UNIQUE em DocGUID deve ser explicitamente colocado em um grupo
de arquivos, para que a coluna DocumentID possa ser a coluna de particionamento. Isso significa que
a alternância de partição será possível somente se as restrições UNIQUE forem desabilitadas antes da
execução da alternância de partição, já que são índices desalinhados, e reabilitadas posteriormente.
Continuando com o exemplo anterior, o código a seguir cria uma tabela e tenta uma alternância de partição.
CREATE TABLE NonPartitionedDocumentStore (
DocumentID INT IDENTITY PRIMARY KEY,
Document VARBINARY (MAX) FILESTREAM NULL,
DocGUID UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL
UNIQUE DEFAULT NEWID ());
GO
ALTER TABLE DocumentStore SWITCH PARTITION 2 TO NonPartitionedDocumentStore;
GO
23
A alternância de partição falhará apresentando a mensagem a seguir.
Msg 7733, Level 16, State 4, Line 1
Falha na instrução ‘ALTER TABLE SWITCH’. A tabela
‘FileStreamTestDB.dbo.DocumentStore’ é particionada, enquanto o índice
‘UQ_Document_8CC1617F60ED59’ não é particionado.
Desabilitar o índice exclusivo na tabela de origem e tentar novamente fornece o código a seguir.
ALTER INDEX [UQ__Document__8CC331617F60ED59] ON DocumentStore DISABLE;
GO
ALTER TABLE FileStreamTest3 SWITCH PARTITION 2 TO NonPartitionedFileStreamTest3;
GO
Isso também falha, exibindo a mensagem a seguir.
Msg 4947, Leve 16, State 1, Line 1
Falha na instrução ALTER TABLE SWITCH. Não existe um índice idêntico na tabela de
origem ‘FileStreamTestDB.dbo.DocumentStore’ para o índice
‘UQ_NonParti_8CC3316103317E3D’ na tabela de destino
‘FileStreamTestDB.dbo.NonPartitionedDocumentStore’.
Os índices exclusivos nas tabelas particionadas e não particionadas devem ser desabilitados para que
a alternância possa prosseguir.
ALTER INDEX [UQ__NonParti__8CC3316103317E3D] ON NonPartitionedDocumentStore DISABLE;
GO
ALTER TABLE DocumentStore SWITCH PARTITION 2 TO NonPartitionedDocumentStore;
GO
ALTER INDEX [UQ__NonParti__8CC3316103317E3D] ON
NonPartitionedDocumentStore REBUILD WITH (ONLINE = ON);
24
ALTER INDEX [UQ__Document__8CC331617F60ED59] ON
NonPartitionedDocumentStore REBUILD WITH (ONLINE = ON);
GO
Mais informações sobre dados FILESTREAM de particionamento serão incluídas no próximo white paper
sobre particionamento no SQL Server 2008.
Balanceamento de carga de dados FILESTREAM
O particionamento também pode ser usado para criar um esquema da tabela que permita o balanceamento
de carga bruto de dados FILESTREAM entre vários volumes. Isso pode ser desejável por vários motivos,
como limitações de hardware ou para permitir que os pontos de acesso em uma tabela sejam armazenados
em diferentes volumes.
O código a seguir mostra uma função e um esquema de particionamento com base na coluna
uniqueidentifier, que efetivamente espalha os dados FILESTREAM por 16 volumes, enquanto distribui
os dados estruturados entre dois grupos de arquivos.
USE master;
GO
-- Create the database
CREATE DATABASE Production ON PRIMARY
(NAME = 'Production', FILENAME = 'E:\Production\Production.mdf'),
FILEGROUP DataFilegroup1
(NAME = 'Data_FG1', FILENAME = 'F:\Production\Data_FG1.ndf'),
FILEGROUP DataFilegroup2
(NAME = 'Data_FG2', FILENAME = 'G:\Production\Data_FG2.ndf'),
FILEGROUP FSFilegroup0 CONTAINS FILESTREAM
(NAME = 'FS_FG0', FILENAME = 'H:\Production\FS_FG0'),
FILEGROUP FSFilegroup1 CONTAINS FILESTREAM
(NAME = 'FS_FG1', FILENAME = 'I:\Production\FS_FG1'),
FILEGROUP FSFilegroup2 CONTAINS FILESTREAM
(NAME = 'FS_FG2', FILENAME = 'J:\Production\FS_FG2'),
25
FILEGROUP FSFilegroup3 CONTAINS FILESTREAM
(NAME = 'FS_FG3', FILENAME = 'K:\Production\FS_FG3'),
FILEGROUP FSFilegroup4 CONTAINS FILESTREAM
(NAME = 'FS_FG4', FILENAME = 'L:\Production\FS_FG4'),
FILEGROUP FSFilegroup5 CONTAINS FILESTREAM
(NAME = 'FS_FG5', FILENAME = 'M:\Production\FS_FG5'),
FILEGROUP FSFilegroup6 CONTAINS FILESTREAM
(NAME = 'FS_FG6', FILENAME = 'N:\Production\FS_FG6'),
FILEGROUP FSFilegroup7 CONTAINS FILESTREAM
(NAME = 'FS_FG7', FILENAME = 'O:\Production\FS_FG7'),
FILEGROUP FSFilegroup8 CONTAINS FILESTREAM
(NAME = 'FS_FG8', FILENAME = 'P:\Production\FS_FG8'),
FILEGROUP FSFilegroup9 CONTAINS FILESTREAM
(NAME = 'FS_FG9', FILENAME = 'Q:\Production\FS_FG9'),
FILEGROUP FSFilegroupA CONTAINS FILESTREAM
(NAME = 'FS_FGA', FILENAME = 'R:\Production\FS_FGA'),
FILEGROUP FSFilegroupB CONTAINS FILESTREAM
(NAME = 'FS_FGB', FILENAME = 'S:\Production\FS_FGB'),
FILEGROUP FSFilegroupC CONTAINS FILESTREAM
(NAME = 'FS_FGC', FILENAME = 'T:\Production\FS_FGC'),
FILEGROUP FSFilegroupD CONTAINS FILESTREAM
(NAME = 'FS_FGD', FILENAME = 'U:\Production\FS_FGD'),
FILEGROUP FSFilegroupE CONTAINS FILESTREAM
(NAME = 'FS_FGE', FILENAME = 'V:\Production\FS_FGE'),
FILEGROUP FSFilegroupF CONTAINS FILESTREAM
(NAME = 'FS_FGF', FILENAME = 'W:\Production\FS_FGF');
GO
26
USE Production;
GO
-- Create a partition function based on the last 6 bytes of the GUID
CREATE PARTITION FUNCTION LoadBalance_PF (UNIQUEIDENTIFIER)
AS RANGE LEFT FOR VALUES (
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-100000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-200000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-300000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-400000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-500000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-600000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-700000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-800000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-900000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-a00000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-b00000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-c00000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-d00000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-e00000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-f00000000000'));
GO
-- Create a filestream partitioning scheme that allows mapping to 16 filestream
filegroups
CREATE PARTITION SCHEME LoadBalance_FS_PS
AS PARTITION LoadBalance_PF TO (
FSFileGroup0, FSFileGroup1, FSFileGroup2, FSFileGroup3,
27
FSFileGroup4, FSFileGroup5, FSFileGroup6, FSFileGroup7,
FSFileGroup8, FSFileGroup9, FSFileGroupA, FSFileGroupB,
FSFileGroupC, FSFileGroupD, FSFileGroupE, FSFileGroupF);
GO
-- Create a data partitioning scheme to round-robin between two filegroups
CREATE PARTITION SCHEME LoadBalance_Data_PS
AS PARTITION LoadBalance_PF TO (
DataFileGroup1, DataFileGroup2, DataFileGroup1, DataFileGroup2,
DataFileGroup1, DataFileGroup2, DataFileGroup1, DataFileGroup2,
DataFileGroup1, DataFileGroup2, DataFileGroup1, DataFileGroup2,
DataFileGroup1, DataFileGroup2, DataFileGroup1, DataFileGroup2);
GO
-- Create the partitioned table
CREATE TABLE DocumentStore (
DocumentID INT IDENTITY,
Document VARBINARY (MAX) FILESTREAM NULL,
DocGUID UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL
DEFAULT NEWID (),
CONSTRAINT DocStorePK PRIMARY KEY CLUSTERED (DocGUID),
CONSTRAINT DocStoreU UNIQUE (DocGUID))
ON LoadBalance_Data_PS (DocGUID)
FILESTREAM_ON LoadBalance_FS_PS;
GO
28
O balanceamento de carga pode ser facilmente testado com o código a seguir.
SET NOCOUNT ON;
GO
-- Insert 10000 rows to test load balancing
DECLARE @count INT = 0;
WHILE (@count < 10000)
BEGIN
INSERT INTO DocumentStore DEFAULT VALUES;
SET @count = @count + 1;
END;
GO
-- Check the distribution
SELECT COUNT ($PARTITION.LoadBalance_PF (DocGUID))
FROM DocumentStore
GROUP BY $PARTITION.LoadBalance_PF (DocGUID);
GO
Os resultados da execução de um exemplo desse teste foram 631, 641, 661, 640, 649, 637, 618, 618,
576, 608, 595, 645, 640, 616, 602 e 623 linhas em cada um dos grupos de arquivos FILESTREAM
FS_FG0 a FS_FGF.
Combinações e limitações de recursos
Como o recurso FILESTREAM armazena dados no sistema de arquivos, há algumas restrições
e considerações quando o FILESTREAM é combinado com outros recursos do SQL Server. Esta seção
fornece uma visão geral das combinações de recursos que se deve conhecer. Para obter mais informações,
consulte o tópico "Usando o FILESTREAM com outros recursos do SQL Server" nos Manuais Online do
SQL Server 2008 (http://msdn.microsoft.com/pt-br/library/bb895334.aspx).
29
Replicação
A replicação transacional e a replicação de mesclagem oferecem suporte a dados FILESTREAM, mas há
muitas considerações como estas:




Quando a topologia de replicação engloba as instâncias que usam versões diferentes do SQL
Server, há limitações quanto ao tamanho dos dados que podem ser enviados a instâncias de
nível inferior.
As opções de filtro de replicação determinam se o atributo FILESTREAM será replicado ou não
usando a replicação transacional.
O tamanho máximo do valor de dados varbinary (max) que pode ser replicado na replicação
transacional sem replicar o atributo FILESTREAM é 2 GB.
Quando a replicação de mesclagem é usada, ela e o FILESTREAM exigem uma coluna
uniqueidentifier. É preciso ter cuidado com o esquema de tabela ao usar a replicação de
mesclagem para que os GUIDs sejam sequenciais (isto é, use NEWSEQUENTIALID() em vez
de NEWID()).
Espelhamento de banco de dados
O espelhamento de banco de dados não oferece suporte a FILESTREAM. Um grupo de arquivos
FILESTREAM não pode ser criado no servidor principal. O espelhamento de banco de dados não
pode ser configurado para um banco de dados que contenha grupos de arquivos FILESTREAM.
Criptografia
Os dados FILESTREAM não podem ser criptografados com métodos de criptografia do SQL Server.
Se a criptografia de dados transparente for habilitada, os dados FILESTREAM não serão criptografados.
Clustering de failover
O FILESTREAM tem suporte completo com clustering de failover. Todos os nós no cluster devem ter
o FILESTREAM habilitado no nível do Windows, e os contêineres de dados FILESTREAM devem ser
colocados no armazenamento compartilhado para que os dados sejam disponibilizados para todos os
nós. Para obter mais informações, consulte o tópico "Como configurar o FILESTREAM em um cluster de
failover" nos Manuais Online do SQL Server 2008 (http://msdn.microsoft.com/pt-br/library/cc645886.aspx).
Texto completo
A indexação de texto completo funciona com uma coluna FILESTREAM exatamente da mesma maneira
que com uma coluna varbinary (max). A tabela deve ter uma coluna extra que contenha a extensão de
nome de arquivo para os dados BLOB que estão sendo armazenados na coluna FILESTREAM.
Instantâneos de banco de dados
O SQL Server não oferece suporte a instantâneos de banco de dados para contêineres de dados
FILESTREAM. Se um arquivo de dados FILESTREAM for incluído em uma cláusula CREATE
DATABASE ON, a instrução falhará e um erro será gerado.
30
Se um banco de dados contiver dados FILESTREAM, ainda poderá ser criado um instantâneo de banco
de dados dos grupos de arquivos regulares. Nesse caso, uma mensagem de aviso será retornada e os
grupos de arquivos FILESTREAM serão marcados como offline no instantâneo de banco de dados.
As consultas funcionarão conforme o esperado no instantâneo de banco de dados, a menos que tentem
acessar os dados FILESTREAM. Se isso ocorrer, um erro será gerado.
Um banco de dados não poderá ser revertido para um instantâneo se o banco de dados contiver dados
FILESTREAM, pois não há como saber em que estado os dados FILESTREAM estavam no momento
representado pelo instantâneo de banco de dados.
Exibições, índices, estatísticas, gatilhos e restrições
As colunas FILESTREAM não podem fazer parte de uma chave de índice nem especificadas como uma
coluna INCLUDE em um índice não clusterizado. É possível definir uma coluna computada que faça
referência a uma coluna FILESTREAM, mas a coluna computada não pode ser indexada.
As estatísticas não podem ser criadas em colunas FILESTREAM.
Restrições PRIMARY KEY, FOREIGN KEY e UNIQUE não podem ser criadas em colunas
FILESTREAM.
As exibições indexadas não podem conter colunas FILESTREAM, mas as exibições não indexadas
podem.
Em vez disso, não é possível definir gatilhos em tabelas que contenham colunas FILESTREAM.
Níveis de isolamento
Quando os dados FILESTREAM são acessados por meio das APIs do Win32, apenas o nível de
isolamento confirmado por leitura tem suporte. O acesso Transact-SQL também permite os níveis de
isolamento serializáveis e de leitura repetida. Além disso, usando o acesso Transact-SQL, as leituras
sujas são permitidas por meio do nível de isolamento não confirmado por leitura ou pela dica de consulta
NOLOCK, mas esse acesso não mostrará atualizações em curso dos dados FILESTREAM.
Backup e restauração
O FILESTREAM funciona com todos os modelos de recuperação e todas as formas de backup
e restauração (completo, diferencial e log). Em caso de desastre, se a opção CONTINUE_AFTER_ERROR
for especificada em uma opção BACKUP ou RESTORE, os dados FILESTREAM talvez não possam
ser recuperados sem perda de dados (da mesma forma que a recuperação de dados regulares quando
CONTINUE_AFTER_ERROR é especificada).
Segurança
A instância do SQL Server deverá ser configurada para usar a segurança integrada se o acesso Win32
a dados FILESTREAM for necessário.
Envio de logs
O envio de logs oferece suporte a FILESTREAM. Os servidores primário e secundário devem estar
executando o SQL Server 2008 ou uma versão posterior e ter o FILESTREAM habilitado no nível do
Windows.
31
SQL Server Express
O SQL Server Express oferece suporte a FILESTREAM. O limite de tamanho do banco de dados de
4 GB não inclui o contêiner de dados FILESTREAM.
No entanto, se os dados FILESTREAM estiverem sendo enviados para dentro ou fora da instância
do SQL Server Express usando o Service Broker, será preciso ter cuidado, pois o Service Broker
não oferece suporte ao armazenamento de dados como FILESTREAM nas filas de transmissão ou de
destino. Isso significa que, se uma das filas aumentar, o limite de tamanho do banco de dados de 4 GB
poderá ser atingido.
Uma alternativa, nesse caso, é usar um esquema no qual a conversa do Service Broker transmita
notificações de que os dados FILESTREAM precisam ser enviados ou recebidos. A transmissão real dos
dados FILESTREAM é feita usando o acesso remoto por meio do compartilhamento do FILESTREAM do
contêiner de dados FILESTREAM da instância do SQL Server Express.
Considerações sobre avaliação e ajuste de desempenho
Há várias considerações importantes ao ajustar uma carga de trabalho FILESTREAM:






Verifique se o hardware está configurado corretamente para FILESTREAM.
Verifique se a geração de nomes 8.3 está desabilitada no NTFS.
Verifique se o rastreamento de hora do último acesso está desabilitado no NTFS.
Verifique se o contêiner de dados FILESTREAM não está em um volume fragmentado.
Verifique se o tamanho de dados BLOB é apropriado para armazenamento com FILESTREAM.
Verifique se os contêineres de dados FILESTREAM têm seus próprios volumes dedicados.
Um fator importante a ser destacado é o tamanho do buffer usado pelo protocolo SMB que é usado
para armazenar em buffer as leituras dos dados FILESTREAM. No teste em que o sistema operacional
Windows Server® 2003 foi usado, os tamanhos maiores de buffer tendem a obter melhores taxas de
transferências, com tamanhos de buffer de um múltiplo de, aproximadamente, 60 KB. Os tamanhos de
buffer maiores podem ser mais eficientes em outros sistemas operacionais.
Há considerações adicionais ao comparar uma carga de trabalho FILESTREAM com outras opções de
armazenamento (uma vez que a carga de trabalho FILESTREAM tenha sido ajustada):



32
Verifique se o hardware de armazenamento e o nível de RAID são os mesmos em ambos
os casos.
Verifique se a configuração de compactação de volume é a mesma em ambos os casos.
Leve em consideração se o FILESTREAM está executando write-through com base na API em
uso e nas opções especificadas.
Considerações sobre migração de dados
Um cenário comum de uso do SQL Server 2008 será a migração de dados BLOB existentes para
o armazenamento FILESTREAM. Embora fornecer uma ferramenta completa ou um conjunto de códigos
para executar migrações esteja além do escopo deste white paper, veja a seguir um fluxo de trabalho
simples a ser seguido:









Examine as considerações sobre o tamanho dos dados para uso de FILESTREAM a fim de
garantir que a média de tamanhos de dados envolvidos seja, assim como no armazenamento
do FILESTREAM, adequada.
Revise as informações disponíveis sobre combinações e limitações de recursos para garantir
que o armazenamento FILESTREAM funcione com todos os outros requisitos do aplicativo.
Siga as recomendações da seção anterior "Considerações sobre avaliação e ajuste de
desempenho".
Verifique se a instância do SQL Server está usando a segurança integrada e se o FILESTREAM
foi habilitado nos níveis do Windows e do SQL Server.
Verifique se o local do contêiner de dados FILESTREAM de destino tem espaço em disco
suficiente para armazenar os dados BLOB migrados.
Crie os grupos de arquivos FILESTREAM necessários.
Duplique os esquemas de tabela envolvidos, alterando as colunas BLOB necessárias para
serem FILESTREAM.
Migre todos os dados não BLOB para o novo esquema.
Migre todos os dados BLOB para as novas colunas FILESTREAM.
Práticas recomendadas de uso do FILESTREAM
Esta seção é uma coleção de práticas recomendadas que resultaram do uso do FILESTREAM durante
os testes internos e públicos de pré-lançamento do recurso. Assim como todas as práticas recomendadas,
essas são generalizações e podem não se aplicar a cada situação e cenário. As práticas recomendadas
seguem abaixo sem ordem específica:




33
Vários anexos pequenos a um arquivo FILESTREAM devem ser evitados sempre que possível,
pois cada anexo cria um arquivo FILESTREAM inteiramente novo. Isso poderia ser bastante
oneroso para arquivos FILESTREAM grandes. Se possível, vários anexos devem ser agrupados
juntos em uma coluna varbinary (max) e, em seguida, acrescentados à coluna FILESTREAM
quando um limite de tamanho é atingido.
Com uma carga de trabalho de gravação com intenso número de threads, considere
a possibilidade de configurar o parâmetro AllocationSize para as APIs OpenSqlFilestream ou
SqlFilestream. Os tamanhos de alocação inicial maiores limitarão o potencial de fragmentação
no nível de sistema de arquivos, especialmente quando combinados com um tamanho grande
de cluster NTFS, conforme descrito anteriormente.
Se os arquivos FILESTREAM forem grandes, evite as atualizações de Transact-SQL que
acrescentam ou pré-acrescentam dados a um arquivo. Isso (geralmente) armazenará dados
no spool em tempdb e novamente em um novo arquivo físico, o que afetará o desempenho.
Ao ler um valor FILESTREAM, considere o seguinte:
o Se as leituras exigirem apenas a leitura dos primeiros bytes, considere a funcionalidade
de subcadeia de caracteres.
o Se o arquivo inteiro deve ser lido, considere o acesso Win32.
o
o
o
Se partes aleatórias do arquivo devem ser lidas, considere abrir o identificador de
arquivo usando SetFilePointer.
Ao ler um arquivo inteiro, especifique o sinalizador FILE_SEQUENTIAL_ONLY.
Use os buffers feito sob medida em múltiplos de 60 KB (conforme descrito
anteriormente).
É possível atingir o tamanho de um arquivo FILESTREAM sem precisar abrir um identificador para
o arquivo adicionando uma coluna computada persistente à tabela que armazena o tamanho do arquivo
FILESTREAM. A coluna computada é atualizada quando o arquivo já está aberto para operações de
gravação.
Conclusão
Este white paper descreveu o recurso FILESTREAM do SQL Server 2008, que permite
o armazenamento de dados BLOB e o acesso eficiente a eles por meio de uma combinação
do SQL Server 2008 e do sistema de arquivos NTFS. Para concluir, vale reiterar os principais
pontos destacados neste white paper.
O armazenamento FILESTREAM não é apropriado em todos os casos. Com base na pesquisa
anterior e no comportamento do recurso FILESTREAM, os dados BLOB de 1 MB e maiores
que não serão acessados por Transact-SQL são mais bem armazenados como dados
FILESTREAM.
Também deve ser considerada a carga de trabalho de atualização, uma vez que qualquer
atualização parcial em um arquivo FILESTREAM gera uma cópia completa do arquivo.
Com uma carga de trabalho de atualização especialmente pesada, o desempenho pode se
apresentar de uma forma que o FILESTREAM não seja apropriado.
Os detalhes das combinações de recursos devem ser estudados para garantir que
a implantação seja bem-sucedida. Por exemplo, na versão RTM do SQL Server 2008,
o espelhamento de banco de dados não pode usar dados FILESTREAM, nem aproveitar
o isolamento de instantâneo. A maioria das outras combinações de recursos tem suporte,
mas algumas podem ter limitações (como a replicação). Este white paper não fornece uma
taxonomia exaustiva dos recursos e de sua interação, de modo que as seções mais recentes
dos Manuais Online do SQL Server devem ser verificadas antes da implantação, especialmente
porque algumas limitações poderão aumentar em versões futuras.
Por fim, se o FILESTREAM for implantado sem a configuração correta do Windows e do
SQL Server, os níveis de desempenho previstos talvez não sejam atingidos. As práticas
recomendadas e os detalhes de configuração descritos acima devem ser usados para ajudar
a evitar problemas de desempenho.
34
Para obter mais informações:
http://www.microsoft.com/sqlserver/: Site do SQL Server
http://technet.microsoft.com/pt-br/sqlserver/: TechCenter do SQL Server
http://msdn.microsoft.com/pt-br/sqlserver/: SQL Server DevCenter
Este documento ajudou você? Envie seus comentários. Em uma escala de 1 (ruim) a 5
(excelente), como você classificaria este white paper e por quê? Por exemplo:


Você está classificando-o como excelente devido aos bons exemplos, às excelentes
capturas de tela, à clareza do texto ou por outro motivo?
Você está classificando-o como ruim devido aos exemplos insatisfatórios, às capturas
de tela confusas ou ao texto mal-escrito?
Estes comentários nos ajudam a melhorar a qualidade dos white papers que lançamos.
Enviar comentários.
35
Download