Problems with RelocateFile property in the Restore-SqlDatabase cmdlet

后端 未结 6 1620
难免孤独
难免孤独 2020-12-16 13:47

I trying to restore a database by using the Restore-SqlDatabase cmdlet. I need to relocate the files but I\'m getting the following errror

Restore-SqlDatabas         


        
6条回答
  •  一向
    一向 (楼主)
    2020-12-16 14:28

    This looks like a difference in the version of SMO that you have loaded and the one that Restore-SqlDatabase expects. There are probably two approaches here...

    1. Make sure that the versions match.
    2. Use the Microsoft.SqlServer.Management.Smo.Restore.SqlRestore method instead of the Restore-SqlDatabase cmdlet.

    I have extracted the relevant pieces from a larger script below. It is untested in this form and there are a few variables such as $ServerName which are assumed to be available but it should be enough to get you going.

        if($useSqlServerAuthentication)
        {
            $passwordSecureString = ConvertTo-SecureString -String $password -AsPlainText -Force;
    
            $serverConnection = new-object Microsoft.SqlServer.Management.Common.ServerConnection $ServerName, $UserName, $passwordSecureString;
    
            $server = new-object Microsoft.SqlServer.Management.Smo.Server $serverConnection;
        }
        else
        {
            $server = new-object Microsoft.SqlServer.Management.Smo.Server $ServerName;
        }
    
        $dataFolder = $server.Settings.DefaultFile;
        $logFolder = $server.Settings.DefaultLog;
    
        if ($dataFolder.Length -eq 0)
        {
            $dataFolder = $server.Information.MasterDBPath;
        }
    
        if ($logFolder.Length -eq 0) 
        {
            $logFolder = $server.Information.MasterDBLogPath;
        }
    
        $backupDeviceItem = new-object Microsoft.SqlServer.Management.Smo.BackupDeviceItem $Path, 'File';
    
        $restore = new-object 'Microsoft.SqlServer.Management.Smo.Restore';
        $restore.Database = $DatabaseName;
        $restore.Devices.Add($backupDeviceItem);
    
        $dataFileNumber = 0;
    
        foreach ($file in $restore.ReadFileList($server)) 
        {
            $relocateFile = new-object 'Microsoft.SqlServer.Management.Smo.RelocateFile';
            $relocateFile.LogicalFileName = $file.LogicalName;
    
            if ($file.Type -eq 'D'){
                if($dataFileNumber -ge 1)
                {
                    $suffix = "_$dataFileNumber";
                }
                else
                {
                    $suffix = $null;
                }
    
                $relocateFile.PhysicalFileName = "$dataFolder\$DatabaseName$suffix.mdf";
    
                $dataFileNumber ++;
            }
            else 
            {
                $relocateFile.PhysicalFileName = "$logFolder\$DatabaseName.ldf";
            }
    
            $restore.RelocateFiles.Add($relocateFile) | out-null;
        }    
    
        $restore.SqlRestore($server);
    

提交回复
热议问题