Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于将SQL Server数据库从一台服务器恢复到另一台服务器的PowerShell脚本具有不同的驱动器_Sql_Sql Server_Powershell_Database Restore - Fatal编程技术网

用于将SQL Server数据库从一台服务器恢复到另一台服务器的PowerShell脚本具有不同的驱动器

用于将SQL Server数据库从一台服务器恢复到另一台服务器的PowerShell脚本具有不同的驱动器,sql,sql-server,powershell,database-restore,Sql,Sql Server,Powershell,Database Restore,我正在尝试编写一个脚本,将数据库从远程计算机恢复到新的SQL Server。我的旧SQL Server的数据驱动器为卷D:,而新SQL Server的数据驱动器为E:,那么有人能帮我将数据库从PS恢复到其他驱动器位置吗 备份放在新的SQL ServerE:\migration文件夹中,我将从该文件夹中尝试恢复备份。下面是我尝试过的,它在相同的文件夹结构下运行良好 # Defining the server Name Write-Host " Initiating the SQL Server

我正在尝试编写一个脚本,将数据库从远程计算机恢复到新的SQL Server。我的旧SQL Server的数据驱动器为卷
D:
,而新SQL Server的数据驱动器为
E:
,那么有人能帮我将数据库从PS恢复到其他驱动器位置吗

备份放在新的SQL Server
E:\migration
文件夹中,我将从该文件夹中尝试恢复备份。下面是我尝试过的,它在相同的文件夹结构下运行良好

# Defining the server Name

Write-Host " Initiating the SQL Server Install"
$Servers = Read-Host "Please specify DB Server Name"

Invoke-Command -ComputerName $Servers{

$INSTANCENAME = Read-Host "Please specify DB Server Instance Name , ex:- DBXXXXINST01"
$VOLNAME = Read-Host "Please specify DB Server InstanceVolume Name , ex:- XXXXINST01"

$ServerInstance = Read-Host "Please specify DB Server Instance Name , ex:- dbxx\DBXXXXINST01"

import-module SQLPS -DisableNameChecking

Write-Host " Initiating the DB creation/configuration"
Write-Host "Creating SQL folder"

$setupFolder = "E:\$VOLNAME\SQL"

New-Item -Path $setupFolder -type directory -Force 

$backupRoot = Get-ChildItem -Path "E:\migration\DB_Backup\1234inst01\"
$datafilesDest = "E:\$VOLNAME\SQL\"
$logfilesDest = "E:\$VOLNAME\SQL\"

## For each folder in the backup root directory...
#
foreach($folder in $backupRoot)
{   
    # Get the most recent .bak files for all databases...
    $backupFiles = Get-ChildItem -Path $folder.FullName -Filter "*.bak" -Recurse | Sort-Object -Property CreationTime -Descending | Select-Object -First 1

    # For each .bak file...
    foreach ($backupFile in $backupFiles)
    {
        # Restore the header to get the database name...
        $query = "RESTORE HEADERONLY FROM DISK = N'"+$backupFile.FullName+"'"
        $headerInfo = Invoke-Sqlcmd -ServerInstance $ServerInstance -Query $query
        $databaseName = $headerInfo.DatabaseName

        # Restore the file list to get the logical filenames of the database files...
        $query = "RESTORE FILELISTONLY FROM DISK = N'"+$backupFile.FullName+"'"
        $files = Invoke-Sqlcmd -ServerInstance $ServerInstance -Query $query

        # Differentiate data files from log files...
        $dataFile = $files | Where-Object -Property Type -EQ "D"
        $logFile = $files | Where-Object -Property Type -EQ "L"

        # Set some variables...
        $dataFileName = $dataFile.LogicalName
        $logFileName = $logFile.LogicalName

        # Set the destination of the restored files...
        $dataFileFullPath = $datafilesDest+"\"+$dataFileName+".mdf"
        $logFileFullPath = $logfilesDest+"\"+$logFileName+".ldf"

        # Perform the database restore... and then go around the loop.
        Restore-SqlDatabase -ServerInstance $ServerInstance -Database $databaseName -BackupFile $backupFile.FullName -ReplaceDatabase
    }
} 

您应该能够使用Restore SqlDatabase来实现这一点

我尚未对此进行测试,但如果您对新的物理文件名感到满意,您的问题代码构造应该可以:

$relocateData = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile($dataFile.LogicalName, $dataFileFullPath)
$relocateLog = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile($logFile.LogicalName, $logFileFullPath)

Restore-SqlDatabase -ServerInstance $ServerInstance -Database $databaseName -BackupFile $backupFile.FullName -ReplaceDatabase -RelocateFile @($relocateData, $relocateLog)
编辑:

根据您对powershell sql模块的配置,如果powershell将
重定位文件
对象实例化为错误版本,则此操作可能会失败


修复方法是强制版本匹配

我尝试了这一点,但我发现无法绑定参数“RelocateFile”。无法将类型为“System.String”的“$RelocateData”值转换为类型为“Microsoft.SqlServer.Management.Smo.RelocateFile”。+CategoryInfo:InvalidArgument:(:)[Restore SqlDatabase],参数BindingException+FullyQualifiedErrorId:CannotConvertArgumentNoMessage,Microsoft.SqlServer.Management.PowerShell.RestoreSqlDatabaseCommand。。不知道我在逻辑上遗漏了什么。。由于我试图远程执行此操作,因此它在理想情况下可以工作。您得到的错误表明正确传递
-RelocateFile
参数有问题。尝试将其设置为变量,然后检查变量的类型:
$rf=@($relocateData,$RelocateLog)$rf | get member
-应该返回
类型名称:Microsoft.SqlServer.Management.Smo.RelocateFile
我已经检查过了,类型名称与您提到的相同。。即使将其放入变量中,我也会遇到同样的问题:-无法绑定参数“RelocateFile”。无法将类型为“Microsoft.SqlServer.Management.Smo.RelocateFile”的“Microsoft.SqlServer.Management.Smo.RelocateFile”值转换为类型为“Microsoft.SqlServer.Management.Smo.RelocateFile”。仅供参考。。这是sql 2016答案代码在sql 2017容器中工作。2016年dba stackexchange上的答案表明,我还发现了一个有关
重定位文件
对象版本控制的相关问题,您最近的错误听起来更像那个错误。