Каталог решений - Yandex Cloud Managed Service: создание и перенос баз (реальные кейсы)

Yandex Cloud Managed Service: создание и перенос баз (реальные кейсы)

Yandex Cloud Managed Service: создание и перенос баз (реальные кейсы)

В наличии

О том, почему нельзя просто переехать в Yandex Cloud Managed Service for SQL и как работать с бэкапами.

Категория:

Описание

Содержание статей:

Напоминаю:

У нас теперь нет роли dbcreator. Это важно!

У нас теперь нет возможности копировать базы через бэкапы!

 

Кейс 1: Перенос баз 1с через dt

Нет смысла долго объяснять про перенос баз через dt, есть только одно, но…

Нет роли dbcreator, а это значит, у Вас не сработает галка «В случае отсутствия базы создать».

1 Читаем про создание базы тут -> https://cloud.yandex.ru/docs/managed-sqlserver/operations/databases

2 После создания пустой базы и создания пользователя с правами DB_OWNER на вновь созданную базу, подключаем ее через Администрирование серверов.

3 Заходим в конфигуратор и загружаем базу из dt.

 

Кейс 2: Необходимо было установить WMS на Managed Service for SQL Server в Yandex.Cloud

В апреле 2021 мы решили установить WMS сразу в Managed Service. Я наивно подумал, что там будет 1 база и 1 пользователь, поэтому я создал пустую базу и создал пользователя с ролью db_owner на эту базу.

На следующий день меня попросили пользователю дать роль dbcreator, так как во время установки WMS системы создаются базы и пользователи скриптами. Я, естественно, был удивлен, так как ранее было доходчиво объяснено о том, что нет возможности дать такую роль. Я еще раз пересказал всю информацию из статьи «Как мы на Managed Service for SQL Server в Yandex.Cloud переезжали» и предложил способ решения.

Но мне было сказано:

— Это хорошо, что у нас есть план Б, но все-таки создай обращение. Нужно официальное подтверждение о том, что такую роль дать нельзя.

Обращение:

 

 

Вырезка из https://cloud.yandex.ru/docs/managed-sqlserver/operations/databases

 

 

Идем по предложенному мной плану Б:

1 Узнаю версию MSSQL в YC через SQL Management Studio

SELECT @@version.

2 Создаю стенд и устанавливаем на него MSSQL нужной версии (Версия полностью идентична с Managed Service)

3 Разворачиваем WMS систему на стенде

4 Создал в Managed Service базы пустышки с такими же именами и пользователей, которые были созданы при установке WMS.

5 Дал пользователям права db_owner на базы WMS системы

6 *Выгрузил бэкапы баз со стенда и передал их специалистам в YC

7 *Они подняли бэкапы на Managed Service в заранее заготовленные базы пустышки

8 Под созданными пользователями настроили систему WMS

Согласитесь, такой вариант не сильно удобен. Очень много телодвижений и плюсом задействованы специалисты Yandex.

*Пункты, выделенные синим цветом, можно решить своими силами, но этот способ впервые был проделан мной в июне, до этого был только вариант, описанный выше.

 

Кейс 3: Необходимо было скриптами создать базу в Yandex.Cloud Managed Service for SQL Server

События перед 3 кейсом

В мае нам понадобились бэкапы, и мы запросили их у специалистов из Yandex. На этот момент у нас уже было несколько десятков баз. Специалисты опять спросили, не пробовали ли мы sqlpackage. Я сказал, что пробовали, не вышло, и дал ссылку на статью со всеми телодвижениями.

Нам выкачали бэкапы и спустя какое-то время предложили гипотезу с использованием sqlpackage.

Гипотеза была отложена, но в начале июня про нее пришлось вспомнить.

 

В отличие от предыдущего кейса сроки горели, да и стенд из предыдущего кейса уже был снесен.

1 Я установил SQL Server 2019 Developerэто была моя ошибка, хотя без нее кейс 3 не состоялся бы.

SQL Server 2019 Developer — это бесплатный выпуск с полным набором функций, лицензируемый для использования в качестве базы данных для разработки и тестирования и не предназначенный для применения в рабочей среде.

2 Скриптами создал базу

3 В Managed Service создал базу пустышку и пользователя. Дал права пользователю на вновь созданную базу.

4 Снял бэкап с базы, поднятой на SQL Server 2019 Developer, и попросил поднять его в базу, созданную на Managed Service у специалистов из YC

5 Для подстраховки параллельно вечером начал пробовать перенос через sqlpackage

 

Вечером поступает первый звоночек:

