1. 程式人生 > >如何通過使用 SQL Server 中的 Detach 和 Attach 函式將 SQL Server 資料庫移到新位置(轉載)

如何通過使用 SQL Server 中的 Detach 和 Attach 函式將 SQL Server 資料庫移到新位置(轉載)

如何通過使用 SQL Server 中的 Detach 和 Attach 函式將 SQL Server 資料庫移到新位置

參考
概要
本文描述如何更改任何 SQL Server 7.0、SQL Server 2000 或 SQL Server 2005 資料庫的資料和日誌檔案的位置。


更改某些 SQL Server 系統資料庫的位置必須遵循的步驟與更改使用者資料庫的位置必須遵循的步驟不同。將分別對這些特殊情況給予說明。
注意:SQL Server 7.0 系統資料庫與 SQL Server 2000 不相容。不要將 SQL Server 7.0 master、model、msdb 或分發資料庫附加到 SQL Server 2000。如果您使用的是 SQL Server 2005,則只能將 SQL Server 2005 資料庫附加到一個例項。
本文的所有示例都假設 SQL Server 安裝在 D:/Mssql7 目錄中,而且所有資料庫和日誌檔案都位於預設目錄 D:/Mssql7/Data 中。這些示例將所有資料庫的資料和日誌檔案都移到 E:/Sqldata。


先決條件
• 從資料庫的當前位置備份當前所有資料庫,尤其是 master 資料庫。
• 必須具有系統管理員 (sa) 許可權。
• 必須知道資料庫的所有資料檔案和日誌檔案的名稱及當前位置。

注意:可以使用儲存過程 sp_helpfile 來確定資料庫所使用的所有檔案的名稱和當前位置:use <database_name>
go
sp_helpfile
go
 
• 應可以以獨佔方式訪問被移動的資料庫。如果在此過程中出現問題並且無法訪問已經移動的資料庫,或無法啟動 SQL Server,則需要檢視 SQL Server 錯誤日誌和 SQL Server 聯機叢書以獲取這些錯誤的更多資訊。

移動使用者資料庫
以下示例將移動一個名為 mydb 的資料庫,該資料庫包含一個數據檔案 Mydb.mdf 和一個日誌檔案 Mydblog.ldf。如果您要移動的資料庫還有其他資料或日誌檔案,請在儲存過程 sp_attach_db 中用一個逗號分隔的列表將它們全部列出。無論資料庫包含多少檔案,儲存過程 sp_detach_db 都不會更改,原因是它不會列出這些檔案。 1. 按如下所示分離資料庫:use master
   go
   sp_detach_db 'mydb'
   go
 
2. 然後,將資料和日誌檔案從當前位置 (D:/Mssql7/Data) 複製到新位置 (E:/Sqldata)。
3. 按如下所示重新附加指向新位置中這些檔案的資料庫:use master
  go
  sp_attach_db 'mydb','E:/Sqldata/mydbdata.mdf','E:/Sqldata/mydblog.ldf'
  go
使用 sp_helpfile 確認檔案位置的更改:use mydb
   go
   sp_helpfile
   go
filename 列的值應當反映出新的位置。

移動 pubs 和 Northwind
使用與移動使用者資料庫相同的步驟。


移動 MSDB (SQL Server 7.0)
注意:如果您在移動 msdb 和 model 資料庫的同時結合使用此過程,則重新附加的順序必須首先是 model,然後是 msdb。如果首先重新附加的是 msdb,則必須將它分離,等到附加完 model 後再重新附加。 1. 確保 SQL Server 代理當前沒有執行。
2. 使用與移動使用者資料庫相同的步驟。
注意:如果 SQL Server 代理正在執行,則 sp_detach_db 儲存過程將會失敗,並返回以下訊息:
伺服器:訊息 3702,級別 16,狀態 1,行 0
無法刪除資料庫 'msdb',因為該資料庫當前正在使用。
DBCC 執行完畢。如果 DBCC 輸出了錯誤訊息,請與系統管理員聯絡。


移動 MSDB 資料庫(SQL Server 2000 和 SQL Server 2005)
注意:如果您在移動 msdb 和 model 資料庫的同時結合使用此過程,則重新附加的順序必須首先是 model,然後是 msdb。如果首先重新附加的是 msdb,則必須將它分離,等到附加完 model 後再重新附加。

在 SQL Server 2000 和 SQL Server 2005 中,不能使用 sp_detach_db 儲存過程分離系統資料庫。執行 sp_detach_db 'msdb' 將會失敗並返回以下訊息:
伺服器:訊息 7940,級別 16,狀態 1,行 1
無法分離系統資料庫 master、model、msdb 和 tempdb。
要在 SQL Server 2000 上移動 MSDB 資料庫,請按照下列步驟操作: 1. 在 SQL Server 企業管理器中,右鍵單擊伺服器名,然後單擊屬性。
2. 在常規選項卡上,單擊啟動引數。
3. 新增一個新引數“-T3608”(不帶引號)。
新增跟蹤標記 3608 後,按照下列步驟操作: 1. 停止並重新啟動 SQL Server。
2. 確保 SQL Server 代理服務當前沒有執行。
3. 按如下所示分離 msdb 資料庫:use master
go
sp_detach_db 'msdb'
go
 
