Categorías
Donaciones

Todo el contenido es gratuito y en beneficio de la comunidad. Puedes reconocer el esfuerzo con una donación si lo deseas.

Patrocinadores
Inserte aquí su publicidad

Bien es sabido que SQL Server Express carece de Agente de SQL Server. ¿Significa eso que no podemos automatizar nada, ni siquiera los backups? ¿Hay alguna forma de agendar backups en SQL Server Express?

La respuesta es si. Claro que podemos.

No tenemos agente, pero sí tenemos el programador de tareas de Windows (Scheduled Tasks), que nos permite ejecutar comandos con SQLCMD a una hora u horas concretas. Así, primero preparamos nuestro script. Si hablamos de tareas de mantenimiento básicas, lo más eficaz es recurrir a la web del MVP Ola Hallengren, https://ola.hallengren.com/. Tomado del primero de los ejemplos de utilización del procedimiento almacenado de backup, este script que aquí acompaño hace backup de todas las bases de datos de una instancia, comprimidos y verificados:

EXECUTE dbo.DatabaseBackup
 @Databases = 'USER_DATABASES',
 @Directory = 'C:\Backup',
 @BackupType = 'FULL',
 @Verify = 'Y',
 @Compress = 'Y',
 @CheckSum = 'Y',
 @CleanupTime = 24

Con ello preparamos la ejecución de los backups, salvando scripts que luego ejecutaremos. La instrucción que irá en la tarea programada es muy simple:

sqlcmd -S miServidor\nombreDeInstancia -i C:\Scripts\MiScriptDeBackup.sql

Ya que sabemos programar los backups, no hay que quedarse ahí, hay que hacer lo mismo con las reindexaciones, chequeos de integridad, monitorización de esperas, etc. Sin SQL Server Agent es todo más engorroso, pero ni mucho menos imposible realizar una administración completa de una instancia de SQL Server Agent.

Para una guía completa de SQLCMD, dejo link a la ayuda: https://msdn.microsoft.com/es-es/library/ms162773.aspx. También a una guía que incluye la creación de tareas programadas para este mismo fin: https://support.microsoft.com/es-es/kb/2019698.

Y para terminar, he de citarme a mí mismo, ya que mi primera publicación en MSDN versaba sobre la automatización de backups y restores. Ha pasado tiempo, pero el artículo sigue vivo.

https://msdn.microsoft.com/es-es/library/bb972243.aspx

Esta semana se ha hecho público. Soy SQL Server, BI & Big Data External Advisor en MVP Cluster. Y qué menos que dedicarle unas líneas a este tema en este lugar que últimamente no actualizo en demasía.

http://mvpcluster.es/mvpclusterpress/44-noticias-rrhh/170-alberto-lopez-grande-se-incorpora-como-sql-server-bi-big-data-external-advisor-a-mvp-cluster

MVP ClusterPrimero os hablo del proyecto. MVP Cluster es, o mejor dicho, yo he percibido que es, una aventura de unos pocos frikis (como yo) que, cansados del proyecto en “modo infierno”, como ellos lo llaman, montan su propia empresa y empiezan a atraer para sí el talento, mucho talento, para cuidarlo, valorarlo y crecer con él, una decidida apuesta por la calidad.

Que esta forma coloquial de expresarlo no le dé a nadie la impresión de que esto es un chiringuito de cuatro amiguetes, porque no lo es, todo lo contrario. Va muy en serio, un proyecto bien pensado y sólidamente financiado. La idea básica es pocos, pero los mejores, y de un amplio abanico de tecnologías del ecosistema Microsoft, para aportar una calidad diferencial. Debajo un par de capas de buenos profesionales con muchas ganas de crecer con el proyecto y que cuentan con el mentoring de los de arriba. Lo mejor de todo, gestionado por técnicos, muy bregados, pero que son de los nuestros, de los que no tienes que contarles las cosas con muñecos y que empatizan contigo a la primera, porque están igual que tú, se las han comido igual que tú y saben lo que hay y lo que no. Si además van de cara, con total transparencia y con esa ilusión que sólo se da en los inicios imperfectos de las cosas bonitas, en fin, que lo tienen todo y que les va a ir muy bien, con o sin mí. De hecho, ya les va bien.

Mapa de servicios de MVP CusterAsí, en temas de Sharepoint y colaboración en general tienen a varios cracks, aquíson referencia. También en comunicaciones unificadas, en Azure, en ALM, en productividad, formación, etc. Gente joven, creciendo y sabiendo el terreno que pisan.

http://mvpcluster.es/soluciones

