【问题标题】:MS SQL Server backup to remote PC using C#使用 C# 将 MS SQL Server 备份到远程 PC
【发布时间】:2017-05-22 08:57:07
【问题描述】:

目前,我正在数据库服务器文件系统上创建我的数据库备份。 以下是我使用 SMO 命名空间实现此目的的代码:

backup.Devices.AddDevice(filePath, SMO.DeviceType.File);
backup.BackupSetName = fileName;
backup.BackupSetDescription = fileDescription;
backup.Initialize = false;
backup.SqlBackup(server);
backup.Wait();

我希望能够在 Active Directory(域)下的远程 PC 上创建备份。

假设,我有 PC "A" 作为 IIS 服务器和 PC "B" 作为数据库服务器。并且活动目录文件夹地址为 "ww007.somename.net\folder"。 是否可以将备份文件作为文件流从 PC B 返回到 PC A?这样我就可以使用 C# 将该文件保存到活动目录中。 要么 是否可以在上述代码中包含 ww007.somename.net\folder 并通过数据库服务器获得相同的结果。

【问题讨论】:

  • 可以从 sql-server 执行。但是我设法做到这一点的方式需要用户登录在目标文件夹中具有权限的服务器。如果它满足您的需求,我可以提供它作为答案。如果您不能让用户登录,它将无法正常工作。
  • @Sourcery,请分享。

标签: c# asp.net sql-server iis active-directory


【解决方案1】:

此脚本将服务器上的所有数据库备份到远程服务器。您可以将其修改为仅备份您认为合适的某些数据库。

只要您拥有目标文件夹的权限,您就可以备份到其他服务器。

  1. 确保 SQL 服务器上的登录用户有权访问目标文件夹。

  2. 挂载或连接到目标服务器上的共享。

  3. 根据您的服务器和条件修改下面的代码,然后在控制台或使用 osql 命令运行它。

    DECLARE @name VARCHAR(50) -- 数据库名称
    DECLARE @path VARCHAR(256) -- 备份文件的路径
    DECLARE @fileName VARCHAR(256) -- 备份文件名
    DECLARE @fileDate VARCHAR(20) -- 用于文件名 SET @path = '\\10.your.server.ip\share\whatever_extra_folder\'
    SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) 声明 db_cursor CURSOR FOR
    选择名称 FROM master.dbo.sysdatabases WHERE name NOT IN ('master','model','msdb','tempdb')
    打开 db_cursor
    FETCH NEXT FROM db_cursor INTO @name
    而@@FETCH_STATUS = 0
    开始
    SET @fileName = @path + @name + '_' + @fileDate + '.BAK'
    备份数据库 @name 到磁盘 = @fileName

    FETCH NEXT FROM db_cursor INTO @name
    结束
    关闭 db_cursor
    DEALLOCATE db_cursor

我从 Microsoft 任务计划程序运行 if(仅在用户登录时运行),并使用包含此行的 cmd 文件:

osql -E -Syour_sql_server_name -n -iF:\folder\sql_file_with_abvove_code.sql -oF:\folder\a_log_file.txt

对我来说,将备份备份到远程服务器就像是一种魅力。上面的代码不是我写的,只是修改了一下,不记账。希望它对你有用。

【讨论】:

  • "BACKUP DATABASE @name TO DISK = @fileName" 就足够了,如果我们可以控制数据库服务器(写入权限/服务登录)。我的问题,我无法控制数据库服务器。这就是原因,我想从 WebServer 端解决这个问题(如果可能的话)。
  • 您能给 SQL-SERVER 的文件服务器权限吗?因此,在权限处理中,您需要找到并授予计算机而不是用户的权限。然后它可能会在 SQL 中运行命令表单而无需映射/连接到服务器。
【解决方案2】:

我正在添加一个我想保留在 stackoverflow 中的相关代码。此代码用于读取备份文件,因为备份通常存储在 SQL 服务器上。这是一种通过 SQL 1433 端口将备份传输到远程客户端的简单方法。希望对其他人有所帮助。

static void Main(string[] args)
    {
        SqlConnection con = new SqlConnection(@"Server=.\YourServer;Database=ValidDatabase;User Id=User;Password = Password;");
        SqlCommand command = con.CreateCommand();
        command.CommandType = System.Data.CommandType.Text;
        command.CommandText = @"SELECT * FROM OPENROWSET(BULK N'C:\MSSQL\Backup\DbBackup.bak', SINGLE_BLOB) AS Contents";
        con.Open();
        command.BeginExecuteReader(callback, command,
                CommandBehavior.CloseConnection);
        Console.ReadLine();
    }

    private static void callback(IAsyncResult ar)
    {
        SqlCommand cmd = (SqlCommand)ar.AsyncState;
        SqlDataReader reader = cmd.EndExecuteReader(ar);
        bool res = reader.Read();
        using (BinaryReader br = new BinaryReader(reader.GetStream(0)))
        {
            FileStream fs = File.Create(@"c:\temp\RemoteDbBackupbak.bak");
            using (BinaryWriter bw = new BinaryWriter(fs))
            {
                int index = 0;
                byte[] buffer = new byte[8192];
                while ((index = br.Read(buffer, 0, 8192)) > 0)
                {
                    fs.Write(buffer, 0, index);
                }
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多