我正在尝试将数据库从旧的垂死服务器迁移到新服务器。
在整个互联网上,我发现安德鲁·摩根有两个方便的scripts用于保存和恢复数据库。备份部分运行良好;我通过网络共享文件夹并让脚本将db备份到unc路径,从而在我的本地PC上获得db.bak
。
不幸的是,恢复部分不起作用,我不知道为什么(我的高级DEV也不知道,而且他是知道SQL aorund的人)。
我这样称呼它:
Restore-SQLdatabase -SQLServer "NEWSERVER\MSSQLSERVER" -SQLDatabase "DBToMigrate" -Path "C:\Backup\DBToMigrate.bak" -SQLusername "sa" -SQLpassword "IMAPLAINTEXTPASSWORD"
sa
对数据库拥有完全的权力。
它失败并显示以下消息:
尝试连接到指定的SQL服务器:成功
WARNUNG:恢复数据库时发现异常!
WARNUNG:Ausnahme beim Aufrufen von“ExecuteNonQuery”mit 0 Argument(en):“'''附近的语法不正确。
关键字'with'附近的语法不正确。如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号结束前一个语句。“
WARNUNG:试图恢复数据库
有问题的部分是:
ALTER DATABASE $SQLDatabase
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
RESTORE DATABASE $SQLDatabase
FROM DISK = '$path'
WITH REPLACE
当它被执行时,scipt会获得异常。
我尝试在CREATE DATABASE $SQLDatabase
部分前放置一个ALTER
,但在创建该数据库之后,它会说“数据库名称已经存在”。
此外,省略更改部分并将该部分更改为
时RESTORE DATABASE $SQLDatabase FROM DISK = '$path' WITH REPLACE
它说了一些关于数据库文件的东西,给了我旧服务器上的路径(我想完全不相关,但似乎可能是我的下一个问题),找不到(当然,因为我我现在在我的本地机器上,没有那些。)
我正在使用脚本,因为我们需要迁移大约15个数据库,还因为我想学习如何在不使用SSMS向导的情况下完成这些工作。
更新:我将撇号更改为正常,,这确实是错误。现在我只需要获取db文件的文件名,这样我就可以MOVE
将它们发送到新服务器。
答案 0 :(得分:0)
您只需要为文件写一个新目的地,您可以在此处查看RESTORE的语法:RESTORE Statements (Transact-SQL)
您的代码将是这样的:
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';