DB

【SQL Server】LocalDBの例外と原因まとめ

LocalDBに接続する場合のエラー対処法まとめです。

事象①

LocalDB インスタンス "MSSQLLocalDB" は、次のエラーにより開始できませんでした:
Error occurred during LocalDB instance startup: SQL Server process failed to start.

同時に↓のメッセージが表示される。

bcrypt.dllエラー

プロシージャ エントリ ポイント BCryptKeyDerivation がダイナミック リンク ライブラリ bcrypt.dll から見つかりませんでした。

イベントログの内容

Windows API call WaitForMultipleObjects returned error code: 575. Windows system error message is: {アプリケーション エラー}
アプリケーションを正しく起動できませんでした (0x%lx)。[OK] をクリックしてアプリケーションを閉じてください。
Reported at line: 3714. 

原因

インスタンスを起動するべく、コマンドプロンプトから「sqllocaldb start MSSQLLocalDB」を実行すると、上記のエラーメッセージと供に発生。
起動できない原因は多々あるが、「bcrypt.dll」のエラーを伴う理由おそらく1つ。OSがサポート外である。
Windows7でSQL Server LocalDB 2017を使用すると発生する。元々公式ではサポート外と言っているが、インストールはできるため使えるものだと思っていた。
おそらくBCryptKeyDerivationという関数かプロパティは、Windows8以降の更新で、「bcrypt.dll」に追加されたと思われる。

発生例

Windows7でSQL Server LocalDB 2017をインストールし、インスタンスを起動。Windows10などにあげて対応。

事象②

System.Data.SqlClient.SqlException (0x80131904): 
Cannot attach the file '{mdfのパス}' as database '{mdfのファイル名}'.
原因

これは文字通り、LocalDBのファイルにアタッチできないとのこと。

発生例

ファイルがない、またはディレクトリへのアクセス権がない。

事象③

System.Data.SqlClient.SqlException (0x80131904): 
The database '{mdfのファイル名}' cannot be opened because it is version 852. This server supports version 851 and earlier. A downgrade path is not supported.
Could not open new database 'TESTLocalDB'. CREATE DATABASE is aborted.
Cannot attach the file '{mdfのパス}' as database '{mdfのファイル名}'.
原因

開こうとしているmdfファイルを作成したバージョンと、インストールしているLocalDBのバージョンが異なることが原因。
現在のサーバーでは851以前をサポートするとのこと。
version 851や852は内部的な値らしく、表に出る情報ではないっぽい。
「sqllocaldb v」コマンドで実際のバージョンと照らしあわせると、
851:Microsoft SQL Server 2016 Release Candidate 0 (RC0) (13.0.1100.286)
852:Microsoft SQL Server 2017 (14.0.1000.169)

でした。

発生例

2017LocalDBをインストールした環境で作成したmdfを、2016LocalDBインストール環境で接続する。

事象④

System.Data.SqlClient.SqlException (0x80131904): 
サーバーとの接続を正常に確立しましたが、ログイン中にエラーが発生しました。 (provider: Named Pipes Provider, error: 0 - パイプの他端にプロセスがありません。) ---> System.ComponentModel.Win32Exception (0x80004005): パイプの他端にプロセスがありません。
原因

相変わらず理解しにくいメッセージですが、LocalDBにWindows認証ではなく、SQLServer認証で接続する場合に発生します。ぼくの環境では、ログインユーザーは作成したけど、そのログインユーザーにサーバーロールを設定する前に接続するとこれが出ました。

↓のSQLを実行、サーバーロールを追加して解決しました。

EXEC sp_addsrvrolemember 'ユーザー名','sysadmin'

発生例

サーバーロール未設定で、Management StudioやPGからSQLServer認証で接続を試みる。

事象⑤

system.data.sqlclient.sqlexception (0x80131904):
SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできません。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。 (provider: SQL Network Interfaces, error: 50 - Local Database Runtime エラーが発生しました。LocalDB インスタンスを開始する際にエラーが発生しました: SQL Server プロセスを開始できませんでした。)
場所 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions)
場所 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
場所 System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
場所 System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnectionOptions userOptions)
場所 System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnectionOptions userOptions)
場所 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
場所 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
場所 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
場所 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInterval(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
場所 System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
場所 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
場所 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
場所 System.Data.SqlClient.SqlConnection.Open()
場所 {Projectの呼び出し箇所}

イベントログの内容

Windows API call WaitForMultipleObjects returned error code: 575. Windows system error message is: {アプリケーション エラー}
アプリケーションを正しく起動できませんでした (0x%lx)。[OK] をクリックしてアプリケーションを閉じてください。
Reported at line: 3714. 

原因

例外の内容からして、単なる接続文字列の不備や、mdfファイルのパスが誤っている等のケアレスミスだと見込んだが違った。
認証方法はWindows認証で、接続文字列は埋め込んでいるため間違いようがない。なにより、開発環境複数台を同じ方法で構成したのに1台のみで発生したのです。

 
Stack Overflowで同じエラーを見つけた。
Cannot start SqlLocalDB instance with my Windows account

投稿者はアカウントを変え、localDBのAppDataフォルダをリネームすることで正常に動いた模様。

 
うまくフォルダ内のファイルにアクセスできてないのか?
それを参考に、下記フォルダを削除することで解決しました。
C:\Users\{ユーザー名}\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\{インスタンス名}

削除してLocalDBへの接続を試みると再度フォルダが生成されました。なぜこの事象が起きたのか、どうやったら再現するのかはわかりませんでしたが、次回同じ事象になったらハマらずに済みそうです。

 

他にもあれば随時追加していきます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です