將資料庫備份檔還原至localdb時發生The logical database file cannot be found的錯誤

將資料庫備份檔還原至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恢復正常(有點像是災難復原),但沒人說明為何會有這樣的錯誤。

 

後來找到一篇對岸網友的文章才知道,當我們的備份檔來源DBmdfldf檔是存放在不同路徑時,此時的備份檔要還原到localdb就會發生上述的錯誤。localdb會用mdf的路徑去找ldf,即使是您在localdb產生的DB備份檔也是一樣,只要來源DBmdfldf路徑不同,該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]mdfldf檔案存放路徑故意放在不同位置

2.     備份剛剛建立的DB

3.     利用剛剛的備份檔還原成一個新的資料庫[localDBTest2]

由下圖可以知道我們還原失敗了

clip_image002

 

情境二 :

/*建立新的資料庫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]mdfldf檔案存放路徑這次放在相同路徑

2.     備份剛剛建立的DB

3.     利用剛剛的備份檔還原成一個新的資料庫[localDBTest2]

由下圖可以知道我們還原成功了

clip_image004

 

 

結論 : 花了一個早上才知道原因,不曉得算是BUG ?

 

參考資料來源 : http://www.cnblogs.com/wusong/p/3647304.html

 

我是ROCK

rockchang@mails.fju.edu.tw