【发布时间】:2010-10-14 11:20:40
【问题描述】:
通过 C# 代码备份 SQL Server 数据库有多容易?
我看到很多相关的问题,但没有真正的答案。
【问题讨论】:
-
您是要备份整个数据库还是部分数据库?
标签: c# sql sql-server backup
通过 C# 代码备份 SQL Server 数据库有多容易?
我看到很多相关的问题,但没有真正的答案。
【问题讨论】:
标签: c# sql sql-server backup
或者:在 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 库来执行管理员任务,例如备份和恢复。
【讨论】:
这是一个将数据库备份内容放入流中的脚本(作为“选择”结果),这对于以编程方式不带任何共享文件夹创建备份很有用。您唯一需要的是与服务器的连接。已针对 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...
【讨论】:
如果您想在 C# 中使用字节流,例如在写入磁盘之前压缩流,欢迎您查看我的项目中的代码,SQL Server Compressed Backup。它有一个用 C++ 编写的小型 VDI(SQL Server 虚拟设备 API)DLL 包装器,忠实地将每个 VDI 选项暴露给 .Net,其余(大部分)代码是用 C# 编写的。
【讨论】: