使用 PowerShell 和 SMO 库从 .BAK 文件创建新数据库

MD29

我正在尝试.bak使用 powershell文件创建一个新的 SQL Server 数据库

这是我的脚本:

TRY
{
    [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null 
    [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SmoExtended') | out-null
    $servername = "MyServer\MyServerInstance"
    $datapath= "E:\SQLData\MyNewDataBase"
    $logpath= "E:\SQLLogs\MyNewDataBase"
    $path= "\\MyServer\BKPFolder\"
    $server = new-object("Microsoft.SqlServer.Management.Smo.Server") $servername
    $folderitem=Get-ChildItem $path -filter *.bak -rec

    foreach($bkfiles in $folderitem)
    {
        $dbRestore = new-object("Microsoft.SqlServer.Management.Smo.Restore")
        $files = $path+$bkfiles.Name
        $backupFile = $files
        $dbRestore.Devices.AddDevice($backupFile, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
        $dbRestoreDetails = $dbRestore.ReadBackupHeader($server)
        $dbFileList= $dbRestore.ReadFileList($server)

        foreach ($row in $dbFileList)
        {
             $FileType = $row["Type"].ToUpper()

             If ($FileType.Equals("D")) 
             {
                 $DBLogicalName = $Row["LogicalName"]
             }

             ELSEIf ($FileType.Equals("L")) 
             {
                 $LogLogicalName = $Row["LogicalName"]
             }
        }

        $dbRestoreFile = new-object("Microsoft.SqlServer.Management.Smo.RelocateFile") 
        $dbRestoreLog = new-object("Microsoft.SqlServer.Management.Smo.RelocateFile")

        $dbRestoreFile.LogicalFileName = $DBLogicalName 
        $dbRestoreFile.PhysicalFileName =$datapath +  "\" + $DBLogicalName + ".mdf" 

        $dbRestoreLog.LogicalFileName =   $LogLogicalName 
        $dbRestoreLog.PhysicalFileName =  $logpath +  "\" + $LogLogicalName + ".ldf" 

        $dbRestore.RelocateFiles.Add($dbRestoreFile) 
        $dbRestore.RelocateFiles.Add($dbRestoreLog)                

        $dbRestore.Database = "MyNewDataBase"
        $dbRestore.NoRecovery = $false
        $dbRestore.Action = "DataBase"
        $dbRestore.FileNumber = 1;
        $dbRestore.ReplaceDatabase = $false;

        $dbRestore.SqlRestore($server)  
   }
} catch     {
    "Database restore failed:`n`n " + _.Exception.GetBaseException().Message
}

当我运行此代码时,出现此错误:

文件“E:\SQLData\MyNewDataBase\OLDDataBase_Data.mdf”的目录查找失败,出现操作系统错误 2(系统找不到指定的文件。)。

文件“OLDDataBase_Data”无法恢复到“E:\SQLData\MyNewDataBase\OLDDataBase_Data.mdf”。使用 WITH MOVE 标识文件的有效位置。

在规划 RESTORE 语句时发现了问题。以前的消息提供了详细信息。
RESTORE DATABASE 异常终止。

看起来我的脚本正在尝试从旧数据库中查找.mdf.ldf文件。但我只有.bak旧数据库中的一个文件。

我错过了什么?

谢谢。

MD29

经过大量的研究和尝试,我终于恢复了我的数据库。这对我有用:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
    [Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
    [Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum") | Out-Null                              

    #Define o novo local dos arquivos de mdf e ldf
    $RelocateData = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("OldDataBase_Data", "E:\SQLData\MyNewDataBase_DATA.mdf")
    $RelocateLog = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("OldDataBase_Log", "E:\SQLLogs\MyNewDataBase_LOG.ldf")

    #Executa a restauração
    Restore-SqlDatabase -ServerInstance "MyServer\MyServerInstance" -Database "MyNewDataBase" -BackupFile "\\BackupFolder\OldDataBase.bak" -RelocateFile @($RelocateData,$RelocateLog) -NoRecovery
    Restore-SqlDatabase -ServerInstance "MyServer\MyServerInstance" -Database "MyNewDataBase" -BackupFile "\\BackupFolder\OldDataBase.trn" -RestoreAction Log -NoRecovery 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用T-SQL使用.bak文件创建新数据库

使用SMO备份数据库

SMO 使用 PowerShell 生成数据库脚本,因此与从 Management Studio 手动创建脚本时的方式相同

如何在Powershell中避免使用SMO对象的系统数据库?

使用PowerShell和基于文件的数据库操作

如何使用PowerShell和C#检索每个.bak文件?

使用Python创建新的Access数据库和表

如何使用pymongo创建新的数据库和集合?

如何从Azure SQL数据库创建BAK文件

从 bak 文件恢复数据库

当.bak文件中有多个备份点时,使用SMO Restore Class

使用bak文件从另一台计算机还原数据库

使用SSMS将Azure数据库备份到.BAK文件吗?

如何使用Python dbf库读取和创建新的FoxPro 2.6数据库表

导入和查看Microsoft SQL数据库(.BAK)的过程是什么?

MS SQL Server 2008使用SMO还原数据库会破坏resourceDB

使用Powershell创建新用户和数据库

使用Azure Powershell Runbook自动创建数据库

如何将bak文件导入Azure数据库

使用NHibernate和FluentNHibernate创建数据库和表?

如何使用python和sqlite3创建新数据库

如何使用javascript从数据库创建自动计算值和新值

从 .bak 文件还原时,能否将表重命名为新数据库?

将数据库从.bak传输到新数据库时出现问题

如何从SQL Server 2012中的数据库创建特定表的备份.bak文件?

如何备份Microsoft SQL Server数据库以创建多个100MB .bak文件

将数据库 .bak 文件从 VM 还原到 azure 弹性池数据库

使用SQL PowerShell枚举数据库

使用Node和FS创建自己的“数据库”