トップ回答者
LDF(トランザクションログ)を消してしまった。

質問
-
いつもお世話になります。
<SQLServer 2000>
LDF(トランザクションログ)を消して、再起動してしまい。
以降、SQLServerが立ち上がらない状況です。
仕方なく、前のデータファイルとトランザクションログを戻し
再起動したのですが、以下の通り、okidbが分析できません。
色々調べてみたのですが、分かりません。 宜しくお願いします。
<正常時>
2008-10-16 14:31:58.37 server SQL Server を優先度クラス 'normal'(2 CPUs 検出) で開始しています。
2008-10-16 14:31:58.40 server SQL Server が thread モード処理用に設定されました。
2008-10-16 14:31:58.40 server dynamic ロック アロケーションを使用しています。 [2500] ロック ブロック、[5000] ロック所有者ブロック。
2008-10-16 14:31:58.43 server 分散トランザクション コーディネータ (MS DTC) を初期化しようとしています。
2008-10-16 14:32:11.57 spid3 データベース 'master' の開始中。
2008-10-16 14:32:11.61 server 'SSNETLIB.DLL' のバージョン '8.0.766' を使用しています。
2008-10-16 14:32:11.61 spid5 データベース 'model' の開始中。2008-10-16 14:32:11.61 spid3 サーバー名は 'ISSSQLSERVER' です。
2008-10-16 14:32:11.61 spid8 データベース 'msdb' の開始中。
2008-10-16 14:32:11.61 spid9 データベース 'pubs' の開始中。
2008-10-16 14:32:11.61 spid10 データベース 'Northwind' の開始中。
2008-10-16 14:32:11.61 spid11 データベース 'okidb' の開始中。
2008-10-16 14:32:11.61 spid12 データベース 'testdb' の開始中。
2008-10-16 14:32:11.62 server SQLServer は 192.1.1.251: 1433 で受信を待っています。
2008-10-16 14:32:11.64 spid5 tempdb データベースの消去中。
2008-10-16 14:32:11.65 spid11 データベース 'okidb' (7) の分析は 100% 完了しました (約 0 秒以上)
2008-10-16 14:32:11.68 server SQLServer は TCP, Shared Memory, Named Pipes で受信を待っています。
2008-10-16 14:32:11.68 server SQL Server はクライアント接続できます
2008-10-16 14:32:11.68 spid5 データベース 'tempdb' の開始中。
2008-10-16 14:32:11.70 spid3 復旧が完了しました。
2008-10-16 14:32:11.70 spid3 SQL global counter collection task is created.
<現状>
2009-06-29 17:33:41.60 server SQL Server を優先度クラス 'normal'(2 CPUs 検出) で開始しています。
2009-06-29 17:33:41.68 server SQL Server が thread モード処理用に設定されました。
2009-06-29 17:33:41.70 server dynamic ロック アロケーションを使用しています。 [2500] ロック ブロック、[5000] ロック所有者ブロック。
2009-06-29 17:33:41.73 server 分散トランザクション コーディネータ (MS DTC) を初期化しようとしています。
2009-06-29 17:33:55.20 server Failed to obtain TransactionDispenserInterface: Result Code = 0x8004d01b
2009-06-29 17:33:55.23 spid3 データベース 'master' の開始中。
2009-06-29 17:33:55.48 server 'SSNETLIB.DLL' のバージョン '8.0.766' を使用しています。2009-06-29 17:33:55.48 spid5 データベース 'model' の開始中。
2009-06-29 17:33:55.50 spid3 サーバー名は 'ISSSQLSERVER' です。
2009-06-29 17:33:55.50 spid8 データベース 'msdb' の開始中。
2009-06-29 17:33:55.50 spid9 データベース 'pubs' の開始中。
2009-06-29 17:33:55.50 spid10 データベース 'Northwind' の開始中。
2009-06-29 17:33:55.50 spid11 データベース 'okidb' の開始中。
2009-06-29 17:33:55.50 spid12 データベース 'testdb' の開始中。
2009-06-29 17:33:55.57 server SQLServer は 192.1.1.251: 1433 で受信を待っています。
2009-06-29 17:33:55.64 spid5 tempdb データベースの消去中。
2009-06-29 17:33:55.68 server SQLServer は TCP, Shared Memory, Named Pipes で受信を待っています。
2009-06-29 17:33:55.68 server SQL Server はクライアント接続できます
2009-06-29 17:33:55.90 spid5 データベース 'tempdb' の開始中。
2009-06-29 17:33:55.92 spid11 Bypassing recovery for database 'okidb' because it is marked SUSPECT.
2009-06-29 17:33:56.01 spid3 復旧が完了しました。
回答
すべての返信
-
こんにちは、nagino です。
この手のトラブルはバージョンや操作に依存することがありますので、可能であれば以下についてもう少し詳細な情報をご提示願います。
● OS (Windows 2003 SP1 など)
● SQL Server (SQL Server 2000 SP3 など)
● 「前のデータファイルとトランザクションログに戻し」とは? (バックアップから復元、データファイルとトランザクションログの 2 ファイルをコピーしてアタッチ、など)
● 現在手元にあるデータ・環境 (完全バックアップがあるか、デタッチしたファイルのコピーがあるか、検証環境の有無、など)
とりあえず「0x8004d01b」エラーの原因としては、MSDTC(分散トランザクションコーディネータ)が起動する前に SQL Server の起動処理が先に進んでしまっているためと思われます。
もしかしたら以下のケースが該当するかもしれません。
http://support.microsoft.com/kb/911845/ja
現段階で改善の可能性がありそうな対処法は、ぱっと思いつく限りでは以下でしょうか。
・ SQL Server SP4 を適用する。
・ MSDTC のサービスを手動で起動してから、SQL Server のサービスを起動する。
また、「Bypassing recovery ~(後略)」エラーの原因は、理由は様々ですが okidb に何らかの問題があるため、復旧処理が行えなかったと思われます。
「前のデータファイルとトランザクションログに戻し」た手順や、戻したファイルに問題がある可能性があります。
これについては、以下のように okidb を再度復元/アタッチしなおして再現するかどうかご確認ください。
・ 正常なバックアップがある ⇒ 一度 okidb を削除して、バックアップから復元する
・ デタッチしたファイルのコピーがある ⇒ 一度 okidb を削除して、アタッチしなおす
ご参考になれば幸いです。
MCITP(Database Developer/Database Administrator) -
現在の環境は
OS = Windows Server 2003 Enterprise SP2 (2台でクラスタを組んでいます)
DB = SQL Server2000 SP4
なお、指摘して頂いた改善策のSQL ServerSP4を適用した結果
下記のアラームは無くなりましたが症状に変化はありません。
Failed to obtain TransactionDispenserInterface: Result Code = 0x8004d01b
但し、okidbについてはエラーが残ったままです。
Bypassing recovery for database 'okidb' because it is marked SUSPECT.
-------------------------------------------------------
okidbのファイルを戻した作業手順は、
1 [消去]
XXXX.mdfを消去
2 [コピー]
過去に保存してあった、XXXX.mdf と XXXX.ldfをフォルダにコピー
3 [SQLServer起動]
EMで、△マークが緑色になるが接続出来ず。
4 [クエリアナライザー実行]
以下のアラームが出て接続出来ず
サーバー メッセージ 18456 レベル 16 状態 1
[MicroSoft][ODBC SQL Server Driver][SQLServer] 接続出来ません。
接続できれば、一旦okidbを消去し再構築する予定なのですが、
接続出来ずに困っています。 宜しくお願いします。 -
再構築をされることを前提に動かれているのであれば、以下のコマンドを実行してみてはどうでしょう。
use master
go
sp_configure 'allow updates',1
goreconfigure with override
go-- 未確認モード解除
update master..sysdatabases set status = 16 where name = 'データベース名'
go
DBCC DBRECOVER ('データベース名', IGNOREERRORS)
go
その後、SQL Server を再起動後、DBCC CheckDB にて整合性チェックを実施。
※ただ、データベースが破損している場合は、もうどうしようも無いのですが。 -
osql -Usa -Piss -dmaster -SISSSQLSERVER
上記、コマンドで接続成功しました。
-Sの指定が必要だったようです。
と、いう事で以下のコマンドを試してみようと思います。
use master
go
sp_configure 'allow updates',1
goreconfigure with override
go-- 未確認モード解除
update master..sysdatabases set status = 16 where name = 'データベース名'
go
DBCC DBRECOVER ('データベース名', IGNOREERRORS)
go