1. SoluciónSSIS para ejecucionescentralizadasengrandesentornos SQL SERVER.
En lostiemposque correnesbastante comúnque un DBA que trabaje enuna gran compañía
administre decenas,cientosoinclusomilesde instanciasSQLSERVER,porlo que una tarea tan
sencillacomocambiarunparámetrode configuracióndel servidor,instalarunnuevoplande
mantenimientoomodificarlaprogramaciónde backupentodas ellaspuede resultarunatareade lo
más tediosa.
Para podercontrolary automatizarenla medida de loposible este tipode operacionesyoptimizar
nuestrovaliosotiempose hadiseñadoestasolución.
A grandesrasgosel objetivoestenerunlistadode servidoresenunatablaconun campo enel que
cargaremosel códigoTSQL que deseamosejecutarsobre cadainstancia.
Instancia SQL
VAIO select@@version
Después,conlaayuda de SQL SERVER DATA TOOLS (SSTD) crearemosunpaquete de intrgration
servicesconunaconexióndinámicaque recorrerádichatablayejecutaráel códigoTSQL encada
una de las instancias.
De estamanera,algocomo crear un LOGIN,un LINKEDSERVER, o modificarel valordel Remote
QueryTimeoutentodasnuestrasinstanciaspodrállevarnosunospocosminutos.
Elementosnecesarios:
1 -Base de datos de herramientas:
Para contenerlastablasde configuraciónyde LOG que vamosa utilizarcrearemosunabase de
herramientasllamadaDBA,personalmentesiempre me gustatenerestabase de datosenlas
instanciasque administroparaalbergarmistablas,reportesyprocedimientosalmacenadosde
administración.
2 –Tabla de instancias:
En la base de datos DBA crearemosunatablallamada SSIS_All_instancesque constaráde 2 campos,
Instancia (Nombre exactode cadainstanciaque queramosincluir) y SQL(CódigoTSQL a ejecutar).
USE DBA
GO
CREATE TABLE [dbo].[SSIS_All_instances](
[Instancia] [varchar](200) NOT NULL,
[SQL] [varchar](MAX) NULL
) ON [PRIMARY]
GO
3 –Tabla de LOG.
Al tenerque establecerconexionesconmuchosservidores,nonosinteresaque unfallode conexión
o de ejecuciónsobre unode ellosfinaliceel trabajo,perosíteneruncontrol de encualesse ha
ejecutadoyencuálesno.Para ello,tambiénenlabase de datos DBA crearemoslatabla
SSIS_exec_LOG que constará de doscampos name (Nombre de lainstancia) y result(Resultadode la
ejecución).
2. name result
VAIO Success
USE [DBA]
GO
CREATE TABLE [dbo].[SSIS_exec_LOG](
[name] [varchar](200) NOT NULL,
[result][varchar](50) NULL
) ON [PRIMARY]
GO
4 –Paquete SSIS.
Esta es laparte fundamental delproyecto,yse explicaradetalladamenteelementoporelemento.
ELEMENTOS DEL PAQUETE SSIS
1 –Variables:
Crearemoslastresvariablesque vamosanecesitar
3. 2 -Connection manager:
Para este paquete vamosanecesitardos conexionesque enmi casoson:
1 Vaio.DBA_SA:Se conectade forma directaa mi servidorde administraciónyami base de datos
DBA. Es laque utilizaremosparahacerla consultaa latabla SSIS_All_instancesypara cargar los
resultadosenel LOG.
La configuramosconel usuarioSA o con unusuarioque seaSYSAdminenlainstanciadonde hemos
creadola base de datosDBA y lastablasde configuraciónyde LOG.
2- Dynamic_Server_SA: Esta conexiónlaconfiguraremosparaque de formadinamicase vaya
conectandoa cada servidorque tengamosenlatablaSSIS_ALL_INSTANCES.
4. La manerade darle este dinamismoescreandounaexpresiónenlaventanade propiedadestal y
como se muestraenla imagen,seleccionarlapropiedadServerName e introducirlaexpresión
@[User::Servername]
Tambiénlaconfiguramosconel usuarioSA o con un usuarioque seaSysadminentodaslas
instancias.
3 –Tarea execute SQL (Delete_Log_Table)
Utilizamosestatareapara eliminarlosregistrosde latablade LOG antesde cada ejecución.
truncate table SSIS_exec_LOG
Esta tarea utilizarálaconexiónalabase de datosDBA,en mi caso Vaio.DBA_SA
4 –Tarea execute SQL (Select Servidor)
Esta tarea tambiénutilizarálaconexión Vaio.DBA_SAyserála encargadade recopilarlalistade
instanciasde nuestratabla.El resultadoloalmacenaremosenlavariable ServerListque definimos
anteriormente pormediolapropiedadResultSet.
5. El SQLStamentde latarea será el siguiente:
SELECT Instancia, SQL from SSIS_All_instances
5 – Foreach Loop Container
Este bucle recibirálalistade instanciasdel resultsetde latareaanteriory la recorreráejecutándose
una vezpor cada una de ellas.
Debemosconfigurarel apartadocollectionde lasiguiente manera.
6. Y Variable Mappings,enel que le asignaremosuníndice acada variable que vamosa utilizar
mapeandoel resultadode laconsulta.
7. Con estoya tendríamosconfiguradoel Foreach LoopContainer,peroojo,porque al tratarse de un
listadoque puede sermuyamplioyenalgúncaso puede fallarlaconexiónoejecuciónenalgunade
lasinstancias,nonos interesaque estohagafinalizarel procesocompleto.
Para evitarestodebemosmodificarlapropiedad ForceExecutionResultdentrode laspropiedades
del ForeachLoop estableciéndolaen Success.De estamanera,aunque laejecuciónfalleenalguna
de las instanciasoni siquieraseacapazde conectarse a ella,continuaráconlasiguiente.
8. Lo que sí nosinteresaesregistrarenlatabla de LOG el resultadode laejecuciónencadainstancia
para poderrevisarloposteriormente,loveremosal final deldocumento.
6 -Tarea (Execute SQL):
Esta tarea nosservirápara ejecutarel comandointroducidoenel campoSQLde la tabla
SSIS_All_instancessobre cada instanciaporla que pase el bucle foreachLoop.
Esta sentenciahasidoalmacenadaanteriormente enlavariable llamadaSQLporlo que editamosla
tarea y laconfiguramosde lasiguiente manera
Conection:Dynamic_Server_SA (Conexióndinámica)
SQLSourceType:Variable
SourceVariable:User::SQL
9. 7 –LOG_Successon table
Comohemoscomentadoanteriormente nosinteresaregistrarel resultadode laejecuciónencada
instanciaenunatabla de LOG, para elloenla líneade Workflow de éxitocolocaremosunatareaque
introduciráenlatabla SSIS_exec_LOG el nombre de lainstancia(obtenidode lavariable
Servername) yel texto"Success".
En la configuraciónde latareadebmoseditarel apartado ParameterMapping de lasiguiente
manera.
10. Añadimosunparámetromapeadoala variable Servername,loque nosdaráel nombre de la
instanciasobre laque se ha ejecutadolainstrucciónSQL,eneste caso de formaexitosa.
El SQL SourceTypeeneste casoserá DirectImput,ya que pondremosel códigoSQLdirectamente
En el apartado SQLStatementintroducimosel siguiente código:
insertinto SSIS_exec_LOG (name,result)
values(?,'Success')
Y configuramoslatarea con laconexiónestáticaala base de datos DBA en laque se encuentrala
tablaSSIS_exec_LOG(Vaio.DBA_SA).
8 –LOG_Error on table.
En el Workflowde failure correspondientealatarea Execute SQL colocaremosestatareaque
configuraremosde maneraidénticaala anteriorconla únicadiferenciade que el códigoTSQL
registraráenla tablade LOG el texto"Error" enlugar de "Success".
insertinto SSIS_exec_LOG (name,result)
values(?, 'Error')
11. Con estoya tendríamoscompletadoel paquete SSIS.
Por último,haremosdeploydel proyectoyconfiguraremosunJobdentrodel SQLServerque ejecute
el paquete dtsx al que enprincipionole asignaremosningunaprogramaciónyaque estápensado
para ejecucionesAdHoc.
En el siguiente ejemplovamosamodificarel parámetro ''costthresholdforparallelism''entodaslas
instanciasque tengamosenlatablainventario.
Primerocargamostodas lasinstanciasenlatablaSSIS_All_Instancesjuntoconel códigoSQL a
ejecutar.
insertinto SSIS_All_Instances(Instancia,SQL)
selectinstancia,
'USEmaster
GO
EXEC sys.sp_configure N''costthresholdfor parallelism'',N''25''
GO
RECONFIGUREWITH OVERRIDE
GO'
from inventario
Una vez cargada nuestratablade configuraciónejecutamosel Jobque llamaal paquete dtsx que
acabamos de crear.
Puede tardarun rato dependiendodelnúmerode instanciasque tengamos.
Finalmentepodemosrevisarlatabla SSIS_exec_LOG de nuestrabase de datos DBA para ver en
cuálesse ha ejecutadocorrectamente yencualeshahabidoalgúnerror.
Comoveis,conla ayudade estasolución,simplementemodificandonuestratablade configuración
podemoshacermodificacionesde formamasivaentodonuestroentornoenunospocossegundos.