JoikuSpot Premium -> Te crea una red wifi para poder compartir la conexión 3G del móvil.
Collins -> Diccionario de inglés-inglés.
McGuider -> Software de navegación que funciona muy bien con el GPS interno de Nokia.
Gmail -> Cliente para el correo de google.
Google Maps -> Mapas.
Powerboot -> Para arrancar programas con el inicio del móvil.
Opera Mini -> Navegador muy bueno.
Snaptu -> Cliente de redes sociales y lector RSS.
PhoneGuard -> Si te roban el móvil o cambian la SIM, recibes un SMS en el móvil que hayas prefijado con el nuevo número y su posición GPS.
Juegos -> Bomb Jack, StreetFighter, Super Puzzle Bubble, The Fast and the Furius, Bubble Bobble, CoasterRush, Marble, Nate Adams Motocross, Brain Juice, JawBreaker.
Friday, 20 de November del 2009
Publicando un blog en Orafaq
El proyecto en el que actualmente trabajo dedico una pequeña parte a la administración de Oracle. Además este año he finalizado la certificación a OCP 10g (estaba certificado en OCA 9 desde 2004), y todas estas experiencias me están generando contenido suficiente para publicarlo en un blog. Lo estoy haciendo en www.orafaq.com, por ser una web especializada en Oracle. El blog se puede leer aquí: http://www.orafaq.com/blog/16208.
Procedimientos almacenados y extendidos no documentados en SQL Server 2005
XP_FileExist
Su uso:
Devuelve 3 columnas con 0 ó 1: File Exists, File is a Directory, Parent Directory Exists.
Ejemplo:
SP_MSForEachDb
Ejecuta una cadena de texto como un comando por cada base de datos en el servidor. Puede ser útil para buscar una tabla de la que no sabes en qué base de datos está, por ejemplo:
También es útil para lanzar la misma tarea de mantenimiento en todas las bases de datos:
SP_MSForEachTable
Funcionamiento parecido a sp_msforeachdb, pero por cada tabla. Con este ejemplo vaciamos todas las tablas dejando sólo la estructura.
SP_who2
Algunos datos iguales que los de sp_who, con otros nombres de columnas, sin columna ecid y con las columnas cputime, diskio, lastbatch y programname añadidas.
sp_MSdependencies
Sirve para determinar las dependencias de un objeto en la base de datos. Su uso:
Todas las variables son opcionales, con:
obtenemos una descripción breve de las opciones.
Su uso:
EXEC xp_fileexist[, OUTPUT]
Devuelve 3 columnas con 0 ó 1: File Exists, File is a Directory, Parent Directory Exists.
Ejemplo:
exec master.dbo.xp_fileexist 'C:\temp'
SP_MSForEachDb
Ejecuta una cadena de texto como un comando por cada base de datos en el servidor. Puede ser útil para buscar una tabla de la que no sabes en qué base de datos está, por ejemplo:
exec dbo.sp_MSforeachdb 'select ''?'', * from [?].INFORMATION_SCHEMA.TABLES where table_name like ''autores'' '
También es útil para lanzar la misma tarea de mantenimiento en todas las bases de datos:
exec dbo.sp_MSforeachdb 'DBCC SHRINKDATABASE(N''?'' )'
SP_MSForEachTable
Funcionamiento parecido a sp_msforeachdb, pero por cada tabla. Con este ejemplo vaciamos todas las tablas dejando sólo la estructura.
exec dbo.sp_msforeachtable 'delete test.dbo.[?]'
SP_who2
Algunos datos iguales que los de sp_who, con otros nombres de columnas, sin columna ecid y con las columnas cputime, diskio, lastbatch y programname añadidas.
sp_MSdependencies
Sirve para determinar las dependencias de un objeto en la base de datos. Su uso:
exec dbo.sp_MSdependencies [
Todas las variables son opcionales, con:
exec sp_msdependencies '?'
obtenemos una descripción breve de las opciones.
Wednesday, 11 de November del 2009
Cómo conseguir una versión redistribuible del Framework 3.0 SP1
Parece que a los de Microsoft no se les ocurrió que tal vez debamos instalar el Framework 3.0 SP1 en una máquina aislada de Internet, porque sólo sacaron la versión "strap", que necesariamente tiene que descargarse archivos de internet durante la instalación.
Dejo los comentarios abiertos para todo el que quiera desahogarse con Microsoft y voy al grano con la solución:
Desde tu pc (con salida a internet):
1. Descargar la versión "strap" en el idioma correspondiente.
http://www.microsoft.com/downloads/details.aspx?familyid=EC2CA85D-B255-4425-9E65-1E88A0BDB72A&displaylang=en
2. Abrir la carpeta temporal del usuario con el que has iniciado sesión: Inicio, ejecutar: %temp%
3. Ejecutar el instalador.
4. Tras aceptar el EULA, verás cómo dentro de la carpeta temporal aparece la carpeta "dotnetfx3521022.08". Busca dentro de ella SP1 y cópialo a un sitio distinto. Ya tienes la versión redistribuible.
5. Ahora puedes instalar o cancelar la instalación en curso.
Dejo los comentarios abiertos para todo el que quiera desahogarse con Microsoft y voy al grano con la solución:
Desde tu pc (con salida a internet):
1. Descargar la versión "strap" en el idioma correspondiente.
http://www.microsoft.com/downloads/details.aspx?familyid=EC2CA85D-B255-4425-9E65-1E88A0BDB72A&displaylang=en
2. Abrir la carpeta temporal del usuario con el que has iniciado sesión: Inicio, ejecutar: %temp%
3. Ejecutar el instalador.
4. Tras aceptar el EULA, verás cómo dentro de la carpeta temporal aparece la carpeta "dotnetfx3521022.08". Busca dentro de ella SP1 y cópialo a un sitio distinto. Ya tienes la versión redistribuible.
5. Ahora puedes instalar o cancelar la instalación en curso.
Friday, 6 de November del 2009
Prevenir el uso de "SELECT * FROM..."
Con esta técnica evitamos que los desarrolladores utilicen SELECT * FROM en su código.
Por cada tabla, añadir un campo "nousesasterisco", al que más adelante le denegaremos el acceso de lectura:
Denegamos el SELECT en esa columna por cada tabla:
Tras asignar el rol "rol_deniega" a los usuarios de la aplicación, les aparecerá este mensaje:
Por cada tabla, añadir un campo "nousesasterisco", al que más adelante le denegaremos el acceso de lectura:
ALTER TABLE dbo.[tabla] ADD
nousesasterisco char(1) NULL
GO
[...]
Denegamos el SELECT en esa columna por cada tabla:
DENY SELECT ON OBJECT:: dbo.[tabla](nousesasterisco) TO [rol_deniega];
Tras asignar el rol "rol_deniega" a los usuarios de la aplicación, les aparecerá este mensaje:
SELECT * FROM dbo.tabla;
--Result
Msg 230, Level 14, State 1, Line 1
The SELECT permission was denied on the column 'nousesasterisco' of the object 'tabla', database 'Pruebas', schema 'dbo'.
Wednesday, 14 de October del 2009
Crea una fuente de windows ttf o mac con tu caligrafía
Lo hace perfecto en 4 pasos:
Pasos:
- Imprimirte la plantilla en PDF y rellenarla con un rotulador.
- Escanearlo y enviarlo a la web.
- En 10 segundos tienes la fuente ttf para descargar con tu ortografía.
Fontcapture.
Pasos:
- Imprimirte la plantilla en PDF y rellenarla con un rotulador.
- Escanearlo y enviarlo a la web.
- En 10 segundos tienes la fuente ttf para descargar con tu ortografía.
Fontcapture.
Tuesday, 13 de October del 2009
Visor de Excel 2007
Te llega un fichero excel y no está el Office instalado en ese ordenador.
Tienes varias opciones:
- Enviártelo a tu cuenta de gmail, y abrirlo ahí con el visor de Google. Esta tal vez es la más rápida, pero no se verá exactamente igual.
- Abrirlo desde Google docs. Otra buena opción, con la misma pega.
- Instalarte OpenOffice. La instalación tarda un buen rato.
- Instalarte Microsoft Office. La instalación tarda un buen rato. Cuesta dinero.
- Instalarte el visor de ficheros de Excel 2007 de Microsoft. Rápido, bonito, gratis.
Tienes varias opciones:
- Enviártelo a tu cuenta de gmail, y abrirlo ahí con el visor de Google. Esta tal vez es la más rápida, pero no se verá exactamente igual.
- Abrirlo desde Google docs. Otra buena opción, con la misma pega.
- Instalarte OpenOffice. La instalación tarda un buen rato.
- Instalarte Microsoft Office. La instalación tarda un buen rato. Cuesta dinero.
- Instalarte el visor de ficheros de Excel 2007 de Microsoft. Rápido, bonito, gratis.
Monitorizar SQL Server en 8 pasos (Paso 8/8)
Paso 8: Consolidación de los datos
Los scripts del 8.1 al 8.3 consolidan los resultados del PerfMon en un esquema de estrella. Luego, se puede construir un cubo OLAP sobre esto.
Para limitar las líneas de código, aquí sólo están las dimensiones de objeto y máquina. Una configuración similar hará falta para Fecha, Instancia y dimensiones del contador.
Script 8.1 crea las tabals
Script 8.2 refresca todas las dimensiones
Para recuperar espacio en disco, puedes truncar la tabla CounterData después de haber hecho la carga.
Los scripts del 8.1 al 8.3 consolidan los resultados del PerfMon en un esquema de estrella. Luego, se puede construir un cubo OLAP sobre esto.
Para limitar las líneas de código, aquí sólo están las dimensiones de objeto y máquina. Una configuración similar hará falta para Fecha, Instancia y dimensiones del contador.
Script 8.1 crea las tabals
--Script 8.1
CREATE TABLE dbo.Fact_Perfmon (
PerfMonID int IDENTITY (1, 1) NOT NULL ,
DateID int NULL ,
MachineID int NULL ,
ObjectID int NULL ,
InstanceID int NULL ,
CounterID int NULL ,
CounterValue float NULL
) ON [PRIMARY]
GO
CREATE TABLE dbo.Dim_Machine (
MachineID int IDENTITY (1, 1) NOT NULL ,
MachineName varchar (100) NULL
) ON [PRIMARY]
GO
CREATE TABLE dbo.Dim_Object (
ObjectID int IDENTITY (1, 1) NOT NULL ,
ObjectName varchar (100) NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Fact_Perfmon ADD
CONSTRAINT PK_Fact_Perfmon PRIMARY KEY CLUSTERED
(
PerfMonID
) ON [PRIMARY]
GO
ALTER TABLE dbo.Dim_Machine ADD
CONSTRAINT PK_Dim_Machine PRIMARY KEY CLUSTERED
(
MachineID
) ON [PRIMARY]
GO
ALTER TABLE dbo.Dim_Object ADD
CONSTRAINT PK_Dim_Object PRIMARY KEY CLUSTERED
(
ObjectID
) ON [PRIMARY]
GO
ALTER TABLE dbo.Fact_Perfmon ADD
CONSTRAINT FK_Fact_Perfmon_Dim_Machine FOREIGN KEY
(
MachineID
) REFERENCES dbo.Dim_Machine (
MachineID
),
CONSTRAINT FK_Fact_Perfmon_Dim_Object FOREIGN KEY
(
ObjectID
) REFERENCES dbo.Dim_Object (
ObjectID
)
GO
Script 8.2 refresca todas las dimensiones
--Script 8.2
INSERT Dim_Machine (MachineName) SELECT DISTINCT MachineName FROM MonitoringDB.DBO.CounterDetails WHERE MachineName not in (SELECT DISTINCT MachineName from Dim_Machine)
INSERT Dim_Object (ObjectName) SELECT DISTINCT ObjectName FROM MonitoringDB.DBO.CounterDetails WHERE ObjectName not in (SELECT DISTINCT ObjectName from Dim_Object)
Script 8.3 refreshes your fact table
--Script 8.3
SELECT dd.DateID
, dm.MachineID
, do.ObjectID
, dc.CounterID
, di.InstanceID
, dat.CounterValue
FROM MonitoringDB.DBO.CounterData Dat
INNER JOIN MonitoringDB.DBO.CounterDetails Det ON Dat.CounterID = Det.CounterID
INNER JOIN Dim_Date dd ON DateValue = Dat.CounterDateTime
INNER JOIN Dim_Machine dm ON dm.MachineName = Det.MachineName
INNER JOIN Dim_Object do ON do.ObjectName=Det.ObjectName
INNER JOIN Dim_Counter dc ON dc.CounterName= Det.CounterName
INNER JOIN Dim_Instance di ON di.InstanceName = Det.InstanceName
Para recuperar espacio en disco, puedes truncar la tabla CounterData después de haber hecho la carga.
Monitorizar SQL Server en 8 pasos (Paso 7/8)
Paso 7: El panel de control digital
Si quieres más flexibilidad para manejar las alertas, también puedes almacenar valores de umbrales en una tabla de la base de datos. De esta manera un script externo y/o un interfaz gráfico de usuario puede comparar los valores almacenados con los umbrales y generar todo tipo de mecanismos de alerta. Esto es más potestad de los desarrolladores, pero aunque no lo seas, no es algo difícil.
Si quieres más flexibilidad para manejar las alertas, también puedes almacenar valores de umbrales en una tabla de la base de datos. De esta manera un script externo y/o un interfaz gráfico de usuario puede comparar los valores almacenados con los umbrales y generar todo tipo de mecanismos de alerta. Esto es más potestad de los desarrolladores, pero aunque no lo seas, no es algo difícil.
Monitorizar SQL Server en 8 pasos (Paso 6/8)
Paso 6: Alertas
Que siempre cuente nuestra consigna "que sea simple" para nuestro diseño. Usa los mecanismos del PerfMon para generar alertas y para registrar eventos en el log de aplicaciones, donde una herramienta centralizada podría capturarlos y tratarlos según la política de la empresa: notificar a la sala del CPD, enviar un SMS al móvil de guardia, etc...
Si tu empresa no dispone de ningún sistema de gestión de alertas, suscríbete a mi blog porque hablaré de ello en unos días.
Que siempre cuente nuestra consigna "que sea simple" para nuestro diseño. Usa los mecanismos del PerfMon para generar alertas y para registrar eventos en el log de aplicaciones, donde una herramienta centralizada podría capturarlos y tratarlos según la política de la empresa: notificar a la sala del CPD, enviar un SMS al móvil de guardia, etc...
Si tu empresa no dispone de ningún sistema de gestión de alertas, suscríbete a mi blog porque hablaré de ello en unos días.
Monitorizar SQL Server en 8 pasos (Paso 5/8)
Paso 5: Configurar la visualización en Excel
Todos tus datos están ahora almacenados en tablas de SQL Server y los interfaces los has creado utilizando vistas. Ahora puedes visualizarlos como gráficos en cualquier herramienta, como por ejemplo, Excel. Si te sientes más agusto con Reporting Services, hazlo así. Reporting services es una forma más profesional, pero por simplicidad, vamos a usar excel aquí. Además, la configuración no va a ser muy distinta.
Todos estos pasos los tienes que hacer en la máquina cliente donde quieres ver tu panel de monitorización (en inglés dashboard, por el parecido al salpicadero de un coche).
Paso 5.1: Crear un DSN de sistema para hacer la conexión a la base de datos de monitorización.
Paso 5.2: Clic en en Data - Import External Data - New Database Query.
Paso 5.3: Selecciona el origen de datos que has creado en el paso 5.1.
Paso 5.4: Ves por todos los pasos y une las diferentes vistas utilizando el campo CounterDateTime.
Paso 5.5: Carga los resultados en una nueva hoja.
Paso 5.6: Clic en Data - Import External Data – Data Range Properties y selecciona Refresh every 1 minute.
Paso 5.6: Abre el asistente para gráficas (chart wizard).
Todos tus datos están ahora almacenados en tablas de SQL Server y los interfaces los has creado utilizando vistas. Ahora puedes visualizarlos como gráficos en cualquier herramienta, como por ejemplo, Excel. Si te sientes más agusto con Reporting Services, hazlo así. Reporting services es una forma más profesional, pero por simplicidad, vamos a usar excel aquí. Además, la configuración no va a ser muy distinta.
Todos estos pasos los tienes que hacer en la máquina cliente donde quieres ver tu panel de monitorización (en inglés dashboard, por el parecido al salpicadero de un coche).
Paso 5.1: Crear un DSN de sistema para hacer la conexión a la base de datos de monitorización.
Paso 5.2: Clic en en Data - Import External Data - New Database Query.
Paso 5.3: Selecciona el origen de datos que has creado en el paso 5.1.
Paso 5.4: Ves por todos los pasos y une las diferentes vistas utilizando el campo CounterDateTime.
Paso 5.5: Carga los resultados en una nueva hoja.
Paso 5.6: Clic en Data - Import External Data – Data Range Properties y selecciona Refresh every 1 minute.
Paso 5.6: Abre el asistente para gráficas (chart wizard).
Monitorizar SQL Server en 8 pasos (Paso 4/8)
Paso 4: Profiler
La dificultad para recopilar datos del Profiler es encontrar un proceso que filtre información útil de la columna textdata. Por ejemplo: quieres investigar la duración media de un procedimiento almacenado, pero no puedes realizar una agrupación a menos que te deshagas de todos los parámetros que también se almacenan en textdata.
El script 4.1 puede ser un primer paso en tu búsqueda a cómo filtrar y consolidar los datos del SQL Profiler para que te sean útiles. Esta función depende del uso sp_executesdql, por lo que podrías necesitar personalizarlo según tus condiciones.
La dificultad para recopilar datos del Profiler es encontrar un proceso que filtre información útil de la columna textdata. Por ejemplo: quieres investigar la duración media de un procedimiento almacenado, pero no puedes realizar una agrupación a menos que te deshagas de todos los parámetros que también se almacenan en textdata.
El script 4.1 puede ser un primer paso en tu búsqueda a cómo filtrar y consolidar los datos del SQL Profiler para que te sean útiles. Esta función depende del uso sp_executesdql, por lo que podrías necesitar personalizarlo según tus condiciones.
--Script 4.1
CREATE FUNCTION fn_getSPfromTextdata (@textdata VARCHAR(4000))
RETURNS VARCHAR (4000)
AS
BEGIN
DECLARE @ret VARCHAR (4000)
SET @ret = ''
IF SUBSTRING(@textdata, 1, 18) = 'exec sp_executesql' AND SUBSTRING (@textdata, 22, 6) = 'INSERT'
BEGIN
SELECT @ret = SUBSTRING(@textdata, 22, PATINDEX ('% (%', SUBSTRING(@textdata, 6, LEN(@textdata) - 5))-17)
END
ELSE IF SUBSTRING(@textdata, 1, 18) = 'exec sp_executesql' AND SUBSTRING(@textdata, 22, 6) = 'UPDATE'
BEGIN
SELECT @ret = SUBSTRING(@textdata, 22, PATINDEX ('% SET %', SUBSTRING(@textdata, 6, LEN(@textdata) - 5))-17)
END
ELSE IF SUBSTRING(@textdata, 1, 18) = 'exec sp_executesql' AND SUBSTRING(@textdata, 22, 6) = 'DELETE'
BEGIN
SELECT @ret = SUBSTRING(@textdata, 22, PATINDEX ('% WHERE %', substring (@textdata, 6, LEN(@textdata) - 5))-17)
END
ELSE IF substring(@textdata, 1, 4) = 'exec'
BEGIN
SELECT @ret = SUBSTRING(@textdata, 6, PATINDEX ('% %', SUBSTRING(@textdata, 6, LEN(@textdata) - 5)))
END
RETURN @ret
END
Monitorizar SQL Server en 8 pasos (Paso 3/8)
Paso 3. Configurar la base de datos de monitorización
Una vez configurado el PerfMon según las indicaciones del artículo anterior, un conjunto de tablas se habrán creado automáticamente. Si quieres utilizar esas tablas para consultarlas, deberás crearles índices.
El script 3.1 ajustará tu base de datos de monitorización para que las consultas vayan más rápido.
El script 3.2 crea vistas para cada contador que puedes monitorizar. Estos scripts se usarán en uno de los pasos siguientes en los que se trata la visualización. El script 3.2 recopilará los 100 valores más recientes de conexiones de usuario.
El script 3.3 recopila los 100 valores más recientes del uso total de CPU
Más tarde, estas dos vistas se unirán en un gráfico.
Una vez configurado el PerfMon según las indicaciones del artículo anterior, un conjunto de tablas se habrán creado automáticamente. Si quieres utilizar esas tablas para consultarlas, deberás crearles índices.
El script 3.1 ajustará tu base de datos de monitorización para que las consultas vayan más rápido.
--Script 3.1
CREATE CLUSTERED INDEX ix_1 ON dbo.CounterData(CounterID) ON [PRIMARY]
CREATE UNIQUE INDEX ix_2 ON dbo.CounterData(RecordIndex, CounterID) ON [PRIMARY]
CREATE INDEX ix_1 ON dbo.CounterDetails(CounterName) ON [PRIMARY]
CREATE INDEX ix_2 ON dbo.CounterDetails(ObjectName) ON [PRIMARY]
El script 3.2 crea vistas para cada contador que puedes monitorizar. Estos scripts se usarán en uno de los pasos siguientes en los que se trata la visualización. El script 3.2 recopilará los 100 valores más recientes de conexiones de usuario.
--Script 3.2
CREATE VIEW VW_User_Connections
AS
SELECT TOP 100 * FROM
(
SELECT TOP 100 data.CounterDateTime
, data.CounterValue AS [User connections]
FROM CounterData data WITH (NOLOCK)
INNER JOIN CounterDetails details WITH (NOLOCK)
ON data.CounterID = details.CounterID
WHERE details.CounterName = 'User connections'
ORDER BY 1 desc
) AS t
ORDER BY t.CounterDateTime
El script 3.3 recopila los 100 valores más recientes del uso total de CPU
--Script 3.3
CREATE VIEW dbo.VW_CPU_total_user_time
AS
SELECT TOP 100 * FROM
(
SELECT TOP 100 data.CounterDateTime
, data.CounterValue AS [CPU Total User Time]
FROM dbo.CounterData data WITH (NOLOCK)
INNER JOIN dbo.CounterDetails details WITH (NOLOCK)
ON data.CounterID = details.CounterID
WHERE details.ObjectName = 'Processor'
AND details.CounterName = '% User Time'
AND details.InstanceName = '_Total'
ORDER BY 1 DESC
) AS t
ORDER BY t.CounterDateTime
Más tarde, estas dos vistas se unirán en un gráfico.
Monitorizar SQL Server en 8 pasos (Paso 2/8)
Paso 2: Configurar PerfMon
Los siguientes pasos cubren la configuración del Monitor de Rendimiento (perfmon). Esta configuración está específicamente diseñada para poder usar los datos en una sección posterior.
Paso 2.1. Crear un DSN de tu servidor de producción a tu servidor de monitorización.
Paso 2.2. Cambiar el inicio de sesión del servicio "Performance Logs and Alerts" por una cuenta de dominio que:
- Sea miembro del grupo de administradores local del servidor de producción
- Sea miembro del role db_owner de la base de datos a monitorizar
Paso 2.2. Iniciar Perfmon:
- Añadir un nuevo contador. En la pestaña General, clic en Add Objects para añadir contadores de los siguientes objetos:
Memory, Physical Disk, Process, Processor, SQLServer:Access Methods, SQLServer:Buffer Manager, SQLServer:Cache Manager, SQLServer:Databases, SQLServer:General Statistics, SQLServer:Latches, SQLServer:Locks, SQLServer:Memory Manager, SQLServer:SQL Statistics, SQLServer:SQL Settable.
Cambiar el intervalo a 1 minuto.
- En la pestaña Log Files. Cambiar Log file type a = SQL database. Elige el DSN que creaste en el paso 2.1. En la pstaña Schedule limita la ventana adecuada con las opciones de Start y Stop.
Cuando un fichero de log se cierra, ejecutar este comando: use this to automatically run your consolidation and cleanup script.
Paso 2.4. Inicia tu contador.
Los siguientes pasos cubren la configuración del Monitor de Rendimiento (perfmon). Esta configuración está específicamente diseñada para poder usar los datos en una sección posterior.
Paso 2.1. Crear un DSN de tu servidor de producción a tu servidor de monitorización.
Paso 2.2. Cambiar el inicio de sesión del servicio "Performance Logs and Alerts" por una cuenta de dominio que:
- Sea miembro del grupo de administradores local del servidor de producción
- Sea miembro del role db_owner de la base de datos a monitorizar
Paso 2.2. Iniciar Perfmon:
- Añadir un nuevo contador. En la pestaña General, clic en Add Objects para añadir contadores de los siguientes objetos:
Memory, Physical Disk, Process, Processor, SQLServer:Access Methods, SQLServer:Buffer Manager, SQLServer:Cache Manager, SQLServer:Databases, SQLServer:General Statistics, SQLServer:Latches, SQLServer:Locks, SQLServer:Memory Manager, SQLServer:SQL Statistics, SQLServer:SQL Settable.
Cambiar el intervalo a 1 minuto.
- En la pestaña Log Files. Cambiar Log file type a = SQL database. Elige el DSN que creaste en el paso 2.1. En la pstaña Schedule limita la ventana adecuada con las opciones de Start y Stop.
Cuando un fichero de log se cierra, ejecutar este comando: use this to automatically run your consolidation and cleanup script.
Paso 2.4. Inicia tu contador.
Monitorizar SQL Server en 8 pasos (Paso 1/8)
Paso 1: Master.dbo.sysperfinfo
La tabla de sistema master.dbo.sysperfinfo contiene todos los contadores de rendimiento interno de SQL server que se ven con PerfMon. Los pros y los contras de utilizar sysperfinfo son:
Pros:
- Está disponible online sin la necesidad de configurar un entorno de monitorización. Te puedes crear un simple script para recopilar los datos de rendimiento.
- Al contrario que Perfmon, no son necesarios permisos a nivel de Sistema Operatifo. Sólo necesitas permiso de lectura a la base de datos master. Los permisos a nivel de sistema operativo a veces son difíciles de conseguir cuando los servicios de una empresa están "outsourceados".
Contras:
- Sysperfinfo abarca sólo los contadores de SQL Server. No están los de CPU, memoria o estadísticas de I/O de disco disponibles.
El script 1.1 te enseña cómo recopilar los datos del contador 'Log Bytes Flushed/sec' durante 3 minutos tomando muestras a intervalos de 5 segundos.
El script 1.2 crea todas las tablas necesarias para un entorno de ensayo:
El script 1.3 crea el procedimiento almacenado para registrar un nuevo valor
El script 1.4 añade un registro en la tabla tbl_log_sysperfinfo. Este script se debería ejecutar en un trabajo programado de SQL Server, una vez por minuto.
La tabla de sistema master.dbo.sysperfinfo contiene todos los contadores de rendimiento interno de SQL server que se ven con PerfMon. Los pros y los contras de utilizar sysperfinfo son:
Pros:
- Está disponible online sin la necesidad de configurar un entorno de monitorización. Te puedes crear un simple script para recopilar los datos de rendimiento.
- Al contrario que Perfmon, no son necesarios permisos a nivel de Sistema Operatifo. Sólo necesitas permiso de lectura a la base de datos master. Los permisos a nivel de sistema operativo a veces son difíciles de conseguir cuando los servicios de una empresa están "outsourceados".
Contras:
- Sysperfinfo abarca sólo los contadores de SQL Server. No están los de CPU, memoria o estadísticas de I/O de disco disponibles.
El script 1.1 te enseña cómo recopilar los datos del contador 'Log Bytes Flushed/sec' durante 3 minutos tomando muestras a intervalos de 5 segundos.
--Script 1.1:
CREATE TABLE #Writes(ts DATETIME, LogBytesFlushes BIGINT)
DECLARE @lbf INT, @lbfold INT, @starttime DATETIME
SET @starttime = getdate()
SELECT @lbfold=cntr_value FROM master..sysperfinfo WHERE counter_name = 'Log Bytes Flushed/sec' AND instance_name = 'test'
WAITFOR DELAY '00:00:05'
WHILE getdate() < dateadd(mi,3,@starttime)
BEGIN
SELECT @lbf=cntr_value FROM master..sysperfinfo WHERE counter_name = 'Log Bytes Flushed/sec' AND instance_name = 'test'
INSERT INTO #writes (ts,LogBytesFlushes) VALUES (getdate(), @lbf - @lbfold)
SET @lbfold = @lbf
WAITFOR DELAY '00:00:05'
END
SELECT * FROM #writes
El script 1.2 crea todas las tablas necesarias para un entorno de ensayo:
--Script 1.2:
CREATE TABLE dbo.wt_current_sysperfinfo (
InsertTime DATETIME NULL CONSTRAINT DF_wt_current_sysperfinfo_InsertTime DEFAULT (getdate()),
object_name NCHAR (128) NOT NULL ,
counter_name NCHAR (128) NOT NULL ,
instance_name NCHAR (128) NULL ,
cntr_value INT NOT NULL ,
cntr_type INT NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE dbo.wt_previous_sysperfinfo (
InsertTime DATETIME NULL CONSTRAINT DF_wt_previous_sysperfinfo_InsertTime DEFAULT (getdate()),
object_name NCHAR (128) NOT NULL ,
counter_name NCHAR (128) NOT NULL ,
instance_name NCHAR (128) NULL ,
cntr_value INT NOT NULL ,
cntr_type INT NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE dbo.tbl_log_sysperfinfo(
InsertTime datetime NULL CONSTRAINT DF_tbl_log_sysperfinfo_InsertTime DEFAULT (getdate()),
[Batch Requests/sec] FLOAT NULL,
[Buffer cache hit ratio] FLOAT NULL,
[Page life expectancy] FLOAT NULL,
[User Connections] INT NULL
) ON [PRIMARY]
GO
El script 1.3 crea el procedimiento almacenado para registrar un nuevo valor
--Script 1.3:
CREATE PROC usp_refresh_log_sysperfinfo
as
-- declarations
DECLARE @previous_inserttime DATETIME, @current_inserttime DATETIME, @elapseTimeSec INT
DECLARE @previous_batch_request_sec FLOAT, @current_batch_request_sec FLOAT, @batch_request_sec FLOAT
DECLARE @current_Buffer_cache_hit_ratio FLOAT, @current_Buffer_cache_hit_ratio_base FLOAT, @Buffer_cache_hit_ratio FLOAT
DECLARE @Page_life_expectancy INT, @User_Connections INT
-- calculate elapse time
SELECT TOP 1 @current_inserttime = InsertTime FROM dbo.wt_current_sysperfinfo (NOLOCK)
SELECT TOP 1 @previous_inserttime = InsertTime FROM dbo.wt_previous_sysperfinfo (NOLOCK)
SELECT @elapseTimeSec = datediff(s, @previous_inserttime, @current_inserttime)
-- calculate @batch_request_sec
SELECT @current_batch_request_sec = cntr_value FROM dbo.wt_current_sysperfinfo (NOLOCK) WHERE counter_name = 'Batch Requests/sec'
SELECT @previous_batch_request_sec = cntr_value FROM dbo.wt_previous_sysperfinfo (NOLOCK) where counter_name = 'Batch Requests/sec'
SELECT @batch_request_sec = (@current_batch_request_sec - @previous_batch_request_sec) / @elapseTimeSec
-- calculate Buffer cache hit ratio
SELECT @current_Buffer_cache_hit_ratio = cntr_value FROM dbo.wt_current_sysperfinfo (NOLOCK) WHERE counter_name = 'Buffer cache hit ratio'
SELECT @current_Buffer_cache_hit_ratio_base = cntr_value FROM dbo.wt_current_sysperfinfo (NOLOCK) WHERE counter_name = 'Buffer cache hit ratio base'
SELECT @Buffer_cache_hit_ratio = @current_Buffer_cache_hit_ratio / @current_Buffer_cache_hit_ratio_base * 100.00
-- calculate Page life expectancy
SELECT @Page_life_expectancy = cntr_value FROM dbo.wt_current_sysperfinfo (NOLOCK) WHERE counter_name = 'Page life expectancy'
-- calculate User Connections
SELECT @User_Connections = cntr_value FROM dbo.wt_current_sysperfinfo (NOLOCK) WHERE counter_name = 'User Connections'
INSERT INTO dbo.tbl_log_sysperfinfo
(
[Batch Requests/sec],
[Buffer cache hit ratio],
[Page life expectancy],
[User Connections]
)
VALUES
(
@batch_request_sec,
@Buffer_cache_hit_ratio,
@Page_life_expectancy,
@User_Connections
)
El script 1.4 añade un registro en la tabla tbl_log_sysperfinfo. Este script se debería ejecutar en un trabajo programado de SQL Server, una vez por minuto.
--Script 1.4:
DROP TABLE dbo.wt_previous_sysperfinfo
SELECT * INTO wt_previous_sysperfinfo FROM dbo.wt_current_sysperfinfo
TRUNCATE TABLE dbo.wt_current_sysperfinfo
INSERT wt_current_sysperfinfo (object_name, counter_name, instance_name, cntr_value, cntr_type)
SELECT object_name, counter_name, instance_name, cntr_value, cntr_type FROM master.dbo.sysperfinfo
EXEC usp_refresh_log_sysperfinfo
« previous page
(Page 3 of 5, totaling 74 entries)
next page »
