2018-02-26

[SQL Server] Fix: File activation failure. Msg 1813 Could not open new database. CREATE DATABASE is aborted.


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.

01. 建立新資料庫: ForceRebuild。

-- 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。


使用 FOR ATTACH_REBUILD_LOG 失敗,因為 SQL Server 是使用 非正常 的方式來關閉資料庫。

-- 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

沒有留言:

張貼留言