17 noviembre, 2009

Cómo detectar y matar procesos huérfanos

Cuando una aplicación cliente desconecta de un servidor SQL Server, el proceso de conexión debe borrarse en el servidor. Si los procesos de conexión no se borran por cualquier motivo, éstos se convierten en procesos "huérfanos". Estos procesos o sesiones inactivas pueden utilizar recursos valiosos, como bloqueos y conexiones de usuario.

¿Cuánto tiempo tarda o cuándo es que SQL Server limpia una sesión huérfana? No lo hace. SQL Server termina una conxión cuando la aplicación cliente o el sistema operativo lo solicita. A nivel de sistema operativo, las conexiones que usan named pipes sobre NETBEUI suelen tener un timeout bastante rápido. Las conexiones basadas en named pipes sobre IP tienen un timeout un poco mayor. Pero las sesiones basadas en sockets TCP/IP por omisión no tienen timeout. Por lo tanto el administrador de SQL Server debe identificar las sesiones huérfanas y matarlas usando el comando KILL.

Una forma posible de identificar una sesión huérfana se logra filtrando en SysProcesses por las columnas Status y Last_Batch. Si el Status indica que la sesión está a la espera de un comando y la diferencia entre GetDate() y Last_Batch es grande, todo indica la presencia de una sesión huérfana a la que se podría aplicar el KILL.

Por ejemplo:

--
-- SQL Server 2005/2008
-- Matar sesiones inactivas de mas de X minutos
--
-- Ejemplo: 8 hrs (480 minutos)
DECLARE @mm INT
SET @mm = 480

DECLARE @SPIDS TABLE(SPID INT)
DECLARE @SPID INT
DECLARE @KILLCMD VARCHAR(200)

INSERT @SPIDS (SPID)
SELECT SPID
FROM sysprocesses
WHERE SPID <> @@SPID
AND status = 'sleeping'
AND DATEDIFF(MINUTE, last_batch, getdate()) > @mm

SELECT @SPID = MIN(SPID) FROM @SPIDS
WHILE @SPID IS NOT NULL
BEGIN
SELECT @KILLCMD = 'KILL ' + CONVERT(VARCHAR(100),@SPID)
EXEC(@KILLCMD)
SELECT @SPID = MIN(SPID) FROM @SPIDS WHERE SPID > @SPID
END


La ejecución del ejemplo no elimina procesos del sistema. Cuando KILL intenta hacerlo, se verá el mensaje de error:

Msg 6107, Level 14, State 1, Line 1
Only user processes can be killed.


sys.sysprocesses contiene información sobre los procesos que se ejecutan en una instancia de SQL Server. Estos procesos pueden ser procesos del cliente o procesos del sistema.
Esta tabla del sistema se incluye como vista para la compatibilidad con versiones anteriores a 2005/2008. En su lugar, se recomienda el uso de las vistas del sistema de SQL Server actual. Esta característica se quitará en una versión futura de Microsoft SQL Server.

12 noviembre, 2009

Entendiendo y usando el soporte de PowerShell en SQL Server 2008

He traducido a español este excelente artículo del MVP Allen White:

Understanding and Using PowerShell Support in SQL Server 2008
http://msdn.microsoft.com/en-us/library/dd938892.aspx

Mi versión traducida está disponible públicamente: Entendiendo y Usando el Soporte de PowerShell en SQL Server 2008. También puede obtenerse en este otro link.

Espero que sea de utilidad a la comunidad hispanoparlante. Todos los comentarios son siempre bienvenidos.

02 noviembre, 2009

Instalar AdventureWorks2008 es más que una aventura

En los buenos viejos tiempos, instalar las bases de datos de ejemplo de SQL Server era tan simple como ejecutar algunos scripts T-SQL. Pero los tiempos han cambiado y ahora para instalar AdventureWorks en SQL Server 2008 requiere varios pasos algo complejos, empezando con que existen varios requisitos previos y además las bases AdventureWorks usan un instalador bastante sofisticado. Veremos en este artículo cómo instalar AdventureWorks 2008 en un SQL Server 2008 sobre Windows Server 2008 (en mi caso, la edición Standard).

Primero veamos cómo es la forma oficial de hacer la instalación de AdventureWorks2008, cómo la forma oficial tiene fallas y finalmente cómo instalar exitosamente las bases de ejemplo con un método alternativo.

1. La manera oficial de instalar AdventureWorks

Primero que nada hay que instalar los pre-requisitos necesarios:

Microsoft .NET Framework 3.5 Service Pack 1
http://download.microsoft.com/download/2/0/e/20e90413-712f-438c-988e-fdaa79a8ac3d/dotnetfx35.exe

Windows Installer 4.5 Redistributable
http://www.microsoft.com/downloads/details.aspx?FamilyId=5A58B56F-60B6-4412-95B9-54D056D6F9F4&displaylang=en

Para Windows Server 2008 elegir uno de los siguientes instaladores acorde a la plataforma:

x86: Windows6.0-KB942288-v2-x86.msu
x64: Windows6.0-KB942288-v2-x64.msu
IA64: Windows6.0-KB942288-v2-ia64.msu

Windows Powershell

En Windows Server 2008, Windows Powershell viene incluído pero no se instala por omisión. Para instalarlo ejecutar el Server Manager:

%SystemRoot%\system32\CompMgmtLauncher.exe

Seleccionar: Features. Luego clic en "Add Features" y marcar "Windows Powershell".

