Мы рассматриваем возможность использования 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?