“Y si son los mejores, ¿qué pinto yo en esto?”, podrá argumentar el lector crítico y avezado, es decir, casi todos. Fácil. Por un lado, y como los gallegos, en todas partes tiene que haber un DBA. No puedes ir de líder tecnológico por ahí y que cuando lo pongas a funcionar, aquello no se mueva porque el modelo de datos es nada más que regulero. Bueno, salvo en MS. Por otro, en SQL Server y BI, los demás estaban ya cogidos.

http://mvpcluster.es/equipo

A mí me han pillado también a punto de caramelo, con ganas de crecer y aportar de otras maneras. Así que eso haré, echar una mano en lo que pueda ser útil y cuando mis labores en GCO me lo permitan (bueno, y que lo permitan también la familia, los foros de MS, la política, el gimnasio, el fútbol, las cervezas de los viernes y un largo etc.). Quiero también aprovechar para agradecérselo a los que han hecho posible este acercamiento. Y al equipo, que me han dado una acogida muy cariñosa, de esas que hacen que uno se ponga colorado.

En conclusión, mi recomendación para MVP Cluster, socio tecnológico (nota mental: hablar de arquitectura), proveedor de soluciones de Sharepoint, productividad, movilidad, formación y un largo etc., que incluye también SQL Server, BI, Bigdata, y en cuyos proyectos, ya sean específicamente relacionados con el mundo SQL Server o no, como cuestión transversal que es la base de datos, espero poder participar para aportar mi criterio y experiencia. Dejo aquí unos links, también crearé algunos fijos en esta web, para que podáis contactar con ellos o conmigo si hay algo en lo que podamos trabajar juntos.

Hay cosas que a uno sólo te pasan si es MVP. De otro modo, a ver cómo se explica que vaya a ser uno de los ponentes de un SQL Saturday. Es lógico, ya que formo parte del equipo que lo organiza, pero una cosa es estar apoyando en lo que se pueda y otra bien distinta es compartir tablas con rutilantes figuras del calibre de Scott Klein, Peter Myers o Miguel Egea, entre otros.

Alineación del SQL Saturday Barcelona

Alineación del SQL Saturday Barcelona

Y ahí está mi cara, la última, pero no por ello menos orgulloso, tendré mi puesto en el track de administración en el SQL Saturday Barcelona 2014, el 338 de la serie histórica, el primero que se celebre en España. Todo un honor, que además será una buenísima ocasión que tendré de reencontrarme con viejos amigos, estar cerca de los mejores y aprender de ellos todo lo que pueda. La ciudad me encanta, y es también un aliciente, para mí y para todo el que venga. Hay que recordar también que el Tech-ed es justo allí la siguiente semana, habrá mucha gente que pueda aprovechar y pasarse por allí. O eso esperamos, ya que la fecha no la escogimos al azar.

31047e9f-e891-4cef-9e1f-20c39c90ddbe

Barcelona, ciudad del SQL Saturday #338

En esto de la organización, la experiencia está siendo apasionante. De todo ello, la selección de ponentes ha sido lo que más me ha gustado hasta ahora. Había mucho donde elegir y buenísimo, así que ha costado. Lo que sí sabíamos es que el cartel iba a ser de escándalo (no hay más que verlo), con lo que la esencia del evento, que es juntar a la comunidad en una jornada de formación gratuita, tendrá un nivel altísimo. No quiero ni pensar qué precio tendría una conferencia con el caché de cada uno. Pues bien, vienen gratis y se pagan el viaje. Aún así, el tinglado que hay que montar conlleva unos gastos, y seguimos reclutando sponsors que quieran aprovechar la visibilidad de este evento, aquí dejo el enlace. Todos son bienvenidos y desde una cuantía más que modesta:

http://www.sqlsaturday.com/338/sponsors.aspx

Y bueno, ahora estamos preparando la ponencia. En esta ocasión tan especial, hablaré de migración a SQL Server 2014, y no para mostrar cómo se utiliza el instalable precisamente. Eso es el empujón final de un largo camino que hay que recorrer y que empieza por formarse. Qué mejor ocasión que asistir a este SQL Saturday para ello. Regístrate, si aún no lo has hecho, porque será la releche.

http://www.sqlsaturday.com/338/register.aspx

¿Y será irrepetible? Pues esperemos que no, y que sea el primero de muchos SQL Saturday en los que pueda participar. Y si es por aquí cerca (a 600 y pico kilómetros de casa), mejor. De momento, habrá que disfrutar de esta ocasión, por si acaso. Allí espero verte.

