Habilite SQL Server para realizar copias de seguridad en máquinas / unidades remotas

8

Tengo un Servidor SQL (2000, 2005 y 2008) y me gustaría usar el Agente SQL (o incluso una simple base de datos de respaldo 'xxx' a disco = 'aaa'), para hacer un respaldo a unidades remotas.

Es decir: tengo una unidad asignada en la máquina SQL, por ejemplo: "M:" que se asigna a \\ otherbox \ someshare

De manera predeterminada, SQL Server no le permitirá realizar copias de seguridad en dichas unidades, pero creo que hay una manera de habilitarlo. ¿Alguien puede señalarme los documentos?

Gracias por adelantado.

Martin Marconcini
fuente
1
¿Puede simplemente usar una herramienta de terceros, como SQLBackupAndFTP para hacer una copia de seguridad de su servidor SQL de forma remota? sqlbackupandftp.com/blog/…
Nick Taylor

Respuestas:

8

Utilice la ruta UNC cuando especifique el destino: el Agente SQL no tiene un concepto de "unidades" "asignadas".

Además, el Agente SQL normalmente se ejecuta como "Servicio local" o "Sistema local" y, como tal, no tiene derechos para recursos compartidos remotos en otras computadoras.

Usted tiene un par de opciones:

  • Ejecute el Agente SQL como una cuenta de rol en el dominio. Otorgue a esa cuenta permiso para escribir en el directorio / recurso compartido donde desea almacenar las copias de seguridad.

  • Ejecute el Agente SQL como "Servicio de red". Se autenticará en el servidor compartido con la cuenta de computadora de dominio de la máquina en la que se ejecuta el servicio. Otorgue a esa cuenta permiso para escribir en el directorio / recurso compartido donde desea almacenar la copia de seguridad.

  • Si no tiene un dominio, cree una cuenta con el mismo nombre de usuario y contraseña tanto en la máquina que aloja el Agente SQL como en la máquina que aloja los archivos de copia de seguridad. Cambie el Agente SQL para que se ejecute como esta cuenta de "rol" y otorgue a esa cuenta permiso para escribir en el directorio / recurso compartido donde desea almacenar la copia de seguridad. (El "dominio del pobre" ...)

Evan Anderson
fuente
Además de mencionar las rutas UNC, recomendaría que el usuario realmente se CONECTE a la ruta UNC. La manera rápida / fácil de hacer esto es abrir un navegador web y escribirlo. Se le solicitará un nombre de usuario / contraseña y, por lo general, puede decir que desea RECORDAR a ese usuario / pasar en el futuro. He visto demasiadas personas que llegaron al 99% del camino y no pudieron entender por qué las cosas no funcionaron. ¡PRUEBE SU CONEXIÓN! Jajaja :-)
KPWINC
Eso es lo que estaba buscando (la parte del "dominio del pobre");) ¡Gracias!
Martin Marconcini
4

Estoy totalmente de acuerdo con ambas respuestas sobre la ruta UNC.

También me gustaría agregar que incluso con unidades mapeadas tienes una solución simple. Puede ejecutar una copia de seguridad en cualquiera de las unidades normales de su servidor. Y luego puedes agregar

xp_cmdshell 'XCOPY [source] [destination] \flags'

Comando SQL para el trabajo o script SQL que ejecuta.

Con xp_cmdshell puede hacer aún más: por ejemplo, ejecutar una herramienta de línea de comando de archivo externo, como 7z para comprimir el archivo antes de copiarlo en la unidad asignada (cuando la conexión remota es demasiado lenta ...)

PD: Olvidé mencionar que xp_cmdshell puede habilitarse y deshabilitarse usando la herramienta de Configuración de área de superficie y ejecutando sp_configure (y por defecto está deshabilitado)

Bogdan_Ch
fuente
La utilidad ROBOCOPY del Kit de recursos Win2003 proporciona algunas opciones adicionales sobre XCOPY, que son útiles en este tipo de operación. En mi caso, la capacidad de no sobrescribir las copias de seguridad copiadas previamente o duplicar dos directorios de copias de seguridad se implementa fácilmente sin secuencias de comandos adicionales.
kermatt
1

Su agente necesita acceso a los recursos compartidos de la red. No necesitan ser mapeados de antemano.

Lo haces así:

BACKUP DATABASE myDB TO DISK = '\\machine\share\dir\file.bak'

Creo que si el usuario que posee el trabajo es un administrador de sistemas sql, se ejecuta bajo el agente; de ​​lo contrario, se ejecuta como el usuario que no es administrador de sistemas.

Sam
fuente
1

Si SQL Server no se ejecuta bajo una cuenta de dominio, puede asignar una unidad de red para la cuenta de sqlserver (no su cuenta) como se describe en esta respuesta de stackoverflow

Primero necesitas habilitar xp_cmdshell

-- allow changes to advanced options 
EXEC sp_configure 'show advanced options', 1
GO
-- Update currently configured values for advanced options.
RECONFIGURE
GO
-- To enable xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 1
GO
-- Update currently configured values for advanced options.
RECONFIGURE
GO

Luego puedes mapear un disco usando:

EXEC xp_cmdshell 'NET USE Z: \\Srv\Path password1 /USER:Domain\UserName'

Finalmente, puede hacer una copia de seguridad en esa unidad asignada:

BACKUP DATABASE myDB TO DISK = 'z:\file.bak'
Yepeekai
fuente
0

Tenga en cuenta aquí que SQL Server es muy intolerante con los retrasos de la red. Si ocurren, y tienden a hacerlo, la copia de seguridad fallará. No recomiendo esta práctica en absoluto para entornos de producción.

Es mejor hacer una copia de seguridad local y luego copiar.

Steve Jones
fuente
0

La forma más fácil es crear una unidad .vhd en un recurso compartido de red a través de la administración del disco y asignarle una letra de unidad. SQL puede acceder a esta unidad sin ninguna modificación.

Simplemente agregue un script diskpart.exe al planificador en el arranque para adjuntarlo automáticamente al reiniciar.

ejemplo, seleccione vdisk file = "\ {dirección IP / servidor} {networkshare} {filenamep.vhd}" adjunte vdisk // recuerda la última letra de unidad asignada.

Kimon
fuente