繁体   English   中英

使用C#将MS SQL Server备份到远程PC

[英]MS SQL Server backup to remote PC using C#

当前,我正在数据库服务器文件系统上创建数据库备份。 以下是我使用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并通过数据库服务器获得相同的结果。

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

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

  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
    从master.dbo.sys数据库中选择名称,不在其中的名称(“ master”,“ model”,“ msdb”,“ tempdb”)
    打开db_cursor
    从db_cursor INTO @name获取下一个
    @@ FETCH_STATUS = 0时
    开始
    SET @fileName = @path + @name +'_'+ @fileDate +'.BAK'
    备份数据库@name TO DISK = @fileName

    从db_cursor INTO @name获取下一个
    结束
    关闭db_cursor
    取消分配db_cursor

如果从Microsoft Task Scheduler(仅在用户登录时运行)运行包含以下行的cmd文件,则可以运行:

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

对我来说,将备份备份到远程服务器就像是一种魅力。 我没有编写上面的代码,只是对其进行了修改,并不为此而功劳。 希望对你有效。

我添加了一个我想保留在stackoverflow中的相关代码。 由于备份通常存储在SQL Server上,因此该代码用于读取备份文件。 这是通过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);
                }
            }
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM