MSSQLSERVER_17204

適用対象: SQL サーバー

詳細

属性 Value
製品名 SQL Server
イベント ID 17204
イベント ソース MSSQLSERVER
コンポーネント SQLEngine
シンボル名 DBLKIO_DEVOPENFAILED
メッセージ テキスト %ls: ファイル番号 %d のファイル %ls を開けませんでした。 OS エラー: %ls。

説明

SQL Server で、指定された OS エラーが原因で指定されたファイルを開くことができませんでした。

SQL Server がデータベースやトランザクション ログ ファイルを開くことができない場合、Windows アプリケーション イベントまたは SQL Server エラー ログにエラー 17204 が表示されることがあります。 このエラーの例を次に示します。

Error: 17204, Severity: 16, State: 1.
FCB::Open failed: Could not open file c:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\data\MyDB_Prm.mdf for file number 1.  OS error: 5(Access is denied.).

SQL Server インスタンスの起動プロセス中、またはデータベースの起動を試みるデータベース操作 (ALTER DATABASE など) で、これらのエラーが発生する場合があります。 シナリオによっては、17204 と 17207 の両方のエラーが表示される場合があり、別の状況ではそのうちの 1 つだけが表示される場合があります。

ユーザー データベースでこのようなエラーが発生した場合、そのデータベースは RECOVERY_PENDING 状態のままになり、アプリケーションはこのデータベースにアクセスできなくなります。 システム データベースでこれらのエラーが発生した場合、SQL Server インスタンスは起動せず、SQL Server のこのインスタンスに接続できません。 システム データベースで障害が発生すると、SQL Server フェールオーバー クラスター リソースがオフラインになる可能性もあります。

原因

SQL Server データベースを使用する前に、データベースを起動する必要があります。 データベースの起動プロセスは次のようになります。

  1. データベースおよびデータベース ファイルを表すさまざまなデータ構造を初期化する
  2. データベースに属するすべてのファイルを開く
  3. データベース上で復旧を実行する

SQL Server では、 CreateFile Windows API 関数を使用して、データベースに属するファイルを開きます。

メッセージ 17204 (および 17207) は、SQL Server がスタートアップ プロセス中にデータベース ファイルを開こうとしたときにエラーが発生したことを示します。

これらのエラー メッセージには、次の情報が含まれています。

  1. ファイルを開こうとしている SQL Server 関数の名前。 通常、これらのエラー メッセージに表示される関数名は、次のいずれかになります。

    • FCB::Open - SQL Server が開こうとしたときにファイルでエラーが発生しました
    • FileMgr::StartPrimaryDataFiles - プライマリ データ ファイルまたはプライマリ ファイル グループに属するファイル
    • FileMgr::StartSecondaryDataFiles - セカンダリ ファイル グループに属するファイル
    • FileMgr::StartLogFiles - トランザクション ログ ファイル
    • STREAMFCB::Startup - SQL FileStream コンテナー
    • FCB::RemoveAlternateStreams
  2. 状態情報によって、このエラー メッセージを生成する可能性がある関数内の複数の場所が識別されます

  3. ファイルの完全な物理パス

  4. ファイルに対応するファイル ID

  5. オペレーティング システムのエラー コードとエラーの説明。 場合によっては、エラー コードのみが表示されます。

これらのエラー メッセージに表示されるオペレーティング システムのエラー情報は、エラー 17204 につながる根本原因です。 これらのエラー メッセージのよくある原因は、アクセス許可の問題か、ファイルへの正しくないパスです。

