將資料庫備份檔還原至localdb時發生The logical database file cannot be found的錯誤
緣由 : 今日試著將Production的資料庫備份檔還原至我的localdb上,但卻不斷發生錯誤,無法成功還原。
語法如下 :
USE [master]
RESTORE DATABASE [localDBTest123] FROM DISK = N'D:\localDBTest.bak' WITH FILE = 1,
MOVE N'localDBTest' TO N'J:\localdb\localDBTest123.mdf',
MOVE N'localDBTest_log' TO N'J:\localdb\localDBTest123_log.ldf', NOUNLOAD, REPLACE, STATS = 5
GO
錯誤訊息如下 :
訊息 1853,層級 16,狀態 1,行 2
The logical database file 'localDBTest_log' cannot be found. Specify the full path for the file.
訊息 3167,層級 16,狀態 1,行 2
RESTORE could not start database 'localDBTest123'.
訊息 3013,層級 16,狀態 1,行 2
RESTORE DATABASE is terminating abnormally.
由錯誤訊息看來就是說找不到ldf檔,但我用過RESTORE FILLISTONLY檢視過備份檔,ldf的邏輯名稱並沒有錯,用UI還原也是發生一樣的錯誤,此時只好求助google大神,找到好幾篇討論。但似乎都圍繞在用甚麼方式可以解決還原失敗後讓DB恢復正常(有點像是災難復原),但沒人說明為何會有這樣的錯誤。
後來找到一篇對岸網友的文章才知道,當我們的備份檔來源DB的mdf及ldf檔是存放在不同路徑時,此時的備份檔要還原到localdb就會發生上述的錯誤。localdb會用mdf的路徑去找ldf檔,即使是您在localdb產生的DB備份檔也是一樣,只要來源DB的mdf跟ldf路徑不同,該DB備份檔還原至localdb時便會產生錯誤。
情境一 :
/*建立新的資料庫localDBTest在localdb上將mdf及ldf存放在不同的路徑上*/
CREATE DATABASE [localDBTest]
ON PRIMARY ( NAME = N'localDBTest', FILENAME = N'J:\localdb\Data\localDBTest.mdf')
LOG ON ( NAME = N'localDBTest_log', FILENAME = N'J:\localdb\Log\localDBTest_log.ldf')
GO
/*備份剛剛建立的資料庫*/
BACKUP DATABASE [localDBTest] TO DISK=N'D:\localDBTest.BAK'
GO
/*
利用剛剛備份檔還原成一個新的資料庫[localDBTest2]
mdf在J:\localdb\Data\localDBTest2.mdf
ldf在J:\localdb\Log\localDBTest2_log.ldf
*/
RESTORE DATABASE [localDBTest2] FROM DISK = N'D:\localDBTest.bak' WITH FILE = 1,
MOVE N'localDBTest' TO N'J:\localdb\Data\localDBTest2.mdf',
MOVE N'localDBTest_log' TO N'J:\localdb\Log\localDBTest2_log.ldf', NOUNLOAD, REPLACE, STATS = 5
GO
1. 我在localdb上建立一資料庫[localDBTest],而mdf及ldf檔案存放路徑故意放在不同位置。
2. 備份剛剛建立的DB。
3. 利用剛剛的備份檔還原成一個新的資料庫[localDBTest2]。
由下圖可以知道我們還原失敗了
情境二 :
/*建立新的資料庫localDBTest在localdb上將mdf及ldf存放在相同的路徑上mdf及ldf都在J:\localdb\Data\*/
CREATE DATABASE [localDBTest]
ON PRIMARY ( NAME = N'localDBTest', FILENAME = N'J:\localdb\Data\localDBTest.mdf')
LOG ON ( NAME = N'localDBTest_log', FILENAME = N'J:\localdb\Data\localDBTest_log.ldf')
GO
/*備份剛剛建立的資料庫*/
BACKUP DATABASE [localDBTest] TO DISK=N'D:\localDBTest.BAK'
GO
/*
利用剛剛備份檔還原成一個新的資料庫[localDBTest2]
mdf在J:\localdb\Data\localDBTest2.mdf
ldf在J:\localdb\Log\localDBTest2_log.ldf
*/
RESTORE DATABASE [localDBTest2] FROM DISK = N'D:\localDBTest.bak' WITH FILE = 1,
MOVE N'localDBTest' TO N'J:\localdb\Data\localDBTest2.mdf',
MOVE N'localDBTest_log' TO N'J:\localdb\Log\localDBTest2_log.ldf', NOUNLOAD, REPLACE, STATS = 5
GO
1. 我在localdb上建立一資料庫[localDBTest],而mdf及ldf檔案存放路徑這次放在相同路徑。
2. 備份剛剛建立的DB。
3. 利用剛剛的備份檔還原成一個新的資料庫[localDBTest2]。
由下圖可以知道我們還原成功了
結論 : 花了一個早上才知道原因,不曉得算是BUG嗎 ?
參考資料來源 : http://www.cnblogs.com/wusong/p/3647304.html
我是ROCK
rockchang@mails.fju.edu.tw