2009-04-16 14 views
6

Tengo una pequeña base de datos de SQL Server que necesito copiar en el comando - Necesito poder tomar los archivos mfd e ldf en un momento dado, copiarlos, comprimirlos y ponerlos a disposición de un usuario final.Separe programáticamente la base de datos SQL Server para copiar el archivo mdf

Ahora esto es posible por manualmente:

1) Inicio de sesión en el servidor SQL a través de Escritorio remoto

2) Separación de la base de datos mediante SQL Server Management Studio. Tengo que jugar con una combinación de establecer la base de datos a single_user y/o reiniciar el servicio para que pueda separarlo ya que el servidor de la aplicación normalmente está conectado a él.

3) Mientras estoy desconectado, reviso el sistema de archivos y copio los archivos mdf y ldf.

4) que vuelva a conectar la base de datos a través de SQL Server Management Studio

5) Me zip los archivos copiados, y los muevo a un servidor FTP para las personas que los necesitan pueden obtenerlos.

Es un proceso horrible e ineficiente. No se trata solo de necesitar el esquema, sino más bien de la necesidad de que las personas trabajen con instantáneas de datos reales de producción en sus propias máquinas locales con el fin de realizar experimentos destructivos. Afortunadamente, la base de datos comprimida es muy pequeña, tal vez 30 megas con el registro.

Entonces, idealmente, me gustaría crear una página en la aplicación web ASP .NET que tenga un botón que el usuario pueda presionar para iniciar el empaquetado de la base de datos actual en un archivo zip, y luego solo proporcionaría el enlace a la descarga del archivo.

Respuesta

9

Por qué no hacer una copia de seguridad ordinario (fácil de hacer con SqlCommand) y añadir una función para los usuarios restaurar fácil ese archivo de copia de seguridad con un clic en un botón?

  • Puede copia de seguridad de la base de datos con SQL-comandos
  • Puede pagar y el código postal del backupfile con SQL-comandos
  • También puede pagar y FTP la backupfile automágicamente a un servidor web si lo desea.

¿Qué utilizan los usuarios finales para consumir su db? ¿Un programa winform? Entonces es fácil hacer todo con un clic de botón para el usuario.

Éstos son algunos ejemplos de código para que:

Declare @CustomerID int 
declare @FileName nvarchar(40) 
declare @ZipFileName nvarchar(40) 
declare @ZipComand nvarchar(255) 


set @CustomerID=20 --Get from database instead in real life application 
SET @FileName='c:\backups\myback'+ cast(@customerID as nvarchar(10))+'.bak' 
SET @ZipFileName='c:\backups\myback'+ cast(@customerID as nvarchar(10))+'.zip' 

--Backup database northwind 
backup database northwind to [email protected] 

--Zip the file, I got a commanddriven zip.exe from the net somewhere. 
set @ZipComand= 'zip.exe -r '[email protected]+' '[email protected] 
EXEC xp_cmdshell @zipcomand,NO_output 

--Execute the batfile that ftp:s the file to the server 
exec xp_cmdshell 'c:\movetoftp.bat',no_output 

--Done! 

Usted tiene que tener un movetoftp.bat que contiene este (cambio de servidor FTP a tu):
ftp -s: ftpcommands.txt ftp. myftp.neta

Y usted tiene que tener un ftpcommands.txt que contiene este (Usted puede tener este archivo creado dnamically con sólo el derecho archivo zip por sqlcommands también, pero me permitirá hacerlo usted mismo):

ftpusername
ftppassword
binaria
preguntar n
mput c:. \ backups \ * postal
dejar de fumar

8

mirada a los diálogos que utiliza en SQL Server Management Studio, cerca de la parte superior de cada uno es un botón que generará un scrip para realizar la acción. Esta es una forma rápida de descubrir cómo hacer esto en SQL, que se puede ejecutar desde una conexión de base de datos.

E.g. para separar la base de datos DB1:

EXEC master.dbo.sp_detach_db @dbname = N'db1' 
+1

señalar la existencia del botón de escritura fue extremadamente útil. +1 –

0

Personalmente me gustaría generar copias de seguridad de la base de datos y código postal esos y los envían a los usuarios. Tal vez podrías escribir un pequeño script para restaurar.

Motivo por el que se separó la base de datos hace que no esté disponible para otros.

0

Usaría la versión de consola SQL Dumper y comprimiría el volcado sql.

En mi humilde opinión siempre es mejor tener una copia de texto sin formato en lugar de un archivo binario. Si algo sale mal, al menos puede reescribir sus datos a mano, porque puede leerlos.

0

Primero, conéctese a SQL Server sin Adjuntar ningún archivo DB y sin uso Nombre de la base de datos.

ConnectionString = @"Data Source=XXX;Integrated Security=True;Connect Timeout=30"; 

Nota: XXX =. O BIEN. \ SQLEXPRESS O. \ MSSQLSERVER O (local) \ SQLEXPRESS O (localdb) \ v11.0 & ...

luego debajo de Query Separar el archivo DB.

"ALTER DATABASE [your DB] SET OFFLINE WITH ROLLBACK IMMEDIATE \n\r exec sp_detach_db @dbname = [your DB]"; 

Ok.

Mi Código de ejemplo:

sql_connect1.ConnectionString = @"Data Source=.\sqlexpress;Integrated Security=True;Connect Timeout=30"; 
sql_command.CommandText = "ALTER DATABASE [IRAN] SET OFFLINE WITH ROLLBACK IMMEDIATE \n\r exec sp_detach_db @dbname = [IRAN]"; 
        sql_command.Connection = sql_connect1; 
        sql_connect1.Open(); 
        sql_command.ExecuteNonQuery(); 
        sql_connect1.Close(); 
Cuestiones relacionadas