通过C#备份SQL Server

通过C#代码备份SQL Server数据库有多容易?

我看到很多相关的问题,但没有真正的答案。

或者:在Management Studio中生成备份脚本,将其放入存储过程,从C#代码运行过程。

CREATE PROCEDURE sp_backup AS BEGIN BACKUP DATABASE [YourDatabase] TO DISK = N'C:\YourPathAndFile.bak' WITH NOFORMAT, NOINIT, NAME = N'Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10 END GO 

SQL管理对象 – Microsoft.SqlServer.Management.Smo

它具有完成该操作所需的方法。

请参阅使用c#中的SMO库

关于如何使用c#中的SMO库来执行管理员任务,例如备份和恢复。

这是一个将数据库备份内容放入流中的脚本(作为“选择”结果),这对于在没有任何共享文件夹的情况下创建备份程序非常有用。 您唯一需要的是与服务器的连接。 经过MSSQL 2008 R2测试。

 -- переменные DECLARE @dbName nvarchar(MAX); SET @dbName = N'AdventureWorks'; DECLARE @backupFileName nvarchar(MAX); SET @backupFileName = N'C:\Temp\' + @dbName + N'.bak'; --EXECUTE (N'PRINT N''Создание бэкапа '+ @backupFileName + '''') -- создание временной папки EXEC xp_cmdshell N'mkdir C:\Temp', no_output; -- бэкап с перетиранием имеющегося файла DECLARE @sqlScript nvarchar(MAX); SET @sqlScript = N'BACKUP DATABASE [' + @dbName + '] TO DISK = N''' + @backupFileName + ''' WITH NOFORMAT, INIT, NAME = N''' + @dbName + '-Full Database Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 10'; --SELECT @sqlScript AS backupScript EXECUTE (@sqlScript); -- похоже, файл в 3ГБ можно вычитать... но памяти на это уходит ОЧЕНЬ МНОГО -- вычитывание файла SET @sqlScript = N' SELECT N''' + @backupFileName + ''' AS [backupFileName], BulkColumn AS [backupContent] FROM OPENROWSET (BULK ''' + @backupFileName + ''', SINGLE_BLOB) MyFile'; --SELECT @sqlScript AS openRowsetScript EXECUTE (@sqlScript); -- удаление файла SET @sqlScript = N'EXEC xp_cmdshell ''del "' + @backupFileName + '"'', no_output'; EXECUTE (@sqlScript); 

结果如下:

  backupFileName backupContent C:\Temp\AdventureWorks.bak 0x54415045000003008C000E01000000000000000000000000000... 

如果您拥有正确的权限,应该很容易。

想到2种方法,已经提到过SQL管理对象,我找到了一个很好的项目,可以在这里使用它们

您始终可以通过ADO.Net对象在服务器上抛出T-SQL备份命令。 Msdn引用你需要的主命令

如果您想使用C#中的字节流,例如在写入磁盘之前压缩流,欢迎您查看我的项目SQL Server Compressed Backup中的代码。 它有一个用C ++编写的小型VDI(SQL Server虚拟设备API)DLL包装器,忠实地将每个VDI选项暴露给.Net,其余(大量)代码用C#编写。