Экземпляр LocalDB исчезает после попытки подключения с использованием C # SqlConnect при запуске от имени пользователя локальной системы - PullRequest
0 голосов
/ 05 июля 2019

Мы рассматриваем возможность использования LocalDB для нашего приложения в производстве. Поскольку наш сервис и веб-приложение работают как сервис LOCAL_SYSTEM, имеет смысл запускать экземпляр localdb как LOCAL_SYSTEM.

Я уже некоторое время тестирую, и у меня несколько проблем. Протестировано на нескольких машинах, только для ОС x64.

SQL Server v12 / 2014 Express LocalDB с использованием установщика x64. 14 августа 2017 года дает тот же результат. Не существует установщика x86, который работает в ОС x64.

C:\Temp>echo %username%
lan

C:\Temp>psexec.exe -s cmd.exe

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com


Microsoft Windows [Version 10.0.18362.175]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Windows\system32>cd c:\Temp

c:\Temp>echo %username%
TSTWCD03$

c:\Temp>SQLLocalDB create MyInstance
LocalDB instance "MyInstance" created with version 12.0.2000.8.

c:\Temp>SQLLocalDB start MyInstance
LocalDB instance "MyInstance" started.

c:\Temp>sqlcmd -S "(localdb)\MyInstance" -Q "SELECT GETDATE()"

-----------------------
2019-07-05 16:37:00.043

(1 rows affected)

Итак, экземпляр теперь явно работает. Давайте попробуем подключиться, используя мое приложение для сборки x64 C #:

c:\Temp>ODBCTest_x64
Connect using SQL: Data Source = (localdb)\MyInstance; Integrated Security = True; Connect Timeout = 10;
SQLCONN State: Open

c:\Temp>SQLLocalDB info MyInstance
Name:               MyInstance
Version:            12.0.2000.8
Shared name:
Owner:              NT AUTHORITY\SYSTEM
Auto-create:        No
State:              Running
Last start time:    05/07/2019 16:36:36
Instance pipe name: np:\\.\pipe\LOCALDB#F3826724\tsql\query

c:\Temp>dir "C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\MyInstance"
 Volume in drive C has no label.
 Volume Serial Number is BC82-AA93

 Directory of C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\MyInstance

05/07/2019  16:36    <DIR>          .
05/07/2019  16:36    <DIR>          ..
05/07/2019  16:36                 0 error.log
05/07/2019  16:36            12.030 error1.log
05/07/2019  16:36                 0 error2.log
05/07/2019  16:36         1.048.576 log.trc
05/07/2019  16:36                 0 log_1.trc
05/07/2019  16:36         4.194.304 master.mdf
05/07/2019  16:36         2.097.152 mastlog.ldf
05/07/2019  16:36         2.293.760 model.mdf
05/07/2019  16:36           524.288 modellog.ldf
05/07/2019  16:36        13.434.880 msdbdata.mdf
05/07/2019  16:36           524.288 msdblog.ldf
05/07/2019  16:36            73.728 system_health_0_132068109699630000.xel
05/07/2019  16:36                 0 system_health_0_132068109978530000.xel
05/07/2019  16:36         2.293.760 tempdb.mdf
05/07/2019  16:36           516.096 templog.ldf
              15 File(s)     27.012.862 bytes
               2 Dir(s)  59.358.416.896 bytes free

Подключение с использованием x64 SqlConnection прошло успешно.

Но наш сервис работает как приложение x86 ...

c:\Temp>ODBCTest_x86
Connect using SQL: Data Source = (localdb)\MyInstance; Integrated Security = True; Connect Timeout = 10;

Необработанное исключение: System.Data.SqlClient.SqlException: ошибка, связанная с сетью или экземпляром, возникла при установлении соединения с SQL Server. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений. (поставщик: сетевые интерфейсы SQL, ошибка: 50 - ошибка времени выполнения локальной базы данных. Указанный экземпляр LocalDB не существует.)

в System.Data.SqlClient.SqlInternalConnectionTds..ctor (идентичность DbConnectionPoolIdentity, SqlConnectionString connectionOptions, SqlCredential верительных, Object providerInfo, Струнный Новый_пароль, SecureString newSecurePassword, логическое redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool бассейн, Строка, Boolean маркер доступа applyTransientFaultHandling , SqlAuthenticationProviderManager sqlAuthProviderManager)
в System.Data.SqlClient.SqlConnectionFactory.CreateConnection (параметры DbConnectionOptions, DbConnectionPoolKey poolKey, объект poolGroupProviderInfo, пул DbConnectionPool, DbConnection owningConnection, DbConnectionOptions userOptions) * 10 в System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection (пул DbConnectionPool, DbConnection owningObject, параметры DbConnectionOptions, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
в System.Data.ProviderBase.DbConnectionPool.CreateObject (DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
в System.Data.ProviderBase.DbConnectionPool.UserCreateRequest (DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
в System.Data.ProviderBase.DbConnectionPool.TryGetConnection (DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, логический onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal & подключение) в System.Data.ProviderBase.DbConnectionPool.TryGetConnection (DbConnection owningObject, TaskCompletionSource 1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)<br> at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource 1 повтор, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal & connection)
в System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal (DbConnection externalConnection, DbConnectionFactory connectionFactory, TaskCompletionSource 1 retry, DbConnectionOptions userOptions)<br> at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource 1 повтор, DbConnectionOptions userOptions)
в System.Data.SqlClient.SqlConnection.TryOpenInner (TaskCompletionSource 1 retry)<br> at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource 1 повтор)
в System.Data.SqlClient.SqlConnection.Open ()
в ODBCTest.Program.Main (строка [] args)

c:\Temp>SQLLocalDB info MyInstance
Printing of LocalDB instance "MyInstance" information failed because of the following error:
LocalDB instance "MyInstance" doesn't exist!

c:\Temp>dir "C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\MyInstance"
 Volume in drive C has no label.
 Volume Serial Number is BC82-AA93

 Directory of C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\MyInstance

05/07/2019  16:36    <DIR>          .
05/07/2019  16:36    <DIR>          ..
05/07/2019  16:36                 0 error.log
05/07/2019  16:36            12.030 error1.log
05/07/2019  16:36                 0 error2.log
05/07/2019  16:36         1.048.576 log.trc
05/07/2019  16:36                 0 log_1.trc
05/07/2019  16:36         4.194.304 master.mdf
05/07/2019  16:36         2.097.152 mastlog.ldf
05/07/2019  16:36         2.293.760 model.mdf
05/07/2019  16:36           524.288 modellog.ldf
05/07/2019  16:36        13.434.880 msdbdata.mdf
05/07/2019  16:36           524.288 msdblog.ldf
05/07/2019  16:36            73.728 system_health_0_132068109699630000.xel
05/07/2019  16:36                 0 system_health_0_132068109978530000.xel
05/07/2019  16:36         2.293.760 tempdb.mdf
05/07/2019  16:36           516.096 templog.ldf
              15 File(s)     27.012.862 bytes
               2 Dir(s)  59.358.351.360 bytes free

WTF только что произошел? x86 SqlConnection к моему x64 SQL LocalDB просто убил мой экземпляр ... в экземпляре!

c:\Temp>SQLLocalDB create MyInstance
LocalDB instance "MyInstance" created with version 12.0.2000.8.

c:\Temp>SQLLocalDB start MyInstance
LocalDB instance "MyInstance" started.

c:\Temp>SQLLocalDB info MyInstance
Name:               MyInstance
Version:            12.0.2000.8
Shared name:
Owner:              NT AUTHORITY\SYSTEM
Auto-create:        No
State:              Running
Last start time:    05/07/2019 16:53:13
Instance pipe name: np:\\.\pipe\LOCALDB#23C9D1D8\tsql\query

c:\Temp>ODBCTest_x64
Connect using SQL: Data Source=np:\\.\pipe\LOCALDB#23C9D1D8\tsql\query; Integrated Security=True; Connect Timeout=10;
SQLCONN State: Open

c:\Temp>ODBCTest_x86
Connect using SQL: Data Source=np:\\.\pipe\LOCALDB#23C9D1D8\tsql\query; Integrated Security=True; Connect Timeout=10;
SQLCONN State: Open

Соединение с использованием имени трубы экземпляра работает!

Журнал событий показывает мне эту ошибку, когда экземпляр LocalDB работает как LOCAL_SYSTEM:

В разделе реестра экземпляра LocalDB отсутствует значение реестра «DataDirectory»: {F3917303-37C0-418C-8551-390A6E46EEC3}

Возможно, он работает с использованием имени канала, но я бы действительно предпочел использовать имя экземпляра.Любые советы о том, почему это не удается при вызове с использованием библиотеки x86?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...