PDA

Ver la Versión Completa : Backup sobre BD MSSQL remoto


JClink
14-08-2007, 16:13:28
Buenas,

Despues de haber leido distintos hilos acerca de como realizar backups de una base de datos sql server no he podido resolver un problema que me corroe.

Mi situacion es la siguiente:

Tengo varios PCs (Host1, Host2, Host3, ...) y en cada uno de ellos el programa que ataca a la base de datos sql. Ésta se encuentra en el Host1, y deseo realizar un backup de la base de datos desde el host2.

Hasta aqui parece la cosa normal, el problema me viene cuando abro mi opendialog y selecciono un nombre de fichero en una determinada ruta ubicada en Host2 (C:\prueba.dat).

[code]
str_path := 'C:\prueba.dat'; //valor sacado de un opendialog
SQLCommand.Text:='USE master IF (EXISTS (SELECT NAME FROM master.dbo.sysdevices WHERE (NAME=N''PIEBKP''))) BEGIN EXEC sp_dropdevice ''PIEBKP''' END EXEC sp_addumpdevice ''disk'', ''PIEBKP'', '''+str_path+'''' BACKUP DATABASE PIEpart TO PIEBKP WITH INIT';
SQLCommand.Execute;
[\code]
Al intentar hacer la anterior rutina el backup se guarda en el equipo en el que se encuentra la base de datos, es decir en Host1.

Mi pregunta es, ¿Como podría hacerlo para que me guardara el Backup en la ruta especificada pero en Host2? No se si se podrá hacer pero lo he intentado hacer con el sql enterprise manager desde host2 y si q me ha realizado el backup, por eso estoy confundido.


Gracias de antemano, un saludo a todos los foreros.

nuk3zito
14-08-2007, 16:31:44
Pocas veces pido ayuda al foro... pero ya que está este problema, me uno al compañero para pedir ayuda sobre este problemita.

Lo que tuve que hacer una vez fue... sabiendo que el backup se realiza en el Server, la misma aplicación al terminar de hacer el respaldo me copiaba el archivo a donde le indicara con mi componente TSaveDialog... sin embargo, este solo es un parche puesto que me imagino que si debe haber algo (en SQL Server) que nos permita guardar el respaldo en el cliente.

Esto es más tema para SQL Server que para Delphi, pero si alguno lo sabe, me uno al compañero a pedir que alguien apoye con dicha información.

JClink
14-08-2007, 16:51:48
Gracias nuk3zito por la solucion, creo que de momento servirá pero si se alguien conociese otro metodo mas directo y desde el SGBD mucho mejor. ;)

Saludos.

JClink
14-08-2007, 17:23:14
De repente me ha surgido una pregunta,

¿Como has copiado desde el server el archivo? Tendrias que tener la carpeta del server en la que lo guardaste compartida para poder copiarlo a otro pc.

En mi caso no tengo esa opcion. El asunto es que lo guarda el mssql pero desde codigo delphi no puedo copiar el archivo si no está como recurso compartido.

Imaginate que del server no tienes ningun permiso de escritura, unicamente acceso a la base de datos, ¿existe alguna rutina de mssql que te permita copiar y pegar archivos?

Gracias por vuestra paciencia...

Un saludo

nuk3zito
14-08-2007, 18:43:13
Talvez poniendo una unidad de red en el server (direccionando a cualquier otro directorio en otra compu).

Pero si alguien se apiada y nos dice como es que se guarda directamente en nuestra PC Cliente por medio de las instrucciones de SQL Server, pues esa sería la mejor opción.

__hector
15-08-2007, 22:42:31
No existe manera de hacer un backup a un directorio local de una base de datos desde sql server. Si existiera esta posibilidad, podría suponer un grave fallo de seguridad, puesto que cualquier usuario con un conjunto mínimo de permisos (perteneciente al grupo de dd_backup por ejemplo) podría conectarse al servidor y llevarse la base de datos haciendo backup.

Es por esto que sql server se limita estrictamente a realizar el backup desde el lugar en que fue configurado para hacerlo. Esto según recuerdo, incluye rutas UNC de la red local, así que si compartes una carpeta cualquiera en la red, podrías en teoría, hacer que sql server hiciese backup en dicho recurso (de la forma \\maquina\directorio\backup)

nuk3zito
15-08-2007, 22:55:09
Es por esto que sql server se limita estrictamente a realizar el backup desde el lugar en que fue configurado para hacerlo. Esto según recuerdo, incluye rutas UNC de la red local, así que si compartes una carpeta cualquiera en la red, podrías en teoría, hacer que sql server hiciese backup en dicho recurso (de la forma \\maquina\directorio\backup)

Pues eso es lo que hago, guardo mis respaldos en una unidad de red, pero esperaba que si se pudiera en una PC X... pero ya veo que estamos en las mismas.

Saludos

JClink
16-08-2007, 09:09:21
Gracias Hector por la aclaración,

Entonces la solución sería crear una carpeta compartida en el equipo que contiene la bd mediante codigo delphi, crear dentro el backup, copiarla a nuestro equipo e inmediatamente despues borrar la carpeta compartida.

Un Saludo.

nuk3zito
16-08-2007, 17:13:38
Los respaldos ¿los harás desde cualquier PC? o normalmente siempre será desde una PC específicamente?

Si los harás desde cualquier PC, entonces si creo que debes hacer como has dicho... pero si siempre será desde una misma PC, mejor comparte alguna carpeta de esa PC y crea su unidad de red en el Server de SQL. no?

JClink
17-08-2007, 09:16:16
En principio se hacen desde cualquier PC, y estoy probando a crearme una carpeta compartida en el PC que ejecuto la orden de backup, de esta forma al mssql le digo que me le haga en una ruta de red del tipo "\\HostX\Carpeta_Backup" y seguidamente copiar el archivo generado en la ruta especificada en el SaveDialog y borrar la carpeta anteriormente creada.

Por cierto, ¿alguien sabe como funciona lo de los permisos de carpeta?
Me doy cuenta que no tengo ni idea de como hacerlo.
Estoy utilizando la funcion CreateDirectory(lpPathName:PAnsiChar; lpSecurityAttributes):longBool;

El ultimo parametro no se exactamente como se utiliza.

Otra pregunta, ¿con que funcion se puede establecer una carpeta oculta, solo lectura, ... y esta clase de atributos?. Es que la anterior funcion me parece que establece el acceso a la carpeta (usuarios, grupos, dominios, ...) aunque no estoy seguro.

Gracias de antemano.

Saludos.