Você está na página 1de 21

Backups automticos de SQL Server Express

Backup SQL Server Express

SQL Server Express

Es bien sabido que las versiones Express de SQL Server no disponen del agente de SQL Server
para programar trabajos que se encarguen, entre otras cosas, de los backups de las diferentes
bases de datos.
Hace das, buscando sobre el tema encontr una solucin muy simple que voy a compartir y
explicar en sta entrada.
Para hacer backups automticos de las bases de datos de SQL Server Express, basta seguir los
siguientes pasos:

Entrar a SQL Server Management Studio Expres

Desplegar el nodo Server Objects y seleccionar el nodo Backup Devices como se indica
en la imagen.

Clic derecho sobre Backup Devices y seleccionar la opcin New Backup Device...

Sobre el campo Device name usar un nombre de dispositivo que se va a usar para el
backup. Yo uso como nombre de dispositivo el mismo nombre de la base de datos a la
cual le voy hacer backup con este procedimiento, pero es indiferente. Si quiere puede
llamarlo potato. No importa.
Seleccionamos la opcin File para hacer backup al disco duro y hacemos clic en el botn
... para seleccionar la ruta de destino del backup.

Se abre la ventana para seleccionar la ruta de destino del backup. En este caso se
seleccin el directorio (eso de decir carpeta, es como muy feo) G:\Backups SQL.
En el campo File name indicamos el nombre del archivo de backup CON SU
EXTENSIN! En este caso he colocado el mismo nombre de la base de datos a la cual le
voy hacer backup mediante este procedimiento. Para finalizar hacemos clic en el botn
OK.

La configuracin del dispositivo de Backup debe quedar como indica la siguiente imagen.
Para finalizar hacemos clic en el botn OK.

El dispositivo de backup que se acaba de crear debe verse listado como lo indica la
siguiente imagen.

Para hacer backup en este dispositivo ejecutamos el siguiente comando en una lnea de
comandos:

sqlcmd -S <Servidor>\<Instancia> -E -Q "BACKUP DATABASE <Base de Datos>


TO <Dispositivo de backup>"

Donde:
o <Servidor>: Indica el nombre del servidor SQL.
o <Instancia>: Corresponde al nombre de la instancia de SQL. Si el servidor SQL no
tiene instancia, omita este dato.
o <Base de Datos>: Indica el nombre de la base de datos a la cual se le har backup.
o <Dispositivo de backup>: Nombre del dispositivo de backup en el cul har el
backup.
Para este caso concreto voy hacer backup de la base de datos NavoriSQL en el

dispositivo de backup creado en este procedimiento que lleva su mismo nombre. Por
ejemplo:
sqlcmd -S SERVIDOR -E -Q "BACKUP DATABASE NavoriSQL TO NavoriSQL"

En el directorio seleccionado para los backups, debe quedar el backup de la base de datos.

El ltimo paso sera insertar en un archivo .BAT el comando que realiza el backup y
mediante las tareas programas de Windows programar la ejecucin de este archivo
.BAT

Cabe apuntar que este procedimiento es vlido para cualquier versin de SQL Server. No
solo se limita a las versiones Express.

SQL Server Express: Hacer backups programados y con


retencin
SQL Server Express es una excelente opcin para trabajar con SQL Server en proyectos
pequeos y medianos sin tener que pagar licencias. Es una versin gratuita pero totalmente
funcional del gestor de base de datos relacionales de Microsoft. A cambio tiene ciertas
limitaciones. Por ejemplo, no permite utilizar ms de 1 GB de RAM por instancia para cach de
datos en memoria y el tamao de cada base de datos gestionada no puede superar los 10 GB (que
es un tamao considerable para aplicaciones normales). Carece de otras caractersticas de alta

disponibilidad y replicacin, pero ofrece toda la funcionalidad habitual (incluyendo integracin


de datos y reporting) y las herramientas de administracin. Aqu podrs encontrar una
comparativa de todas las ediciones de SQL Server.
Una de las cosas que no estn disponibles con SQL Server es el Agente SQL. El agente nos
permite programar tareas que se ejecutarn sobre las bases de datos cuando nosotros queramos.
Esta carencia dificulta un poco, por ejemplo, la realizacin de copias de seguridad, especialmente
si queremos mantener un periodo de retencin concreto (por ejemplo, las copias de los ltimos 7
das).
Por suerte esta carencia en concreto es muy fcil de solucionar, y en este artculo voy a explicar
cmo lograrlo de manera sencilla.
Lo primero que tenemos que saber es que todas las ediciones de SQL Server incluyen una
utilidad de lnea de comandos que nos permite ejecutar instrucciones T-SQL arbitrarias contra
cualquier base de datos. Se trata de SQLCMD.exe, generalmente ubicada en esta ruta:
"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE"
en el caso de SQL Server 2012 Express.
Esta utilidad tiene muchos parmetros que nos permiten controlar su forma de trabajar. Dos que
nos interesan especialmente son:

