ОСкрипты для деплоя и копирования базы данных |
02.05.17 16:21 |
Что делают эти скрипты, если кратко?Скрипт по копированию базы данных CopyBase.osВам звонят и сообщают, что в заказе номер 667 ошибка и надо бы поправить. А в вашей базе нет этого заказа. Не набивать же его вручную? Запускаете скрипт Import.bat, ждете 2-30 минут, и вот уже в вашей базе самая свежая копия рабочей, уже подключена к хранилищу разработки и обновлена. Скрипт по деплою Deploy.osНастала пора обновить рабочую базу. Вы заранее положили все нужно в хранилище рабочей базы. В час X вы начинаете обновление: оповещаете пользователей о том, что надо бы из 1Ски всем выйти (никто конечно не выходит), начинаете рубить соединения вручную (фоновые задания и самые упертые возвращаются быстрее, чем вы их успеваете удалить), ставите блокировку на базу (и сами долго мучаетесь с заходом в конфигуратор. Доходит до того, что вы снимаете блокировку, забегаете в конфигуратор и снова ставите блокировку, надеясь, что именно сеанс конфигуратора не умрет. Он умирает), делаете бекап (он длится что то долго и вы отвлекаетесь на пару статей. Когда возвращаетесь в базе уже тусуются пользователи, а бекап уже морально устарел), обновляете (ребутнув сервер пару раз, т.к. пользователи так и не перестали заходить), с чистой совестью идете гулять с семьей/пить пиво с друзьями (вам звонят и говорят, что не могут зайти в базу. Видимо кто то забыл выполнить миграцию). Скрипт же делает все то же самое, но быстрее и надежнее. Он ставит мягкую блокировку (когда новые пользователи не могут зайти, а старым выскакивает сообщение с предложением сохраниться и завершить работу), потом отрубает все соединения принудительно, выполняет бекап, обновляется из хранилища, обновляет базу данных, запускает миграцию данных и снимает блокировку, когда все завершено. Как работают скрипты, если подробнееСами скрипты написаны на oscript. На инфостарте этот проект уже известен, поэтому не буду сильно его хвалить. Через батник запускается на выполнение оскрипт, ему передается скрипт и параметры к нему. Особым образом читаются все необходимые параметры (об этом чуть ниже). Выполняется тестирование параметров - что к хранилищу коннектится, что кластер отвечает и что доступ к SQL получен. Если передать параметр -testparam, то на этом скрипт будет остановлен. Нужно это для проверки всех важных параметров до того, как начались длительные или безвозвратные операции, а то очень обидно, когда уже и пользователи изгнаны и бекап выполнен, а пароль к хранилищу не подошел.
Если добавить флаг -debug, то будут выведены все подробности (будет включен режим отладки для логоса, если вы понимаете о чем я).
CopyBase.osШаг Выполнить бекап.Выполняет бекап базы источника средствами SQLCMD (в моем примере это рабочая база). Может быть пропущен, если параметр "Source_SQL.UseBackup" = false . Выполняет бекап в файл "FileBackup" для SQL базы-источника с параметрами "Source_SQL.Server", "Source_SQL.User", "Source_SQL.Password", "Source_SQL.Base" Если бекап выполнить не удалось- скрипт завершает работу аварийно. Шаг Проверить соединенияПроверяет, что в базе-приемника (в моем примере это наша база разработки, в которую мы разворачиваем копию) нет соединений. Пропускается, если "SQL.UseRestore" = false Получает количество соединений для SQL базы-приемника с параметрами "SQL.Server", "SQL.User", "SQL.Password", "SQL.Base" Если получить соединения не удалось или соединений больше 0 - скрипт завершает работу аварийно. Шаг Выполнить восстановлениеЗапускает скрипт "Script_Restore" для базы "SQL.Server", "SQL.User", "SQL.Password", "SQL.Base" Может быть пропущен, если "SQL.UseRestore" = false Обойтись без отдельного скрипта не получилось, и проще всего восстановления было сделать через sql-скрипт. Этот скрипт можно получить при интерактивной попытке восстановить бекап в нужную базу (указав пути к файлам, расставив нужные флажки и быть может указав дополнительные действия). Скрипт должен восстанавливать именно ту базу, для который запущен оскрипт и именно из файла "FileBackup" Шаг Удалить файл бекапаУдаляет файл "FileBackup". Может быть пропущен, если "SQL.UseRestore" = false или "SQL.DelBackup" = false Шаг Переподключить хранилищеМожет быть пропущен, если "Repo.Blind" = false. Подключается к базе-приемнику с параметрами "EXE1CV8", "Base.Connect", "Base.User", "Base.Password" Отключает базу от хранилища (на случай, если она подключена к другому хранилищу), подключается к хранилищу с параметрами "Repo.Connect", "Repo.User" и "Repo.Password" Если "UpdateCfg"=true, то выполняет обновление БД Deploy.osШаг Включить RASМожет быть пропущен, если "Cluster.UseLock" = false, "UseDynamicUpdate" = false или не заполнен "EXERAS". Выполняет запуск RAS. Есть смысл, если скрипт выполняется на том же сервере, что и сервер 1С. Именно с помощью RAS и RAC происходит взаимодействие с кластером, с помощью которого устанавливается блокировка и выполняется принудительное завершение работы у пользователей. Шаг Устанавить блокировкуМожет быть пропущен, если "Cluster.UseLock" = false, "UseDynamicUpdate" = false Для установки блокировки используется куча параметров:
Шаг Пауза перед удалением сеансовМожет быть пропущен, если "Cluster.UseLock" = false, "UseDynamicUpdate" = false Скрипт останавливается на время до окончательной блокировки, которое задается параметрами "Cluster.lockstart" или "Cluster.lockstartat" Шаг Удалить соединенияМожет быть пропущен, если "Cluster.UseLock" = false, "UseDynamicUpdate" = false Удаляет все соединения. Шаг Выполнить бекапПропустить нельзя Выполняет бекап в файл "FileBackup" для SQL базы-приемника с параметрами "SQL.Server", "SQL.User", "SQL.Password", "SQL.Base". В отличие от выполнения аналогичного шага в скрипте CopyBase.os тут выполняется бекап именно для текущей базы, а не для базы-источника. Шаг Обновить конфигурацию из хранилищаМожно пропустить, если "UpdateCfg"=false Подключается к базе-приемнику с параметрами "EXE1CV8", "Base.Connect", "Base.User", "Base.Password" Подключается к хранилищу с параметрами "Repo.Connect", "Repo.User" и "Repo.Password", получает из него все обновления и выполняет обновление БД. Если указан флаг "UseDynamicUpdate" = true то обновление динамическое. Шаг Запуск миграцииМожно пропустить, если "UpdateCfg"=false Запускает 1С с параметром запуска указанным в "UpdateLaunchParameter". Подразумевается, что в самой базе уже есть код, который по этому параметру запуска полностью автоматически выполнит обновление. Для баз на основе БСП уже все есть и этот ключ "ВыполнитьОбновлениеИЗавершитьРаботу", но это не точно. Шаг Снять блокировкуМожет быть пропущен, если "Cluster.UseLock" = false, "UseDynamicUpdate" = false Снимает блокировку и разрешает вход пользователям. Указание параметров и файлы настроекПример файлов с настройками лежит в папке bin. Параметры читаются за счет библиотеки https://github.com/Stepa86/ReadParams Параметры хранятся в json файлах. Они удобны для чтения и редактирования без использования спец. инструментов. Главное не забывать заменять \ на \\ Особенности указания параметров в строке запускаФайл параметров по умолчаниюВ первую очередь читается файл param_os.json, его не нужно указывать в строке запуска. Таким образом строка запуска
Прочитает файлы из файла param_os.json и нормально отработает. Переданный файл параметровФайл с параметрами можно указать явно, причем файлов может быть несколько - они должны быть разделены ;. Каждый последующий файл может переопределить параметры предыдущего.
Особенности чтения файлов параметровПри разработке я придерживался правила - один параметр указывается один и только один раз. Когда обновляется 1Ска на сервере - нужно изменить только один параметр, а не 15 файлов. Для этого при чтении параметров работает механизм подстановки
и в качестве параметра можно указать другой файл для чтения. Вот пример файла param_os.json, который подтянет все остальные параметры из других файлов
Флаги запускаМожно перед указанием файлов указать флаги -debug и -testparam . Что они делают описано выше. Рекомендуемое расположение файлов параметров
Исходный код и всегда самая свежая версия доступна на гитхабе https://github.com/Stepa86/1C-Deploy-and-CopyDB |