次の方法で共有


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 <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)、または偽装されたアカウントのセキュリティ コンテキストにおいて、ファイルへのアクセスが行われているかどうかを把握します。

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