-S: nos permite especificar contra qu servidor/instancia se ejecutarn las


sentencias T-SQL.

-i: permite especificar una ruta a un archivo (normalmente con extensin .sql)
que contiene las instrucciones T-SQL que queremos ejecutar contra el
servidor. As podemos incluir scripts ms complejos que una simple lnea.

Sabiendo la existencia de esta herramienta, conseguir backups gracias a ella es muy sencillo.
1. Construir las instrucciones T-SQL base para hacer el backup

Lo primero es conseguir los comandos T-SQl para hacer un backup. Lo ms sencillo es usar las
herramientas integradas en el Microsoft SQL Server Management Studio (MSSMS). brelo,
busca la base de datos que te interesa copiar en el explorador de objetos y pulsa el botn derecho
del ratn sobre ella. En el men contextual elige la opcin de "Tareasbackup":

Esto abre una nueva ventana desde la que podemos definir cmo queremos realizar el backup:

Desde esta ventana elegimos la base de datos a copiar y la ruta en la que queremos guardar dicha
copia de seguridad (normalmente le damos como extensin al archivo .bak, pero puede ser
cualquiera o incluso no tener extensin).
Adems si pulsamos en la pgina "Opciones" en el lateral podemos configurar algunas cosas ms,
como por ejemplo (muy recomendable) que se verifique el backup al terminar de hacerlo:

OJO: la edicin Express no soporta la compresin de los backups, as que si seleccionamos esta
opcin en la lista desplegable de la parte inferior de la figura anterior, se producir un error al
realizar el backup.
Una vez que tengamos seleccionadas todas las opciones que necesitemos, podemos obtener el
cdigo necesario para realizar el backup usando el botn "Script" de la parte superior de la
ventana anterior. Por defecto nos copiar el cdigo generado a una ventana del MSSMS, as:

Con esto obtendramos una base de datos que se sobrescribira en cada nueva copia, Lo
interesante de las copias de seguridad es tener copias con una retencin de varios das, para poder
comprobar datos anteriores o restaurar los datos a un estado anterior.
2. Retocar el script para darle una semana de retencin

Supongamos que queremos hacer una copia de seguridad diaria y que queremos mantener las
copias durante 7 das, de modo que podamos recuperar los datos desde cualquier copia de
seguridad de la ltima semana. Para ello vamos a retocar el script anterior de modo que cada da
le cambie el nombre al archivo de copia de seguridad. Para ello vamos a declarar una variable
que servir para guardar la ruta y el nombre del archivo de copia de seguridad, cambindolo en
funcin, en este caso, del da de la semana en el que nos encontremos. En este caso sera as:
DECLARE @dest nvarchar(255)
SET @dest = 'C:\BackupsBBDD\SELF_' + CAST(DATEPART(weekday, GETDATE()) AS nvarchar(1)) + '.bak'

La funcin DATEPART con el valor weekday para el primer parmetro nos devuelve un nmero
para cada da de la semana, empezando por el domingo (un 1) hasta el sbado (un 7). Como le
pasamos la fecha actual (GETDATE) como segundo parmetro lo que obtendremos en la
variable @dest es cada da un nombre diferente para la base de datos, aadindole el nmero de
da de la semana para obtener nombres estilo: SELF_1.bak, SELF_2.bak, SELF_3.bak y as
sucesivamente.
En el script generado por el MSSMS bastar ahora por sustituir la ruta por el nombre de esta
variable y ya lo tendremos listo (ojo: hay que sustituirlo en dos sitios: en el backup y en la
verificacin del backup en la parte inferior).

Dado que en caso de que un archivo exista de backup se sobrescribir, en la prctica con este
script lo que conseguimos es que siempre haya 7 copias como mximo en el histrico.
3. Crear un bat para realizar el backup

Ahora que ya tenemos el cdigo necesario para crear las copias de seguridad lo que debemos
hacer es crear un archivo .bat que nos permita ejecutar este cdigo T-SQL cuando queramos. Para
ello usaremos SQLCMD.EXE, escribiendo esta instruccin:
"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE"
-S SERVIDOR\INSTANCIA -i "C:\BackupsBBDD\BackupSELF.sql" >>
log.txt
Debemos sustituir SERVIDOR\INSTANCIA por el nombre de nuestro servidor y la instancia de
SQL Server sobre la que queremos trabajar. En el parmetro -i debemos indicar la ruta al
archivo .sql con las instrucciones para la copia de seguridad que acabamos de crear.
La ltima instruccin ">> log.txt" nos permite guardar el resultado de la ejecucin en un archivo
de texto que podemos consultar para ver cundo se ha realizado cada copia, cunto ha tardado y
cualquier otro mensaje que se derive de la ejecucin del script. E spor eso que me gusta colocarle
al principio del script una instruccin ms como esta:
PRINT CAST(GETDATE() AS nvarchar) + ' - COPIA DE SEGURIDAD INICIADA AL ARCHIVO: ' + @dest

De este modo aparecer en el archivo Log.txt un mensaje al principio de cada copia de seguridad
indicando la fecha de creacin y el nombre del archivo. Podemos incluir del mismo modo
cualquier otra informacin que consideremos relevante.
4. Programar la tarea

Ahora que ya tenemos un script para hacer la copia de seguridad, y adems hemos creado un .bat
para ejecutarlo, lo nico que nos falta es crear una tarea programada para poder lanzarla con la
periodicidad que nos convenga (en principio cada da).
Para ello abrimos el administrador de tareas programadas del sistema y creamos una nueva tarea.
Lo nico que tendremos que hacer es indicar que queremos ejecutar el archivo .bat del paso
anterior as como a qu hora del da lo vamos a hacer:

Con esto habremos conseguido que todos los das a las 2:00 de la maana se realice una copia de
seguridad de la base de datos, con una retencin de 7 das:

Cada uno de esos archivos se corresponde con la copia de seguridad del domingo (1), lunes (2),
martes 83), etc
Si quisisemos un periodo de retencin de un mes, por ejemplo, sera tan fcil como cambiar el
parmetro de DATEPART por "day" de modo que se pusiera el nmero de da del mes. Podemos
jugar con los distintos valores del primer parmetro de DATEPART para conseguir otros
periodos, como por ejemplo, si hacemos ms de una copia al da, aadirle la hora de modo que
tengamos ms de un archivo diario
Si quieres aprender a programar bien SQL Server, no te pierdas estos dos cursos de campusMVP
(en ingls):

SQL Server 2012 fundamentals for developers

Hands on SQL Server 2012: Expert Programming and Design (tambin sirve para
preparar las certificaciones 70-461 y 70-464)

Crear copia de seguridad programada en Sql Server Express


2008
Como muchos ya os habris dado cuenta, la versin Sql Server Express 2008 no incluye el agente
de tareas. Y para que sirve el agente de tareas? os preguntareis otros. Pues bien el agente de
tareas es el que se encarga de llevar a cabo todas las tareas relacionadas con el mantenimiento de
la base de datos ya sea realizar copias de seguridad programadas (diarias, semanales,
mensuales), realizar una programacin para limpiar registros, indexar la base de datos, etc

En nuestro caso lo que buscamos de manera ms urgente es poder realizar copias de seguridad
programadas para evitar accidentes como la prdida de informacin o borrado accidental o no de
la base de datos. Siempre que trabajemos con una base de datos hay que tener un respaldo por si
acaso el ordenador falla y hubiera que restaurarla en otro pc o para poder evitar cualquier prdida
accidental de los datos.
Para realizar este ejercicio, es necesario un conocimiento previo del lenguaje SQL. Por ello
vamos a ver previamente como se realizara una copia de seguridad completa normal de una base
de datos a una ruta concreta:
BACKUP DATABASE nombredelabasededatos
TO DISK = C:\nombredelabasededatos.bak
WITH FORMAT;
El funcionamiento es realizar la copia de seguridad con el nombre de la base de datos que
queremos respaldar e indicar la ruta en la que queremos que se guarde la copia de seguridad (por
ejemplo en c:\). Lo que se encuentra en letra naranja es lo que tendremos que cambiar para
indicar el nombre de la base de datos a respaldar y el nombre de la copia de seguridad.
Una vez tenemos claro el funcionamiento de la copia de seguridad, vamos a darle una fecha antes
del nombre para poder crear una copia cada da y poder distinguirlas en formato ao/mes/da:
declare @ruta as nvarchar (50);
declare @fecha as nvarchar (50);
set @fecha = CONVERT (nvarchar, CURRENT_TIMESTAMP , 112)
set @ruta = C:\ + @fecha + nombredelabasededatos.bak
BACKUP DATABASE nombredelabasededatos
TO DISK = @ruta
WITH FORMAT;

Aqu lo que hemos hecho es declarar dos variables una con la ruta y otra con la fecha para que
quede claro su uso de manera muy sencilla. Declaramos las variables como nvarchar,
establecemos el valor con set que van a tener cada una, en el caso de la fecha hay que convertir el
formato datetime que usa current_timestamp a nvarchar que es cadena y luego lo utilizaremos en
ese formato para anteponerlo al nombre y as distinguir los diversos archivos de las copias de
seguridad. Y en el caso de la variable ruta hemos indicado simplemente la ruta donde se va a
guardar el archivo con su fecha y nombre correspondiente.
Ahora vamos a crear un archivo .bat para ejecutar el cdigo mediante la consola de comandos de
windows conocida como CMD y as con el programador de tareas de windows poder programar
la tarea.
1- Creamos con el bloc de notas un archivo y lo llamamos tarea.bat (sin las comillas). Le
damos botn derecho y editar.

Editar .bat
2- Una vez estemos en modo edicin, insertamos el siguiente cdigo:
ECHO ejecutando tarea
ECHO.
pause
osql -S nombredelainstanciasql\sqlexpress -E -Q declare @ruta as nvarchar (50);declare
@fecha as nvarchar (50);set @fecha = CONVERT(nvarchar, CURRENT_TIMESTAMP , 112)set
@ruta = C:\ + @fecha + nombredelabasededatos.bak BACKUP DATABASE
nombredelabasededatos TO DISK = @ruta WITH FORMAT;
ECHO tarea ejecutada
pause
CLS
EXIT
3- Cambiamos lo que est escrito en naranja por lo que corresponda a la informacin de nuestra
instancia de Sql Server Express 2008 (suele ser el nombre del equipo /sqlexpress, a no ser que se
haya cambiado en la instalacin) y nombre de la base de datos a respaldar.
4- Ejecutamos el archivo para comprobar que no hemos cometido ningn error de cdigo.

Cmd
5- Si nos aparece como en la imagen y nos crea la copia de seguridad con xito tendremos que
hacer un cambio en el cdigo para quitarle las pausas de comprobacin y que lo haga
directamente sin pulsar ninguna tecla. Si nos fijamos en la imagen hay unas flechas que nos
indican lo que en el cdigo significa pause. As que volvemos al fichero y lo editamos borrando
las pause, nos quedara as:

ECHO ejecutando tarea


ECHO.
sqlcmd -S nombredelainstanciasql\sqlexpress -E -Q declare @ruta as nvarchar (50);declare
@fecha as nvarchar (50);set @fecha = CONVERT(nvarchar, CURRENT_TIMESTAMP , 112)set
@ruta = C:\ + @fecha + nombredelabasededatos.bak BACKUP DATABASE
nombredelabasededatos TO DISK = @ruta WITH FORMAT;
ECHO tarea ejecutada
CLS
EXIT
Ahora vamos como paso final a programar la tarea para que se ejecute a diario.
1- Para ello entramos en Inicio Programas Accesorios Herramientas del sistema y pulsamos
click en Tareas programadas.

Tareas Programadas
2- Le damos a agregar una nueva tarea y cuando nos salga el asistente pulsamos siguiente.
Seleccionamos en examinar el archivo tarea.bat que hemos creado y pulsamos siguiente de
nuevo.
3- Pulsamos en la siguiente pantalla a diario para que se ejecute todos los dias y le damos a
siguiente.

4- Ahora es el momento de seleccionar que hora y con que frecuencia as como cuando se debe
iniciar la tarea. Pulsamos en siguiente una vez configurado y nos va a pedir un nombre de usuario
del equipo y una contrasea del usuario, pulsamos siguiente y pulsamos finalizar.

De este modo quedara completado el captulo de como crear una programacin de un backup en
Sql Server Express 2008.
Espero que os sirva y as poder haberos ayudado.
ACTUALIZACIN:
Importante
Esta caracterstica se quitar en una versin futura de SQL Server. Evite utilizar esta
caracterstica en los nuevos trabajos de programacin y planee modificar las aplicaciones que
actualmente la utilizan. sqlcmd instead.>En su lugar, use sqlcmd. sqlcmd Utility.>Para obtener
ms informacin, vea sqlcmd (utilidad).
http://msdn.microsoft.com/es-es/library/ms162806.aspx
Debido a las ltimas peticiones he decidido incluir el Script para hacer backup de todas las bases
de datos de usuario, recordad que para que funcione debis cambiar el nombre de la instancia:
ECHO ejecutando tarea
ECHO.
sqlcmd -S nombredelainstanciasql\sqlexpress -E -Q DECLARE BBDDUsuarios_cursor
Cursor FOR SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN
(master,model,msdb,tempdb) declare @nombreDB varchar(50);declare @ruta as nvarchar
(50); declare @fecha as nvarchar (50); set @fecha = CONVERT(nvarchar,
CURRENT_TIMESTAMP , 112) OPEN BBDDUsuarios_cursor Fetch NEXT FROM
BBDDUsuarios_cursor INTO @nombreDB WHILE @@FETCH_STATUS = 0 BEGIN set
@ruta = C:\Backup\ + @fecha + _ + @nombreDB + .bak BACKUP DATABASE
@nombreDB TO DISK = @ruta WITH FORMAT; Fetch NEXT FROM BBDDUsuarios_cursor
INTO @nombreDB END CLOSE BBDDUsuarios_cursor DEALLOCATE
BBDDUsuarios_cursor
ECHO tarea ejecutada
CLS
EXIT

Você também pode gostar