ユーザーの操作

  1. エラー 17204 を解決するには、関連付けられているオペレーティング システムのエラー コードを理解し、そのエラーを診断する必要があります。 オペレーティング システムのエラー状態が解決したら、(ALTER DATABASE SET ONLINE などを使用して) データベースまたは SQL Server インスタンスを再起動して、影響を受けるデータベースをオンラインにすることができます。 場合によっては、オペレーティング システムのエラーを解決できないことがあります。 その場合、特定の是正措置を講じる必要があります。 このセクションでは、それらの操作について説明します。

  2. 17204 エラー メッセージにエラー コードのみが含まれており、エラーの説明が含まれていない場合は、オペレーティング システム シェル (net helpmsg <error code> のコマンドを使用してエラー コードを解決してみてください。 エラー コードとして 8 桁の状態コードを取得している場合は、「HRESULT を Win32 エラー コードに変換する方法」などの情報源を参照して、これらの状態コードを OS エラーにデコードできます。

  3. Access is Denied オペレーティング システム エラー = 5 を取得している場合は、次の方法を検討してください。

    • エクスプローラーでファイルのプロパティを参照して、ファイルに設定されているアクセス許可を確認します。 SQL Server では、Windows グループを使用して、さまざまなファイル リソースにアクセス制御をプロビジョニングします。 適切なグループ [SQLServerMSSQLUser$ComputerName$MSSQLSERVER や SQLServerMSSQLUser$ComputerName$InstanceName などの名前] に、エラー メッセージで言及されているデータベース ファイルに対して必要なアクセス許可が付与されていることを確認します。 詳細については、「データベース エンジン アクセスのファイル システム権限の構成」を参照してください。 Windows グループに SQL Server サービスのスタートアップ アカウントまたはサービス SID が実際に含まれていることを確認します。

    • SQL Server サービスが現在実行されているユーザー アカウントを確認します。 Windows タスク マネージャーを使用して、この情報を取得できます。 実行可能ファイル "sqlservr.exe" の "ユーザー名" の値を探します。 また、SQL Server サービス アカウントを最近変更した場合は、サポートされているこの操作の方法が SQL Server 構成マネージャー ユーティリティを使用していることを確認してください。 これについて詳しくは、「SQL Server 構成マネージャー」をご覧ください。

    • 操作の種類 (サーバー起動中にデータベースを開く、データベースのアタッチ、データベースの復元など) によっては、偽装とデータベース ファイルへのアクセスに使用されるアカウントが異なる場合があります。 トピック「データ ファイルとログ ファイルのセキュリティ保護」を確認して、どの操作によってどのアクセス許可が、どのアカウントに設定されるかを理解してください。 Windows SysInternals Process Monitor などのツールを使用して、SQL Server インスタンスのサービス開始アカウント [またはサービス SID]、または偽装されたアカウントのセキュリティ コンテキストにおいて、ファイルへのアクセスが行われているかどうかを把握します。

      ALTER DATABASE または CREATE DATABASE 操作を実行するユーザーの資格情報を SQL Server が偽装している場合は、プロセス モニター ツール (例) に次の情報が表示されます。

      Date & Time:      3/27/2010 8:26:08 PM
      Event Class:        File System
      Operation:          CreateFile
      Result:                ACCESS DENIED
      Path:                  C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\attach_test.mdf
      TID:                   4288
      Duration:             0.0000366
      Desired Access:Generic Read/Write
      Disposition:        Open
      Options:            Synchronous IO Non-Alert, Non-Directory File, Open No Recall
      Attributes:          N
      ShareMode:       Read
      AllocationSize:   n/a
      Impersonating: DomainName\UserName
      
  4. The system cannot find the file specified オペレーティング システム エラー = 3 が表示された場合:

    • エラー メッセージで完全なパスを確認します
    • エクスプローラーでディスク ドライブとフォルダー パスが表示され、アクセス可能であることを確認します
    • Windows イベント ログを確認して、このディスク ドライブに問題があるかどうかを調べます
    • パスが正しくない場合、またこのデータベースがシステムに既に存在する場合は、トピック「データベース ファイルの移動」で説明されている方法を使用してデータベース ファイルのパスを変更できます。 特に 17204 または 17207 が発生しているシステム データベース ファイルで、指定されたディスク ドライブが使用できないディザスター リカバリー シナリオに取り組んでいる場合に、この手順の使用が必要になる場合があります。 このトピックでは、さまざまなシステム データベース (master、model、tempdb、msdb、および mssqlsystemresource.mdf) の現在の場所を特定する方法についても説明します。
    • データベース ファイルが見つからないためにこのエラーが表示される場合は、有効なバックアップからデータベースを復元する必要があります。
      • エラーに関連付けられているデータベース ファイルがセカンダリ ファイル グループに属している場合は、必要に応じて、ファイル グループをオフラインにし、データベースをオンラインにしてから、そのファイル グループの復元を単独で実行できます。 詳細については、「ALTER DATABASE (Transact-SQL) の File および Filegroup オプション」のオフラインに関するセクションを参照してください。
      • エラーを生成したファイルがトランザクション ログ ファイルである場合は、CREATE DATABASE (Transact-SQL) に関するトピックの "FOR ATTACH" と "FOR ATTACH_REBUILD_LOG" に関するセクションの情報を参照して、欠落しているトランザクション ログ ファイルを再作成する方法を確認してください。
    • SQL Server がこれらの場所にあるデータベース ファイルへのアクセスを試みる前に、ディスクまたはネットワークの場所 (iSCSI ドライブなど) が使用可能であることを確認します。 必要に応じて、クラスター アドミニストレーターまたはサービス コントロール マネージャーで必要な依存関係を作成します。
  5. The process cannot access the file because it is being used by another process オペレーティング システム エラー = 32 が表示された場合:

    • Windows Sysinternals のプロセス エクスプローラーハンドルなどのツールを使用して、別のプロセスまたはサービスがこのデータベース ファイルに対して排他的ロックを取得しているかどうかを確認します
    • そのプロセスが SQL Server データベース ファイルにアクセスするのを停止します。 一般的な例としては、ウイルス対策プログラムがあります (ファイルの除外に関するガイダンスについては、次のサポート技術情報の記事を参照)
    • クラスター環境で、以前に所有していたノードの sqlservr.exe プロセスによって、データベース ファイルへのハンドルが実際に解放されていることを確認します。 通常、このような状況は起こりませんが、クラスターまたは I/O パスが正しく構成されていない場合に、このような問題が発生する可能性があります。