Специалисты Y.C:

 

 

Вот тут я и вспоминаю, что Managed Service for SQL Server в Yandex.Cloud работает на MS SQL 2016…

Кстати, только сейчас до меня дошло выражение "трудности = возможности"!)

 

Смысл гипотезы с SqlPackage:

Первоначально sqlpackage был придуман для того, чтобы базы данных распространять в виде инсталляции.

Далее он же стал использоваться для загрузки баз данных в Azure.

И он же пока единственная возможность снимать бекапы и закидывать базы в YC MS SQL самостоятельно

 

Необходимо на стенде повторить окружение Yandex.Cloud Managed Service for SQL Server, а точнее, повторить окружение у конкретной переносимой базы. Все это нужно для того, чтобы «автоматика склеилась».

То есть база приемник (Yandex.Cloud Managed Service for SQL Server) по внешним свойствам должна полностью совпадать с передаваемой базой (Стенд)

Действия на Managed Service for SQL Server:

1 Создаем базу приемник на Managed Service for SQL Server с таким же именем, как и база на стенде

 

 

2 Дожидаемся выполнения операции (если не дожидаться, тогда при следующем действии получим ошибку)

 

 

 

3 Создаем пользователя и даем ему права на базу

 

4 Дожидаемся выполнения операции

 

 

 

Действия на стенде:

1 Параметры сортировки (Collation) должны совпадать с настройками Managed Service for SQL

«Cyrillic_General_CI_AS» -> «Кириллица», «Большая буква = малая буква» и «е <> ё»

В противном случае могут некорректно работать сортировки и соединения.

Самое противное — если создать и перенести с неправильным параметром, тогда переделать будет практически невозможно.

 

 

2 Модель восстановления должна быть Полная (Full) и Включен компонент Broker (Service Broker = True)

 

 

3 В базе источнике убрать всех виндовых пользователей, оставить только SQL-ных, далее создать таких же пользователей с теми же паролями в YC MS SQL.

В общем, SQL-ные пользователи должны совпадать и на стенде, и на YC MS SQL. Одинаковые пароли и одинаковые роли.

 

 

Владельца (Owner) базы сделать SA.

 

4 Качаем sqlpackage (я качал под Windows)

https://docs.microsoft.com/ru-ru/sql/tools/sqlpackage/sqlpackage-download?view=sql-server-ver15

Запускаем установщик DacFramework.msi для Windows.

Программа sqlpackage устанавливается в папку C:\Program Files\Microsoft SQL Server\150\DAC\bin

Открываем новое окно командной строки и запустите файл sqlpackage.exe

Пример показывает версию sqlpackage:

 

 

5 Смотрим информацию по sqlpackage

Команда:

sqlpackage.exe /help

Также можно почитать тут -> https://docs.microsoft.com/ru-ru/sql/tools/sqlpackage/sqlpackage?view=sql-server-ver15

 

Выгрузка базы со стенда при виндовой авторизации:

sqlpackage.exe /a:Extract /ssn:ИМЯ_ХОСТА /sdn:ИМЯ_БАЗЫ /tf:"С:\ПАПКА_ДЛЯ_БАЗЫ\test.dacpac" /p:ExtractAllTableData=True /p:ExtractReferencedServerScopedElements=False

Выгрузка базы со стенда при SQL-ной авторизации:

sqlpackage.exe /a:Extract /ssn:ИМЯ_ХОСТА /sdn:ИМЯ_БАЗЫ /tf:"С:\ПАПКА_ДЛЯ_БАЗЫ\test.dacpac" /p:ExtractAllTableData=True /p:ExtractReferencedServerScopedElements=False /su:ПОЛЬЗОВАТЕЛЬ /sp:"ПАРОЛЬ"

 

Информация:

ИМЯ_ХОСТА – может быть localhost

/a:Extract: Создает файл приложения уровня данных (DACPAC), содержащий только схему или схему и пользовательские данные из подключенной базы данных SQL.

/p:ExtractAllTableData: Указывает, извлекаются ли данные из всех пользовательских таблиц. Если задано значение true, данные извлекаются из всех пользовательских таблиц и нельзя указать отдельные пользовательские таблицы для извлечения данных. Если задано значение false, укажите одну или несколько пользовательских таблиц для извлечения данных.

/p:ExtractReferencedServerScopedElements: Если задано значение true, извлекаются объекты имени для входа, аудита сервера и учетных данных, на которые ссылаются объекты из базы данных-источника.

 

Загрузка базы в YC MS SQL:

