Compartir a través de


FILESTREAM (SQL Server)

FILESTREAM permite que las aplicaciones basadas en SQL Server almacenen datos no estructurados, como documentos e imágenes, en el sistema de archivos. Las aplicaciones pueden aprovechar las API de streaming enriquecidas y el rendimiento del sistema de archivos y, al mismo tiempo, mantener la coherencia transaccional entre los datos no estructurados y los datos estructurados correspondientes.

FILESTREAM integra el motor de base de datos de SQL Server con un sistema de archivos NTFS almacenando varbinary(max) datos de objetos binarios grandes (BLOB) como archivos en el sistema de archivos. Las instrucciones Transact-SQL pueden insertar, actualizar, consultar, buscar y realizar copias de seguridad de los datos de FILESTREAM. Las interfaces del sistema de archivos Win32 proporcionan acceso de streaming a los datos.

FILESTREAM usa la caché del sistema NT para almacenar en caché los datos de los archivos. Esto ayuda a reducir cualquier efecto que puedan tener los datos FILESTREAM en el rendimiento del motor de base de datos. No se usa el grupo de búferes de SQL Server; por lo tanto, esta memoria está disponible para el procesamiento de consultas.

FILESTREAM no se habilita automáticamente al instalar o actualizar SQL Server. Debe habilitar FILESTREAM mediante el Administrador de configuración de SQL Server y SQL Server Management Studio. Para usar FILESTREAM, debe crear o modificar una base de datos para que contenga un tipo especial de grupo de archivos. A continuación, cree o modifique una tabla para que contenga una varbinary(max) columna con el atributo FILESTREAM. Después de completar estas tareas, puedes usar Transact-SQL y Win32 para administrar los datos de FILESTREAM.

Para obtener más información sobre cómo instalar y usar FILESTREAM, vea la lista de tareas relacionadas.

Cuándo usar FILESTREAM

En SQL Server, los BLOB pueden ser datos estándar varbinary(max) que almacenan los datos en tablas o objetos FILESTREAM varbinary(max) que almacenan los datos en el sistema de archivos. El tamaño y el uso de los datos determina si debe usar el almacenamiento de base de datos o el almacenamiento del sistema de archivos. Si se cumplen las condiciones siguientes, considere la posibilidad de usar FILESTREAM:

  • Los objetos que se almacenan son, en promedio, de más de 1 MB.

  • El acceso rápido para la lectura es importante.

  • Está desarrollando aplicaciones que usan un nivel intermedio para la lógica de la aplicación.

En el caso de objetos más pequeños, el almacenamiento varbinary(max) de blobs en la base de datos suele proporcionar un mejor rendimiento de streaming.

Almacenamiento de FILESTREAM

El almacenamiento FILESTREAM se implementa como una varbinary(max) columna en la que los datos se almacenan como BLOB en el sistema de archivos. Los tamaños de los BLOB solo están limitados por el tamaño de volumen del sistema de archivos. La limitación estándar varbinary(max) de tamaños de archivo de 2 GB no se aplica a blobs almacenados en el sistema de archivos.

Para especificar que una columna debe almacenar datos en el sistema de archivos, especifique el atributo FILESTREAM en una varbinary(max) columna. Esto hace que el motor de base de datos almacene todos los datos de esa columna en el sistema de archivos, pero no en el archivo de base de datos.

Los datos FILESTREAM deben almacenarse en grupos de archivos FILESTREAM. Un grupo de archivos FILESTREAM es un grupo de archivos especial que contiene directorios del sistema de archivos en lugar de los propios archivos. Estos directorios del sistema de archivos se denominan contenedores de datos. Los contenedores de datos son la interfaz entre el almacenamiento del motor de base de datos y el almacenamiento del sistema de archivos.

Al usar el almacenamiento FILESTREAM, tenga en cuenta lo siguiente:

  • Cuando una tabla contiene una columna FILESTREAM, cada fila debe tener un identificador de fila único no null.

  • Se pueden agregar varios contenedores de datos a un grupo de archivos FILESTREAM.

  • Los contenedores de datos FILESTREAM no se pueden anidar.

  • Cuando usas clústeres de conmutación por error, los grupos de archivos FILESTREAM deben ubicarse en recursos de disco compartidos.

  • Los grupos de archivos FILESTREAM pueden estar en volúmenes comprimidos.

