SQL Server允許使用簡單的Copy方式來備份資料庫的資料和記錄檔嗎?答案是肯定的。但前提是資料檔案不再被SQL Server使用。
當資料庫處於活動狀態,你不能簡單的copy它的檔案,推薦方式是使用完整Database Backup(備份類型)。這是因為資料庫的資料和記錄檔不能處於非一致狀態。這會導致僅僅在交易記錄中被修改的資料頁可能無法寫入資料檔案。這也會影響進程中的事務無法提交或是復原已經寫入檔案中的資料。
下面是一個簡單的例子:
10:00 |
Copying of data files start, takes 10 minutes. |
10:05 |
A checkpoint occurs, modifies some pages at the beginning of the data file (which have already been copied), and some pages at the end of the data file (yet to be copied). |
10:10 |
Copying of data files end, copy of transaction log starts. |
10:15 |
Copying of transaction log ends. |
你最後一步是copy交易記錄,這就意味著資料檔案已經包括了最後一次checkpoint以後的所有更改,但是實際上資料檔案僅僅包括部分更改。
Copy一個已經被其他應用程式開啟的檔案,這種方式是非常有用的,但如上所述,這種方式好像並不適用於備份SQL Server資料庫。假如你必須使用Copy方式來替換普通的Database Backup方式的話,推薦的方式是使用sp_detach_db預存程序來分離資料庫:
sp_detach_db 'AdventureWorks'
SQL Server在把資料庫從SQL Server執行個體上分離下來之前,會把所有的髒頁都寫回磁碟。然後,你就可以Copy資料庫檔案了,這時資料庫檔案也是處於一致性狀態的。然後,你可以使用sp_attach_db來重新附加資料庫:
sp_attach_db 'AdventureWorks', 'e:/mssql_data/AdventureWorks/AdventureWorks.mdf', 'e:/mssql_data/AdventureWorks_log.ldf'
假如你的資料庫僅僅由資料檔案組成,而且再也不需要交易記錄檔了,那麼使用sp_attach_single_file_db預存程序:
sp_attach_single_file_db 'AdventureWorks', 'e:/mssql_data/AdventureWorks/AdventureWorks.mdf'
當資料庫執行個體處於離線狀態時,你也可以安全的Copy資料庫檔案。
Copy資料庫檔案這種方式的主要略勢是,你不得不把資料庫離線一段時間,以便你來Copy資料檔案。而且,你也不能使用附加的資料庫作為差異備份和交易記錄備份的起始點。
本文翻譯自sqlbackuprestore,更多精彩內容請瀏覽http://www.sqlbackuprestore.com