sqlpackage.exe /a:Publish /sf:"C:\ ПАПКА_ДЛЯ_БАЗЫ\test.dacpac" /tsn:АДРЕС_МАНАДЖЕТ_СЕРВИСА_В_ОБЛАКЕ /tdn: ИМЯ_БАЗЫ /tec:True /ttsc:True /tu:ПОЛЬЗОВАТЕЛЬ /tp:"ПАРОЛЬ" /p:AllowIncompatiblePlatform=True /p:IgnoreCryptographicProviderFilePath=True /p:IgnoreExtendedProperties=True /p:IgnoreFileAndLogFilePath=True /p:IgnoreFilegroupPlacement=True /p:IgnoreFileSize=True /p:IgnoreFullTextCatalogFilePath=True /p:IgnoreLoginSids=True /p:ScriptRefreshModule=False

 

Что особенно порадовало, дак это то, что я смог с 2019 MS SQL затащить базу на 2016 в YC MS SQL, при загрузке увидев вот такое предупреждение:

 

 

Информация:

/a:Publish: выполняет добавочное обновление схемы базы данных в соответствии со схемой исходного DACPAC-файла. Если база данных не существует на сервере, операция публикации создаст ее. В противном случае обновляется существующая база данных.

 

П.С. Про то, что гипотеза сработала, я сообщил в Яндекс и думаю, по этим рельсам уже кто-то проехал 😉

 

Кейс 4: Перенос базы из Managed Service for SQL Server к себе через SqlPackage

В 3 кейсе мы переносили со стенда в Managed Service for SQL Server. В этом кейсе ситуация обратная.

Выгрузка базы из YC MS SQL:

sqlpackage.exe /a:Extract /ssn:АДРЕС_МАНАДЖЕТ_СЕРВИСА_В_ОБЛАКЕ /sdn:ИМЯ_БАЗЫ /tf:"С:\ПАПКА_ДЛЯ_БАЗЫ\test.dacpac" /p:ExtractAllTableData=True /p:ExtractReferencedServerScopedElements=False  /su:ПОЛЬЗОВАТЕЛЬ /sp:"ПАРОЛЬ"

 

Загрузка базы:

sqlpackage.exe /a:Publish /sf:"С:\ПАПКА_ДЛЯ_БАЗЫ\test.dacpac" /tsn:ИМЯ_ХОСТА /tdn:ИМЯ_БАЗЫ /tec:True /ttsc:True /tu:ПОЛЬЗОВАТЕЛЬ /tp:"ПАРОЛЬ" /p:AllowIncompatiblePlatform=True /p:IgnoreCryptographicProviderFilePath=True /p:IgnoreExtendedProperties=True /p:IgnoreFileAndLogFilePath=True /p:IgnoreFilegroupPlacement=True /p:IgnoreFileSize=True /p:IgnoreFullTextCatalogFilePath=True /p:IgnoreLoginSids=True /p:ScriptRefreshModule=False

 

Парадокс SqlPackage:

Очень часто ко мне приходили люди и говорили: нам нужна копия базы.

Поработав с Managed Service for SQL Server в ответ, я стал говорить — есть 2 варианта:

1 Через dt, но в нерабочее время.

2 Через SqlPackage.

Знаете, сколько раз мне сказали: — Да, давай через SqlPackage!

Ровно ноль (0) раз!!!

Знаете, почему?

Потому, что я не встретил ни одного человека, который слышал про SqlPackage. Правда, я знаю двух, которым пришлось в итоге им пользоваться.

Не буду голословным, давайте загуглимЗаинфостартим SqlPackage и посмотрим, насколько он часто встречается в статьях:

 

 

2-е статьи!!!

Заинфостартите, например: git (753 статьи), http-сервис (320 статей), scrum (179 статей), sonar (40 статей).

Чувствуете «Популярность» и замыленность тем?

А между тем SqlPackage:

  1. С недавних пор стал опенсорсным, самостоятельным продуктом
  2. Есть под Windows, macOS и Linux
  3. Позволяет накатывать базы на разные версии MS SQL
  4. Отлично подойдет для непрерывной разработки
  5. Поддерживает языки: Китайский, Английский, Французский, Немецкий, Итальянский, Японский, Корейский, Португальский, Русский, Испанский
  6. Да и обновление релизов, думаю, тоже можно прикрутить. В общем, надо пробовать!

 

На этом статью заканчиваю. Следующая статья будет про мониторинг, регламенты, немного про бэкапы и станет финальной.

Всем удачи, надеюсь, информация для Вас полезна!

has been added to your cart:
Оформление заказа