Quantcast
Channel: PowerShell.org » All Posts
Viewing all articles
Browse latest Browse all 13067

Reply To: Seeking help using / combining two Powershell scripts

$
0
0

Alright I’ve got this portion working now by combining a couple of other scripts. I now need to figure out how to fix all of the orphaned users after the DB restores are complete.

I call everything using:

sqlps.exe -executionpolicy bypass -File D:\Scripts\SQLRestores.ps1 -BackupFileLocation D:\RestorefromDenver\Extracted -SqlServerName na-alb-prdsql1

The current script is:

Param (
[string]$BackupFileLocation,
[string]$SqlServerName
)

########### Extract GZ files containing SQL BAK files #################################################

$shell=new-object -com shell.application

$CurrentLocation=get-location

$CurrentPath=$CurrentLocation.path

$Location=$shell.namespace($CurrentPath)

$ZipFiles = Get-ChildItem D:\RestorefromDenver\Extracted -Recurse -Include *.gz

$ZipFiles.count | out-default

foreach ($ZipFile in $ZipFiles)

{
C:\7z.exe e -y -oD:\RestorefromDenver\Extracted $ZipFile.Name
}

########### Setup for BAK file restores #################################################

$server = New-Object (“Microsoft.SqlServer.Management.Smo.Server”) $SqlServerName
$DatabaseDefaultPath= $server.MasterDBPath +”\”

$bakFiles = Get-ChildItem $BackupFileLocation -Filter “*.bak”

### BOS Get the Default File Locations ###

$DefaultSystemDataLocation = $Server.Information.MasterDBPath
$DefaultSystemLogLocation = $Server.Information.MasterDBLogPath

$DefaultUserDBDataLocation = $Server.Settings.DefaultFile
$DefaultUserDBLogLocation = $Server.Settings.DefaultLog

if ($DefaultUserDBDataLocation.Length -eq 0)
{
$DefaultUserDBDataLocation = $DefaultSystemDataLocation
}
if ($DefaultUserDBLogLocation.Length -eq 0)
{
$DefaultUserDBLogLocation = $DefaultSystemLogLocation
}

### EOS Get the Default File Locations ###

###### BEGIN OF FOR LOOP ##############################################################################

foreach ($bak in $bakFiles)
{

$RestoreHeaderOnlyQuery=”Restore HeaderOnly From Disk=N’”+$bak.FullName+”‘”
$HeaderData=INVOKE-SQLCMD -SERVERINSTANCE $server -QUERY $RestoreHeaderOnlyQuery

$FileNumber=0

foreach ($HData in $HeaderData)
{
If($HData.BackupType -eq 1)
{
$FileNumber=$HData.Position
$DBName=$HData.DatabaseName
$BackupOfServer= “["+$HData.ServerName+"]”
}
}

if ($FileNumber -ne 0)
{

IF($DBName -eq “master” -OR $DBName -eq “model” -OR $DBName -eq “msdb”)
{
$DefaultDataLocation=$DefaultSystemDataLocation+ “\”
$DefaultLogLocation=$DefaultSystemLogLocation+ “\”
}
else
{
$DefaultDataLocation=$DefaultUserDBDataLocation+ “\”
$DefaultLogLocation=$DefaultUserDBLogLocation+ “\”
}

$db = $server.Databases[$DBName]

write-host “————————————————————-”
write-host “Restoring database [$($dbName)] On Server $($server)” -ForegroundColor Green
write-host “————————————————————-”

$RestoreFileListQuery=”Restore FilelistOnly From Disk=N’”+$bak.FullName+”‘”
$FileListData=INVOKE-SQLCMD -SERVERINSTANCE $server -QUERY $RestoreFileListQuery
$MoveQuery=”"

foreach ($FData in $FileListData)
{

$PhName=$FData.PhysicalName
$str= $PhName.SubString(0,$PhName.LastIndexOf(“\”)+1)
$PhName=$PhName -replace “\\”,”_”
$str=$str -replace “\\”,”_”
$LogicalFilename= $PhName -replace $str,”"

IF($FData.Type -eq “D”)
{
$MoveQuery=$MoveQuery+
“MOVE N’”+$FData.LogicalName+”‘”+
“TO N’”+$DefaultDataLocation+ $LogicalFilename+”‘,”
}

IF($FData.Type -eq “L”)
{
$MoveQuery=$MoveQuery+
“MOVE N’”+$FData.LogicalName+”‘”+
“TO N’”+$DefaultLogLocation+ $LogicalFilename+”‘,”
}
}

$RestoreQuery= “Restore Database “+ $DBName +
” FROM DISK=N’”+$bak.FullName+”‘ “+
“WITH REPLACE,FILE = “+ $FileNumber+”,”+
$MoveQuery +
“NOUNLOAD, STATS = 20″

if ($DBName -eq “master”)
{

if($BackupOfServer -eq $server)
{
$QrForInstance=”select isnull(‘mssql?’+cast(SERVERPROPERTY(‘instancename’) as varchar(50)),’mssqlserver’) as InstanceName”
$Instance=INVOKE-SQLCMD -SERVERINSTANCE $server -QUERY $QrForInstance -VERBOSE
$ServiceName=$Instance.InstanceName
$DisplayName= Get-Service -name $ServiceName | select DisplayName
$Command=”net start ""+$DisplayName.DisplayName+"” /m”

If($ServiceName -like “*sql*” -and $DisplayName -like “*sql*”)

{

#Stop Service
stop-service $ServiceName -force -verbose

#Start Service in Single User Mode
invoke-EXPRESSION $Command -verbose

#Restoring Master Database
write-host “********************”
INVOKE-SQLCMD -SERVERINSTANCE $server -QUERY $RestoreQuery -querytimeout 65534 -VERBOSE
write-host “********************”
write-host “”

#Stop Service
stop-service $ServiceName -force -verbose

#Start Service
start-service $ServiceName -verbose

}
}
else
{
write-host “You are restoring The backup of master database of server $($BackupOfServer) to Server $($server), which is not compatiable.” -ForegroundColor Red
write-host “Please restore valid backup.” -ForegroundColor Red

}

}
else
{
if ($db -ne $null)
{
$server.KillAllProcesses($dbName)
}

INVOKE-SQLCMD -SERVERINSTANCE $server -QUERY $RestoreQuery -querytimeout 65534 -VERBOSE
}

write-host “————————————————————-”
write-host “”

}
ELSE
{
write-host “———————————————————————————————————–”
write-host “Backup file $($bak.FullName) does not contain any FULL database backup(s)” -ForegroundColor Red
write-host “———————————————————————————————————–”
write-host “”

}
Start-Sleep -Seconds 3

}

###### END OF FOR LOOP ##############################################################################

write-host “”


Viewing all articles
Browse latest Browse all 13067

Trending Articles