sábado, 28 de julio de 2012

Windows: Respaldando SQL Server 2008 R2.

Esta vez vamos a tocar los respaldos de sql server, yo estoy trabajando sobre la version 2008 R2. Muy pocas veces me he metido con esta BD, pero como nos llego deseo conocer de ella, los respaldos de cualquier BD son de las tareas aparte de importantes de alta prioridad.

No quiero decir que las demas tareas de sistemas no lo sean pero estas tienen prioridad, todo lo que hagan debe tener su valor de prioridad.

SQL server tiene opcion de crear batches y ahi dentro uno armar su klabacero, quiero mencionar que el script que use lo tome de una persona, ahorita que lo vean ahi viene su nombre, yo solo lo adapte a mis necesidades.

Un detalle que le encontre a el script es que cuando se ejecuta el script diferencial(ahorita entramos en detalles) con la BD master truena con ella pero continua con las demas.

Cuando vi esto en el log rapidamiente me fui a googlear y por ahi localice docs de Redmont que nos dice que la BD master solo permite backups FULL, si no creen traten con "Server Management Studio" y traten de hacerlo, no los deja. 

Desconozco si en las versiones anteriores es diferente, pero no hay problema por que es una BD que pocas veces se modifica, si su caso es diferente entonces van a tener que crear un batch que la respalde diario.

Tipos de Respaldos, estoy trabajando sobre 2 solamente:

Full: Crea un respaldo completo.
Diferencial: Crea un respaldo con los datos que cambiaron en base a el ultimo respaldo.

Configuracion de Directorio de Respaldos:

A mi no me gusta usar el directorio que usa SQL Server, yo prefiero usar uno especifico para respaldos, yo en esta ocacion voy a crear un folder en el disco C: llamado Backups, quedaria asi la ruta:

C:\Backups

Agenda de Respaldos:

Vamos a usar el mismo Task Scheduler de Windows, en esta version si cambia pero la interface, los parametros continuan, vamos a confiurar asi mis respaldos:

Full: Lun, Miercoles, Viernes, Sabado.
Diferenciales: Martes, Miercoles, Jueves

Como mi servidor de produccion esta dentro de un dominio bajo Linux con samba+Ldap entonces mi autentificacion es atraves de Windows, es importante saber el nombre del equipo donde esta operando, en mi caso se llama:

WIN-U4I7H5GMO2U

Es la version SQL 2008 R2 Express mi instancia asi se llama:

sqlexpress

Esto pronto van a ver donde se va a usar.

Parece que ya tenemos la info que necesitamos, vamos a empezar por ver los scripts de respaldo, empezando por el Full.

Full Script: sql-bak-full.sql.

Contenido:

-- SQL Server backup routine to backup all databases
-- Jed S. Walker, 2011/10/03
-- to automate via job scheduler
--  sqlcmd -S theSQLserver\theWeather -i C:\SQLSERVERBACKUP\scripts\backup_db_all.sql -o C:\SQLSERVERBACKUP\backup_db_all.log
--Customize by: pmoreno at bajaopensolutions dot com 2012-07-25


PRINT '=>Setup base variables'
DECLARE @today VARchar(20)
DECLARE @dbname nvarchar(255)
DECLARE @backupname nvarchar(255)
DECLARE @backuploc nvarchar(255)
SET @backuploc = 'C:\Backups\'  
PRINT @backuploc
--SET @today = CONVERT(CHAR(8), GETDATE(), 112)
SET @today = REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(20), GETDATE(), 126),'-',''),':',''),'.','')
PRINT @today


---- backup all online databases
-- first get all databases to be backed up
DECLARE @dbList TABLE
( dbid INT,
  dbname NVARCHAR(256)
)
INSERT  INTO @dbList ( dbid, dbname )
SELECT  dbid, name
FROM    master.dbo.sysdatabases
WHERE   ( name NOT IN ( 'tempdb' ) )
AND DATABASEPROPERTYEX(name, 'Status') = 'ONLINE'
ORDER BY dbid


------ Starting backup, one by one
DECLARE @maxid int;
DECLARE @curid int;
SELECT @curid = MIN(dbid)-1, @maxid = MAX(dbid) from @dbList;


PRINT '=> Perform backups'
WHILE @curid != @maxid
  BEGIN
    SELECT  TOP(1)
            @curid = dbid,
            @dbname = dbname
    FROM    @dbList
    WHERE   dbid > @curid;
    PRINT 'Debug: curid= ' + str(@curid) + ' maxid=' + str(@maxid)
    SET @backupname = @backuploc + @dbname + '_' + @today + '.bakF'
    PRINT N'=> Backup: ' + @dbname + ' to ' + @backupname
    BACKUP DATABASE @dbname TO DISK = @backupname with NOFORMAT, NOREWIND, INIT, SKIP, CHECKSUM, STOP_ON_ERROR
  END


PRINT ''
PRINT '=>Done with backups'


NOTA: Ahi viene el autor original.

Marque en Bold una instruccion esa indica que la BD tempdb no nos interesa, segun la doc de Sql Server no es critica esa BD.

Este script lo almaceno en el mismo directorio donde se van los respaldos C:\Backups.