Administración integrada

Dado que FILESTREAM se implementa como una varbinary(max) columna e integrada directamente en el motor de base de datos, la mayoría de las funciones y herramientas de administración de SQL Server funcionan sin modificaciones para los datos FILESTREAM. Por ejemplo, puede usar todos los modelos de copia de seguridad y recuperación con datos FILESTREAM y se realiza una copia de seguridad de los datos FILESTREAM con los datos estructurados de la base de datos. Si no desea realizar una copia de seguridad de datos FILESTREAM con datos relacionales, puede usar una copia de seguridad parcial para excluir grupos de archivos FILESTREAM.

Seguridad integrada

En SQL Server, los datos FILESTREAM se protegen igual que otros datos: al conceder permisos en los niveles de tabla o columna. Si un usuario tiene permiso para la columna FILESTREAM de una tabla, el usuario puede abrir los archivos asociados.

Nota:

El cifrado no se admite en los datos FILESTREAM.

Solo a la cuenta en la que se ejecuta la cuenta de servicio de SQL Server se le conceden permisos NTFS al contenedor FILESTREAM. Se recomienda que no se conceda ningún otro permiso a ninguna otra cuenta en el contenedor de datos.

Nota:

Los inicios de sesión de SQL no funcionarán con contenedores FILESTREAM. Solo la autenticación NTFS funcionará con contenedores FILESTREAM.

Acceso a datos BLOB con Transact-SQL y acceso de transmisión del sistema de archivos

Después de almacenar datos en una columna FILESTREAM, puede acceder a los archivos mediante transacciones Transact-SQL o mediante las APIs de Win32.

acceso a Transact-SQL

Mediante Transact-SQL, puede insertar, actualizar y eliminar datos FILESTREAM:

  • Puede usar una operación de inserción para rellenar previamente un campo FILESTREAM con un valor NULL, un valor vacío o datos en línea relativamente cortos. Sin embargo, una gran cantidad de datos se transmite de forma más eficaz a un archivo que usa interfaces Win32.

  • Al actualizar un campo FILESTREAM, modifica los datos de BLOB subyacentes en el sistema de archivos. Cuando un campo FILESTREAM está establecido en NULL, se eliminan los datos de BLOB asociados al campo. No puede usar una actualización fragmentada de Transact-SQL, implementada como UPDATE**.**Write() para realizar actualizaciones parciales de los datos.

  • Al eliminar una fila o eliminar o truncar una tabla que contiene datos FILESTREAM, se eliminan los datos BLOB subyacentes en el sistema de archivos.

Acceso de streaming del sistema de archivos

El soporte de Streaming Win32 se utiliza en el contexto de una transacción de SQL Server. Dentro de una transacción, puede usar funciones FILESTREAM para obtener una ruta de acceso lógica del sistema de archivos UNC de un archivo. A continuación, use la API OpenSqlFilestream para obtener un identificador de archivo. A continuación, las interfaces de streaming de archivos Win32 pueden usar este identificador, como ReadFile() y WriteFile(), para acceder y actualizar el archivo mediante el sistema de archivos.

Dado que las operaciones de archivo son transaccionales, no puede eliminar ni cambiar el nombre de los archivos FILESTREAM a través del sistema de archivos.

Modelo de declaración

El sistema de archivos FILESTREAM modela una instrucción Transact-SQL mediante abrir y cerrar archivos. La instrucción 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, cualquier desencadenador AFTER posible registrado en la tabla se activa como si se completara una instrucción UPDATE.

Espacio de nombres de almacenamiento

