Share via


MSSQLSERVER_17207

適用対象:SQL Server

詳細

属性
製品名 SQL Server
イベント ID 17207
イベント ソース MSSQLSERVER
コンポーネント SQLEngine
シンボル名 DBLKIO_OS2DISKERROR
メッセージ テキスト %ls:ファイル '%ls' を作成中または開いているときに、オペレーティング システム エラー %ls が発生しました。 オペレーティング システム エラーを診断して修正し、操作を再試行してください。

説明

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

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

Error: 17207, Severity: 16, State: 1.
FileMgr::StartSecondaryDataFiles: Operating system error 2(The system cannot find the file specified.) occurred while creating or opening file 'F:\MSSQL\DATA\MyDB_FG1_1.ndf'. Diagnose and correct the operating system error, and retry the operation.

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

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

問題が SQL Server FileStream ファイル グループに関連している場合は、ファイル名の代わりに完全なディレクトリ パスのみが表示されていることがわかります。 次に例を示します。

Error: 17207, Severity: 16, State: 1.
STREAMFCB::Startup: Operating system error 2(The system cannot find the file specified.) occurred while creating or opening file 'C:\Program Files\Microsoft SQL Server\MSSQL13.SQL2016\MSSQL\DATA\bpa_files_test_fs_1\bpa_files_test_fs_1'. Diagnose and correct the operating system error, and retry the operation.

原因

SQL Server データベースを使用する前には、そのデータベースを起動する必要があります。 データベースの起動プロセスでは、データベースおよびデータベース ファイルを表すさまざまなデータ構造が初期化され、データベースに属するすべてのファイルが開かれ、最後にデータベースの復旧が実行されます。 SQL Server では、データベースに属するファイルを開くために、CreateFile Windows API 関数が使用されます。

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

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

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

    • エクスプローラーでファイルのプロパティを参照して、ファイルに設定されているアクセス許可を確認します。 SQL Server では、Windows グループを使用して、さまざまなファイル リソースに Access Control をプロビジョニングします。 適切なグループ (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)、または偽装されたアカウントのセキュリティ コンテキストにおいて、ファイルへのアクセスが行われているかどうかを把握します。

      SQL Server によって、ALTER DATABASE または CREATE DATABASE 操作を実行するログインのユーザー資格情報が偽装されている場合は、Process Monitor ツールに次の情報が表示されます (一例)。

      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\MSSQL13.SQL2016\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 パスが正しく構成されていない場合に、このような問題が発生する可能性があります。