none
SQL Serverの自動再起動エラー RRS feed

  • 質問

  • ■質問内容

    SQL Server Agent側で「予期しない停止時にSQL Serverを自動的に再起動する」のオプションを有効にしていましたが、自動再起動の処理に失敗しました。

    ログからAgent実行ユーザーの権限不足が考えられる原因と思っておりますが、

    具体的にどのような権限を付与すれば、予期しない停止時に正しくインスタンスが再起動するようになるでしょうか?

    ■バージョンと実行ユーザ

    SQLServerのバージョン:SQL Server 2017

    Agentサービスの実行ユーザ:NT Service$SQLAgent$インスタンス名

    SQL Serverサービスの実行ユーザ:NT Service$MSSQL$インスタンス名

    ■エージェントのログ

    ```

    [140] AutoRestart: MSSQL$インスタンス名 サービスを3回再起動しようとしましたが、再起動できませんでした。

    [368] AutoRestart: MSSQL$インスタンス名 サービスを再起動できません(理由:アクセスが拒否されました)

    [139] AutoRestart: MSSQL$インスタンス名 サービスが失敗しました。サービスを再起動しようとしています(再試行回数 #3)

    [368] AutoRestart: MSSQL$インスタンス名 サービスを再起動できません(理由:アクセスが拒否されました)

    [139] AutoRestart: MSSQL$インスタンス名 サービスが失敗しました。サービスを再起動しようとしています(再試行回数 #2)

    [368] AutoRestart: MSSQL$インスタンス名 サービスを再起動できません(理由:アクセスが拒否されました)

    [139] AutoRestart: MSSQL$インスタンス名 サービスが失敗しました。サービスを再起動しようとしています(再試行回数 #1)

    ```

    情報をお持ちの方がいらっしゃればご教授いただければと思います。

    以上、よろしくお願いいたします。


    2020年1月27日 7:19

回答

  • 個人的な見解となりますが、SQL Server プロセスが Shutdown ロジックに入らず不正にダウンするような事象は稀だと思いますが、可能な限りダウンタイムを減らすという意味では、"予期しない停止時に SQL Server を自動的に再起動する"という設定を有効にしたほうが良いかと思います。
    また、"NT Service$SQLAgent$インスタンス名"は、仮想アカウント(サービス SID) となり、必要最小限の権限のみが付与されているため、別サービスである SQL Server サービスを操作する権限を敢えて付与していないのではないかと推測しています。

    Windows サービス アカウントと権限の構成
    https://docs.microsoft.com/ja-jp/sql/database-engine/configure-windows/configure-windows-service-accounts-and-permissions?view=sql-server-ver15#Serv_SID

    なお、SQL Server Agent サービスのサービス起動アカウントは、SQL Server インスタンスに対する sysadmin 権限を付与する必要があり、一般的には LocalSystem を指定することを避けることが推奨されているため、変更される場合は、ドメインアカウントを準備していただくほうが良いかと思います。

    SQL Server エージェント サービスのアカウントの選択
    https://docs.microsoft.com/ja-jp/sql/ssms/agent/select-an-account-for-the-sql-server-agent-service?view=sql-server-ver15#sql-server-role-membership
    ---
    [ローカル システム アカウント] オプションは、旧バージョンとの互換性のためだけに用意されています。 ローカル システム アカウントには、 SQL Server エージェントが必要としない権限があります。 ローカル システム アカウントとして SQL Server エージェントを実行するのは避けてください。 セキュリティを強化するには、次の「Windows ドメイン アカウントの権限」に示す権限のある Windows ドメイン アカウントを使用します。
    ---
    • 回答としてマーク yasutakaaa 2020年2月5日 4:17
    2020年1月31日 17:49

