martes, 9 de agosto de 2011

Error al reorganizar índices en plan de mantenimiento

En el log del trabajo podemos encontrar algo así como el siguiente error:

Failed:(-1073548784) Executing the query "ALTER INDEX [PK_XXXX] ON [dbo].[XXXXX] REOR..." failed with the following error: "The index "PK_XXXX" (partition 1) on table "XXXXX" cannot be reorganized because page level locking is disabled.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.


La causa es que la opción de "Page Locks", requerida para efectuar la reorganización o la recreación de índices, ha sido deshabilitada. Al parecer esto suele ocurrir cuando se migra una bbdd de SQL 2005 al 2008; por alguna razón  en algunos índices se deshabilita esta opción.



Puede arreglarse:

>ALTER INDEX [PK_XXXX ON [dbo].[XXXXXX] SET (

ALLOW_PAGE_LOCKS = ON

) ;

Con Management Studio,  botón derecho en el índice en cuestión, propiedades, opciones y ahí marcáis la opci´´on de permitir  "page lock"





viernes, 4 de marzo de 2011

xp_cmdshell: comprobar estado antes de ejecutarla

Por razones obvias, es mejor tener xp_cmdshell deshabilitado y habilitarlo sólo cuando es necesario. Para evitar males mayores, igual es recomendable antes de reconfigurar verificar su estado, y una vez ejecutado nuestro script dejarlo como estaba.

Unas pequeñas líneas pueden ahorrarnos algún que otro lío (experiencia personal esta semana :-)

Podéis crear una variable o una pequeña tabla temporal:
-- xp_cmdshell configuration --

CREATE TABLE #config (val int)

INSERT INTO #config SELECT convert(int, vlaue_in_use)
FROM master.sys.configurations WHERE name= 'xp_cmdshell'


IF (SELECT val FROM #config)= 0

-- enable xp_cmdshell and lock it again after completed the script

BEGIN
 EXEC sp_configure 'show advanced options', 1
 RECONFIGURE
 EXEC sp_configure 'xp_cmdshell',1
 RECONFIGURE

END

--AQUI EL CÓDIGO


-- set xp_cmdshell as its previous state if it was changed

IF (SELECT val FROM  #config) = 0

BEGIN
 EXEC sp_configure 'show advanced options', 1
 RECONFIGURE
 EXEC sp_configure 'xp_cmdshell',0
 RECONFIGURE
END


DROP TABLE #config

Lo mismo para OLE Automatation

lunes, 21 de febrero de 2011

Renombrar instancia SQL Server

Por defecto (nombre del servidor:


sp_dropserver NombreServidorAntiguo
GO
sp_addserver NuevoNombreServidor, local
GO


Instancia

sp_dropserver NombreServfidorAntiguo\NombreInstanciaAntigua
GO
sp_addserver NombreservidorNuevo\NombreInstanciaNueva, local
GO


Clúster:

Usar el Adminitrador de Clúster:


Poner 'offline' SQL Server y volver a ponerlo de nuevo en linea.


En todos los casos, una vez cambiado el nombre verificar que haya funcionado

Select @@servername

Recordar que habrá que manualmente modificar los paquetes SSIS para actualizar conel nuevo nombre del servidor/instancia

Ejemplo de error:

  Description: Failed to acquire connection "Local server connection". Connection may not be configured correctly or you may not have the right permissions on this connection.  End Error  Warning: 2011-02-21 10:35:27.16     Code: 0x80019002     Source: OnPreExecute 


Hay un script que facilita las cosas. Está publicado en MSDN aunque ellos no lo crearan y se curen en salud diciendo que no admiten responsabilidades. funcionar funciona bien



use msdb
DECLARE @oldservername as varchar(max)
SET @oldservername='\'

-- set the new server name to the current server name
declare @newservername as varchar(max)
set @newservername=@@servername

declare @xml as varchar(max)
declare @packagedata as varbinary(max)
-- get all the plans that have the old server name in their connection string
DECLARE PlansToFix Cursor
FOR
SELECT    id
FROM         sysdtspackages90
WHERE     (CAST(CAST(packagedata AS varbinary(MAX)) AS varchar(MAX)) LIKE '%server=''' + @oldservername + '%')

OPEN PlansToFix


declare @planid uniqueidentifier
fetch next from PlansToFix into @planid
while (@@fetch_status<>-1)  -- for each plan

begin
if (@@fetch_status<>-2)
begin
select @xml=cast(cast(packagedata as varbinary(max)) as varchar(max)) from sysdtspackages90 where id= @planid  -- get the plan's xml converted to an xml string

declare @planname varchar(max)
select @planname=[name] from  sysdtspackages90 where id= @planid  -- get the plan name
print 'Changing ' + @planname + ' server from ' + @oldservername + ' to ' + @newservername  -- print out what change is happening

set @xml=replace(@xml,'server=''' + @oldservername + '''','server=''' + @newservername +'''')  -- replace the old server name with the new server name in the connection string
select @packagedata=cast(@xml as varbinary(max))  -- convert the xml back to binary
UPDATE    sysdtspackages90 SET packagedata = @packagedata WHERE (id= @planid)  -- update the plan

end
fetch next from PlansToFix into @planid  -- get the next plan

end

close PlansToFix
deallocate PlansToFix

 Más información:

cómo renombrar una instancia de SQL (inglés) 2008R2

Cómo renombrar una instancia 2005 (incluye scipts par amodificar SSIS)
Cómo renombrar un clúster

jueves, 3 de febrero de 2011

SQL Server en clúster; cuántas IP se necesitan?

Para un clúster "failover" típico un mínimo de 4 (5 si también necesitais MSDTC en clúster):

Una para cada uno de los nodos (mínimo dos), servidor1 y servidor2
Una para el clúster, ClusterServidor1y2
Una para SQL Server, ClusterServidor1y2SQL
Una para MSDTC (casi mejor ponerlo y no tener que usarlo que añadirlo más tarde)

martes, 1 de febrero de 2011

Gartner reconoce a Microsoft como líder en BI

La plataforma de BI de Microsoft consigue los mejores resultados en el  anual "Magic Quadrant" de Gartner desbancando a otras como Oracle, IBM o SAP.
Aquí tenéis el informe  (en inglés)

viernes, 28 de enero de 2011

Modificar varios trabajos a la vez

Una manera rápida de generar scripts para modificar trabajos de forma masiva. Por ejemplo, tras crear varios planes de mantenimiento, queremos cambiar el propietario del trabajo a 'SA', si el trabajo falla lo escriba en el evento de windows y lo notifique por correo a un determinado operador:

SELECT 'EXEC msdb.dbo.sp_update_job @job_name=N'''+NAME+''' , @owner_login_name=N''sa'', @notify_level_eventlog= 2, @notify_level_email = 2
,@notify_email_operator_name =N''USUARIO''' FROM msdb..sysjobs where category_id = 3

Ejecutar el código y automáticamente os creará los scripts.

Para más información y opciones del procedimeinto sp_update_job, echadle un vistazo a los libros en linea o aqui.

SQL Server Compact 4.0 disponbile

La última versión ya está para descargar en la página de Microsoft

Y en este blog podéis ver las diferencias entre SQL Server Compact 4 y SQL Server Express 2008 R2

miércoles, 26 de enero de 2011

Borrar planes de mantenimiento

Si la opción botón derecho - borrar no funciona:

Identificar el id del plan a borrar:

Select * from msdb..sysmaintplan_plans

Borrar las referencias a ese plan en las sigueintes tablas:


delete from sysmaintplan_plans where id = 'XXXXXXX-XXXX-XXX-XXXX-XXXXXXXXX'
delete from sysmaintplan_log where plan_id = 'XXXXXXX-XXXX-XXX-XXXX-XXXXXXXXX'
 delete from sysmaintplan_subplans where plan_id ='XXXXXXX-XXXX-XXX-XXXX-XXXXXXXXX'

Ahora ya deberíamos borrar los trabajos asociados sin ningún problema

miércoles, 12 de enero de 2011

Fin de soporte a SQL 7

Ayer día 11, oficialmente se terminó el soporte extendido a SQL 7; descanse en paz :-(

En esta página de Microsoft podéis comprobar los periodos de vigencia para los diferentes productos y versiones

martes, 11 de enero de 2011

Windows 2008 R2 y SQL Server 2008 R2: Error 18456 (2)

...al intentar  abrir una conexión con  Management Studio, de manera local,  utilizando una cuenta de dominio con privilegios de adminstrador en el servidor y sysadmin en  SQL Server  (BUILTIN\Administrator no había sido deshabilitado)

Lo curioso es que previamente no hubo problemas para conectar remotamente con esa misma cuenta.

 En el log aparecía el siguiente error:


XXXX-XX-XX 00:00:00.00 Logon       Error: 18456, Severity: 14, State: 11.
XXXX-XX-XX  00:00:00.00 Logon      Login failed for user MYDOMAIN\MYLOGIN'. Reason: Token-based server access validation failed with an infrastructure error. Check for previous errors. [CLIENT: ]

Con SA pude conectarme y añadir directamente  la mencionada cuenta de dominio como login de SQL server, lo cualo soluccionó el problema.



La razón de este problema es  UAC, el nuevo sistema que Microsoft introduce para controlar las cuentas de usuario, el cual deshabilita la opción de, automáticamente,  mapear un usuario adminstrador con un login sysadmin.


Otra solucción, por tanto, sería lanzar Management Studio encomo adminstrador o ejecutarlo  de manera remota.

(Esta otra entrada da más información sobrelas causas más "normales" para el  error 18456)