En FILESTREAM, el motor de base de datos controla el espacio de nombres del sistema de archivos físico BLOB. Una nueva función intrínseca, PathName, proporciona la ruta de acceso UNC lógica del BLOB que corresponde a cada celda FILESTREAM de la tabla. La aplicación usa esta ruta de acceso lógica para obtener el identificador win32 y operar en los datos BLOB mediante interfaces normales del sistema de archivos Win32. La función devuelve NULL si el valor de la columna FILESTREAM es NULL.

Acceso transaccional al sistema de archivos

Una nueva función intrínseca, GET_FILESTREAM_TRANSACTION_CONTEXT() proporciona el token que representa la transacción actual a la que está asociada la sesión. La transacción debe haberse iniciado y aún no haber sido anulada ni confirmada. Al obtener un token, la aplicación enlaza las operaciones de streaming del sistema de archivos FILESTREAM con una transacción iniciada. La función devuelve NULL en caso de que no se inicie explícitamente ninguna transacción.

Todos los manejadores de archivos deben cerrarse antes de que la transacción se confirme o se cancele. Si un identificador se deja abierto más allá del ámbito de transacción, las lecturas adicionales del identificador provocarán un error; las escrituras adicionales en el identificador se realizarán correctamente, pero los datos reales no se escribirán en el disco. Del mismo modo, si se cierra la base de datos o la instancia del motor de base de datos, se invalidan todos los handles abiertos.

Durabilidad transaccional

Con FILESTREAM, tras la confirmación de la transacción, el Motor de Base de Datos garantiza la durabilidad de la transacción para los datos BLOB de FILESTREAM que se han modificado mediante el acceso secuencial del sistema de archivos.

Semántica de aislamiento

La semántica de aislamiento se rige por los niveles de aislamiento de transacciones del motor de base de datos. El nivel de aislamiento de lectura confirmada es compatible con Transact-SQL y el acceso al sistema de archivos. Se admiten operaciones de lectura repetibles y también aislamientos serializables y de instantáneas. No se admite la lectura sucia.

Las operaciones abiertas de acceso al sistema de archivos no esperan ningún bloqueo. En su lugar, las operaciones en curso fallan inmediatamente si no pueden acceder a los datos debido al aislamiento de las transacciones. Las llamadas api de streaming producen un error con ERROR_SHARING_VIOLATION si la operación abierta no puede continuar debido a una infracción de aislamiento.

Para permitir que se realicen actualizaciones parciales, la aplicación puede emitir un control FS de dispositivo (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) para recuperar el contenido antiguo en el archivo al que hace referencia el manejador abierto. Esto desencadenará una copia de contenido anterior del lado servidor. Para mejorar el rendimiento de las aplicaciones y evitar que se agote el tiempo de espera potencial cuando se trabaja con archivos muy grandes, se recomienda usar E/S asincrónica.

Si el FSCTL se emite después de escribir el identificador, la última operación de escritura persistirá y se perderán las escrituras anteriores realizadas en el identificador.

API del sistema de archivos y niveles de aislamiento admitidos

Cuando una API del sistema de archivos no puede abrir un archivo debido a una infracción de aislamiento, se devuelve una excepción de ERROR_SHARING_VIOLATION. Esta infracción de aislamiento se produce cuando dos transacciones intentan acceder al mismo archivo. El resultado de la operación de acceso depende del modo en el que se abrió el archivo y de la versión de SQL Server en la que se ejecuta la transacción. En la tabla siguiente se describen los resultados posiblemente para dos transacciones que acceden al mismo archivo.