4. 將 Msdbdata.mdf 和 Msdblog.ldf 檔案從當前位置 (D:/Mssql8/Data) 移到新位置 (E:/Mssql8/Data)。
5. 在企業管理器中,從啟動引數框中刪除 -T3608 跟蹤標記。
6. 停止並重新啟動 SQL Server。
7. 按如下所示重新附加 MSDB 資料庫:use master
go
sp_attach_db 'msdb','E:/Mssql8/Data/msdbdata.mdf','E:/Mssql8/Data/msdblog.ldf'
go
注意:如果您試圖通過使用跟蹤標記 -T3608 啟動 SQL Server 來重新附加 msdb 資料庫,會收到以下錯誤:
伺服器:訊息 615,級別 21,狀態 1,行 1
未能找到 ID 為 3,名稱為 'model' 的資料庫表。

如果您使用的是 SQL Server 2005
可以使用 SQL Server 配置管理器來更改 SQL Server 服務的啟動引數。有關如何更改啟動引數的更多資訊,請訪問以下 Microsoft Developer Network 網站:
http://msdn2.microsoft.com/zh-cn/library/ms190737.aspx (http://msdn2.microsoft.com/zh-cn/library/ms190737.aspx)
移動 MSDB 資料庫後,可能會收到以下錯誤訊息:
錯誤 229:拒絕了對物件 'ObjectName' (資料庫 'master',所有者 'dbo')的執行許可權。
發生此問題的原因是所有權鏈斷裂。MSDB 資料庫和 master 資料庫的所有者不相同。因此,MSDB 資料庫的所有權已經發生更改。要解決此問題,請在 Isql.exe 命令列實用工具或 Osql.exe 命令列實用工具中執行以下命令:
USE MSDB
Go
EXEC sp_changedbowner 'sa'
Go
有關更多資訊,請單擊下面的文章編號,以檢視 Microsoft 知識庫中相應的文章:
272424 (http://support.microsoft.com/kb/272424/) INF:資料庫範圍內的物件所有權鏈檢查取決於對映至物件所有者的登入資訊


移動 master 資料庫
1. 在 SQL Server 企業管理器中,更改 master 資料和日誌檔案的路徑。

注意:您也可以在此更改錯誤日誌的位置。
2. 在企業管理器中,右鍵單擊 SQL Server,然後單擊屬性。
3. 單擊啟動引數,將會顯示以下條目:-dD:/MSSQL7/data/master.mdf
-eD:/MSSQL7/log/ErrorLog
-lD:/MSSQL7/data/mastlog.ldf
-d 是 master 資料庫資料檔案的完全限定路徑。

-e 是錯誤日誌檔案的完全限定路徑。

-l 是 master 資料庫日誌檔案的完全限定路徑。
4. 按如下所示更改這些值: a.  刪除 Master.mdf 和 Mastlog.ldf 檔案的當前條目。
b.  新增指定新位置的新條目:-dE:/SQLDATA/master.mdf
-lE:/SQLDATA/mastlog.ldf
 
 
5. 停止 SQL Server。
6. 將 Master.mdf 和 Mastlog.ldf 檔案複製到新位置 (E:/Sqldata)。
7. 重新啟動 SQL Server。

移動 model 資料庫
要移動 model 資料庫,必須用跟蹤標記 3608 啟動 SQL Server,這樣它不會恢復除 master 之外的任何資料庫。

注意:此時,您不能立即訪問任何使用者資料庫。使用此跟蹤標記時,除下列步驟外,不要執行其他任何操作。要將跟蹤標記 3608 新增為 SQL Server 啟動引數,請按照下列步驟操作: 1. 在 SQL Server 企業管理器中,右鍵單擊伺服器名,然後單擊“屬性”。
2. 在“常規”選項卡上,單擊“啟動引數”。
3. 新增一個新引數“-T3608”(不帶引號)。

新增跟蹤標記 3608 後,按照下列步驟操作: 1. 停止並重新啟動 SQL Server。
2. 按如下所示分離“model”資料庫:use master
   go
   sp_detach_db 'model'
   go
 
3. 將 Model.mdf 和 Modellog.ldf 檔案從 D:/Mssql7/Data 移到 E:/Sqldata。
4. 按如下所示重新附加 model 資料庫:use master
   go
   sp_attach_db 'model','E:/Sqldata/model.mdf','E:/Sqldata/modellog.ldf'
   go
 
5. 在企業管理器中,從啟動引數框中刪除 -T3608 跟蹤標記。
6. 停止並重新啟動 SQL Server。您可以使用 sp_helpfile 確認檔案位置的更改:use model
   go
   sp_helpfile
   go
 

移動 tempdb
您可以使用 ALTER DATABASE 語句來移動 tempdb 檔案。 1. 按如下所示使用 sp_helpfile 確定 tempdb 資料庫的邏輯檔名:use tempdb
go
sp_helpfile
go
每個檔案的邏輯名均包含在名稱列中。該示例使用了預設檔名 tempdev 和 templog。
2. 按如下所示使用 ALTER DATABASE 語句指定邏輯檔名:use master
go
Alter database tempdb modify file (name = tempdev, filename = 'E:/Sqldata/tempdb.mdf')
go
Alter database tempdb modify file (name = templog, filename = 'E:/Sqldata/templog.ldf')
go
應當收到以下確認更改的訊息:
檔案“tempdev”在 sysaltfiles 中被修改。重新啟動 SQL Server 後會刪除舊檔案。

檔案“templog”在 sysaltfiles 中被修改。重新啟動 SQL Server 後會刪除舊檔案。
3. 在 tempdb 中使用 sp_helpfile 將會在重新啟動 SQL Server 後才確認這些更改。
4. 停止並重新啟動 SQL Server。