Сценарий PowerShell для восстановления базы данных SQL Server с одного сервера на другой имеет другой диск - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь написать скрипт, который восстанавливает базу данных с удаленного компьютера на новый 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
    }
} 

1 Ответ

1 голос
/ 25 мая 2019

Вы должны иметь возможность использовать RelocateFile параметр из 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)

Редактировать:

В зависимости от конфигурации модулей sql powershell, это может завершиться ошибкой, если powershell создает объекты RelocateFile как неправильные версии,

Исправление - принудительное совпадение версий путем проверки версии сборки, которая реализует команду Restore-SqlDatabase .

...