さて久々にSQL Serverのトランザクションログが破損する事態が発生しました。
トランザクション実行中にPCの電源がOFFになっちゃんたんですね。
復旧は簡単にできるのですが、その手順をメモしておきます。
[手順]
以下のTransact-SQLを順に実行します。
(このサンプルではトランザクションログが破損したDBを[TestDB]としています)
1.ALTER DATABASE TestDB SET EMERGENCY
問題のデータベースの状態をEMERGENCYに変更します。これでデータベースがREAD_ONLYになり、ログ記録が無効になります。
2.ALTER DATABASE TestDB SET SINGLE_USER
問題のデータベースをシングルユーザーモードに変更します。
3.DBCC CHECKDB ('TestDB',REPAIR_ALLOW_DATA_LOSS)
DBCC CHECKDBを実行してデータベースを復旧します。
4.ALTER DATABASE TestDB SET ONLINE
復旧が完了したらデータベースをオンラインに戻します。
5.ALTER DATABASE TestDB SET MULTI_USER
マルチユーザーモードに戻します。
なお、データベースの状態はsys.databasesで確認します。
[参考文献]
SQL Serverヒント集:どのような場合に緊急モードでの修復を使用する必要があるか、およびその方法を理解する
MSDN:ALTER DATABASEのSETオプション(Transact-SQL)
MSDN:DBCC CHECKDB(Transact-SQL)
Note:How to Emergency Mode Repair
If you execute Emergency Mode Repair to your system's SQL Server user databases,you can use follow Transact-SQL.
("TestDB" is a sample database)
ALTER DATABASE TestDB SET EMERGENCY
GO
ALTER DATABASE TestDB SET SINGLE_USER
GO
DBCC CHECKDB ('TestDB',REPAIR_ALLOW_DATA_LOSS)
GO
ALTER DATABASE TestDB SET ONLINE
GO
ALTER DATABASE TestDB SET MULTI_USER
GO
If you check database state,you see sys.databases.