Luego de instalados los pre-requisitos, podremos instalar SQL Server 2008. Si se ha optado por la edición Express, hay que instalar SQL Server 2008 Express with Advanced Services debido a que las bases de ejemplo AdventureWorks requieren el servicio Full-Text Search incluido en dicha edición de Express. Entonces es recomendable instalar lo siguiente:

Microsoft SQL Server 2008 Express with Advanced Services
http://download.microsoft.com/download/e/9/b/e9bcf5d7-2421-464f-94dc-0c694ba1b5a4/SQLEXPRADV_x86_ENU.exe

Microsoft SQL Server 2008 Express with Tools
http://download.microsoft.com/download/7/9/4/794bfafa-aea7-45d4-a6ea-4e92f09918e3/SQLEXPRWT_x86_ENU.exe

Lo anterior es para instalar el Management Studio Express 2008. Observar que si previamente en la máquina existe el Management Studio Express 2005, hay que desinstalarlo desde Start / Control Panel.

Antes de instalar AdventureWorks usando los paquetes de instalación .msi, asegurarse que el SQL Server 2008 ya tiene todo lo siguiente: Full-Text Search instalado, el servicio SQL Full-text Filter Daemon Launcher iniciado y FILESTREAM habilitado. Veamos cada uno:

Cómo instalar el servicio Full-Text Search

Si el servicio Full-Text Search ya está instalado, pero el servicio SQL Full-text Filter Daemon Launcher no está iniciado, la instalación va a fallar indicando que falta dicho servicio.

Para instalar Full-Text Search, ejecutar el instalador de SQL Server (si es la edición Express, hay que usar el instalador de SQL Server 2008 Express With Advanced Services). En el instalador, elegir la opción "New SQL Server stand-alone installation or add features to an existing installation".

En la ventana "Installation Type" seleccionar "Add features to an existing instance of SQL Server 2008", seleccionar la instancia de la lista desplegable y pulsar "Next". Al llegar a la ventana "Feature Selection" bajo el nodo "Instance Features/Database Engine Services", marcar "Full-Text Search", puslar "Next" y completar el asistente de instalación.

Cómo habilitar el servicio SQL Full-text Filter Daemon Launcher

En el menú de inciio de Windows: Start / All Programs / Microsoft SQL Server 2008 / Configuration Tools / SQL Server Configuration Manager. En el panel izquierdo pulsar "SQL Server Services". En la lista de servicios, clic-derecho en "SQL Full-text Filter Daemon Launcher" para la instancia que se está configurando y clic en "Properties". Luego clic en la pestaña "Service", junto a "Start Mode" clic en "Disabled" y en "Automatic". Luego hacer clic-derecho en "SQL Full-text Filter Daemon Launcher" y pulsar "Start".

Cómo habilitar FILESTREAM
http://msdn.microsoft.com/es-es/library/cc645923.aspx


Las bases de datos AdventureWorks se descargan de: Sample Databases (http://msftdbprodsamples.codeplex.com/ ). El instalador es el siguiente:

SQL2008.AdventureWorks_All_Databases.x86.msi
http://msftdbprodsamples.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=34032#DownloadId=86538

Este instalador a mucha gente, incluido yo, le ha fallado. Cuando aparece la ventana "Database setup", aparece una lista desplegable donde hay que seleccionar la instancia de SQL Server en la que se va a instalar AdventureWorks. Pero sorpresivamente el botón "Next" no se habilita. Para hacer peor las cosas, si se pulsa el botón "Back" y se vuelve a pulsar "Next", volvemos a la ventana y ahora sí está activo el botón "Next". Lo pulsamos y sopresa! La instalación termina indicando que hubo una falla. Trsitemente, no se indica cuál es la falla exactamente.


2. La manera alternativa de instalar AdventureWorks que funciona

2.1. No usar los programas de instalación .msi y descargar las bases de ejemplo en el formato zipeado, que están en:

SQL2008.AdventureWorks_All_Databases.zip
http://msftdbprodsamples.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=34032#DownloadId=86540

/* UPDATE 2010-02-28:

El link fue movido, ahora está en http://msftdbprodsamples.codeplex.com/releases/view/37109#DownloadId=106391

*/




2.2. Expandir el zip en una carpeta, por ejemplo D:\SQL2008.AdventureWorks_All_Databases. Dentro de esa carpeta hay una subcarpeta para cada base de datos. Así, la base AdventureWorksLT2008 está en la subcarpeta:

D:\SQL2008.AdventureWorks_All_Databases\Tools\Samples\AdventureWorks 2008 LT

2.3. Luego abrir una ventana de query en el Management Studio y abrir el archivo del script de creación de la base AdventureWorksLT2008:

D:\SQL2008.AdventureWorks_All_Databases\Tools\Samples\AdventureWorks 2008 LT\instawltdb.sql

2.4. Cuando el script fué cargado en la ventana de comandos, poner a la ventana en "modo SQLCMD" (en el menú del Management Studio: Query / SQLCMD mode).

2.5. Modificar las variables SqlSamplesDatabasePath y SqlSamplesSourceDataPath que aparecen en las líneas 34 y 35 para que contengan los valores adecuados, y descomentar. Las líneas quedarán así (prestar atenció que las rutas terminan en retrobarras \ ) como s ve a continuación:

:setvar SqlSamplesDatabasePath "D:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS2008\MSSQL\DATA\"
:setvar SqlSamplesSourceDataPath "D:\SQL2008.AdventureWorks_All_Databases\Tools\Samples\"


2.6. Ejecutar el script y la base de datos AdventureWorksLT2008 se creará exitosamente.

Finalmente hacer los mismos pasos para la base AdventureWorks 2008 OLTP.