Filestream Storage en Alta Disponibilidad

¡Que tal! Primer post del año. A cada uno de ustedes que llega por alguna u otra circunstancia, les deseo un año lleno de felicidad y desafíos nuevos.

Hoy les compartiré un torpedo sobre las posibilidades de alta disponibilidad de Filestream Storage. Para que sepan, no se pueden configurar todas las posibilidades de HA que tiene SQL Server cuando se trabaja con filestream storage.

Las posibilidades son:

  • Mirroring:  NO
  • Log Shipping: SI
  • Failover Cluster: SI *
  • Replication; SI
  • Database Snapshot: NO
  • Avalilability Groups: SI **

*: Los filegroups correspondientes que soportan a filestream, deben estar en un volumen compartido en el cluster.

**: Completamente soportado sin fallas desde el reléase del service pack 1 (mas info: http://dangerousdba.blogspot.com.br/2012/07/filetable-with-alwayson-ags-bug.html )

Más información sobre como trabajar con Filestream y otras características de SQL Server, pueden encontrarla aquí: http://technet.microsoft.com/en-us/library/bb895334.aspx

 

Exportar objetos de la base de datos a archivos de texto en SQL Server

Hola a todos. He estado medio flojo con el blog, pero ahora retomo la actividad. Mucho trabajo, mucho que estudiar y aprender y ahora he vuelto.

Les dejo este video tutorial recién salido del horno donde muestra como volcar los objetos de una base de datos hacia un archivo de texto plano.

¡Chau!

Informacion sobre los objetos de la base de datos en SQL Server

En SQL Server existe un procedimiento almacenado de sistema que permite entregar información sobre cualquier objeto que exista dentro de la base de datos. En Oracle y MySQL existe una instrucción similar  y se llama describe. En SQL Server (y creo que Sybase) se llama sp_help.

A este procedimiento almacenado se le puede o no pasar un parámetro y de esto dependerá del resultado que necesitamos tener. Por ejemplo, si le entregamos como parámentro un tipo de datos, entregará la información del tipo de datos. Si no le pasamos un parámetro, obtendremos una visión general de todos los objetos de la base de datos. Si le entregamos el nombre de una tabla como parámetro, entregará la información de las columnas y así. Obviamente, le podemos pasar como parámetro el nombre de un procedimiento almacenado.

Es más, en base a esto último, podemos ver la información de sp_help:

Informacion procedimiento almacenado sp_help
Informacion procedimiento almacenado sp_help

Es demasiada la información que nos entrega, por eso les dejo el link a la documentación oficial:

http://msdn.microsoft.com/es-es/library/ms187335.aspx

 

Habilitar el acceso remoto a SQL Server 2012

En una organización puede que sea un requerimiento que el servidor esté aislado o puede que no. En el caso que se requiera que se habiliten las conexiones remotas, tenemos que seguir una serie de pasos, ya sean en orden o no.

Permitir las conexiones remotas en la instancia
Abrir SQL Server Management Studio e ir a las propiedades del servidor (botón secundario en el nombre del servidor -> Propiedades). En la ventana de propiedades, ir a las propiedades de conexión y habilitar la opción «Allow remote connections to this server», tal cual como sale en la imagen:

Propiedades de conexion del servidor

Ahora abrimos SQL Server Configuration Manager y verificar que el protocolo TCP/IP para la instancia se encuentre habilitado:

Propiedades de TCP/IP

En la misma ventana, abrimos las propiedades del protocolo TCP/IP y vemos que puerto está utilizando:

Habitualmente utiliza el puerto 1433.

Crear regla en el firewall

Abrimos el firewall de Windows y creamos la siguiente regla:

En esta parte hay que definir el perfil de la regla. En mi caso, quiero que el servidor esté disponible para acceder desde todo el dominio.

Nombre de la regla. Tiene que ser algo descriptivo. Luego finalizamos el asistente.

Para probar la conexión, desde SQL Server Management Studio (idealmente instalado en otro equipo de la organización)  intentamos conectarnos al servidor remoto:

Desde el servidor SQL3 intenté conectarme al SQL1 y todo resultó tal como lo configuré:

Ahora que funciona, ¡A Jugar!

Hablemos sobre Filestream en SQL Server

En una base de datos podemos almacenar datos estructurados y datos no estructurados. Los datos estructurados corresponden a los que están fuertemente tipados. Por ejemplo, los que se almacenan del tipo int, float, etc. En cambio, tenemos los no estructurados que se almacenan como objetos, usualmente llamados blob (Binary Large OBject).

Todos los motores de bases de datos tienen la capacidad de  almacenar binarios, pero SQL Server ofrece una funcionalidad (incluida en la versión 2008) llamada Filestream  que permite almacenar los objetos binarios directamente en el sistema de archivos, pero transparente para el usuario. Por lo que se pueden seguir ejecutando transacciones sobre estos registrosm esto permite un acceso más rápido a dicha información, y adicionalmente, permite poder liberar de carga de memoria a SQL Server, ya que para el acceso a datos FILESTREAM podría no utilizarse el Buffer Pool.

Para habilitar Filestream en la instancia de SQL Server (si es que no se activó en la instalación) se debe abrir  SQL Server Configuration Manager, ir a SQL Server  Services  (Yo lo tengo en Inglés) y abrir las propiedades de la instancia. En las ventana de propiedades, ir a la pestaña de Filestream y veremos algo así:

 

Configuracion de Filestream
Configuracion de Filestream

Una vez de que la característica esta activada, aceptamos, aplicamos y reiniciamos el servicio. Abrimos el Management Studio, seleccionamos la base de datos en la cual queremos activar Filestream y escribimos lo siguiente:

EXEC sp_configure filestream_access_level, 2

RECONFIGURE

Para poder empezar a usar filestream es necesario crear un filegroup que contenga el atributo CONTAINS FILESTREAM. Para eso, utilizaremos este código:

ALTER DATABASE MiDB
ADD FILEGROUP MiDB_filegroup_filestream CONTAINS FILESTREAM
GO
ALTER DATABASE MiDB
ADD FILE
(
NAME= ‘MiDB_filestream’,
FILENAME = ‘C:dbfs’
)
TO FILEGROUP MiDB_filegroup_filestream
GO

Es importante que el directorio c:db esté creado. El directorio fs dentro de C:db lo creará SQL Server. Para crear la tabla que «almacenará» nuestro objeto, es necesario que una columna sea del tipo VARBINARY(MAX).

create table fs
(
id uniqueidentifier rowguidcol not null unique,
archvo varbinary(max) filestream null
)

Con la tabla ya creada, ya es posible guardar algo. Por ejemplo:

–Declarar la variable del ID
DECLARE @ID UNIQUEIDENTIFIER
–Genera un valor unico
SET @ID = NEWID()
–Inserta un blob en la base de datos. En este caso, es un video. OJO Pijo que hace un cast a la ruta del archivo.
INSERT INTO dbo.fs
(ID, archvo)
VALUES
(@ID, CAST(‘E:Windows Server 2008 R2Wildlife.wmv’ AS VARBINARY(MAX)))
–Selecciona el registro recien creado y muestra su ruta
SELECT ID, archvo
FROM dbo.fs
WHERE ID = @ID
SELECT archvo.PathName()
FROM dbo.fs
WHERE ID = @ID

Y nos debiera dar un resultado mas o menos así:

Resultado de Insercion de datos con Filestream

Mas informacion:
http://technet.microsoft.com/es-es/library/cc645923.aspx
http://www.mssqltips.com/sqlservertip/1489/using-filestream-to-store-blobs-in-the-ntfs-file-system-in-sql-server-2008/
http://www.guillesql.es/Articulos/Almacenamiento_FILESTREAM_SQLServer.aspx

Feliz Pascua de Resurrección!

Compresión en SQL Server

Desde SQL Server 2008 es posible comprimir los datos a nivel de filas y páginas y respaldos. En este pequeño artículo hablaré sobre la compresión a nivel de filas. Para páginas y respaldos vendrán en otra entrega.

Compresión en Filas
La compresion de filas está recomendada cuando se tiene una alta carga de trabajo de escritura en disco. Es posible comprimir las filas en los siguientes escenarios:

  • Tablas con y sin indices agrupados y no agrupados
  • Vistas indexadas
  • Indices y tablas particionadas

Recomendaciones

  • Evaluar el ahorro que se genera con la compresion
  • No comprimir todos los elementos de la base de datos sin antes evaluar. Si es pequeño no es necesario comprimir. Considerar comprimir si el elemento es accesado pocas veces.

Código


--tamaño de tabla
exec sp_spaceused MiTabla
go
--compresion por fila
alter table MiTabla rebuild with(data_compression = row)
go
exec sp_spaceused MiTabla
go

Primero muestra el espacio utilizado por la tabla que vamos a comprimir, luego la comprime y al final muestra el espacio ocupado por la tabla ya comprimida para comparar.

Al realizar esta prueba, nos da el siguiente resultado sobre una tabla sin comprimir:

Tabla sin comprimir
Tabla sin comprimir

Pero al comprimir por fila la misma tabla, nos da el siguiente resultado:

Tabla comprimida
Tabla comprimida

Los números hablan solos.

 

Saludos!

 

Replicar tabla en SQL Server

Hola Gente, después de  un mes de desaparición total, he vuelto con la respuesta a una problemática que se da muchas veces.

El problema es el siguiente: Replicación de una tabla

Tenemos dos soluciones para esto:

Replicar solo la estructura

SELECT * INTO TablaDeDestino FROM TablaDeOrigen WHERE 1 = 2

Replicar estructura y datos

SELECT * INTO TablaDeDestino FROM TablaDeOrigen

Con esto, no se copian los constraints ni los índices.

 

¡Saludos!

Respaldar Certificado en SQL Server

Hola gente, el día 14 de febrero publiqué un post pequeño sobre Cifrado de bases de datos en el que hablaba, justamente, como cifrar bases de datos. En el proceso creaba una master key y un certificado. En este pequeño post crearé un backup del certificado para que luego pueda ser importado en otra base de datos.

En una base de datos creada para este propósito, creé un certificado de esta manera:


USE TEST_Certificado;
CREATE CERTIFICATE MiCertificado_TEST
ENCRYPTION BY PASSWORD = '123456'
WITH SUBJECT = 'Prueba de Certificado',
EXPIRY_DATE = '20121031';
GO

El certificado fue creado en la base de datos TEST_Certificado y el certificado se llama MiCertificado_TEST. La clave es super segura y expira el 31 de octubre de este año.
En una nueva ventana de consultas, utilicé este código para respaldar el certificaco en el directorio que se indica:

USE TEST_Certificado
BACKUP CERTIFICATE MiCertificado_TEST TO FILE='C:Program FilesMicrosoft SQL ServerMSSQL11.MSSQLSERVERMSSQLBackupMiCertificado_TEST';
GO

Tambien se puede exportar certificado con clave privada con su respectiva clave de descifrado:

BACKUP CERTIFICATE MiCertificado_TEST TO FILE = 'C:Program FilesMicrosoft SQL ServerMSSQL11.MSSQLSERVERMSSQLBackupMiCertificado_TEST_2'
WITH PRIVATE KEY (DECRYPTION BY PASSWORD='123456', FILE = 'C:Program FilesMicrosoft SQL ServerMSSQL11.MSSQLSERVERMSSQLBackupMiCertificado_TEST_k' ,
ENCRYPTION BY PASSWORD = '123456' );
GO

No te pierdas la próxima entrega, en la cual mostraré como importar un certificado.

Saludos

Licenciar una version trial de SQL Server 2008 R2

Una pregunta bien recurrente es que si se puede licenciar una version trial de SQL Server 2008 R2. La respuesta es: Si.

Si quieres probar SQL Server 2008 R2, lo puedes descargar gratuitamente desde aqui http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=6362 Es una version Enterprise que dura 180 dias.

Al llegar el dia 180, el motor se bloquea. Por lo tanto, si tienes una licencia, debes ingresarla al momento de la instalacion o antes del dia 180.

Que pasa si tienes una licencia para SQL Server 2008 R2 Standard y bajaste este trial? En la instalacion introduces la licencia y solo el programa de instalacion reconoce la version de SQL Server y desactiva todas las caracteristicas correspondientes a la version Enterprise.

Instalacion de SQL Server 2008 R2 Trial
Instalacion de SQL Server 2008 R2 Trial

 

Reconociminto de la version segun licencia
Reconociminto de la version segun licencia