2017-08-18 1 views
4

Ich habe eine Datenbank $CurrentDB und ich möchte eine Sicherung von $CurrentDB zu $NewDB wiederherstellen. Die T-SQL-Befehl sieht wie folgt aus:Powershell wiederherstellen SQL Server-Datenbank auf neue Datenbank

USE [master] 

ALTER DATABASE [NewDB] 
    SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

RESTORE DATABASE [NewDB] 
FROM DISK = N'D:\Backups\CurrentDB.bak' 
WITH FILE = 1, 
    MOVE N'CurrentDB' TO N'D:\Databases\NewDB.mdf', 
    MOVE N'CurrentDB_log' TO N'D:\Logs\NewDB_log.ldf', 
    NOUNLOAD, REPLACE, STATS = 5 

ALTER DATABASE [NewDB] 
    SET MULTI_USER 
GO 

ich bin versucht, Benutzer Restore-SqlDatabase aber ich weiß nicht, wie man richtig -RelocateFile

$CurrentDB = "CurrentDB" 
$NewDB = "NewDB" 
$NewDBmdf = "NewDB.mdf" 
$CurrentDBlog = "CurrentDB_log" 
$NewDBldf = "NewDB_log.ldf" 
$backupfile = $CurrentDB + "ToNewDB.bak" 

$RelocateData = New-Object 
Microsoft.SqlServer.Management.Smo.RelocateFile($CurrentDB, $NewDBmdf) 

$RelocateLog = New-Object 
Microsoft.SqlServer.Management.Smo.RelocateFile($CurrentDBlog, $NewDBldf) 

Restore-SqlDatabase -ServerInstance $SQLServer -Database $NewDB -BackupFile 
$backupfile -ReplaceDatabase -NoRecovery -RelocateFile @($RelocateData, 
$RelocateLog) 

ich nicht ein Beispiel zu finden scheinen, was Ich versuche es zu tun. Ich habe viele Beispiele für die Wiederherstellung von Datenbanken mit demselben Namen, aber verschiedenen Dateien gesehen. Ich möchte einen anderen Namen und andere Dateinamen. Ich bin offen für Vorschläge.

Antwort

2

Sie müssen SMO nicht verwenden, nur weil Sie in der PowerShell sind.

import-module sqlps 

$database = "NewDb" 
$backupLocation = "D:\Backups\CurrentDB.bak" 
$dataFileLocation = "D:\Databases\NewDB.mdf" 
$logFileLocation = "D:\Logs\NewDB_log.ldf" 

$sql = @" 

USE [master] 

ALTER DATABASE [$database] 
    SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

RESTORE DATABASE [$database] 
FROM DISK = N'$backupLocation' 
WITH FILE = 1, 
    MOVE N'CurrentDB' TO N'$dataFileLocation', 
    MOVE N'CurrentDB_log' TO N'$logFileLocation', 
    NOUNLOAD, REPLACE, STATS = 5 

ALTER DATABASE [$database] 
    SET MULTI_USER 
"@ 

invoke-sqlcmd $sql 

Und wenn Sie nicht haben sqlps installiert haben, können Sie System.Data.SqlClient von Powershell verwenden TSQL zu laufen.

Verwandte Themen