Can';t将SQL Server数据库还原到另一台服务器

Can';t将SQL Server数据库还原到另一台服务器,sql,sql-server,powershell,Sql,Sql Server,Powershell,我正在尝试将数据库从一个旧的、濒临死亡的服务器迁移到新的服务器 在互联网上,我找到了安德鲁·摩根(Andrew Morgan)的两个方便的工具,用于保存和恢复数据库。备份部分工作正常;我通过网络共享文件夹并让脚本将数据库备份到unc路径,从而在本地pc上获得我的db.bak 不幸的是,恢复部分不起作用,我也不知道为什么(我的高级开发人员也不知道,他知道SQL aorund) 我这样称呼它: Restore-SQLdatabase -SQLServer "NEWSERVER\MSSQLSERVER

我正在尝试将数据库从一个旧的、濒临死亡的服务器迁移到新的服务器

在互联网上,我找到了安德鲁·摩根(Andrew Morgan)的两个方便的工具,用于保存和恢复数据库。备份部分工作正常;我通过网络共享文件夹并让脚本将数据库备份到unc路径,从而在本地pc上获得我的
db.bak

不幸的是,恢复部分不起作用,我也不知道为什么(我的高级开发人员也不知道,他知道SQL aorund)

我这样称呼它:

Restore-SQLdatabase -SQLServer "NEWSERVER\MSSQLSERVER" -SQLDatabase "DBToMigrate" -Path "C:\Backup\DBToMigrate.bak" -SQLusername "sa" -SQLpassword "IMAPLAINTEXTPASSWORD"
sa
对数据库拥有完全的控制权

它失败,并显示以下消息:

尝试连接到指定的SQL server:成功
警告:还原数据库时捕获到异常
警告:Ausnahme beim Aufrufen von“ExecuteOnQuery”mit 0参数(英文):“靠近“”的语法不正确”。
关键字“with”附近的语法不正确。如果此语句是公用表表达式、xmlnamespaces子句或更改跟踪上下文子句,则前一语句必须以分号终止。“
警告:正在尝试恢复数据库

有关部分是:

ALTER DATABASE $SQLDatabase
SET SINGLE_USER WITH ROLLBACK IMMEDIATE

RESTORE DATABASE $SQLDatabase
FROM DISK = '$path'
WITH REPLACE
当它被执行时,scipt将获得异常

我试着在
ALTER
部分前面放一个
CREATE DATABASE$SQLDatabase
,但是在创建数据库之后,它会说一些类似“该数据库名称已经存在”的话

此外,当省略更改部分并将该部分更改为

RESTORE DATABASE $SQLDatabase FROM DISK = '$path' WITH REPLACE
它显示了一些关于数据库文件的信息,给了我旧服务器上的路径(我想这与旧服务器完全无关,但这可能是我的下一个问题),找不到(当然,因为我现在在本地机器上,而本地机上没有这些路径)

我用一个脚本来完成这项工作,因为我们需要迁移大约15个数据库,而且我想学习如何在不使用SSMS向导的情况下完成这项工作


更新:我将撇号改为普通撇号,这确实是个错误。现在我只需要获取db文件的文件名,这样我就可以
将它们移动到新服务器。

您只需将新的目标写入文件,您可以在此处检查还原的语法:

您的代码如下所示:

RESTORE DATABASE AdventureWorks2012  
   FROM AdventureWorksBackups  
   WITH MOVE 'AdventureWorks2012_Data' TO   
'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Data\NewAdvWorks.mdf',   
      MOVE 'AdventureWorks2012_Log'   
TO 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Data\NewAdvWorks.ldf';  

您只需在文件中写入新的目标,即可在此处检查还原的语法:

您的代码如下所示:

RESTORE DATABASE AdventureWorks2012  
   FROM AdventureWorksBackups  
   WITH MOVE 'AdventureWorks2012_Data' TO   
'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Data\NewAdvWorks.mdf',   
      MOVE 'AdventureWorks2012_Log'   
TO 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Data\NewAdvWorks.ldf';  

“靠近“”的语法不正确”
——如果复制/粘贴脚本,请替换任何花哨的引号(
)使用
——虽然使用SSMS还原工具可能是一个更好的主意。为什么要在还原之前创建数据库?如果是实时数据库,则需要将数据库放入单个用户中,并且需要断开所有用户的连接。不要创建,只需从备份中还原数据库,并为数据库写入新路径即可files@AlexK.thanks,这确实是(第一个)错误!
“靠近”“的语法不正确”
——如果复制/粘贴脚本,请将任何花哨的引号(
)替换为
——尽管使用SSMS还原工具可能是一个更好的主意。为什么要在还原之前创建数据库?如果数据库是实时数据库,则需要将其放入单个用户中,并且需要断开所有用户的连接。不要创建,只需从备份中恢复数据库,并为数据库写入新路径即可files@AlexK.thanks,那确实是(第一个)错误!那么在此之前没有
ALTER
?上面,你说我应该把它放在
单用户
模式下(反正我现在就是这么做的)。另外:我不能直接指向备份,因为我正在本地pc上运行脚本,以便从pc上偶尔运行的数据库恢复bak。虽然我猜
FROM DISK='$path'
可以工作,否则有人会告诉我的。你正在恢复到一个新服务器,对吗?所以这些数据库还不存在。因此,您无需断开用户连接,甚至无需在恢复之前创建数据库。您只需恢复现有备份,指定将mdf/ldf放置在何处,就会为您创建新数据库。我也可以通过查询获取文件名(
AdventureWorks2012\u data
…\u log
)?我们的文件通常被称为
dbName
dbName\u log
,但实际上我发现了一种情况,其中逻辑名称是其他名称,因此我也希望自动化这一部分。是的,您可以使用RESTORE FILELISTONLY FROM DISK='your_backup_file\u full\u path',请参阅之前没有
ALTER
的情况?上面,你说我应该把它放在
单用户
模式下(反正我现在就是这么做的)。另外:我不能直接指向备份,因为我正在本地pc上运行脚本,以便从pc上偶尔运行的数据库恢复bak。虽然我猜
FROM DISK='$path'
可以工作,否则有人会告诉我的。你正在恢复到一个新服务器,对吗?所以这些数据库还不存在。因此,您无需断开用户连接,甚至无需在恢复之前创建数据库。您只需恢复现有备份,指定将mdf/ldf放置在何处,就会为您创建新数据库。我也可以通过查询获取文件名(
AdventureWorks2012\u data
…\u log
)?我们的文件通常被称为
dbName
dbName\u log
,但实际上我发现了一种情况,其中逻辑名称是其他名称,因此我也希望自动化该部分。是的,您可以使用RESTORE FILELISTONLY FROM DISK='您的备份文件\u完整路径',请参阅