Сразу скажу - смысл статьи не в критике. Я просто решил предупредить тех, кто решил проделать тот же путь, что и мы. Показать, какие вопросы пока не решены на текущий момент.
Немножко информации по сервису Managed Service for SQL Server:
Managed Service for SQL Server был запущен на Yandex.Cloud 18.12.2020 -> Сервис Yandex Managed Service for SQL Server™ перешел в общий доступ
Подробный рассказ в официальном видео:
Нам обещано, что почти всю головную боль на себя берет Yandex Managed Service for SQL Server
Мы знали про это решение до того, как оно появилось в декабре, решили, что после январских праздников будем перепрыгивать на Yandex Managed Service for SQL Server.
Нам надо было перенести несколько 1С баз и несколько баз других систем и подключить к одной из баз Yandex DataLens.
Задача простейшая, но…
Первым делом я решил перенести 1С базы.
1 Снял бекап средствами MSSQL
2 В Managed Service for SQL Server создал пустые базы и пользователя с правами владельца (DB_OWNER) на эти базы.
3 Попытался средствами MSSQL загрузить бекапы… Поковырялся пару часов и решил дедовским методом перенести через конфигуратор dt-ки.
Самое интересное, на видео выше показан именно этот метод, но почему-то я решил, что это просто совпадение.
Переезд состоялся без осложнений.
Осталось перенести не 1С базу и дело сделано…
Первым делом я решил-таки попробовать подсунуть бекап.
Я пытался подсунуть бекап через консоль:
Я пытался перенести бекап через Yandex Object Storage.
Не вышло...
В Яндекс мне порекомендовали следующее решение:
Здравствуйте. Пока единственный вариант развернуть бэкап — воспользоваться средствами экспорта-импорта в Management Studio или SSIS пакетом для загрузки данных.
Мои действия:
Я воспользовался мастером Импорт и экспорт данных в SQL Server. Данные перенеслись, но в процессе были ошибки, и система чью базу я переносил сообщила мне что база не ее. То есть при переносе что-то не перенеслось. Я повторил попытку, но и она закончилась фиаско.
Я опять обратился за советом.
В Яндекс мне порекомендовали следующее решение:
Концептуально сейчас есть такой порядок действий:
1. Экспорт структуры БД через SQLPackage.exe без пользователей https://docs.microsoft.com/ru-ru/sql/tools/sqlpackage/sqlpackage?view=sql-server-ver15 формат DACPAC. BACPAC не подойдёт, т.к. его импорт подразумевает право на создание БД и в существующую БД он импортироваться не умеет.
2. Создание в облаке пустой БД
3. Применение к этой БД структуры из шага 1 через тот же SQLPackage.exe
4. Загрузка данных в таблицы через средства экспорта-импорта или SSIS.
На каждом этапе мы сильно зависим от того, что есть в БД. Например, если окажется, что есть функции или процедуры, ссылающиеся на объекты, которых нет, то экспорт не удастся, придётся исключать отдельные объекты.
Мои действия:
1 Скачал последнюю версию SqlPackage.exe
2 Создал DACPAC
Команда:
sqlpackage.exe /TargetFile:"C:\Back_up_For_ya\sqlpackageoutput\output_current_version.dacpac" /Action:Extract /SourceServerName:"MSSQL" /SourceDatabaseName:"МояБаза"
3 Создал в Managed Service for SQL Server базу "МояБаза", создал пользователя "МойПользователь" и дал права DB_OWNER
4 Попытался загрузить DACPAC
Команда:
SqlPackage.exe /Action:Publish /SourceFile:"C:\Back_up_For_ya\sqlpackageoutput\output_current_version.dacpac" /TargetDatabaseName:"МояБаза" /TargetServerName:"МойСерверНаЯндексе" /TargetUser:"МойПользователь " /TargetPassword:"ПарольПользователя"
Initializing deployment (Start)
*** A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: HTTP Provider, error: 0 - )
*** A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: HTTP Provider, error: 0 - )
*** A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: HTTP Provider, error: 0 - )
*** A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: HTTP Provider, error: 0 - )
*** A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: HTTP Provider, error: 0 - )
*** A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: HTTP Provider, error: 0 - )
Initializing deployment (Failed)
*** Could not deploy package.
Unable to connect to target server 'МойСерверНаЯндексе'. Please verify the connection information such as the server name, login credentials, and firewall rules for the target server.
A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: HTTP Provider, error: 0 - )
Time elapsed 0:03:08.21
5 Запустил SqlPackage.exe так же как в 4 пункте, но добавил ключ расшифровки /Diagnostics:True
Получил больше представления по ошибкам, вырезка из лога:
Microsoft.Data.Tools.Diagnostics.Tracer Error: 19 : 2021-01-20T12:34:41 : Retry requested: Retry count = 1. Delay = 00:00:02.7500000, SQL Error Code = -2146232060, SQL Error Number = 0, Can retry error = True, Will retry = True Microsoft.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: HTTP Provider, error: 0 - )
at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at Microsoft.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean& marsCapable, Boolean& fedAuthRequired)
at Microsoft.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover, SqlAuthenticationMethod authType)
at Microsoft.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover)
at Microsoft.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout)
at Microsoft.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance)
at Microsoft.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling, String accessToken, DbConnectionPool pool)
at Microsoft.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
at Microsoft.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
at Microsoft.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at Microsoft.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at Microsoft.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at Microsoft.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry, SqlConnectionOverrides overrides)
at Microsoft.Data.SqlClient.SqlConnection.Open(SqlConnectionOverrides overrides)
at Microsoft.Data.SqlClient.SqlConnection.Open()
at Microsoft.Data.Tools.Schema.Common.SqlClient.ReliableSqlConnection.<OpenConnection>b__48_0() in F:\B\16909\6200\Sources\Product\Source\SchemaSql\Common\SqlClient\ReliableSqlConnection.cs:line 429
at Microsoft.Data.Tools.Schema.Common.SqlClient.RetryPolicy.<>c__DisplayClass25_0.<ExecuteAction>b__0(RetryState _) in F:\B\16909\6200\Sources\Product\Source\SchemaSql\Common\SqlClient\RetryPolicy.cs:line 128
at Microsoft.Data.Tools.Schema.Common.SqlClient.RetryPolicy.<>c__DisplayClass26_0.<ExecuteAction>b__0(RetryState retryState) in F:\B\16909\6200\Sources\Product\Source\SchemaSql\Common\SqlClient\RetryPolicy.cs:line 142
at Microsoft.Data.Tools.Schema.Common.SqlClient.RetryPolicy.ExecuteAction[R](Func`2 func, Nullable`1 token) in F:\B\16909\6200\Sources\Product\Source\SchemaSql\Common\SqlClient\RetryPolicy.cs:line 179
ClientConnectionId:6x2x3218-x8xx-4x51-x343-xx6660xx7514
Microsoft.Data.Tools.Diagnostics.Tracer Warning: 0 : 2021-01-20T12:34:41 : Retry occurred: session: 00000000-0000-0000-0000-000000000000; attempt - 1; delay - 00:00:02.7500000; exception - "Microsoft.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: HTTP Provider, error: 0 - )
at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at Microsoft.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean& marsCapable, Boolean& fedAuthRequired)
at Microsoft.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover, SqlAuthenticationMethod authType)
at Microsoft.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover)
at Microsoft.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout)
at Microsoft.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance)
at Microsoft.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling, String accessToken, DbConnectionPool pool)
at Microsoft.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
at Microsoft.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
at Microsoft.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at Microsoft.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at Microsoft.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at Microsoft.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry, SqlConnectionOverrides overrides)
at Microsoft.Data.SqlClient.SqlConnection.Open(SqlConnectionOverrides overrides)
at Microsoft.Data.SqlClient.SqlConnection.Open()
at Microsoft.Data.Tools.Schema.Common.SqlClient.ReliableSqlConnection.<OpenConnection>b__48_0() in F:\B\16909\6200\Sources\Product\Source\SchemaSql\Common\SqlClient\ReliableSqlConnection.cs:line 429
at Microsoft.Data.Tools.Schema.Common.SqlClient.RetryPolicy.<>c__DisplayClass25_0.<ExecuteAction>b__0(RetryState _) in F:\B\16909\6200\Sources\Product\Source\SchemaSql\Common\SqlClient\RetryPolicy.cs:line 128
at Microsoft.Data.Tools.Schema.Common.SqlClient.RetryPolicy.<>c__DisplayClass26_0.<ExecuteAction>b__0(RetryState retryState) in F:\B\16909\6200\Sources\Product\Source\SchemaSql\Common\SqlClient\RetryPolicy.cs:line 142
at Microsoft.Data.Tools.Schema.Common.SqlClient.RetryPolicy.ExecuteAction[R](Func`2 func, Nullable`1 token) in F:\B\16909\6200\Sources\Product\Source\SchemaSql\Common\SqlClient\RetryPolicy.cs:line 179
ClientConnectionId:6x2x3218-x8x-4x51-x343-xx6660xx7514"
*** A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: HTTP Provider, error: 0 - )
Дальше я все логи отдал в Яндекс и после нескольких дней ожеданий предложил такой вариант:
1 Я создам бекап и закину его в Object Storage.
2 Создам ссылку и дам специалистам Yandex.
3 Специалисты перенесут данный файл в место доступное для восстановления базы по средствам Microsoft SQL Server Management Studio
4 Я восстановлю базу из этого бекапа.
Возможен такой вариант?
В Яндекс мне ответили:
Такой вариант возможен. Только пункт 4 тоже сделают специалисты сервиса. Этот сценарий пока отрабатывается на тестовой базе. Если вы не против, можем попробовать импортировать сразу вашу базу. Для этого создадим чат в телеграме со специалистами сервиса и интерактивно все сделаем. Сообщите, пожалуйста, если такой вариант вас устроит.
Я естественно согласился и на следующий день мы со специалистами Яндекс довели дело до конца, но у меня было ощущение что я что-то не так делал, и я спросил:
Вопрос. Если нам еще нужно будет перенести базу через месяц, два. Мы сами сможем это сделать?
В Яндекс мне ответили:
пока вряд ли.
я буду готов оперативно помочь до появления надлежащих средств.
Вопрос с Yandex Managed Service for SQL Server закрыли. Переехать можно но сложно.
Я уверен на 90% что если бекап сохранить в MS Azure, то оттуда можно его и поднять без помощи Яндекс, но это не точно…
Немножко информации по сервису DataLens:
Сервис DataLens позволяет визуализировать данные для анализа.
Мое обращение в Яндекс:
У нас куплены Managed Service for SQL Server и Managed Service for PostgreSQL. В Yandex DataLens подключение к PostgreSQL создается без проблем, а к MS SQL Server подконектится не получается.
В Managed Service for SQL Server создана база и пользователь с ролями на эту базу (DB_DATAREADER DB_DENYDATAWRITER) Использовал инструкцию https://cloud.yandex.ru/docs/datalens/operations/connection/create-mssql-server#ms-sql-server-connection
Подключение не проходит. Database error.
Есть ли такая возможность в принципе или мы зря пытаемся?
Ответы Яндекс:
UPD 15.02.2021
Ответ Яндекс:
Сегодня 18.02.2021 и УРА! Подключение DataLens заработало!
UPD 19.03.2021
Все это время мы никак не могли протестировать DataLens, так как из-за ожидании его починки фокус сместился на другие задачи.
Вчера я все таки добрался до тестирования и...
Мое обращение в Яндекс:
Ответ Яндекс:
Мое обращение в Яндекс:
Резюмирую:
В Managed Service for SQL Server переехать можно, но сложно.
DataLens то работает, то нет...
Думайте сами, решайте сами. Иметь или не иметь...