La palabra “conocer” es polisémica. Aparte del sentido bíblico, podemos establecer dos niveles. Está “saber lo que es conceptualmente, ser consciente de su existencia” y luego está el nivel “dominar y poseer experiencia en la materia en cuestión”. yo no hace tanto que llegué a ese segundo nivel con OpenQuery. Los que tenemos la “suerte” de lidiar con motores que no son SQL Server, como DB2, estamos acostumbrados a que aquello, vía linked server tal cual (por nombres de cuatro partes), sea un suplicio. Sin embargo, con OpenQuery, le mandas lo que haya que buscar, filtradito, y la diferencia es como la noche y el día. Y lo mismo para leer que para escribir. No hay que olvidar que con OpenQuery estamos enviando la sentencia completa al servidor de destino para que la resuelva él.

Ahora estoy en la fase de, como lo que tengo es un martillo, todo me parece un clavo, y lo último que me he preparado es un recopilador de datos de jobs por esta vía. Es decir, ya no es sólo para acceder a DB2, sino también a otros motores SQL Server. Que se puede hacer de otras formas, que no rinde tan mal incluso directamente, pero como ya le he cogido el truco y la inercia al “select * from OpenQuery(…”, sabe hasta mejor.

Así, la sentencia básica sería:

select 'INSTANCIA' as Server, Job, DiaEjecucion, 
	HoraEjecucion, Duracion, Paso, NombrePaso, Mensaje
from OpenQuery([INSTANCIA], '
select g.name as Job, cast(h.run_date as varchar(20)) as DiaEjecucion, 
	right(''000000'' + cast(h.run_time as varchar(20)), 6) as HoraEjecucion,
	right(''000000'' + cast(h.run_duration as varchar(20)), 6) as Duracion,
	h.step_id as Paso,
	h.step_name as NombrePaso,
	h.message as Mensaje
from (
select j.name,h.instance_id id   
from 
	msdb.dbo.sysjobs j with(nolock) inner join 
	msdb.dbo.sysjobhistory h with(nolock) on j.job_id = h.job_id   
and h.run_status=0    
) g inner join msdb.dbo.sysjobhistory h with(nolock)on g.id = h.instance_id   
where h.step_id > 0 and
	h.run_date >= cast(CONVERT(char(8),dateadd(dd,-1,getdate()),112) as int)') T

 

Y si eso lo hacemos dinámico, empleando los servidores vinculados, volcando el resultado a una tabla, obtenemos lo siguiente (lleva una segunda parte para formatear un HTML que permita enviar el resultado por mail):

create proc [dbo].[Jobs_Fallidos] 
  @pOut varchar(max) = null output, 
  @pDestino varchar(10) = 'Mail', 
  @pTODO_OK bit = 0 output,
  @pFechaHoraDesde smalldatetime = null
  
  as

--Para sólo recuperar los de las últimas x horas
select @pFechaHoraDesde = isnull(@pFechaHoraDesde, dateadd(hh, -14, getdate()))

declare @sql nvarchar(max), @parte_fija nvarchar(max)

select @sql = '', @parte_fija = N'
    select ''#NombreLinkedServer#'' as Server, Job, DiaEjecucion, 
	  HoraEjecucion, Duracion, Paso, NombrePaso, Mensaje
	from OpenQuery([#NombreLinkedServer#], ''
	select g.name as Job, cast(h.run_date as varchar(20)) as DiaEjecucion, 
		right(''''000000'''' + cast(h.run_time as varchar(20)), 6) as HoraEjecucion,
		right(''''000000'''' + cast(h.run_duration as varchar(20)), 6) as Duracion,
		h.step_id as Paso,
		h.step_name as NombrePaso,
		h.message as Mensaje
	from (
	select j.name,h.instance_id id   
	from 
		msdb.dbo.sysjobs j with(nolock) inner join 
		msdb.dbo.sysjobhistory h with(nolock) on j.job_id = h.job_id   
	and h.run_status=0    
	) g inner join msdb.dbo.sysjobhistory h with(nolock)on g.id = h.instance_id   
	where h.step_id > 0 and
	  h.run_date >= cast(CONVERT(char(8),dateadd(dd,-1,getdate()),112) as int)'') T'  


if object_id ('tempdb..#fjobs') > 0
	 drop table #fjobs   
	 
create table #fjobs 
  (Server varchar(15) not null, 
   Job varchar(100) not null, 
   DiaEjecucion char(8) not null, 
   HoraEjecucion char(6) not null, 
   Duracion char(6) not null,
   Paso int null,
   NombrePaso varchar(100) null,
   Mensaje varchar(max) null
   )


select @sql = @sql + replace(@parte_fija, '#NombreLinkedServer#', name) + ' union all
'
from sys.servers where provider = 'SQLNCLI'

select @sql = left(@sql, len(@sql) - 12)

insert #fjobs
exec sp_executesql @sql

delete from #fjobs 
where DiaEjecucion + ' ' + 
  left(HoraEjecucion,2)+':'+substring(HoraEjecucion,3,2) < @pFechaHoraDesde

--Listado de jobs que han fallado
 select cast(h.Server as nvarchar(15)) Server, 
  cast(h.Job as nvarchar(100)) as Job, 
  cast(h.DiaEjecucion as nvarchar(8)) as DiaEjecucion,  
  cast(HoraEjecucion as nvarchar(6)) as HoraEjecucion, 
  cast(Duracion as nvarchar(8)) as Duracion,
  cast(Paso as nvarchar(10)) as Paso, 
  cast(NombrePaso as nvarchar(100)) as NombrePaso, 
  cast(Mensaje as nvarchar(500)) as Mensaje
 from #fjobs h 
 order by Server, Job, DiaEjecucion, HoraEjecucion, Paso 
 

--Apartir de aquí, es un divertimento para enviar un mail con este listado
if @pDestino = 'Mail' and exists(select top 1 h.Server from #fjobs h)  
 begin
  select @pOut = '<html> 
<head> 
<STYLE TYPE="text/css"> 
<!-- 
body{font-family: Segoi UI; font-size: 9pt;} 
TH{font-family: Segoi UI; font-size: 9pt; color: 000099} 
TD{font-family: Segoi UI; font-size: 9pt;} 
---> 
</STYLE> 
</head> 
<body><p>'+ 
  'Jobs Fallidos en las últimas horas:</p>' +    
'<table  border=1 cellspacing=0 cellpadding=3> 
<tr><th>Servidor</th><th>Job</th><th>Dia</th><th>Hora</th><th>Duracion</th>
<th>Step</th><th>Nombre</th><th>Mensaje</th>
</tr>'
 
  select @pOut = @pOut +  ' 
  <tr>' + 
  '<td>' + h.Server + '</td>' + 
  '<td>' + rtrim(h.Job)  + ' </td>' +   
  '<td>' + h.DiaEjecucion  + ' </td>' +   
  '<td>' + left(h.HoraEjecucion,2)+':'+substring(h.HoraEjecucion,3,2) + ' </td>' +   
  '<td>' + left(h.Duracion,2)+':'+substring(h.Duracion,3,2)+':'+right(h.Duracion,2)+''' </td>'+
  '<td>' + cast(h.Paso as varchar(10)) + ' </td>' +
  '<td>' + h.NombrePaso + ' </td>' +
  '<td>' + left(h.Mensaje, 200) + ' </td>' +
  + '</tr>'
  from #fjobs h  
  order by Server, Job, DiaEjecucion, HoraEjecucion, Paso
 
 select @pOut = @pOut + '</table>' + 
 '<p>No responda a este mensaje</p>' +
 '<p>Sistemas de Información.<BR>
 Plus Ultra Seguros.</p>' +
'</body> 
</html>'

 end

if not exists(select top 1 h.Server from #fjobs h) 
 select @pTODO_OK = 1
else 
 select @pTODO_OK = 0

if object_id ('tempdb..#fjobs') > 0
 drop table #fjobs
 
set nocount off

return 0

 

Y bueno, ya está. Hemos hecho uso y abuso de OpenQuery.

A raíz de una pregunta surgida en el foro, aprovecho para hacer un breve post que recuerde esta funcionalidad, la posibilidad de capturar los registros de una operación DML para recuperarlos o tratarlos en general. La pregunta concreta en cuestión era cómo insertar un registro en una tabla a la que lo borras de otra:

http://social.msdn.microsoft.com/Forums/es-ES/be6b1c73-154b-41c4-9c35-d385d86e2083/como-hacer-para-que-antes-de-eliminar-un-registro-me-lo-inserte-en-otra-tabla?forum=sqlserveres

Habiendo varias alternativas, una es emplear la cláusula OUPUT. Tan fácil como esto:

CREATE TABLE dummy (Id int, campo varchar(10))
GO
CREATE TABLE Otra (Id int, campo varchar(10))
GO

INSERT dummy (Id, campo)
VALUES
(1, 'a'),
(2, 'b'),
(3, 'c'),
(4, 'd'),
(5, 'e')

GO

DELETE dummy
OUTPUT DELETED.* INTO Otra
WHERE Id = 3
GO

SELECT * FROM Otra
GO

Y ya está.


Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies