简体   繁体   English

在SQL Server上还原网络数据库而不复制它

[英]Restore network database on SQL Server without copy it

I trying to restore a SQL Server backup over the network. 我试图通过网络还原SQL Server备份。

I found a lot of way to copy file over network but backup files are big I don't want to copy them. 我发现了很多通过网络复制文件的方法,但是备份文件很大,我不想复制它们。

My problem is simple: this line 我的问题很简单:这行

var fileList = restore.ReadFileList(smoServer);

executes on SQL Server. 在SQL Server上执行。

This one define the backup I try to restore 这个定义了我尝试还原的备份

var backupDeviceItem = new BackupDeviceItem(path, DeviceType.File);

The problem is the path looks like: 10.\\*.\\*.\\*\\\\file.bak 问题是路径看起来像: 10.\\*.\\*.\\*\\\\file.bak

So I get an exception that says 所以我得到一个例外,说

"10.*.*.*" path not found on server 在服务器上找不到“ 10。*。*。*”路径

That is logical - I need to provide credential for the machine 10.\\*.\\*.\\* 这是合乎逻辑的-我需要为计算机10.\\*.\\*.\\*提供凭据10.\\*.\\*.\\*

If path parameter is C:\\file.bak , my code works - if it's \\\\10.\\*.\\*.\\*\\\\file.bak , my code says "file not found". 如果path参数是C:\\file.bak ,则我的代码有效-如果它是\\\\10.\\*.\\*.\\*\\\\file.bak ,我的代码将显示“找不到文件”。

The BackupDeviceItem has a constructor with credentials but its SQL credential... or I'm already on my SQL Server... I need credentials for the machine that has the .bak file ... BackupDeviceItem具有带有凭据的构造函数,但是其SQL凭据...或者我已经在SQL Server中...我需要具有.bak文件的计算机的凭据...

Any ideas? 有任何想法吗?

Just in case someone want my entire code here is my helper 万一有人想要我的整个代码,这是我的帮手

using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using System;
using System.IO;

namespace SqlManager.Tools
{
    public class SMOHelper
    {
        public static void RestoreDatabase(string path, string restore_name, SqlConfig sqlAccess)
        {
            ServerConnection SqlConnection;

            if (String.IsNullOrWhiteSpace(sqlAccess.username))
            {
                SqlConnection = new ServerConnection(sqlAccess.uri);
            }
            else
            {
                SqlConnection = new ServerConnection(sqlAccess.uri, sqlAccess.username, sqlAccess.password);
            }

            Server smoServer = new Server(SqlConnection);

            try
            {
                // On crée la BDD
                if (!smoServer.Databases.Contains(restore_name))
                {
                    Logger.Info("Creation de la base:");
                    Logger.Info(restore_name);
                    var database = new Database(smoServer, restore_name);
                    database.Create();
                }

                Logger.Success("Connexion SQL réussi");
                var targetDatabase = smoServer.Databases[restore_name];
                targetDatabase.RecoveryModel = RecoveryModel.Simple;
                targetDatabase.Alter();

                Restore restore = new Restore();

                var backupDeviceItem = new BackupDeviceItem(path, DeviceType.File);
                restore.Devices.Add(backupDeviceItem);
                restore.Database = restore_name;
                restore.ReplaceDatabase = true;
                restore.NoRecovery = false;
                restore.Action = RestoreActionType.Database;

                var fileList = restore.ReadFileList(smoServer);
                Logger.Success("Fichier de backup trouvé sur le serveur distant");

                var dataFile = new RelocateFile();
                dataFile.LogicalFileName = fileList.Rows[0][0].ToString();
                dataFile.PhysicalFileName = smoServer.Databases[restore_name].FileGroups[0].Files[0].FileName;

                var logFile = new RelocateFile();
                logFile.LogicalFileName = fileList.Rows[1][0].ToString();
                logFile.PhysicalFileName = smoServer.Databases[restore_name].LogFiles[0].FileName;

                restore.RelocateFiles.Add(dataFile);
                restore.RelocateFiles.Add(logFile);

                var backupHeaderInfo = restore.ReadBackupHeader(smoServer);

                smoServer.KillAllProcesses(restore_name);

                Logger.Info("Debut de la restauration sur le server");
                restore.SqlRestore(smoServer);
                Logger.Success("Restauration terminer");

                targetDatabase.SetOnline();
                SqlConnection.Disconnect();
            }
            catch (SmoException ex)
            {
                Logger.Error("SMO Message : " + ex.Message);
                Logger.Error("SMO Exception : " + ex.InnerException);
            }
            catch (IOException ex)
            {
                Logger.Error("IO Message : " + ex.Message);
                Logger.Error("IO Exception : " + ex.InnerException);
            }
            catch (Exception ex)
            {
                Logger.Error("Message : " + ex.Message);
                Logger.Error("Exception : " + ex.InnerException);
            }
        }
    }
}

You say 你说

So i get an exception that say "10.*.*.*" path not found on server 所以我得到一个异常,说在服务器上找不到“ 10。*。*。*”路径

You cannot use an asterisk in a folder name or a file name on a Windows server. 您不能在Windows服务器上的文件夹名称或文件名称中使用星号。 See Naming Files, Paths, and Namespaces 请参阅命名文件,路径和命名空间

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

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