Revisores tcnicos: Alexandru Chirica, Arkadi Brjazovski, Prem Mehra, Joanna Omel, Mike Ruthruff, Robin Dhamankar
Fecha de publicacin: octubre de 2008 Se aplica a: SQL Server 2008
Resumen: en estas notas del producto se describe la caracterstica FILESTREAM de SQL Server 2008, que permite el almacenamiento y el acceso eficiente a datos BLOB mediante una combinacin de SQL Server 2008 y el sistema de archivos NTFS. Tambin se explican las distintas opciones de almacenamiento de BLOB, la configuracin de Windows y SQL Server para usar datos de FILESTREAM, los aspectos que hay que tener en cuenta a la hora de combinar FILESTREAM con otras caractersticas, y detalles de implementacin como la creacin de particiones y el rendimiento. Estas notas del producto estn destinadas a arquitectos, profesionales de TI y DBA encargados de la evaluacin o implementacin de FILESTREAM. Se da por supuesto que el lector est familiarizado con Windows y SQL Server, y que tiene al menos unos conocimientos rudimentarios de conceptos de base de datos como las transacciones. Introduccin En la sociedad actual se generan datos a unas velocidades increbles y a menudo es necesario almacenarlos y obtener acceso a ellos de manera controlada y eficiente. Existen distintas tecnologas para ello y la eleccin de la tecnologa suele depender de la naturaleza de los datos que se van a almacenar: estructurados, semiestructurados o no estructurados: Los datos estructurados son aquellos que se pueden almacenar fcilmente en un esquema relacional, como los que representan datos de ventas de una empresa. Se pueden almacenar en una base de datos con una tabla de informacin para los productos que la compaa vende, otra tabla con informacin sobre los clientes y otra tabla con los detalles de ventas de los productos a los clientes. El acceso a los datos y su manipulacin se realiza mediante un lenguaje de consultas enriquecido como Transact-SQL.
2
Los datos semiestructurados son aquellos que se ajustan a un esquema flexible pero que no se suelen almacenar bien en un conjunto de tablas de base de datos, como aquellos en los que cada punto de datos puede tener atributos radicalmente diferentes. Los datos semiestructurados suelen almacenarse con el tipo de datos xml en el software de base de datos Microsoft SQL Server y normalmente se obtiene acceso a ellos mediante un lenguaje de consultas basado en elementos como XQuery. Los datos no estructurados pueden no tener ningn esquema (por ejemplo, un fragmento de datos cifrados) o pueden ser grandes cantidades de datos binarios (muchos megabytes o incluso gigabytes) que parecen no tener ningn esquema pero en realidad tienen un esquema muy simple inherente, como los archivos de imagen, vdeo de transmisin por secuencias o clips de sonido. En este caso, los datos binarios se refieren a datos que pueden tener cualquier valor, no solo los que se pueden escribir con un teclado. Estos valores de datos se conocen comnmente como objetos binarios grandes, o simplemente blobs. En estas notas del producto se describe la caracterstica FILESTREAM de SQL Server 2008, que permite el almacenamiento y el acceso eficiente a datos BLOB mediante una combinacin de SQL Server 2008 y el sistema de archivos NTFS. Se explica la caracterstica FILESTREAM propiamente dicha, las opciones de almacenamiento de BLOB, la configuracin del sistema operativo Windows y SQL Server para usar datos de FILESTREAM, los aspectos que hay que tener en cuenta a la hora de combinar FILESTREAM con otras caractersticas, y detalles de implementacin como las particiones y el rendimiento. Opciones para el almacenamiento de blobs Si bien los datos estructurados y semiestructurados se pueden almacenar fcilmente en una base de datos relacional, la eleccin de dnde almacenar los datos no estructurados o BLOB es ms complicada. A la hora de decidir dnde almacenar los datos BLOB, tenga en cuenta los siguientes requisitos: Rendimiento: la manera en que se van a usar los datos es un factor fundamental. Si se necesita acceso de transmisin por secuencias, el almacenamiento de los datos dentro de una base de datos de SQL Server puede ser ms lento que almacenarlos externamente en una ubicacin como el sistema de archivos NTFS. Cuando se usa el almacenamiento del sistema de archivos, los datos se leen del archivo y se pasan a la aplicacin cliente (directamente o con un almacenamiento en bfer adicional). Cuando los datos BLOB se almacenan en una base de datos de SQL Server, primero se deben leer en la memoria de SQL Server (el grupo de bferes) y despus se devuelven a la aplicacin cliente a travs de una conexin de cliente. Esto no solo significa que los datos pasan por una fase de procesamiento adicional; tambin significa que la memoria de SQL Server est "contaminada" innecesariamente con datos BLOB, lo que puede causar problemas de rendimiento en operaciones posteriores de SQL Server. Seguridad: los datos confidenciales cuyo acceso se debe administrar estrechamente se pueden almacenar en una base de datos y se puede supervisar la seguridad mediante los controles de acceso habituales de SQL Server. Si se almacenan los mismos datos en el sistema de archivos, es necesario implementar distintos mtodos de seguridad como las listas de control de acceso (ACL). Tamao de los datos: segn el estudio que se cita ms adelante en estas notas del producto, es mejor almacenar los blob de menos de 256 kilobytes (kB) (como los iconos de widget) en una base de datos y los blobs de ms de 1 megabyte (MB) fuera de la base de datos. En el caso de datos cuyo tamao est comprendido entre 256 kB y 1 MB, la solucin de almacenamiento ms eficiente depende de la proporcin de lectura y escritura de los datos, y de la tasa de "sobrescritura". El almacenamiento de datos BLOB exclusivamente dentro de la base de datos (por ejemplo, usando el tipo de datos varbinary (max)) est limitado a 2 gigabytes (GB) por BLOB.
3
Acceso de cliente: el protocolo que el cliente emplea para obtener acceso a datos de SQL Server, como ODBC, quizs no sea el adecuado para aplicaciones como la transmisin por secuencias de archivos de vdeo grandes. En este caso, puede ser necesario almacenar los datos en el sistema de archivos. Semntica transaccional: si los datos BLOB tienen asociados datos estructurados que se almacenarn en la base de datos, los cambios en los datos BLOB necesitarn ajustarse a la semntica transaccional para que los dos conjuntos de datos estn sincronizados. Por ejemplo, si una transaccin crea datos BLOB y una fila en una tabla de base de datos pero despus hace una reversin, se debe revertir la creacin de los datos BLOB y la creacin de la fila de la tabla. Esto puede resultar muy complejo si los datos BLOB se almacenan en el sistema de archivos sin ningn vnculo a la base de datos. Fragmentacin de datos: las actualizaciones y sobrescrituras frecuentes harn que los BLOB se muevan, ya sea dentro de los archivos de base de datos de SQL Server o dentro del sistema de archivos, en funcin de dnde se almacenen los datos. En este caso, si los BLOB son grandes, se pueden fragmentar (es decir, pueden no almacenarse en una parte contigua del disco). Es ms fcil resolver esta fragmentacin si se usa el sistema de archivos en lugar de SQL Server. Facilidad de uso: es ms difcil y costoso administrar una solucin que emplea varias tecnologas no integradas que una solucin integrada. Costo: el costo de la solucin de almacenamiento vara en funcin de la tecnologa que se emplea. Las explicaciones anteriores sobre el tamao y la fragmentacin se basan en el conocido documento de Microsoft Research BLOB o no BLOB: almacenamiento de objetos grandes en una base de datos o en un sistema de archivos? (Gray, Van Ingen y Sears). Este documento contiene ms informacin sobre las ventajas y desventajas de ambos modelos y se puede descargar desde aqu: http://research.microsoft.com/research/pubs/view.aspx?msr_tr_id=MSR-TR-2006-45 Existen diversas soluciones para el almacenamiento de BLOB, y cada una de ellas tiene sus pros y sus contras, segn los requisitos indicados anteriormente. En la tabla siguiente se comparan tres opciones frecuentes para almacenar datos BLOB, incluido FILESTREAM, en SQL Server 2008.
Punto de comparacin Solucin de almacenamiento Servidor de archivos/sistema de archivos SQL Server (con varbinary (max)) FILESTREAM Tamao mximo de BLOB Tamao del volumen NTFS 2 GB - 1 bytes Tamao del volumen NTFS Rendimiento de la transmisin por secuencias de BLOB grandes Excelente Deficiente Excelente Seguridad ACL manuales Integrada Integrada + ACL automticas Costo por GB Bajo Alto Bajo Facilidad de uso Difcil Integrada Integrada Integracin con datos estructurados Difcil Coherencia en el nivel de datos Coherencia en el nivel de datos Desarrollo e implementacin de aplicaciones Ms complejos Ms sencillos Ms sencillos
4
Punto de comparacin Solucin de almacenamiento Servidor de archivos/sistema de archivos SQL Server (con varbinary (max)) FILESTREAM Recuperacin de la fragmentacin de datos Excelente Deficiente Excelente Rendimiento de pequeas actualizaciones frecuentes Excelente Moderado Deficiente Tabla 1: comparacin de las tecnologas de almacenamiento de BLOB anteriores a SQL Server 2008 FILESTREAM es la nica solucin que proporciona coherencia transaccional de los datos estructurados y no estructurados, as como administracin integrada, seguridad, bajo costo y excelente rendimiento de transmisin de datos por secuencias. Para lograrlo, almacena los datos estructurados en los archivos de base de datos y los datos BLOB no estructurados en el sistema de archivos, al tiempo que mantiene la coherencia transaccional entre los dos almacenamientos. En la seccin "Informacin general de FILESTREAM" ms adelante en estas notas del producto se proporcionan ms detalles sobre la arquitectura de FILESTREAM. Informacin general de FILESTREAM FILESTREAM es una caracterstica nueva de SQL Server 2008. Permite almacenar los datos estructurados en la base de datos y almacenar directamente en el sistema de archivos NTFS los datos no estructurados asociados (es decir, los BLOB). El acceso a los datos BLOB se realiza mediante las API de transmisin por secuencias de Win32 de alto rendimiento, lo que evita la penalizacin de rendimiento que supone el acceso a los datos BLOB a travs de SQL Server. FILESTREAM mantiene en todo momento la coherencia transaccional entre los datos estructurados y no estructurados, e incluso permite la recuperacin a un momento dado de los datos de FILESTREAM mediante copias de seguridad de registros. SQL Server mantiene automticamente la coherencia y no se necesita ninguna lgica personalizada en la aplicacin. Para ello, el mecanismo de FILESTREAM mantiene el equivalente de un registro de transacciones de la base de datos, que comparte muchos requisitos de administracin (se describen con ms detalle en la seccin "Configurar la recoleccin de elementos no utilizados de FILESTREAM", ms adelante en estas notas del producto). La combinacin del registro de transacciones de la base de datos y el registro de transacciones de FILESTREAM permite la correcta recuperacin transaccional de los datos estructurados y de FILESTREAM. En lugar de ser un tipo de datos completamente nuevo, FILESTREAM es un atributo de almacenamiento del tipo de datos varbinary (max) existente. FILESTREAM mantiene gran parte del comportamiento existente del tipo de datos varbinary (max). Cambia la forma en que se almacenan los datos BLOB: en el sistema de archivos en lugar de en archivos de datos de SQL Server. Puesto que FILESTREAM se implementa como una columna varbinary (max) y se integra directamente en el motor de base de datos, la mayora de las funciones y herramientas de administracin de SQL Server funcionan para los datos de FILESTREAM sin necesidad de realizar modificacin alguna. Hay que destacar que el comportamiento del tipo de datos varbinary (max) normal no ha cambiado en SQL Server 2008, incluido el lmite de tamao de 2 GB. La incorporacin del atributo FILESTREAM hace que una columna varbinary (max) tenga bsicamente un tamao ilimitado (en realidad, el tamao est limitado al del volumen NTFS subyacente).
5
Los datos de FILESTREAM se almacenan en el sistema de archivos en un conjunto de directorios NTFS denominados contenedores de datos, que corresponden a los grupos de archivos especiales de la base de datos. El acceso transaccional a los datos de FILESTREAM est controlado por SQL Server y por un controlador del filtro del sistema de archivos que se instala como parte de la habilitacin de FILESTREAM en el nivel de Windows. El uso de un controlador del filtro del sistema de archivos tambin permite el acceso remoto a los datos de FILESTREAM a travs de una ruta de acceso UNC. SQL Server mantiene un vnculo de ordenaciones de filas de tabla a los archivos FILESTREAM asociados. Esto significa que si se elimina o se cambia el nombre de algn archivo de FILESTREAM directamente a travs del sistema de archivos se daar la base de datos. El uso de FILESTREAM requiere varias modificaciones del esquema en las tablas de datos (especialmente, el requisito de que cada fila debe tener un identificador de fila nico) y tiene tambin algunas restricciones cuando se combina con otras caractersticas (como la imposibilidad de cifrar datos de FILESTREAM). Todo esto se describe con detalle en la seccin "Configurar SQL Server para FILESTREAM", ms adelante en estas notas del producto. Hay dos formas de obtener acceso a datos de FILESTREAM y manipularlos: con el modelo de programacin Transact-SQL estndar o mediante las API de transmisin por secuencias de Win32. Ambos mecanismos reconocen totalmente las transacciones y admiten la mayora de las operaciones DML, incluidas la insercin, actualizacin, eliminacin y seleccin. Tambin se admiten datos de FILESTREAM para operaciones de mantenimiento como copia de seguridad, restauracin y comprobacin de coherencia. La principal excepcin es que no se admiten actualizaciones parciales de los datos de FILESTREAM. Cualquier actualizacin de un valor de datos de FILESTREAM se traduce en la creacin de una nueva copia del archivo de datos de FILESTREAM. El archivo anterior se quita de forma asincrnica, como se describe en la seccin "Configurar la recoleccin de elementos no utilizados de FILESTREAM", ms adelante en estas notas del producto. Acceso a datos BLOB mediante el modelo de programacin dual Despus de almacenar los datos en una columna FILESTREAM, se puede obtener acceso a ellos mediante transacciones Transact-SQL o a travs de las API de Win32. Esta seccin ofrece algunos detalles generales sobre los modelos de programacin y su uso. Acceso a Transact-SQL Con Transact-SQL, es posible insertar, actualizar y eliminar datos de FILESTREAM de la manera siguiente: Se pueden rellenar previamente campos de FILESTREAM mediante una operacin de insercin (con un valor vaco o un valor pequeo distinto de NULL). Sin embargo, las interfaces de Win32 constituyen una manera ms eficiente de transmitir por secuencias una gran cantidad de datos. Al actualizar datos de FILESTREAM, se modifican los datos BLOB subyacentes en el sistema de archivos. Cuando un campo FILESTREAM est establecido en NULL, se eliminan los datos BLOB asociados al campo. No se pueden usar actualizaciones fragmentadas de Transact-SQL implementadas como UPDATE.Write() para realizar actualizaciones parciales en los datos de FILESTREAM. Cuando se elimina una fila que contiene datos de FILESTREAM, o cuando se elimina o se trunca una tabla que contiene datos de FILESTREAM, tambin se eliminan los datos BLOB subyacentes del sistema de archivos. La eliminacin fsica real de los archivos de FILESTREAM es un proceso asincrnico en segundo plano, como se explica en la seccin "Configurar la recoleccin de elementos no utilizados de FILESTREAM", ms adelante en estas notas del producto.
6
Para obtener ms informacin y ejemplos del uso de Transact-SQL para obtener acceso a datos de FILESTREAM, vea el tema "Obtener acceso a datos FILESTREAM con Transact-SQL" (http://msdn.microsoft.com/es-es/library/cc645962.aspx) en los Libros en pantalla de SQL Server 2008. Acceso de transmisin por secuencias de Win32 Para permitir el acceso transaccional del sistema de archivos a los datos de FILESTREAM, una nueva funcin intrnseca, GET_FILESTREAM_TRANSACTION_CONTEXT(), proporciona el token que representa la transaccin actual a la que est asociada la sesin. Se debe haber iniciado la transaccin y no haberse confirmado ni revertido todava. Al obtener un token, la aplicacin enlaza las operaciones de transmisin por secuencias del sistema de archivos de FILESTREAM con una transaccin iniciada. La funcin devuelve NULL en caso de que se no haya iniciado explcitamente ninguna transaccin. Se debe obtener un token para poder obtener acceso a archivos de FILESTREAM. En FILESTREAM, el motor de base de datos controla el espacio de nombres del sistema de archivos fsico de BLOB. Una nueva funcin intrnseca, PathName, proporciona la ruta de acceso UNC lgica del BLOB correspondiente a cada campo de FILESTREAM de la tabla. La aplicacin usa esta ruta de acceso lgica para obtener el identificador de Win32 y actuar sobre los datos BLOB mediante las interfaces normales del sistema de archivos de Win32. La funcin devuelve NULL si el valor de la columna FILESTREAM es NULL. Por tanto, se debe crear previamente un archivo de FILESTREAM para poder obtener acceso a l en el nivel de Win32. Esto se hace como se ha descrito anteriormente. La compatibilidad con la transmisin por secuencias de Win32 funciona en el contexto de una transaccin de SQL Server. Despus de obtener un token de transaccin y un nombre de ruta de acceso, se emplea la API OpenSqlFilestream de Win32 para obtener un identificador de archivo de Win32. O bien, se puede usar la API administrada SqlFileStream. Despus, las interfaces de transmisin por secuencias de Win32, como ReadFile() y WriteFile(), pueden usar este identificador para obtener acceso al archivo y actualizarlo mediante el sistema de archivos. Una vez ms, tenga en cuenta que los archivos de FILESTREAM no se pueden eliminar directamente y no se puede cambiar su nombre con el sistema de archivos. De lo contrario, se perder la coherencia de nivel de vnculo entre la base de datos y el sistema de archivos (es decir, la base de datos resultar daada). El acceso del sistema de archivos de FILESTREAM modela una instruccin Transact-SQL mediante la apertura y el cierre de archivos. La instruccin se inicia cuando se abre un identificador de archivo y finaliza cuando se cierra el identificador. Por ejemplo, cuando se cierra un identificador de escritura, se desencadenan todos los posibles desencadenadores AFTER que estn registrados en la tabla como si se hubiera completado una instruccin UPDATE. Para obtener ms informacin y ejemplos del uso de las API de Win32 para obtener acceso a datos de FILESTREAM, vea el tema "Crear aplicaciones cliente para datos FILESTREAM" (http://msdn.microsoft.com/es-es/library/cc645940.aspx) en los Libros en pantalla de SQL Server 2008.
7
Semntica de transacciones Se deben cerrar todos los identificadores de archivo antes de que la transaccin se confirme o se revierta. Si se queda abierto un identificador cuando se confirma una transaccin, se produce un error en la confirmacin y todas las lecturas y escrituras adicionales del identificador provocan un error, como cabra esperar. Entonces se debe revertir la transaccin. Del mismo modo, si la base de datos o la instancia del motor de base de datos se cierra, se invalidan todos los identificadores abiertos. Siempre que se abre un archivo de FILESTREAM para una operacin de escritura, se crea un nuevo archivo de longitud cero y se escribe en l todo el valor de los datos actualizados de FILESTREAM. El archivo anterior se quita de forma asincrnica, como se describe en la seccin "Configurar la recoleccin de elementos no utilizados de FILESTREAM", ms adelante en estas notas del producto. Con FILESTREAM, el motor de base de datos asegura la durabilidad de la transaccin en la confirmacin de los datos BLOB de FILESTREAM que se modifican desde el acceso de transmisin por secuencias del sistema de archivos. Para ello se emplea el registro de FILESTREAM mencionado anteriormente y un vaciado explcito del contenido del archivo de FILESTREAM en el disco. Semntica de aislamiento La semntica de aislamiento se rige por los niveles de aislamiento de transaccin del motor de base de datos. Cuando se obtiene acceso a datos de FILESTREAM mediante las API de Win32, solo se admite el nivel de aislamiento de lectura confirmada. El acceso a Transact-SQL tambin permite los niveles de aislamiento de lectura repetible y serializable. Adems, mediante el acceso a Transact-SQL, se permiten lecturas de datos sucios en el nivel de aislamiento de lectura no confirmada, o la sugerencia de consulta NOLOCK, pero dicho acceso no mostrar las actualizaciones en curso de datos de FILESTREAM. Las operaciones de apertura de acceso al sistema de archivos no esperan ningn bloqueo. En su lugar, se produce un error inmediato de las operaciones de apertura si no pueden obtener acceso a los datos debido al aislamiento de transaccin. Se produce un error en las llamadas de API de transmisin por secuencias con ERROR_SHARING_VIOLATION si la operacin de apertura no puede continuar debido a la infraccin de aislamiento. Actualizaciones parciales Para permitir que se realicen actualizaciones parciales, la aplicacin puede emitir un control FS de dispositivo (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) para capturar el contenido anterior en el archivo al que hace referencia el identificador abierto. Tambin se puede hacer mediante la API administrada SqlFileStream con la marca ReadWrite. Esto desencadenar una copia del contenido anterior en el lado servidor, como se ha explicado anteriormente. Para mejorar el rendimiento de la aplicacin y evitar posibles tiempos de espera mientras trabaja con archivos muy grandes, debe usar E/S asincrnica. Si se emite el FSCTL una vez que se ha escrito en el identificador, se conservar la ltima operacin de escritura y se perdern las escrituras anteriores realizadas en el identificador. Para obtener ms informacin sobre las actualizaciones parciales, vea el tema "Realizar actualizaciones parciales de los datos FILESTREAM" (http://technet.microsoft.com/es-es/library/cc627407.aspx) en los Libros en pantalla de SQL Server 2008.
8
Escritura continua desde clientes remotos El acceso remoto del sistema de archivos a datos de FILESTREAM est habilitado a travs del protocolo Bloque de mensajes del servidor (SMB). Si el cliente es remoto, el almacenamiento en cach de las operaciones de escritura depende de las opciones especificadas y de la API usada. Por ejemplo, el valor predeterminado para las API de cdigo nativo es realizar una escritura continua, mientras que en las API administradas el valor predeterminado es usar el almacenamiento en bfer. Esta diferencia refleja los comentarios de los clientes sobre las distintas API y sus usos en las versiones CTP de vista previa de SQL Server 2008. Se recomienda que las aplicaciones que se ejecutan en clientes remotos consoliden las pequeas operaciones de escritura (mediante almacenamiento en bfer) para realizar menos operaciones de escritura con un tamao de datos mayor. Adems, si se emplea el almacenamiento en bfer, el cliente debe emitir un vaciado explcito antes de que se confirme la transaccin. No se admite la creacin de vistas asignadas a la memoria (E/S asignada a la memoria) usando un identificador FILESTREAM. Si se usa la asignacin en memoria para datos de FILESTREAM, el motor de base de datos no puede garantizar la coherencia y la durabilidad de los datos o la integridad de la base de datos. Cundo se debe usar FILESTREAM Aunque la tecnologa FILESTREAM cuenta con muchas caractersticas atractivas, quizs no sea la opcin ptima en todas las situaciones. Como se ha mencionado anteriormente, el tamao de los datos BLOB y los patrones de acceso son los factores ms importantes a la hora de decidir si los datos BLOB se deben almacenar totalmente dentro de la base de datos o mediante FILESTREAM. El tamao afecta a lo siguiente: Eficiencia del acceso a los datos BLOB mediante cualquier mecanismo de almacenamiento. Como se ha mencionado anteriormente, el acceso de transmisin por secuencias a datos BLOB grandes es ms eficiente con FILESTREAM, pero las actualizaciones parciales son (potencialmente mucho) ms lentas. Eficiencia de la copia de seguridad de los datos estructurados y BLOB combinados mediante cualquier mecanismo de almacenamiento. Una copia de seguridad que combine archivos de base de datos de SQL Server y un gran nmero de archivos de FILESTREAM ser ms lenta que una copia de seguridad exclusivamente de archivos de base de datos de SQL Server de un tamao total equivalente. Esto se debe a la sobrecarga adicional que supone realizar una copia de seguridad de cada archivo NTFS (una por cada valor de datos de FILESTREAM). Esta sobrecarga es ms evidente cuando los archivos de FILESTREAM son menores (ya que la sobrecarga de tiempo se convierte en un porcentaje mayor del tiempo total de copia de seguridad por MB de datos). A modo de ejemplo, el grfico siguiente muestra el rendimiento relativo de lecturas locales de diferentes tamaos de datos de BLOB mediante varbinary(max), FILESTREAM mediante Transact-SQL y FILESTREAM mediante NTFS. Se puede ver (en la lnea azul) que el acceso Win32 de los datos de FILESTREAM es varias veces ms rpido que el acceso a Transact-SQL de datos varbinary(max) a medida que el tamao de los datos aumenta. Tenga en cuenta que las medidas de rendimiento estn en megabits por segundo (Mbps).
9
Ilustracin 1: rendimiento de lectura de diferentes tamaos de BLOB Las cifras de NTFS incluyen el tiempo necesario para iniciar una transaccin, recuperar el nombre de la ruta de acceso y el contexto de la transaccin de SQL Server, y abrir un identificador de Win32 para los datos de FILESTREAM. Todas las pruebas se realizaron usando el mismo equipo con cuatro ncleos de procesador y un grupo de bferes activo de SQL Server. El otro factor que hay que tener en cuenta es si se puede escribir en el cliente o en el nivel intermedio (o si se puede modificar) para usar las API de transmisin por secuencias de Win32 y el acceso normal a SQL Server. Si no se puede, FILESTREAM no resultar adecuado, ya que el mximo rendimiento se obtiene cuando se usan las API de transmisin por secuencias de Win32. Configurar Windows para FILESTREAM Como ocurre con cualquier otra implementacin, antes de implementar una aplicacin que usa FILESTREAM es importante preparar el servidor Windows que hospedar la base de datos de SQL Server y los contenedores de datos de FILESTREAM asociados. En esta seccin se explica cmo configurar el hardware de almacenamiento y el sistema de archivos NTFS como preparacin para el uso de FILESTREAM. Despus se muestra cmo habilitar FILESTREAM en el nivel de Windows. Seleccin y configuracin de hardware Una de las causas ms frecuentes de una carga de trabajo con un rendimiento bajo es una configuracin de hardware inadecuada. A veces la causa es una memoria insuficiente, lo que conduce a "paginar excesivamente" el grupo de bferes de SQL Server, y en otras ocasiones es simplemente que el hardware de almacenamiento no tiene la capacidad de rendimiento de E/S que la carga de trabajo necesita. En el caso de las aplicaciones que usarn FILESTREAM para la transmisin por secuencias de alto rendimiento de datos BLOB mediante las API de Win32, la eleccin y la configuracin del hardware de almacenamiento son fundamentales.
10
En las prximas secciones se describen algunas prcticas recomendadas para la eleccin y el diseo del almacenamiento. Para obtener una explicacin ms detallada al respecto, vea las notas del producto de TechNet "Diseo del almacenamiento de la base de datos fsica" (http://www.microsoft.com/technet/ prodtechnol/sql/2005/physdbstor.mspx). Despus de realizar un diseo ptimo, es conveniente realizar pruebas de carga para validar la capacidad de rendimiento del subsistema de E/S. Esto se describe en detalle en el artculo de prcticas recomendadas de SQL Server en TechNet "Prcticas recomendadas de E/S antes de la implementacin" (http://www.microsoft.com/technet/prodtechnol/sql/bestpractice/ pdpliobp.mspx). Diseo del almacenamiento fsico Asegrese de tener en cuenta la carga de trabajo prevista en un contenedor de datos de FILESTREAM cuando decida dnde se debe colocar, as como las cargas de trabajo de los contenedores de datos o los archivos de SQL Server colocados. Puede que cada contenedor de datos de FILESTREAM necesite estar en su propio volumen, ya que el hecho de tener varios contenedores de datos con cargas de trabajo elevadas en un nico volumen puede producir contencin. Lo importante aqu es que si no se piensa en las cargas de trabajo implicadas, poner todo en un mismo volumen puede producir problemas de rendimiento. El grado de separacin necesario variar de un cliente a otro. Tambin es posible crear un esquema de tabla dentro de SQL Server que permita el equilibrio de carga de los datos de FILESTREAM entre varios volmenes. Esto se describe en la seccin "Equilibrio de carga de datos de FILESTREAM". Eleccin del nivel RAID Las ventajas de emplear la tecnologa RAID son ampliamente conocidas, y se ha escrito mucho sobre la eleccin de un nivel RAID adecuado para los requisitos de la aplicacin, por lo que estas notas del producto no intentarn repetir toda esa informacin. Las notas del producto "Diseo del almacenamiento de la base de datos fsica" mencionadas anteriormente incluyen una seccin excelente sobre los niveles RAID y la eleccin del nivel RAID. A continuacin se ofrece informacin general simple sobre los factores que hay que tener en cuenta. Los niveles RAID difieren de diversas maneras, especialmente en cuanto a rendimiento de lectura y escritura, resistencia a errores y costo. Por ejemplo, RAID 5 es relativamente econmico, puede controlar el error de solo una unidad de la matriz RAID y puede resultar inadecuado para cargas de trabajo con muchas escrituras. Por otra parte, RAID 10 proporciona un rendimiento excelente de lectura y escritura, y puede controlar errores en varias unidades (en funcin del grado de creacin de reflejo presente), pero es ms costoso, ya que al menos el 50 por ciento de las unidades de la matriz RAID son redundantes. Estos son los tres factores principales que influyen en la eleccin de un nivel RAID. El nivel RAID elegido puede ser diferente para el volumen en el que se almacenan todas las bases de datos de usuario, y puede ser distinto incluso entre el volumen que almacena los archivos de datos y el que almacena los archivos de registro para una sola base de datos. Si la carga de trabajo va a implicar transmisin por secuencias de alto rendimiento de datos de FILESTREAM, la eleccin inmediata puede ser que el volumen del contenedor de datos de FILESTREAM use el nivel RAID que proporciona el mayor rendimiento de lectura. Sin embargo, esto quizs no proporcione un alto grado de resistencia ante errores. Por otra parte, la eleccin inmediata puede ser usar el mismo nivel RAID que para los dems volmenes que almacenan los datos para la base de datos, pero esto quizs no proporcione los niveles de rendimiento que la carga de trabajo demanda.
11
En estas notas del producto, queremos destacar que se debe realizar una eleccin consciente del nivel RAID para los volmenes de contenedores de datos de FILESTREAM despus de evaluar las ventajas y las desventajas, no decidir basndose en un nico factor. Eleccin de la interfaz de unidad En las bases de datos tpicas que tienen datos BLOB, el tamao total de los datos BLOB puede ser muchas veces mayor que el tamao total de los datos estructurados. Al implementar una solucin que implica almacenar los datos de FILESTREAM en volmenes diferentes, quizs desee usar un almacenamiento ms barato para el volumen, como IDE o SATA (en lo sucesivo denominado simplemente "SATA"), en lugar de un almacenamiento SCSI ms costoso. Antes de tomar esta decisin, hay que entender las ventajas y desventajas que ello implica. Esta seccin proporciona informacin general de las distintas caractersticas de SCSI frente a IDE/SATA para que pueda tomar una decisin informada basndose en el rendimiento, la confiabilidad y el costo. Capacidad y rendimiento Las unidades SATA suelen tener ms capacidad que las unidades SCSI, pero tienen una velocidad de giro (RPM) menor que las unidades SCSI. Si bien hay algunas unidades SATA de 10.000 RPM, la mayora son de 5.400 o 7.200 RPM. Existen unidades SCSI de alto rendimiento de 10.000 y hasta 15.000 RPM. Aunque RPM puede ser una mtrica de comparacin til, las dos cifras que se deben usar realmente para realizar una comparacin son la latencia (el tiempo que transcurre hasta que el cabezal del disco se encuentra en la posicin adecuada sobre la superficie del disco) y las velocidades de transferencia medias (cuntos datos se puede transferir hacia y desde la superficie del disco por segundo). Tambin es importante que las unidades puedan procesar patrones complejos de E/S de forma eficiente. A la hora de elegir las unidades, asegrese de que las unidades SATA admitan Native Command Queue (NCQ) y las unidades SCSI admitan Command Tag Queue (CTQ), lo que les permite procesar varias E/S de disco intercaladas para lograr un mejor rendimiento. En resumen, las unidades SCSI suelen tener mejor latencia y velocidades de transferencia, por lo que proporcionarn mejor rendimiento de transmisin de datos, pero posiblemente a un costo mayor. Confiabilidad SQL Server emplea la ordenacin de escritura garantizada y la durabilidad para proporcionar confiabilidad y capacidad de recuperacin gracias a su mecanismo de registro de escritura previa. Para obtener ms informacin sobre estos requisitos de E/S, vea las notas del producto de TechNet "Conceptos bsicos de E/S de SQL Server" (http://www.microsoft.com/technet/prodtechnol/sql/2005/iobasics.mspx). En cuanto a confiabilidad, SCSI suele ser mejor que SATA porque admite de forma uniforme la escritura forzada de datos en el disco mientras que SATA no lo admite. Esto se consigue admitiendo la escritura continua, donde los datos que se van a escribir no se almacenan en memoria cach, o admitiendo el vaciado forzoso del contenido de la memoria cach en el disco. La falta de cualquiera de estos mecanismos puede afectar a la capacidad de recuperacin despus de un error de hardware, de software o de alimentacin. Todos los tipos de interfaces pueden admitir el intercambio en caliente para permitir reparaciones mientras se mantiene la disponibilidad. La caracterstica FILESTREAM se basa en dos garantas de ordenacin de escritura y durabilidad: Durabilidad de los datos en tiempo de confirmacin de la transaccin Registro de escritura previa para la creacin y eliminacin de archivos de FILESTREAM
12
Para lograr durabilidad de los datos, el controlador del sistema de archivos de FILESTREAM emite un vaciado explcito de los archivos que se han modificado antes de que se confirme una transaccin (los detalles del mecanismo quedan fuera del mbito de estas notas del producto). Esto garantiza que en caso de que se produzca un error de alimentacin, los discos que no tienen suficiente memoria cach alimentada por batera no perdern los datos de FILESTREAM confirmados pero sin vaciar. Si las unidades SATA no admiten una operacin de vaciado forzado, se puede ver afectada la capacidad de recuperacin y se pueden perder datos. El registro de escritura previa se basa en la coherencia de los metadatos NTFS. Esto por s solo depende de la confiabilidad de las unidades subyacentes. No hay ningn problema con SCSI, pero si las unidades SATA no admiten el vaciado forzado, se pueden perder algunos cambios en los metadatos NTFS si se produce una situacin de error de alimentacin. Esto puede dar lugar a varios escenarios: NTFS no puede recuperarse y el volumen no se puede montar (es decir, el contenedor de datos de FILESTREAM est bsicamente sin conexin). NTFS se recupera pero los cambios de los metadatos NTFS se pierden y SQL Server no puede revertir una transaccin sin confirmar que realiza una insercin de datos de FILESTREAM (es decir, los datos de FILESTREAM se "pierden"). NTFS se recupera pero los cambios de los metadatos NTFS se pierden y SQL Server no puede revertir una transaccin sin confirmar que realiza una eliminacin de datos de FILESTREAM (es decir, los datos de FILESTREAM se pierden). Hay que destacar que estos tres escenarios no son peores que si los datos BLOB se almacenaran fuera de la base de datos en un volumen NTFS con unidades SATA subyacentes que no admitieran el almacenamiento forzado de datos en el disco. El uso de FILESTREAM en un volumen con unidades SATA subyacentes en este caso es realmente mejor que almacenar los datos BLOB en archivos NTFS sin formato en el mismo volumen, ya que la coherencia del nivel de vnculo de FILESTREAM proporciona un mecanismo para detectar cundo se han producido esos "daos" (mediante la ejecucin de DBCC CHECKDB en la base de datos). En resumen, los datos de FILESTREAM se pueden almacenar de forma confiable en volmenes con almacenamiento SATA subyacente, siempre y cuando las unidades SATA admitan el almacenamiento forzado de datos en el disco mediante el vaciado de la memoria cach. Configuracin de NTFS Incluso el subsistema de E/S mejor diseado, cuando se ejecuta en hardware de alto rendimiento, puede que no funcione de la manera deseada si el sistema de archivos (en este caso, NTFS) no est configurado correctamente. En esta seccin se describen algunas de las opciones de configuracin que pueden afectar a una carga de trabajo en la que participan datos de FILESTREAM. Para obtener informacin general ms completa sobre NTFS, vea los artculos de TechNet Library "Referencia tcnica de NTFS" (http://technet.microsoft.com/es-es/library/cc758691.aspx) y "Trabajar con sistemas de archivos" (http://technet.microsoft.com/es-es/library/bb457112.aspx).
13
Optimizar el rendimiento de NTFS De forma predeterminada, NTFS no est configurado para controlar una carga de trabajo de alto rendimiento con decenas de miles de archivos en un directorio individual del sistema de archivos (es decir, el escenario de FILESTREAM). Hay dos opciones de NTFS que es necesario configurar para facilitar el rendimiento de FILESTREAM. Es especialmente importante establecer estas opciones correctamente antes de iniciar cualquier simulacin de rendimiento; de lo contrario, los resultados no sern representativos del rendimiento real de FILESTREAM. La primera opcin de configuracin consiste en deshabilitar la generacin de nombres 8.3 cuando se crean nuevos archivos (o se cambian de nombre). Este proceso genera un nombre secundario para cada archivo que solo sirve por compatibilidad con versiones anteriores para las aplicaciones de 16 bits. El algoritmo genera un nuevo nombre 8.3 y despus tiene que examinar todos los nombres de archivo con formato 8.3 existentes en el directorio para asegurarse de que el nuevo nombre es nico. A medida que el nmero de archivos del directorio aumenta (normalmente por encima de 300.000), este proceso lleva cada vez ms tiempo. El tiempo necesario para crear un archivo aumenta y el rendimiento disminuye, por lo que desactivar este proceso puede mejorar considerablemente el rendimiento. Para desactivar este proceso, escriba lo siguiente en un smbolo del sistema y reinicie el equipo: fsutil behavior set disable8dot3 1 Nota: esta opcin deshabilita la generacin de nombres 8.3 en todos los volmenes NTFS del servidor. Si hay aplicaciones de 16 bits que usan algunos volmenes, pueden experimentar problemas despus de cambiar este comportamiento. La segunda opcin que hay que desactivar es la actualizacin de la hora de ltimo acceso a un archivo cuando se obtiene acceso al mismo. Si la carga de trabajo tiene acceso brevemente a muchos archivos, se dedica una cantidad de tiempo desproporcionada actualizando simplemente la hora de ltimo acceso de cada archivo. Al desactivar esta opcin tambin aumenta considerablemente el rendimiento. Para desactivar este proceso, escriba lo siguiente en un smbolo del sistema y reinicie el equipo: fsutil behavior set disablelastaccess 1 Tamao de clster Todos los sistemas de archivos de Windows tienen el concepto de "clster", que es la unidad de asignacin cuando se asigna espacio en disco. Como un clster es la menor cantidad de espacio en disco que se puede asignar, si un archivo es muy pequeo, parte del clster puede quedar sin utilizar (se desperdicia). Por tanto, el tamao de clster suele ser bastante reducido para que los archivos pequeos no desaprovechen espacio en disco. Los archivos grandes pueden tener asignados muchos clsteres o los archivos pueden crecer con el tiempo y asignrseles clsteres a medida que crecen. Si un archivo crece mucho, pero en fragmentos pequeos, es probable que los clsteres asignados no sean contiguos en el disco (es decir, sean "fragmentos"). Esto significa que cuanto menores sean los clsteres y cuanto ms crezca un archivo, ms "fragmentado" estar. Por tanto, el tamao de clster es un compromiso entre desaprovechar espacio en disco y reducir la fragmentacin. Puede encontrar informacin ms detallada sobre los diversos tamaos de clster de los sistemas de archivos de Windows en el artculo de Knowledge Base "Tamao de clster predeterminado para FAT y NTFS" (http://support.microsoft.com/kb/140365).
14
La recomendacin para usar FILESTREAM es que las unidades individuales de datos BLOB tengan un tamao de 1 MB o superior. Si es as, se recomienda que el tamao de clster de NTFS para el volumen del contenedor de datos de FILESTREAM se establezca en 64 kB para reducir la fragmentacin. Se debe hacer manualmente porque el valor predeterminado para los volmenes NTFS de hasta 2 terabytes (TB) es de 4 kB. Para ello se usa la opcin /A del comando format. Por ejemplo, escriba lo siguiente en un smbolo del sistema: format F: /FS:NTFS /V:MyFILESTREAMContainer /A:64K Este valor se debe combinar con tamaos de bfer grandes, como se describe en la seccin "Consideraciones sobre la optimizacin del rendimiento y las simulaciones", ms adelante en estas notas del producto. Administrar la fragmentacin Como se ha descrito anteriormente, cuando muchos archivos de un volumen crecen, se fragmentan. Esto significa que la coleccin de clsteres asignados al archivo no es contigua. Cuando el archivo se lee secuencialmente, los cabezales del disco necesitan leer todos los clsteres en orden, lo que puede significar que tienen que leer partes diferentes del disco. Aunque los archivos no crezcan una vez creados, si se crearon en un volumen en el que el espacio disponible no est en un nico fragmento contiguo, se pueden fragmentar inmediatamente, ya que los clsteres necesarios para alojarlos no estn disponibles de forma contigua. Esta fragmentacin hace que el rendimiento de lectura secuencial sea menor que cuando no hay fragmentacin (o cuando hay poca). El problema es muy similar al de la fragmentacin de ndices dentro de una base de datos que disminuye el rendimiento del recorrido de intervalos de consulta. Por tanto, es esencial quitar peridicamente la fragmentacin mediante una herramienta de desfragmentacin de disco para mantener el rendimiento de lectura secuencial. Adems, si el volumen que se va a usar para hospedar el contenedor de datos de FILESTREAM se us previamente, o si todava contiene otros datos, se debe comprobar el nivel de fragmentacin y corregir en caso de que sea necesario. Compresin Los datos almacenados en NTFS se pueden comprimir para ahorrar espacio en disco, pero a costa de un uso adicional de la CPU para comprimir y descomprimir los datos cuando se escriben o se leen, respectivamente. La compresin tampoco es til si los datos no se pueden comprimir. Por ejemplo, los datos aleatorios, los datos cifrados o los datos que ya se han comprimido no se comprimen bien, pero aun as se deben seguir pasando por el algoritmo de compresin de NTFS, lo que produce una sobrecarga de la CPU. Por estos motivos, solo tiene sentido habilitar la compresin cuando los datos se puedan comprimir mucho y cuando la CPU adicional necesaria no haga que disminuya el rendimiento de la carga de trabajo. Tambin hay que tener en cuenta que la compresin solo se pueden habilitar cuando el tamao de clster de NTFS es 4.096 bytes o menos. La compresin se puede habilitar en el volumen del contenedor de datos de FILESTREAM cuando se formatea, mediante la opcin /C del comando format. Por ejemplo: format F: /FS:NTFS /V:MyFILESTREAMContainer /A:4096 /C
15
Tambin se puede habilitar la compresin en un volumen existente siguiendo estos pasos: 1. En Mi PC o en el Explorador de Windows, haga clic con el botn secundario en el volumen que desee comprimir o descomprimir. 2. Haga clic en Propiedades para ver el cuadro de dilogo Propiedades. 3. En la pestaa General, active o desactive la casilla Comprimir contenido para ahorrar espacio en disco y haga clic en Aceptar. 4. En el cuadro de dilogo Confirmar cambios de atributos, seleccione si desea que la compresin se aplique a todo el volumen o solo a la carpeta raz. Esto se muestra en la ilustracin siguiente.
Ilustracin 2: comprimir un volumen existente mediante el Explorador de Windows
16
Administracin del espacio Si bien es posible colocar varios contenedores de datos de FILESTREAM en un nico volumen NTFS, hay motivos para tener una asignacin 1:1 entre los contenedores de datos y los volmenes NTFS. Aparte de la posible contencin dependiente de la carga de trabajo, no hay ninguna manera de administrar el uso del espacio del contenedor de datos de FILESTREAM desde dentro de SQL Server, por lo que hay que usar cuotas de disco de NTFS si es necesario. El seguimiento de las cuotas de disco se realiza por usuario y por volumen, por lo que si se tienen varios contenedores de datos de FILESTREAM en un nico volumen resulta difcil saber qu contenedor de datos usa ms espacio en disco. Todos los archivos de FILESTREAM se crearn bajo la cuenta de servicio de SQL Server. Si se cambia esto, el espacio en disco empezar a cargarse a la nueva cuenta de servicio. Hay un nico controlador del filtro del sistema de archivos de FILESTREAM para cada volumen NTFS que tiene un contenedor de datos de FILESTREAM, y tambin hay uno para cada versin de SQL Server que tiene un contenedor de datos de FILESTREAM en el volumen. Cada controlador del filtro es responsable de administrar todos los contenedores de datos de FILESTREAM de ese volumen, para todas las instancias que usan una versin especfica de SQL Server. Por ejemplo, un volumen NTFS que hospeda tres contenedores de datos de FILESTREAM, uno para cada una de tres instancias de SQL Server 2008, solo tendr un controlador del filtro del sistema de archivos de FILESTREAM de SQL Server 2008. Seguridad Existen dos requisitos de seguridad para usar la caracterstica FILESTREAM. En primer lugar, se debe configurar SQL Server para la seguridad integrada. En segundo lugar, si se va a usar acceso remoto, se debe habilitar el puerto SMB (445) a travs de cualquier sistema de firewall. Esto tambin es necesario para el acceso normal a recursos compartidos remotos. Para obtener ms informacin, vea el artculo de Knowledge Base "Informacin general de los servicios y los requisitos de puerto de red para Windows Server System" (http://support.microsoft.com/kb/832017). Consideraciones sobre software antivirus El software antivirus es ubicuo en el entorno de hoy en da. FILESTREAM no puede impedir que el software antivirus examine los archivos del contenedor de datos de FILESTREAM (esto creara problemas de seguridad). El software normalmente tiene una configuracin de directiva sobre lo que se debe hacer con un archivo sospechoso de estar contaminado con un virus: eliminar el archivo o restringir el acceso al mismo (lo que se conoce como poner el archivo en "cuarentena"). En ambos casos, se impedir el acceso a los datos BLOB del archivo afectado y SQL Server pensar que el archivo se ha eliminado. Se recomienda que configure el software antivirus para que ponga en cuarentena los archivos, no para que los elimine. Se puede usar DBCC CHECKDB dentro de SQL Server para averiguar qu archivos parecen faltar y el administrador de Windows puede correlacionar los nombres de archivo con el registro del software antivirus y realizar la accin necesaria.
17
Habilitar FILESTREAM en Windows FILESTREAM es una caracterstica hbrida que requiere que tanto el administrador de Windows como el administrador de SQL Server realicen algunas acciones antes de que se habilite la caracterstica. Esto es necesario para mantener la separacin de tareas entre los dos administradores, especialmente si el administrador de SQL Server no es tambin el administrador de Windows. Al habilitar FILESTREAM en el nivel de Windows se instala un controlador del filtro del sistema de archivos, que es algo para lo que solo un administrador de Windows tiene privilegios. En el nivel de Windows, FILESTREAM se habilita durante la instalacin de SQL Server 2008 o mediante la ejecucin del Administrador de configuracin de SQL Server. He aqu los pasos que hay que seguir: 1. En el men Inicio, seleccione Todos los programas, seleccione Microsoft SQL Server 2008, seleccione Herramientas de configuracin y, a continuacin, haga clic en Administrador de configuracin de SQL Server. 2. En la lista de servicios, haga clic con el botn secundario en Servicios de SQL Server y, a continuacin, haga clic en Abrir. 3. En el complemento Administrador de configuracin de SQL Server, busque la instancia de SQL Server en la que desee habilitar FILESTREAM. 4. Haga clic con el botn secundario en la instancia y, a continuacin, haga clic en Propiedades. 5. En el cuadro de dilogo Propiedades de SQL Server, haga clic en la pestaa FILESTREAM. 6. Active la casilla Habilitar FILESTREAM para acceso a Transact-SQL. 7. Si desea leer y escribir datos de FILESTREAM desde Windows, haga clic en Habilitar FILESTREAM para el acceso de transmisin por secuencias de E/S de archivos. Escriba el nombre del recurso compartido de Windows en el cuadro Nombre de recurso compartido de Windows. 8. Si los clientes remotos deben tener acceso a los datos de FILESTREAM que estn almacenados en este recurso compartido, seleccione Permitir que los clientes remotos tengan acceso de transmisin por secuencias a los datos de FILESTREAM. 9. Haga clic en Aplicar. En la ilustracin siguiente se muestra la pestaa FILESTREAM como se describe en el procedimiento.
18
Ilustracin 3: configurar FILESTREAM mediante el Administrador de configuracin de SQL Server Este procedimiento debe realizarse para cada instancia de SQL Server que vaya a usar la caracterstica FILESTREAM antes de que la pueda usar SQL Server. No hay ningn especificacin del contenedor de datos de FILESTREAM en esta fase; esto se realiza cuando se crea un grupo de archivos de FILESTREAM en una base de datos despus de que se haya habilitado FILESTREAM dentro de SQL Server. Tenga en cuenta que es posible deshabilitar el acceso de FILESTREAM en el nivel de Windows incluso aunque SQL Server lo haya habilitado. En ese caso, despus de reiniciar la instancia de SQL Server, todos los datos de FILESTREAM no estarn disponibles. Se mostrar la advertencia siguiente.
Ilustracin 4: advertencia que se muestra al deshabilitar FILESTREAM con el Administrador de configuracin de SQL Server
19
Configurar SQL Server para FILESTREAM Cada instancia de SQL Server que vaya a usar la caracterstica FILESTREAM se debe configurar por separado, tanto en el nivel de Windows como en el de SQL Server. Despus de habilitar FILESTREAM, se debe configurar una base de datos para almacenar datos de FILESTREAM y solo entonces se pueden definir las tablas que incluyen columnas FILESTREAM. En esta seccin se describe cmo configurar FILESTREAM en el nivel de SQL Server y cmo crear bases de datos y tablas habilitadas para FILESTREAM, y se explica la interaccin de FILESTREAM con otras caractersticas de SQL Server 2008. Consideraciones sobre la seguridad FILESTREAM requiere el uso de seguridad integrada (es decir, autenticacin de Windows). Cuando una aplicacin que usa Win32 intenta obtener acceso a datos de FILESTREAM, el usuario de Windows se valida mediante SQL Server. Si el usuario tiene acceso de Transact-SQL a los datos de FILESTREAM, el acceso se conceder tambin en el nivel de Win32, siempre y cuando el token de transaccin se obtenga en el contexto de seguridad del usuario de Windows que est abriendo el archivo. El requisito de la autenticacin de Windows procede de la naturaleza de las API de E/S de archivos de Windows. La nica manera de pasar la identidad del cliente desde la aplicacin cliente a SQL Server durante una operacin de E/S de archivos es usar el token de Windows asociado al subproceso del cliente. Cuando se crea el contenedor de datos de FILESTREAM, se protege automticamente de forma que solo la cuenta de servicio de SQL Server y los miembros del grupo BUILTIN/Administradores puedan obtener acceso al rbol de directorios del contenedor de datos. Hay que tener cuidado de que el contenido del contenedor de datos nunca cambie excepto mediante mtodos transaccionales admitidos, ya que el cambio mediante otros mtodos har que el contenedor resulte daado. Habilitar FILESTREAM en SQL Server El segundo paso para habilitar FILESTREAM se realiza dentro de la instancia de SQL Server 2008. No se debe hacer hasta que FILESTREAM se haya habilitado en el nivel de Windows y el volumen NTFS que almacenar los datos de FILESTREAM se haya preparado correctamente (como se ha descrito en la seccin "Configurar Windows para FILESTREAM" anteriormente). El acceso a FILESTREAM se controla dentro de SQL Server mediante sp_configure para establecer la opcin de configuracin filestream_access_level en uno de tres valores posibles. Los valores posibles son: 0: deshabilitar la compatibilidad de FILESTREAM con esta instancia 1: habilitar FILESTREAM para el acceso a Transact-SQL solamente 2: habilitar FILESTREAM para el acceso a Transact-SQL y de transmisin por secuencias de Win32 En el ejemplo siguiente se muestra cmo habilitar FILESTREAM para el acceso a Transact-SQL y de transmisin por secuencias de Win32.
EXEC sp_configure filestream_access_level, 2; GO RECONFIGURE; GO
20
La instruccin RECONFIGURE es necesaria para que el valor recin configurado surta efecto. Tenga en cuenta que si FILESTREAM no se ha habilitado en el nivel de Windows, no se habilitar en el nivel de SQL Server cuando se ejecute el cdigo anterior. El valor configurado actual se puede averiguar mediante el cdigo siguiente.
EXEC sp_configure filestream_access_level; GO
Si FILESTREAM no est configurado en el nivel de Windows, el "config_value" (valor de configuracin) del resultado de sp_configure ser diferente (es decir, 0) del "run_value" (valor de ejecucin) despus de haberse ejecutado la instruccin RECONFIGURE. Crear una base de datos habilitada para FILESTREAM Una vez que FILESTREAM est habilitado en los niveles de Windows y SQL Server, se puede definir un contenedor de datos de FILESTREAM. Para ello se define un grupo de archivos de FILESTREAM en una base de datos. Hay una asignacin 1:1 entre los grupos de archivos de FILESTREAM y los contenedores de datos de FILESTREAM. Un grupo de archivos de FILESTREAM se puede definir cuando se crea una base de datos o se puede crear por separado mediante una instruccin ALTER DATABASE. En el ejemplo siguiente se crea un grupo de archivos de FILESTREAM en una base de datos existente.
ALTER DATABASE Production ADD FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM; GO
La clusula CONTAINS FILESTREAM es necesaria para diferenciar el nuevo grupo de archivos de los grupos de archivos normales de la base de datos. Si la caracterstica FILESTREAM est deshabilitada, esta instruccin producir el error siguiente.
Mensaje 5591, nivel 16, estado 3, lnea 1 La caracterstica FILESTREAM est deshabilitada.
21
Suponiendo que FILESTREAM est habilitado en los niveles de Windows y de SQL Server, se crear el grupo de archivos. En este momento, el contenedor de datos de FILESTREAM se define agregando un nico archivo al grupo de archivos. El nombre de la ruta de acceso especificado es el nombre de la ruta de acceso del directorio que se crear como raz del contenedor de datos. El nombre completo de la ruta de acceso hasta el nombre del directorio final, sin incluirlo, debe existir ya. En el ejemplo siguiente se define el contenedor de datos para el grupo de archivos FileStreamGroup1 creado anteriormente.
ALTER DATABASE Production ADD FILE ( NAME = FSGroup1File, FILENAME = 'F:\Production\FSDATA') TO FILEGROUP FileStreamGroup1; GO
Ahora se crear el directorio FSDATA. Solo contendr dos elementos: El archivo filestream.hdr. Son los metadatos de FILESTREAM para el contenedor de datos. El directorio $FSLOG. Es el equivalente en FILESTREAM del registro de transacciones de una base de datos. Hay que tener en cuenta que una base de datos puede tener varios grupos de archivos de FILESTREAM. Esto puede resultar til para separar el almacenamiento de BLOB para varias tablas de la base de datos. Crear una tabla para almacenar datos de FILESTREAM Una vez que la base de datos tiene un grupo de archivos de FILESTREAM, se pueden crear tablas que contengan columnas FILESTREAM. Como se ha mencionado anteriormente, una columna FILESTREAM se define como una columna varbinary(max) que tiene el atributo FILESTREAM. En el cdigo siguiente se crea una tabla con una sola columna FILESTREAM.
USE Production; GO CREATE TABLE DocumentStore ( DocumentID INT IDENTITY PRIMARY KEY, Document VARBINARY (MAX) FILESTREAM NULL, DocGUID UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL UNIQUE DEFAULT NEWID ())
22
FILESTREAM_ON FileStreamGroup1; GO
Una tabla puede tener varias columnas FILESTREAM, pero los datos de todas las columnas FILESTREAM de una tabla deben almacenarse en el mismo grupo de archivos de FILESTREAM. Si no se especifica la clusula FILESTREAM_ON, se usar el grupo de archivos de FILESTREAM que est configurado como el predeterminado. Esto podra no ser la configuracin deseada y producir problemas de rendimiento. Una vez creada la tabla, el contenedor de datos de FILESTREAM contendr otro directorio, correspondiente a la tabla, con un subdirectorio que corresponde a la columna FILESTREAM de la tabla. Este subdirectorio contendr los archivos de datos una vez introducidos los datos en la tabla. La estructura de directorios variar segn el nmero de columnas FILESTREAM que tenga una tabla y si la tabla est particionada o no. Tenga en cuenta que para que una tabla tenga una o varias columnas FILESTREAM, debe tener tambin una columna del tipo de datos uniqueidentifier con el atributo ROWGUIDCOL. Esta columna no debe permitir valores NULL y debe tener una restriccin de columna nica UNIQUE o PRIMARY KEY . El valor GUID de la columna lo suministrar una aplicacin al insertar datos o una restriccin DEFAULT que use la funcin NEWID() (o NEWSEQUENTIALID() si se ha configurado la replicacin de mezcla, como se indica en la seccin "Combinaciones de caractersticas y restricciones" ms adelante). Para obtener ms informacin sobre los detalles y las restricciones del esquema de tabla y las opciones necesarias, vea el tema "CREATE TABLE (Transact-SQL)" (http://msdn.microsoft.com/es-es/library/ ms174979.aspx) en los Libros pantalla de SQL Server 2008. Configurar la recoleccin de elementos no utilizados de FILESTREAM Los archivos de datos de FILESTREAM del contenedor de datos de FILESTREAM no se pueden actualizar parcialmente. Esto significa que cualquier cambio realizado en los datos BLOB de la columna FILESTREAM crear un archivo de datos de FILESTREAM nuevo. El archivo "anterior" se conservar hasta que ya no sea necesario para recuperar la base de datos. Los archivos que representan datos de FILESTREAM eliminados, o inserciones revertidas de datos de FILESTREAM, se conservan de manera similar. El proceso de recoleccin de elementos no utilizados quita los archivos que ya no se necesitan. Este proceso es automtico, a diferencia de lo que ocurre en Windows SharePoint Services, donde la recoleccin de elementos no utilizados se debe implementar manualmente en el almacn externo de BLOB. A todas las operaciones de archivos de FILESTREAM se les asigna un nmero de secuencia de registro (LSN) en el registro de transacciones de la base de datos. Siempre y cuando el registro de transacciones se trunque ms all del LSN de la operacin de FILESTREAM, el archivo ya no ser necesario y puede ser objeto de la recoleccin de elementos no utilizados. Por tanto, todo lo que pueda evitar el truncamiento del registro de transacciones tambin puede impedir la eliminacin fsica de un archivo de FILESTREAM. He aqu algunos ejemplos: No se han realizado copias de seguridad de registros en el modelo de recuperacin FULL o BULK_LOGGED. Hay una transaccin activa de ejecucin prolongada. El trabajo del lector del registro de replicacin no se ha ejecutado.
23
La recoleccin de elementos no utilizados de FILESTREAM es una tarea en segundo plano desencadenada por el proceso de punto de comprobacin de la base de datos. Se ejecuta automticamente un punto de comprobacin cuando se ha generado una cantidad suficiente de registros de transacciones. Para obtener ms informacin, vea el tema "Puntos de comprobacin de base de datos (SQL Server)" (http://msdn.microsoft.com/es-es/library/ms189573.aspx) en los Libros en pantalla de SQL Server 2008. Puesto que las operaciones de archivos de FILESTREAM se graban mnimamente en el registro de transacciones de la base de datos, puede pasar bastante tiempo hasta que el nmero de entradas del registro de transacciones generadas desencadene un proceso de punto de comprobacin y se produzca la recoleccin de elementos no utilizados. Si esto supone algn problema, puede forzar la recoleccin de elementos no utilizados mediante la instruccin CHECKPOINT. Consideraciones sobre la creacin de particiones Si la tabla que contiene datos de FILESTREAM tiene particiones, la clusula FILESTREAM_ON debe especificar un esquema de particin para los grupos de archivos de FILESTREAM basado en la funcin de particin de la tabla. Esto es necesario porque el esquema de particin normal implicar los grupos de archivos normales que no se pueden usar para almacenar datos de FILESTREAM. La definicin de la tabla (en una instruccin CREATE TABLE o CREATE CLUSTERED INDEXWITH DROP_EXISTING) especifica despus ambos esquemas de particin. El esquema de particin de FILESTREAM puede especificar que todas las particiones se asignen a un nico grupo de archivos, pero no se recomienda porque puede causar problemas de rendimiento. En el ejemplo siguiente se muestra esta sintaxis.
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
CREATE PARTITION SCHEME DocFSPartScheme AS PARTITION DocPartFunction TO (FS_FG1, FS_FG2, FS_FG3); GO
CREATE TABLE DocumentStore (
24
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 la columna DocumentID como columna de particin, el ndice no clster subyacente que aplica la restriccin UNIQUE en el DocGUID se debe colocar explcitamente en un grupo de archivos para que la columna DocumentID puede ser la columna de particin. Esto significa que el cambio de particin solo es posible si se deshabilitan las restricciones UNIQUE antes de realizar el cambio de particin, ya que son ndices no alineados y, a continuacin, se vuelven a habilitar. Continuando con el ejemplo anterior, en el cdigo siguiente se crea una tabla y despus se intenta un cambio de particin.
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
Se produce un error en el cambio de particin y se genera el mensaje siguiente. Mensaje 7733, nivel 16, estado 4, lnea 1 Error de la instruccin 'ALTER TABLE SWITCH'. La tabla 'FileStreamTestDB.dbo.DocumentStore' tiene particiones, mientras que el ndice 'UQ_Document_8CC1617F60ED59' no las tiene.
25
Al deshabilitar el ndice nico en la tabla de origen e intentarlo de nuevo se obtiene el cdigo siguiente.
ALTER INDEX [UQ__Document__8CC331617F60ED59] ON DocumentStore DISABLE; GO
ALTER TABLE FileStreamTest3 SWITCH PARTITION 2 TO NonPartitionedFileStreamTest3; GO
Esto tambin produce un error y se muestra el mensaje siguiente. Mensaje 4947, Nivel 16, Estado 1, Lnea 1 Error de la instruccin ALTER TABLE SWITCH. El ndice de la tabla de origen 'FileStreamTestDB.dbo.DocumentStore' no es idntico al ndice 'UQ_NonParti_8CC3316103317E3D' de la tabla de destino 'FileStreamTestDB.dbo.NonPartitionedDocumentStore'. Se deben deshabilitar los ndices nicos de las tablas con particiones y sin particiones antes de que el modificador pueda continuar.
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); ALTER INDEX [UQ__Document__8CC331617F60ED59] ON NonPartitionedDocumentStore REBUILD WITH (ONLINE = ON); GO
26
Se incluir ms informacin sobre la creacin de particiones de datos de FILESTREAM en unas notas del producto futuras sobre la creacin de particiones en SQL Server 2008. Equilibrio de carga de datos de FILESTREAM Tambin se puede usar la creacin de particiones para crear un esquema de tabla que permita el equilibrio de carga de los datos de FILESTREAM entre varios volmenes. Puede resultar conveniente por diversas razones como limitaciones del hardware o para permitir el almacenamiento de zonas activas de una tabla en volmenes diferentes. En el cdigo siguiente se muestra una funcin y un esquema de particin segn la columna uniqueidentifier que reparte eficazmente los datos de FILESTREAM en 16 volmenes y crea bandas de los datos estructurados en dos grupos de archivos.
-- Crear una funcin de particin basada en los 6 ltimos bytes del GUID
28
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
-- Crear un esquema de particin de FILESTREAM que permita la asignacin a 16 grupos de archivos de FILESTREAM CREATE PARTITION SCHEME LoadBalance_FS_PS AS PARTITION LoadBalance_PF TO ( FSFileGroup0, FSFileGroup1, FSFileGroup2, FSFileGroup3, FSFileGroup4, FSFileGroup5, FSFileGroup6, FSFileGroup7, FSFileGroup8, FSFileGroup9, FSFileGroupA, FSFileGroupB, FSFileGroupC, FSFileGroupD, FSFileGroupE, FSFileGroupF); GO
29
-- Crear un esquema de particin de datos para aplicar la tcnica round-robin entre dos grupos de archivos 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
-- Crear la tabla con particiones 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
El equilibrio de carga se puede probar fcilmente mediante el cdigo siguiente.
SET NOCOUNT ON; GO
30
-- Insertar 10000 filas para probar el equilibrio de carga DECLARE @count INT = 0; WHILE (@count < 10000) BEGIN INSERT INTO DocumentStore DEFAULT VALUES; SET @count = @count + 1; END; GO
-- Comprobar la distribucin SELECT COUNT ($PARTITION.LoadBalance_PF (DocGUID)) FROM DocumentStore GROUP BY $PARTITION.LoadBalance_PF (DocGUID); GO
Los resultados de una ejecucin de ejemplo de esta prueba fueron de 631, 641, 661, 640, 649, 637, 618, 618, 576, 608, 595, 645, 640, 616, 602 y 623 filas en cada uno de los grupos de archivos de FILESTREAM FS_FG0 a FS_FGF. Combinaciones de caractersticas y restricciones Puesto que la caracterstica FILESTREAM almacena datos dentro del sistema de archivos, hay algunas restricciones y consideraciones sobre la combinacin de FILESTREAM con otras caractersticas de SQL Server. Esta seccin proporciona informacin general sobre las combinaciones de caractersticas que debe conocer. Para obtener ms informacin, vea el tema "Compatibilidad de FILESTREAM con otras caractersticas de SQL Server" (http://msdn.microsoft.com/es-es/library/bb895334.aspx) en los Libros en pantalla de SQL Server 2008. Replicacin Tanto la replicacin transaccional como la replicacin de mezcla admiten datos de FILESTREAM, pero hay que tener en cuenta muchos aspectos como los siguientes: Cuando la topologa de replicacin incluye instancias que usan versiones diferentes de SQL Server, existen limitaciones en cuanto al tamao de los datos que se pueden enviar a instancias de nivel inferior. Las opciones de filtro de replicacin determinan si el atributo FILESTREAM se replica o no mediante replicacin transaccional.
31
El tamao del valor mximo de datos varbinary(max) que se puede replicar en la replicacin transaccional sin replicar el atributo FILESTREAM es 2 GB. Cuando se usa la replicacin de mezcla, tanto ella como FILESTREAM necesitan una columna uniqueidentifier. Hay que tener cuidado con el esquema de la tabla cuando se usa la replicacin de mezcla para que los GUID sean secuenciales (es decir, use NEWSEQUENTIALID() en lugar de NEWID()). Creacin de reflejo de la base de datos La creacin de reflejo de la base de datos no admite FILESTREAM. No se puede crear un grupo de archivos FILESTREAM en el servidor principal. La creacin de reflejo de la base de datos no se puede configurar para una base de datos que contiene grupos de archivos de FILESTREAM. Cifrado Los datos de FILESTREAM no se pueden cifrar mediante los mtodos de cifrado de SQL Server. Si el cifrado de datos transparente est habilitado, los datos de FILESTREAM no se cifran. Clsteres de conmutacin por error FILESTREAM se admite totalmente con clsteres de conmutacin por error. Todos los nodos del clster deben tener habilitado FILESTREAM en el nivel de Windows y los contenedores de datos de FILESTREAM se deben colocar en almacenamiento compartido para que los datos estn disponibles en todos los nodos. Para obtener ms informacin, vea en los Libros en pantalla de SQL Server 2008 el tema: "Configurar FILESTREAM en un clster de conmutacin por error" (http://msdn.microsoft.com/es-es/library/cc645886.aspx). Texto completo La indizacin de texto completo funciona con una columna FILESTREAM exactamente igual que con una columna varbinary(max). La tabla debe tener una columna adicional que contenga la extensin de nombre de archivo para los datos BLOB que se almacenan en la columna FILESTREAM. Instantneas de base de datos SQL Server no admite instantneas de base de datos para los contenedores de datos de FILESTREAM. Si se incluye un archivo de datos de FILESTREAM en una clusula CREATE DATABASE ON, se producir un error en la instruccin y se generar el mensaje correspondiente. Si una base de datos contiene datos de FILESTREAM, todava se puede crear una instantnea de base de datos de los grupos de archivos normales. En este caso, se devolver un mensaje de advertencia y los grupos de archivos de FILESTREAM se marcarn como sin conexin en la instantnea de base de datos. Las consultas funcionarn de la manera esperada en la instantnea de base de datos a menos que intenten obtener acceso a los datos de FILESTREAM. Si esto ocurre, se producir un error. Una base de datos que contiene datos FILESTREAM no se puede revertir a una instantnea, ya que no hay ninguna manera de saber en qu estado estaban los datos de FILESTREAM en el momento representado por la instantnea de base de datos. Vistas, ndices, estadsticas, desencadenadores y restricciones Las columnas FILESTREAM no pueden formar parte de una clave de ndice ni especificarse como una columna INCLUDE en un ndice no clster. Es posible definir una columna calculada que haga referencia a una columna FILESTREAM, pero la columna calculada no se puede indizar.
32
No se pueden crear estadsticas de columnas FILESTREAM. No se pueden crear restricciones PRIMARY KEY, FOREIGN KEY y UNIQUE en columnas FILESTREAM. Las vistas indizadas no pueden contener columnas FILESTREAM; sin embargo, las vistas no indizadas s pueden contenerlas. No se pueden definir desencadenadores INSTEAD OF en tablas que contienen columnas FILESTREAM. Niveles de aislamiento Cuando se obtiene acceso a datos de FILESTREAM mediante las API de Win32, solo se admite el nivel de aislamiento de lectura confirmada. El acceso a Transact-SQL tambin permite los niveles de aislamiento de lectura repetible y serializable. Adems, mediante el acceso a Transact-SQL, se permiten lecturas de datos sucios en el nivel de aislamiento de lectura no confirmada, o la sugerencia de consulta NOLOCK, pero dicho acceso no mostrar las actualizaciones en curso de datos de FILESTREAM. Copias de seguridad y restauracin FILESTREAM funciona con todos los modelos de recuperacin y todas las formas de copias de seguridad y restauracin (completa, diferencial y de registros). En una situacin de desastre, si se especifica la opcin CONTINUE_AFTER_ERROR en una opcin BACKUP o RESTORE, los datos de FILESTREAM pueden no recuperarse sin prdida de datos (similar a la recuperacin de datos normales cuando se especifica CONTINUE_AFTER_ERROR). Seguridad La instancia de SQL Server debe estar configurada para usar seguridad integrada si se necesita el acceso de Win32 a los datos de FILESTREAM. Trasvase de registros El trasvase de registros admite FILESTREAM. Los servidores principal y secundario deben ejecutar SQL Server 2008, o una versin posterior, y deben tener habilitado FILESTREAM en el nivel de Windows. SQL Server Express SQL Server Express admite FILESTREAM. El lmite de tamao de base de datos de 4 GB no incluye el contenedor de datos de FILESTREAM. Sin embargo, si se envan datos de FILESTREAM hacia o desde la instancia de SQL Server Express mediante Service Broker, hay que tener cuidado porque Service Broker no admite el almacenamiento de datos como FILESTREAM en las colas de transmisin ni de destino. Esto significa que si se forma una cola, se puede alcanzar el lmite de tamao de base de datos de 4 GB. En este caso, una alternativa consiste en usar un esquema donde la conversacin de Service Broker enve las notificaciones que los datos de FILESTREAM deben enviar o recibir. A continuacin, la transmisin real de los datos de FILESTREAM se realiza mediante acceso remoto a travs del recurso compartido de FILESTREAM del contenedor de datos de FILESTREAM de la instancia de SQL Server Express.
33
Consideraciones sobre la optimizacin del rendimiento y las simulaciones Hay varias consideraciones importantes a la hora de optimizar una carga de trabajo de FILESTREAM: Asegrese de que el hardware est configurado correctamente para FILESTREAM. Asegrese de que la generacin de nombres 8.3 est deshabilitada en NTFS. Asegrese de que el seguimiento de la ltima hora de acceso est deshabilitado en NTFS. Asegrese de que el contenedor de datos de FILESTREAM no se encuentre en un volumen fragmentado. Asegrese de que el tamao de datos BLOB sea adecuado para el almacenamiento con FILESTREAM. Asegrese de que los contenedores de datos de FILESTREAM tengan sus propios volmenes dedicados. Un factor importante que hay que destacar es el tamao de bfer usado por el protocolo SMB que se emplea para almacenar en bfer las lecturas de datos de FILESTREAM. En las pruebas con el sistema operativo Windows Server 2003, los tamaos de bfer mayores suelen lograr un mejor rendimiento, con tamaos de bfer de un mltiplo de aproximadamente 60 kB. Los tamaos de bfer mayores pueden ser ms eficientes en otros sistemas operativos. Hay otras consideraciones adicionales cuando se compara una carga de trabajo de FILESTREAM con otras opciones de almacenamiento (una vez optimizada la carga de trabajo de FILESTREAM): Asegrese de que el hardware de almacenamiento y el nivel RAID sean los mismos en ambos casos. Asegrese de que la configuracin de compresin del volumen sea la misma en ambos casos. Tenga en cuenta si FILESTREAM va a realizar escritura continua segn la API en uso y las opciones especificadas. Consideraciones sobre la migracin de datos Un escenario habitual con SQL Server 2008 ser la migracin de datos BLOB existentes al almacenamiento de FILESTREAM. Si bien proporcionar una herramienta completa o un conjunto de cdigo para realizar esas migraciones queda fuera del mbito de estas notas del producto, a continuacin se muestra un flujo de trabajo simple que se puede seguir: Revisar las consideraciones de tamao de datos para usar FILESTREAM con el fin de asegurarse de que los tamaos de datos promedio implicados son tales que el almacenamiento de FILESTREAM resulta adecuado. Revisar la informacin disponible sobre las combinaciones de caractersticas y las limitaciones para asegurarse de que el almacenamiento de FILESTREAM funcionar con todos los dems requisitos de la aplicacin. Seguir las recomendaciones de la seccin "Consideraciones sobre la optimizacin del rendimiento y las simulaciones" anterior. Asegurarse de que la instancia de SQL Server usa seguridad integrada y que FILESTREAM se ha habilitado en los niveles de Windows y SQL Server. Asegurarse de que la ubicacin del contenedor de datos de FILESTREAM de destino tiene suficiente espacio en disco para almacenar los datos BLOB migrados. Crear los grupos de archivos de FILESTREAM necesarios.
34
Duplicar los esquemas de tabla implicados, cambiando las columnas BLOB necesarias para que sean FILESTREAM. Migrar al nuevo esquema todos los datos que no sean BLOB. Migrar todos los datos BLOB a las nuevas columnas FILESTREAM. Prcticas recomendadas para el uso de FILESTREAM Esta seccin es una coleccin de prcticas recomendadas que han surgido del uso de FILESTREAM durante las pruebas internas y pblicas de la versin preliminar de la caracterstica. Como ocurre con todas las prcticas recomendadas, se trata de generalizaciones y quizs no sean aplicables a todas las situaciones y todos los escenarios. Las prcticas recomendadas son las siguientes, sin ningn orden concreto: Se deben evitar varias anexiones pequeas un archivo de FILESTREAM siempre que sea posible, ya que cada anexin crea un archivo de FILESTREAM nuevo. Esto puede ser muy costoso en el caso de archivos de FILESTREAM grandes. Si es posible, se deben agrupar varias anexiones en una sola columna varbinary(max) y despus anexarlas a la columna FILESTREAM cuando se alcance un umbral de tamao. En el caso de una carga de trabajo con muchas escrituras multiproceso, considere la posibilidad de configurar el parmetro AllocationSize para las API OpenSqlFilestream o SqlFilestream. Unos tamaos de asignacin iniciales mayores limitarn la posibilidad de fragmentacin en el nivel del sistema de archivos, especialmente cuando se combinan con un tamao de clster NTFS grande como se ha descrito anteriormente. Si los archivos de FILESTREAM son grandes, evite actualizaciones de Transact-SQL que anexen o antepongan datos a un archivo. Esto (normalmente) pondr en cola datos en tempdb y de nuevo en un nuevo archivo fsico, lo que afectar al rendimiento. Cuando se lea un valor de FILESTREAM, tenga en cuenta lo siguiente: o Si las lecturas solo necesitan leer los primeros bytes, use la funcionalidad de subcadena. o Si se va a leer todo el archivo, use el acceso de Win32. o Si se van a leer partes aleatorias del archivo, abra el identificador de archivo mediante SetFilePointer. o Cuando se lea un archivo completo, especifique la marca FILE_SEQUENTIAL_ONLY. o Use bferes cuyo tamao sea mltiplos de 60 kB (como se ha descrito anteriormente). El tamao de un archivo de FILESTREAM se puede obtener sin necesidad de abrir un identificador para el archivo: agregue una columna calculada persistente a la tabla que almacena el tamao de archivo de FILESTREAM. La columna calculada se actualiza mientras el archivo ya est abierto para operaciones de escritura. Conclusin En estas notas del producto se ha descrito la caracterstica FILESTREAM de SQL Server 2008 que permite el almacenamiento y el acceso eficiente a datos BLOB mediante una combinacin de SQL Server 2008 y el sistema de archivos NTFS. Para concluir, merece la pena reiterar los puntos principales destacados en este documento.
35
El almacenamiento de FILESTREAM no resulta adecuado en todos los casos. Segn estudios anteriores y el comportamiento de la caracterstica FILESTREAM, es mejor almacenar como datos FILESTREAM los datos BLOB con un tamao de 1 MB o ms a los que no se va a obtener acceso mediante Transact-SQL. Tambin hay que tener en cuenta la carga de trabajo de actualizacin, ya que cualquier actualizacin parcial de un archivo de FILESTREAM generar una copia completa del archivo. Con una carga de trabajo en la que haya muchas actualizaciones, el rendimiento puede disminuir tanto que FILESTREAM no resulte adecuado. Se deben estudiar los detalles de las combinaciones de caractersticas para asegurarse de que la implementacin se realiza correctamente. Por ejemplo, en SQL Server 2008 RTM, la creacin de reflejo de la base de datos no puede usar datos de FILESTREAM ni aislamiento de instantnea. Se admiten la mayora de las dems combinaciones de caractersticas, pero algunas pueden tener ciertas limitaciones (como la replicacin). Estas notas del producto no proporcionan una taxonoma exhaustiva de las caractersticas y su interaccin, por lo que se deben consultar las secciones ms recientes de los Libros en pantalla de SQL Server antes de la implementacin, especialmente porque es posible que algunas limitaciones aumenten en futuras versiones. Por ltimo, si FILESTREAM se implementa sin configurar correctamente Windows y SQL Server, quizs no se alcancen los niveles de rendimiento previstos. Se deben usar las prcticas recomendadas y los detalles de configuracin descritos anteriormente como ayuda para evitar problemas de rendimiento.
Para obtener ms informacin: http://www.microsoft.com/sqlserver/: Sitio web de SQL Server http://technet.microsoft.com/es-es/sqlserver/: SQL Server TechCenter http://msdn.microsoft.com/es-es/sqlserver/: Centro para desarrolladores de SQL Server
Le sirvi de ayuda este documento? Proporcinenos su opinin. Dganos, en una escala de 1 (poco til) a 5 (excelente), cmo calificara este documento y por qu lo valora con esta puntuacin. Por ejemplo: Lo valora alto debido a que tiene buenos ejemplos, capturas de pantalla excelentes, una redaccin comprensible u otra razn? Lo valora bajo debido a que sus ejemplos son escasos, las capturas de pantalla son borrosas o su redaccin es poco clara? Esta informacin nos ayudar a mejorar la calidad de las notas del producto que publicamos. Enviar comentarios.