使用C#

时间:2017-05-22 08:57:07

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

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

2 个答案:

答案 0 :(得分:0)

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

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

  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) DECLARE db_cursor CURSOR for SELECT名称 来自master.dbo.sysdatabases 名称为NOT IN('master','model','msdb','tempdb')
    打开db_cursor
    FETCH NEXT FROM db_cursor INTO @name
    WHILE @@ FETCH_STATUS = 0
    BEGIN
       SET @fileName = @path + @name +'_'+ @fileDate +'。BAK'
       BACKUP DATABASE @name TO DISK = @fileName

    FETCH NEXT FROM db_cursor INTO @name
    END
    关闭db_cursor
    DEALLOCATE db_cursor

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

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

    对于我将备份带到远程服务器来说,它就像一个魅力。我没有制作上面的代码,只是对其进行了修改,并且不予以认可。希望它适合你。

答案 1 :(得分:0)

我正在添加一个我希望保留在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);
                }
            }
        }
    }