2017-06-06 87 views
1

我試圖將數據庫從舊的,即將死亡的服務器遷移到新的服務器。無法將SQL Server數據庫還原到其他服務器

在互聯網上,我發現了Andrew Morgan的兩個方便的scripts,用於保存和恢復數據庫。備份部分運行良好;我通過在網絡上共享文件夾並讓腳本將數據庫備份到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參數(en):「''附近的語法不正確'''
關鍵字'with'附近的語法錯誤如果此語句是公用表表達式,則xmlnamespaces子句或一個更改跟蹤上下文子句,以前的語句必須以分號結尾。「
WARNUNG:嘗試恢復數據庫

的部分問題是:

ALTER DATABASE $SQLDatabase 
SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

RESTORE DATABASE $SQLDatabase 
FROM DISK = '$path' 
WITH REPLACE 

當執行後,素文字獲取異常。

我試着把CREATE DATABASE $SQLDatabase放在ALTER的部分前面,但是在創建db之後,它說「沿着」那個數據庫名已經存在「的地方。

此外,省略了部分改變和不斷變化的那部分

RESTORE DATABASE $SQLDatabase FROM DISK = '$path' WITH REPLACE 

它說,一些有關的數據庫文件,給了我,我想是完全不相關,其中舊服務器上的路徑(時,但似乎有可能是我的下一個問題),無法找到(當然,因爲我在我的本地機器上,現在沒有這些)。

我正在做一個腳本,因爲我們需要遷移大約15個數據庫,也因爲我想學習如何在不使用SSMS嚮導的情況下做這些事情。

更新:我把撇號改爲正常的,這確實是錯誤。現在我只需要獲取db文件的文件名,以便我可以將它們MOVE傳送到新服務器。

+2

'「不正確附近有語法''' - 如果你複製/粘貼腳本,用'''替換任何奇特的引號(''') - 儘管使用SSMS恢復工具可能是一個更好的主意。 –

+0

爲什麼在恢復之前創建數據庫?如果數據庫是實時數據庫,並且需要斷開所有用戶,則需要將數據庫置於single_user中。不要創建,只需從數據庫中恢復數據庫你的備份和寫入文件的新路徑 – sepupic

+0

@ AlexK.thanks,這確實是(第一)錯誤! – Squirrelkiller

回答

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'; 
+0

那麼在沒有'ALTER'之前?上面,你說我應該把它放在'single_user'模式中(我現在就是這麼做的)。另外:我不能直接指向備份,因爲我正在從本地PC運行腳本,從位於偶爾工作的PC上的數據庫恢復bak。雖然我猜'DISK ='$ path''works,否則有人會告訴我這件事。 – Squirrelkiller

+0

您正在恢復到新的服務器,對不對?所以這些數據庫還不存在。因此,您無需斷開用戶連接,甚至無需在還原之前創建數據庫。您只需恢復指定將mdf/ldf放在哪裏的現有備份,就可以爲您創建新數據庫 – sepupic

+0

我可以使用查詢獲得文件名('AdventureWorks2012_data'和'..._log')嗎?我們的文件通常被稱爲'dbName'和'dbName_log',但我實際上發現了一個邏輯名稱是別的東西的情況,所以我也想自動化該部分。 – Squirrelkiller

相關問題