すべての返信

  • AgentサービスのユーザがAdmistratorsグループに属する必要があるように読めます。

    https://docs.microsoft.com/ja-jp/sql/database-engine/configure-windows/configure-windows-service-accounts-and-permissions?view=sql-server-2017

    次の表は、 SQL Server サービスが追加の機能を提供するために必要な権限を示しています。

    SQL Server エージェント (MSSQLSERVER) 再起動の自動化機能を使用します。 Administrators ローカル グループのメンバーである必要があります


    jzkey

    2020年1月27日 9:13
  • 該当のエラーは、SQL Server Agentのサービス起動アカウントに設定されたアカウント(NT Service$SQLAgent$インスタンス名)に SQL Server サービスを再起動可能な権限 が付与されていない場合に発生しうるエラーだと思います。
    最も簡単な対処方法としては、SQL ServerとSQL Server Agentのサービス起動アカウントを同じアカウントすることでしょうか。

    要件として、SQL Server Agentのサービス起動アカウントを "NT Service$SQLAgent$インスタンス名" から変更できない場合は、SQL Server サービスのアクセス制御リストに、"NT Service$SQLAgent$インスタンス名"を追加し、該当アカウントからSQL Server サービスを再起動する権限を明示的に付与する必要があるかと思います。

    サービスの随意アクセス制御リストを作成する場合の推奨事項およびガイド
    https://support.microsoft.com/ja-jp/help/914392/best-practices-and-guidance-for-writers-of-service-discretionary-acces

    試しにやってみたところ、SQL Server Agentのサービス起動アカウント"NT Service$SQLAgent$インスタンス名" から SQL Server サービスを再起動できる状態になりました。

    -- 既存の SQL Server サービスの随意アクセス制御リスト情報を確認
    >sc sdshow MSSQLSERVER
    
    D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
    
    -- 既存の SQL Server サービスの随意アクセス制御リストに SQL Server Agentのサービス起動アカウントのSID を追加し、Local Systemと同じ権限 "CCLCSWRPWPDTLOCRRC" を付与
    
    sc sdset MSSQLSERVER D:(A;;CCLCSWRPWPDTLOCRRC;;;S-1-5-80-344959196-2060754871-2302487193-2804545603-1466107430)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
    
    [補足]
    SQL Server Agentのサービス起動アカウント"NT Service$SQLAgent$インスタンス名のSID情報は、以下のレジストリから確認可能です。
    
    レジストリ
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
    


    ※ 今回は、Local Systemと同じ権限 "CCLCSWRPWPDTLOCRRC" を付与していますが、最低限の権限のみを付与したい場合は、Trial and Error となりますが、権限を減らしても SQL Server サービスを再起動できる権限を検証していただくことになるかと思います。

    2020年1月28日 7:28
  • ご回答いただきありがとうございます。

    Administratorの権限の付与をしてみます。

    2020年1月31日 4:38
  • ご回答いただきありがとうございます。

    検証までいただきありがとうございます。SQL Serverのサービス実行用に権限を付与したドメインアカウントを準備するか、

    LocalSystemでのサービスの起動での方向で考えたいと思います。

    SQL Serverのデフォルトのサービス実行ユーザーを使用しており、自動再起動するには権限が不足している状態ですが、

    一般的にこの機能は使わないのでしょうか?

    2020年1月31日 4:45
  • 個人的な見解となりますが、SQL Server プロセスが Shutdown ロジックに入らず不正にダウンするような事象は稀だと思いますが、可能な限りダウンタイムを減らすという意味では、"予期しない停止時に SQL Server を自動的に再起動する"という設定を有効にしたほうが良いかと思います。
    また、"NT Service$SQLAgent$インスタンス名"は、仮想アカウント(サービス SID) となり、必要最小限の権限のみが付与されているため、別サービスである SQL Server サービスを操作する権限を敢えて付与していないのではないかと推測しています。

    Windows サービス アカウントと権限の構成
    https://docs.microsoft.com/ja-jp/sql/database-engine/configure-windows/configure-windows-service-accounts-and-permissions?view=sql-server-ver15#Serv_SID

    なお、SQL Server Agent サービスのサービス起動アカウントは、SQL Server インスタンスに対する sysadmin 権限を付与する必要があり、一般的には LocalSystem を指定することを避けることが推奨されているため、変更される場合は、ドメインアカウントを準備していただくほうが良いかと思います。

    SQL Server エージェント サービスのアカウントの選択
    https://docs.microsoft.com/ja-jp/sql/ssms/agent/select-an-account-for-the-sql-server-agent-service?view=sql-server-ver15#sql-server-role-membership
    ---
    [ローカル システム アカウント] オプションは、旧バージョンとの互換性のためだけに用意されています。 ローカル システム アカウントには、 SQL Server エージェントが必要としない権限があります。 ローカル システム アカウントとして SQL Server エージェントを実行するのは避けてください。 セキュリティを強化するには、次の「Windows ドメイン アカウントの権限」に示す権限のある Windows ドメイン アカウントを使用します。
    ---
    • 回答としてマーク yasutakaaa 2020年2月5日 4:17
    2020年1月31日 17:49
  • ご回答いただきありがとうございます。

    docs記載の内容についても確認させていただきました。

    今後、ドメインアカウントに対してsysadmin権限を付与し、サービスの起動を行いたいと思います。

    2020年2月5日 4:20