Ahora viene el Diferencial:

Diff Script: sql-bak-diff.sql.
Contenido:


-- SQL Server backup routine to backup all databases Differential
-- Jed S. Walker, 2011/10/03
-- to automate via job scheduler
--   sqlcmd -S theSQLserver\theWeather -i C:\SQLSERVERBACKUP\scripts\backup_db_all.sql -o C:\SQLSERVERBACKUP\backup_db_all.log
-- Customize by pmoreno at bajaopensolutions dot com 2012-07-25




PRINT '=>Setup base variables'
DECLARE @today VARchar(20)
DECLARE @dbname nvarchar(255)
DECLARE @backupname nvarchar(255)
DECLARE @backuploc nvarchar(255)
SET @backuploc = 'C:\Backups\'  
PRINT @backuploc
--SET @today = CONVERT(CHAR(8), GETDATE(), 112)
SET @today = REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(20), GETDATE(), 126),'-',''),':',''),'.','')
PRINT @today


---- backup all online databases
-- first get all databases to be backed up
DECLARE @dbList TABLE
( dbid INT,
  dbname NVARCHAR(256)
)
INSERT  INTO @dbList ( dbid, dbname )
SELECT  dbid, name
FROM    master.dbo.sysdatabases
WHERE   ( name NOT IN ( 'tempdb','master' ) )
AND DATABASEPROPERTYEX(name, 'Status') = 'ONLINE'
ORDER BY dbid


------ Starting backup, one by one
DECLARE @maxid int;
DECLARE @curid int;
SELECT @curid = MIN(dbid)-1, @maxid = MAX(dbid) from @dbList;


PRINT '=> Perform backups'
WHILE @curid != @maxid
  BEGIN
    SELECT  TOP(1)
            @curid = dbid,
            @dbname = dbname
    FROM    @dbList
    WHERE   dbid > @curid;
    PRINT 'Debug: curid= ' + str(@curid) + ' maxid=' + str(@maxid)
    SET @backupname = @backuploc + @dbname + '_' + @today + '.bakD'
    PRINT N'=> Backup: ' + @dbname + ' to ' + @backupname
    BACKUP DATABASE @dbname TO DISK = @backupname with DIFFERENTIAL, NOFORMAT, NOREWIND, INIT, SKIP, CHECKSUM, STOP_ON_ERROR
  END


PRINT ''
PRINT '=>Done with backups'

Ahora en bold les muestro como estoy agregando la BD master por lo que les mencione arriba hacerca de esta BD, no deseo crear respaldos diferenciales a ella por eso la marco en esa instruccion.

Ya tenemos nuestros sctripts sigue los batches que los van a ejecutar, estos son mas sencillos, aqui estan:

Batch Full: sql-backup-full.bat
Contenido:

sqlcmd -S WIN-U4I7H5GMO2U\sqlexpress -E  -i C:\Backups\sql-bak-full.sql -o C:\Backups\backupF.log

-S Nombre de instancia.
-E Usar conexion segura.
-i archivo de entrada
-o Archivo de salida (logs).

Batch Diff: sql-backup-diff.bat
Contenido:


sqlcmd -S WIN-U4I7H5GMO2U\sqlexpress -E  -i C:\Backups\sql-bak-diff.sql -o C:\Backups\backupD.log

Ahi pueden notar las diferencias, si las notan verdad?

Si desean probarlos antes de continuar es muy facil, solo abren su consola cmd en modo Administrador(es windows :-(...) se van a el directorio donde estan sus bacthes y scripts, en mi caso esta en el mismo lugar todos C:\Backups.

Ya dentro, solo ejecutan:

C:\Backups\sql-backup-full.bat

C:\Backups\sql-backup-diff.bat

Si no hay errores no van a recibir nada de salida, todo se va ir a los logs indicados en con el parametro -o.

Ahora vamos a llevar a cabo la programacion de la ejecucion de estos scripts, para esto abrimos nuestro Task Scheduler, esto es mas grafico y facil de hacer, vamos viendo los pasos:

Figura 1: Abrir el Task Scheduler.
Dentro del TS(Task Scheduler) creamos una tarea nueva.

Figura 2: Ingresamos datos basicos.
Vamos usar solo las pestañas: General, Triggers, Actions, las demas no.


Figura 3: Indicamos cuando deseamos la ejecucion.
Para que se vea la ejecucion estoy indicando el dia de hoy a las 6:11PM sabado, ustedes ya que lo vayan a llevar a produccion lo configuran a su manera.

Figura 4: Indicamos aqui la ruta del batch.
Sigan el wizard para indicarle donde esta el batch.

Figura 5: Configuracion Final.
Ya terminamos ahora es cuestion de esperar y ver si se lleva a cabo la tarae cuando se indica. Ya paso la hora indicada vamos a ver nuestro directorio a ver si se ejecuto:

Figura 6: Respaldos creados.
Como podran ver parece que funciono, ya solo es cuestion de terminar el Diff, si ya les funciono el Full, el diff ya es pan comido.

Ya solo quedaria probarlos, pero esa es otra historia que sigue despues de hacer creado sus respaldos.

Saludos.

No hay comentarios: