Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SQL Backup Red
SQL Backup Red
Lo que muchos hemos hecho toda la vida ha sido lo siguiente: haces el backup en una
carpeta local y programas, un tiempo prudencial después, la ejecución de un archivo .bat
que mueva la copia a una unidad de red usando comandos del sistema operativo. Esto
funciona pero añade complejidad ya que hay que coordinar ambas acciones y hay más
puntos de fallo. Además hay una cuestión adicional que a mi ya me ha ocurrido en
servidores viejos: si el disco local no tiene espacio suficiente no puedes hacer copias de
seguridad (no te caben), cuando a lo mejor tienes cientos de GB libres en el NAS que no
puedes aprovechar
Lo ideal sería hacer la copia directamente en el NAS sin pasar por el disco local. En este
post voy a contar cómo podemos conseguir precisamente esto: hacer backups de SQL
Server directamente a la red. Además cuento cómo conseguir un backup diario, con
un archivo para día de la semana, que se van sobrescribiendo automáticamente, por lo
que conseguimos de manera sencilla una retención de 7 días.
Las instrucciones que doy a continuación funcionan con SQL Server 2005 y 2008, y las
he sacado a base de prueba y fallo durante bastante tiempo. No he encontrado en
Internet instrucciones algunas que contemplen esta operación por completo, sobre todo
en lo referente a los pequeños detalles (como la seguridad) que hacen que llegue a
funcionar.
Lo primero que tenemos que hacer es asegurarnos de que nuestro sistema SQL Server
va a tener acceso a la red local. Tanto el motor de bases de datos como el agente de SQL
Server se ejecutan suplantando a un determinado usuario del sistema operativo. Mucha
gente instala SQL Server para que sus servicios se ejecuten bajo la cuenta de sistema, ya
que ésta tiene acceso a cualquier recurso del sistema local, y simplifica la gestión. Esto,
aparte de un posible problema de seguridad (en el que no voy a entrar), no es necesario
en absoluto. Además hay una cuestión fundamental: la cuenta de sistema no tiene
capacidades para acceder a la red. Por lo tanto si nuestro servidor de datos se ejecuta
bajo System no podremos realizar copias de seguridad a unidades de red.
Una cosa es la cuenta bajo la que se ejecuta el servidor y otra es la cuenta que usaremos
para acceder al recurso de red. Tendrá que ser un usuario que tenga permisos de lectura
y escritura en la carpeta compartida en la que queremos escribir el backup. Si no
estamos bajo un mismo dominio de Directorio Activo -es decir, utilizamos usuarios
diferentes para cada máquina- debemos crear en nuestra máquina local (en la que se
ejecuta SQL Server) una cuenta de usuario con el mismo nombre y clave que el que
usaremos para acceder a dicho recurso. Por ejemplo, si el NAS tiene un usuario llamado
“NASBackup” con clave “backup”, deberemos crear también en local este mismo
usuario. Cuando accedemos interactivamente desde el explorador de Windows al
recurso remoto podemos escribir el usuario y la clave en la ventan que aparece, pero con
el Script SQL que usaremos aquí, o disponemos del usuario también en local, o no
Este comando permite ejecutar comandos del sistema operativo desde scripts T-SQL.
Vamos a necesitarlo para habilitar el acceso a los recursos remotos. Por defecto viene
desactivado y no podremos usarlo, ya que reviste bastante peligro, puesto que otorga
acceso a comandos del sistema que pueden ser muy peligrosos (como formatear el disco
duro, por ejemplo). En SQL Serevr 2000 venía habilitado por defecto y las aplicaciones
con problemas de seguridad debidas a inyeción SQL y ejecutadas bajo cuentas con
demasiados privilegios eran una coladera, por eso en la versión 2005 y posteriores se ha
deshabilitado por omisión.
En nuestro caso lo necesitaremos, así que tenemos que habilitarlo. Para ello debemos
lanzar las siguientes instrucciones T-SQL desde SQL Management Studio:
GO
RECONFIGURE
GO
GO
RECONFIGURE
GO
Ya está.
4.- Programar la copia de seguridad
Ahora ya tenemos las bases necesarias para que esto funcione, así que lo único que nos
resta es crear una nueva tarea del agente SQL que se encargue de realizar la copia de
seguridad. En el apartado de “pasos de la tarea” crearemos un nuevo paso con las
siguientes instrucciones T-SQL:
Lo que estamos haciendo es poner el lenguaje actual en inglés. Yo suelo usar siempre el
inglés para todo y tengo los sistemas en este idioma porque considero que tiene muchas
ventajas pero tú, claro está, puedes usar el idioma que prefieras. El hecho de establecer
el idioma es para asegurarnos de que si transportamos el Script a otro servidor diferente
los nombres de los archivos de copia de seguridad van a tener nombres consistentes, ya
que usaremos el nombre del día de la semana para crear un archivo .bak cada día (lunes,
martes, y así sucesivamente).
Las dos siguientes líneas declaran el nombre y la ruta del archivo de backup que vamos
a crear. Lo que yo hago aquí es ponerle como sufijo el nombre del día de la semana en
inglés, de forma que se me crean copias de seguridad diarias con el nombre
“MiBaseDeDatos_Monday.bak”, “MiBaseDeDatos_Tuesday.bak”, y así sucesivamente.
Con esto consigo tener una copia completa cada día de la semana, con una retención de
7 días, que se va sobrescribiendo automáticamente cuando pasa una semana. Para mi
esto es más que suficiente, pero si quisieras más retención o más de una copia diaria al
día tendrías que buscar una forma alternativa para nombrar los archivos.
La siguiente línea es una instrucción T-SQL normal y corriente para crear una copia de
seguridad, sólo que en este caso ya se hará directamente sobre la carpeta de red, y no en
local, que es lo que deseábamos.
Finalmente con xp_cmdshell, nos desconectamos del recurso de red. Esto es necesario
para que no queden conexiones abiertas y nos impidan volver a reconectar en sucesivas
ocasiones.
Espero que te resulte útil y que mis horas de prueba y error te ahorren a ti mucho
tiempo. Si me loquieres agradecedr, ya sabes, matricúlate en alguno de nuestros cursos
EXEC master.dbo.sp_addumpdevice
@devtype = N’disk’,
@logicalname = N’LAN’,
@physicalname = N’\myserverbackupfolderMYBAK.bak’
GO
BACKUP DATABASE [Sample]
TO [LAN]