Transacción 1 Transacción 2 Resultado en SQL Server 2008 Resultado en SQL Server 2008 R2 y versiones posteriores
Abrir para leer. Abrir para leer. Ambos tienen éxito. Ambos tienen éxito.
Abrir para leer. Abra para escribir. Ambos tienen éxito. Las operaciones de escritura en la transacción 2 no afectan a las operaciones de lectura realizadas en la transacción 1. Ambos tienen éxito. Las operaciones de escritura en la transacción 2 no afectan a las operaciones de lectura realizadas en la transacción 1.
Abra para escribir. Abrir para leer. Se produce un error al abrir para la transacción 2 con una excepción de ERROR_SHARING_VIOLATION. Ambos tienen éxito.
Abra para escribir. Abra para escribir. Se produce un error al abrir para la transacción 2 con una excepción de ERROR_SHARING_VIOLATION. Se produce un error al intentar abrir la transacción 2 con una excepción ERROR_SHARING_VIOLATION.
Abrir para leer. Abra para SELECT. Ambos tienen éxito. Ambos tienen éxito.
Abrir para leer. Abra para actualizar o eliminar. Ambos tienen éxito. Las operaciones de escritura en la transacción 2 no afectan a las operaciones de lectura realizadas en la transacción 1. Ambos tienen éxito. Las operaciones de escritura en la transacción 2 no afectan a las operaciones de lectura realizadas en la transacción 1.
Abra para escribir. abra para SELECT. La transacción 2 se bloquea hasta que la transacción 1 se confirma o finaliza, o se agota el tiempo de espera del bloqueo de transacción. Ambos tienen éxito.
Abrir para escribir. Abra para ACTUALIZAR o ELIMINAR. La transacción 2 se bloquea hasta que la transacción 1 se confirma o finaliza, o el bloqueo de transacción expira. La transacción 2 se bloquea hasta que la transacción 1 se confirme o termine, o el tiempo de espera del bloqueo de la transacción se agote.
Abra para SELECT. Abierto para lectura. Ambos tienen éxito. Ambos tienen éxito.
Abra para SELECT. Abra para escribir. Ambos tienen éxito. Las operaciones de escritura en la transacción 2 no afectan a la transacción 1. Ambos tienen éxito. Las operaciones de escritura en la transacción 2 no afectan a la transacción 1.
Abra para actualizar o eliminar. Abierto para lectura. La operación de apertura en la transacción 2 falla con una excepción ERROR_SHARING_VIOLATION. Ambos tienen éxito.
Abierto para actualización o eliminación. Abra para escribir. La operación de apertura en la transacción 2 falla debido a una excepción de ERROR_SHARING_VIOLATION. La operación de apertura en la transacción 2 falla con una excepción de ERROR_SHARING_VIOLATION.
Disponible para SELECT con lectura repetible. Abrir para leer. Ambos tienen éxito. Ambos tienen éxito.
Abra para SELECT con lectura repetible. Abierto para escribir Se produce un error en la operación de apertura en la transacción 2 con una excepción de ERROR_SHARING_VIOLATION. La operación de apertura en la transacción 2 falla con una excepción de ERROR_SHARING_VIOLATION.

Write-Through desde clientes remotos

El acceso remoto del sistema de archivos a los datos FILESTREAM está habilitado a través del protocolo Bloque de mensajes del servidor (SMB). Si el cliente es remoto, el lado cliente no almacena en caché ninguna operación de escritura. Las operaciones de escritura siempre se enviarán al servidor. Los datos se pueden almacenar en caché en el lado servidor. Se recomienda que las aplicaciones que se ejecutan en clientes remotos consoliden las operaciones de escritura pequeñas para hacer menos operaciones de escritura con un tamaño de datos mayor.

No se admite la creación de vistas asignadas a memoria (E/S asignadas a memoria) mediante un identificador FILESTREAM. Si se usa la asignación de memoria para los datos FILESTREAM, el motor de base de datos no puede garantizar la coherencia y durabilidad de los datos ni la integridad de la base de datos.

Tareas relacionadas

Habilitar y configurar FILESTREAM
Creación de una base de datos de FILESTREAM-Enabled
Crear una tabla para almacenar datos FILESTREAM
Acceso a datos FILESTREAM con Transact-SQL
Crear aplicaciones cliente para datos FILESTREAM
Acceso a datos FILESTREAM con OpenSqlFilestream
Realizar actualizaciones parciales en los datos FILESTREAM
Evitar conflictos con operaciones de base de datos en aplicaciones FILESTREAM
Mover una base de datos FILESTREAM-Enabled
Configurar FILESTREAM en un clúster de conmutación por error
Configuración de un firewall para el acceso a FILESTREAM

Contenido relacionado

Compatibilidad de FILESTREAM con otras características de SQL Server