FOR ATTACH_FORCE_REBUILD_LOG
- undocumented。
- 自動重建 Transaction log file 檔案,與 附加 資料庫作業。
- 但有 Data Loss issue。
正常關閉 SQL Server 時,是可以使用 FOR ATTACH 或 FOR ATTACH_REBUILD_LOG 方式,附加 回該資料庫 與 自動重建 Transaction log file。
若因 意外中斷 SQL Server Service,資料庫 非正常 關閉。
- 可以嘗試使用 FOR ATTACH_FORCE_REBUILD_LOG 來 自動重建 Transaction log file 檔案,與 附加 資料庫作業。
- 但必須面對 Data Loss issue!
縮小 Transaction log file ???
- 恣意用 Task Manager(工作管理員) 結束 SQL Server Service。
- 砍掉 Transaction log file 檔案。
- 再用 FOR ATTACH_FORCE_REBUILD_LOG 來 自動重建 Transaction log file 檔案,與 附加 資料庫作業。
- Data Loss issue 伴隨而來...
Fix: File activation failure. Msg 1813 Could not open new database. CREATE DATABASE is aborted.
Demo environment:
- SQL Server 2017 Enterprise Edition.
-- figure 01_CREATE DATABASE
02. 建立 2 張資料表:tb_G1_Data, tb_G2_Data。
-- figure 02_CREATE TABLE
03. 各新增 1 筆資料列。
- 「Autocommit Transactions(自動認可交易)」,自動認可模式是預設的交易管理模式。
- Autocommit mode is the default transaction management mode。
-- figure 03_Each table has one record
04. 使用 「Explicit Transactions(外顯交易)」。
- 新增 3 筆資料列。
- 但是不執行 Commit Transaction,Without commit the transaction。
-- figure 11_Explicit transaction_Insert 3 rows
05. 執行 SHUTDOWN WITH NOWAIT,立即停止 SQL Server。
- 模擬意外中斷 SQL Server Service。
- 或是,用 Task Manager 中斷 SQL Server Service。
WITH NOWAIT 引數
- 不會對每個資料庫執行CHECKPOINT,立即關閉 SQL Server。
- 在嘗試終止所有使用者處理序之後,結束 SQL Server。
- 當重新啟動伺服器時,會執行未完成的交易之回復作業。
-- figure 12_SHUTDOWN WITH NOWAIT_without performing checkpoint
06. 模擬錯誤:
- 更改 Transaction log file 檔案名稱。
- 將該資料庫搬移到新的資料夾。
-- figure 13_ReName_Log_Move_DB_To_New_Location
07. 重新啟動 SQL Server。
08. 觀察資料庫狀態: RECOVERY_PENDING。
- 因為資料庫的實體檔案已經不存在原來的路徑。
-- figure 14_DB_State_RECOVERY_PENDING
09. 刪除受損的資料庫: ForceRebuild。
-- figure 15_DROP DATABASE
10. 使用 FOR ATTACH,嘗試 附加回該資料庫。
FOR ATTACH 需要下列項目:
- 所有資料檔案 (MDF 和 NDF) 都必須是可用的。
- 如果存在多個記錄檔,它們必須全部都是可用的。
- 如果讀取/寫入資料庫有目前無法使用的單一記錄檔,且在進行附加作業之前,資料庫因為 沒有使用者或開啟的交易 而關閉,則 FOR ATTACH 會自動重建記錄檔並更新主要檔案。
- 反之,如果是唯讀資料庫,則會因為無法更新主要檔案而無法重建記錄。
- 因此,當您所附加的唯讀資料庫之記錄無法使用時,您必須在 FOR ATTACH 子句中提供記錄檔或檔案。
- 資料庫快照集中無法指定 FOR ATTACH。
使用 FOR ATTACH 失敗,因為 SQL Server 是使用 非正常 的方式來關閉資料庫。
File activation failure. The physical file name "C:\TSQLDB\ForceRebuild_log.ldf" may be incorrect. The log cannot be rebuilt because there were open transactions/users when the database was shutdown, no checkpoint occurred to the database, or the database was read-only. This error could occur if the transaction log file was manually deleted or lost due to a hardware or environment failure. Msg 1813, Level 16, State 2, Line 3 Could not open new database 'ForceRebuild'. CREATE DATABASE is aborted.
-- figure 21_FOR ATTACH_ERROR_Msg 1813
11. 使用 FOR ATTACH_REBUILD_LOG,嘗試 附加回該資料庫。
FOR ATTACH_REBUILD_LOG 需要下列項目:
- 正常關閉資料庫。
- 所有資料檔案 (MDF 和 NDF) 都必須是可用的。
- 這項作業會中斷記錄備份鏈結。 建議您在作業完成之後執行完整的資料庫備份。
- 一般而言,如果您要將一個含有大型記錄的讀/寫資料庫複製到其他伺服器,而該伺服器中,因為資料庫副本大部分用在讀取作業或只用在讀取作業,
- 所以所需的記錄空間比原始資料庫少,在這種情況下,通常就會使用 FOR ATTACH_REBUILD_LOG。
- 資料庫快照集中無法指定 FOR ATTACH_REBUILD_LOG。
-- figure 22_FOR ATTACH_REBUILD_LOG_ERROR_Msg 1813
use FOR ATTACH_FORCE_REBUILD_LOG
01. 使用 undocumented FOR ATTACH_FORCE_REBUILD_LOG ,嘗試 附加回該資料庫。
FOR ATTACH_FORCE_REBUILD_LOG
- undocumented
- 成功地 重建 Transaction log file 檔案,完成 附加 資料庫作業。
File activation failure. The physical file name "C:\TSQLDB\ForceRebuild_log.ldf" may be incorrect. New log file 'C:\SQLData\ForceRebuild_log.ldf' was created.
-- figure 31_undocumented FOR ATTACH_FORCE_REBUILD_LOG_ReBuild
02. 檢視 SQL Server Error Log:
- New log file 'C:\SQLData\ForceRebuild_log.ldf' was created.
- Parallel redo is started for database 'ForceRebuild' with worker pool size [2].
- Parallel redo is shutdown for database 'ForceRebuild' with worker pool size [2].
-- figure 32_SQL Server Error Log
03. 查詢資料表:Data loss issue
- 原先 Autocommit Transactions 所新增 1 筆,都 遺失不見了!
-- figure 33_Data_loss
使用 SQL Server 中文版本
檔案啟用錯誤。實體檔案名稱 "C:\TSQLDB\ForceRebuild_log.ldf" 可能不正確。 無法重建記錄,因為關閉資料庫時仍有開啟的交易/使用者、資料庫未發生檢查點,或資料庫是唯讀的。 如果手動刪除交易記錄檔,或因硬體或環境失敗而遺失交易記錄檔,就可能發生這種錯誤。 訊息 1813,層級 16,狀態 2,行 19 無法開啟新資料庫 'ForceRebuild'。CREATE DATABASE 已經中止。
01. FOR ATTACH
-- figure 11_FOR ATTACH_錯誤_訊息 1813
02. FOR ATTACH_REBUILD_LOG
-- figure 12_FOR ATTACH_REBUILD_LOG_錯誤_訊息 1813
03. FOR ATTACH_FORCE_REBUILD_LOG
檔案啟用錯誤。實體檔案名稱 "C:\TSQLDB\ForceRebuild_log.ldf" 可能不正確。 已建立新記錄檔 'C:\SQLData\ForceRebuild_log.ldf'。
-- figure 13_undocumented FOR ATTACH_FORCE_REBUILD_LOG
Sample Code
20180226_FOR_ATTACH_FORCE_REBUILD_LOG
https://drive.google.com/drive/folders/0B9PQZW3M2F40OTk3YjI2NTEtNjUxZS00MjNjLWFkYWItMzg4ZDhhMGIwMTZl?usp=sharing
References
Database Detach and Attach (SQL Server)
https://docs.microsoft.com/en-us/sql/relational-databases/databases/database-detach-and-attach-sql-server
CREATE DATABASE (SQL Server Transact-SQL)
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-database-sql-server-transact-sql
交易記錄檔(transaction log)意外損毀,僅剩下資料檔案可用為例。錯誤訊息:訊息 1813,層級 16,狀態 2 ... 檔案啟動錯誤。實體檔案名稱 "*.ldf" 可能不正確。
http://sharedderrick.blogspot.tw/2010/02/transaction-log-1813-16-2-ldf.html