【问题标题】:Get default backup path of sql server programmatically以编程方式获取sql server的默认备份路径
【发布时间】:2013-07-09 15:21:52
【问题描述】:

我正在使用 c# 以编程方式备份​​某些 sql server 数据库。我认为 Microsoft.SqlServer.Management.Smo 和其他一些库是为此目的而制作的。现在我可以备份数据库了。很不错。这是代码:

var server = new Server(@"" + InstanceName);
var backuper = new Backup();
try
{
    backuper.Action = BackupActionType.Database;
    backuper.Database = DbName;
    backuper.Devices.AddDevice(DbName + ".bak", DeviceType.File);
    backuper.BackupSetName = DbName + " - Yedek";
    backuper.BackupSetDescription = "Açık Bulut Depo - " + DbName + " - Yedek";
    backuper.ExpirationDate = DateTime.Now.AddYears(20);
    server.ConnectionContext.Connect();
    backuper.SqlBackup(server); 
}
catch(Exception ex){//..}

我的问题是如何获取数据库备份到的设备的路径? 我知道我可以将自己的路径指定为:

backuper.Devices.AddDevice("C:\SOMEPATH\" + DbName + ".bak", DeviceType.File);

然后我实际上可以知道它在哪里,但我想要做的是将它备份到它的默认位置并获取它的路径。请帮我解决这个问题。

【问题讨论】:

  • 也许备份完成后,您可以找到与数据库关联的最新备份集并从那里解决?

标签: c# sql-server backup


【解决方案1】:

从这篇博文中,您可以使用以下功能:

http://www.mssqltips.com/sqlservertip/1966/function-to-return-default-sql-server-backup-folder/

CREATE FUNCTION dbo.fn_SQLServerBackupDir() 
RETURNS NVARCHAR(4000) 
 AS 
BEGIN 

 DECLARE @path NVARCHAR(4000) 

EXEC master.dbo.xp_instance_regread 
        N'HKEY_LOCAL_MACHINE', 
        N'Software\Microsoft\MSSQLServer\MSSQLServer',N'BackupDirectory', 
        @path OUTPUT,  
        'no_output' 
RETURN @path 
END;

【讨论】:

  • 如何从 c# 调用它?
  • 它需要一个单独的数据库调用而不是上面的 SMO 代码;您可以像调用任何 sql select 语句一样调用它:“SELECT dbo.fn_SQLServerBackupDir() as backuppath”,然后读取结果。
  • 谢谢你,它就像一个魅力 :) 我现在唯一担心的是,这个软件应该被一些想要创建数据库备份的最终用户在多个数据库上使用,如果他们连接到数据库的用户没有必要的权限来创建函数?
  • 您不一定需要该功能,但他们确实需要权限才能执行 master.dbo.xp_instance_regread ,您可以尝试以另一种方式调用。如果无法授予他们该权限,则不确定是否有解决方法。
【解决方案2】:

我通常在backuper.SqlBackup(server);之后立即执行下面的存储过程 返回最新的备份目标路径。我使用这种方法是因为使用 SMO,我为应用程序用户提供了备份到任何位置/驱动器甚至 USB 磁盘的灵活性。因此,用户可能决定不备份到默认备份位置,我想在备份过程成功完成后返回该位置。

  USE [YouDatabaseNameHere]
    GO

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    -- =============================================
    -- Author:      SQL.NET Warrior
    -- =============================================
    CREATE PROCEDURE [dbo].[GetBackupHistory]
    AS
    BEGIN
        SET NOCOUNT ON;
        DECLARE @SQLVer SQL_VARIANT
            ,@DBName VARCHAR(128)
            ,@NumDays   SMALLINT
            ,@SQL       VARCHAR(1024)
            ,@WhereClause   VARCHAR(256)

    SET @DBName = Null
    ;
    SET @NumDays = 14
    ;
    SET @SQLVer = CONVERT(INTEGER, PARSENAME(CONVERT(VARCHAR(20),SERVERPROPERTY('ProductVersion')),4));

    SET @WhereClause = 'WHERE a.type IN (''D'',''I'')
            And a.backup_start_date > GETDATE()- ' + CAST(@NumDays AS VARCHAR)+''
    IF @DBName IS NOT NULL
    BEGIN
        SET @WhereClause = @WhereClause + '
            AND a.database_name = '''+ @DBName +''''
    END

    SET @SQL = '
    SELECT TOP 1 a.database_name,a.backup_start_date
            ,b.physical_device_name AS BackupPath
            ,a.position
            ,a.type
            ,a.backup_size/1024/1024 AS BackupSizeMB
            ,' + CASE 
                WHEN @SQLVer < 10 
                    THEN '0'
                    ELSE 'a.compressed_backup_size/1024/1024'
                END + ' AS CompressedBackMB
        FROM msdb.dbo.backupset a
            INNER JOIN msdb.dbo.backupmediafamily b
                ON a.media_set_id = b.media_set_id
        ' + @WhereClause + '
        ORDER BY a.backup_start_date DESC;';
         --PRINT @SQL
     EXECUTE (@SQL);
    END;



    GO

【讨论】:

    【解决方案3】:

    可以在此处找到此副本的正确答案:https://stackoverflow.com/a/8791588/331889

    Server.BackupDirectory;
    

    鉴于您已经在使用 SMO 对象,它应该是最简单的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多