ОСкрипты для деплоя и копирования базы данных



Набор оскриптов для деплоя базы 1С через хранилище и копирование через sql-бекап одной базы в другую

Что делают эти скрипты, если кратко?

Скрипт по копированию базы данных 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.ras» — сетевой адрес к RAS, например localhost
  • «EXERAC» — путь к RAC
  • «Base.Base» — имя базы в кластере
  • «Cluster.Admin«
  • «Cluster.Password«
  • «v8version» — используемая версия 1Ски
  • «Cluster.lockuccode» — код блокировки
  • «Cluster.lockmessage» — сообщение о блокировке
  • «Cluster.lockstart» — дата и время начала блокировки
  • «Cluster.lockstartat» — количество секунд, через которое нужно установить блокировку

Шаг Пауза перед удалением сеансов

Может быть пропущен, если «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, его не нужно указывать в строке запуска. Таким образом строка запуска

oscript ......srcdeploy.os

Прочитает файлы из файла param_os.json и нормально отработает.

Переданный файл параметров

Файл с параметрами можно указать явно, причем файлов может быть несколько — они должны быть разделены ;. Каждый последующий файл может переопределить параметры предыдущего.

oscript ......srcdeploy.os -debug -testparam "..paramexe1c.json";"..paramcluster.json";"..paramsql.json";base.json;Dynamic.json

Особенности чтения файлов параметров

При разработке я придерживался правила — один параметр указывается один и только один раз. Когда обновляется 1Ска на сервере — нужно изменить только один параметр, а не 15 файлов.

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

{
"v8version": "8.3.10.2168",
"EXE1CV8": "c:\program Files (x86)\1cv8\%v8version%\bin\1cv8.exe",
"EXERAC": "C:\Program Files\1cv8\%v8version%\bin\rac.exe",
// Если RAS уже запущен, то этот параметр следует удалить. Используется для старта RAS принудительно
"EXERAS": "C:\Program Files\1cv8\%v8version%\bin\ras.exe"
}

и в качестве параметра можно указать другой файл для чтения. Вот пример файла param_os.json, который подтянет все остальные параметры из других файлов

{
"ReadFile.exe1c": "..\param\exe1c.json",
"ReadFile.cluster": "..\param\cluster.json",
"ReadFile.sql": "..\param\sql.json",
"ReadFile.Base": ".\base.json"
}

Флаги запуска

Можно перед указанием файлов указать флаги -debug и -testparam . Что они делают описано выше.

Рекомендуемое расположение файлов параметров

[bin]               // Папка в проекте
[Server]          // Папка, в которой лежат все параметры для одного этого сервера
[param]         // Папка с общими параметрами, применимыми для этого сервера
cluster.json  // Общие параметры кластера для Server
exe1c.json    // Общие параметры с путями к exe
import.json   // Общие параметры для импорта скриптом CopyBase
sql.json      // Общие параметры текущего SQL, который использует текущий Server
[DB1]           // Папка с параметрами, применимыми для этой базы
deploy.bat    // Батник для деплоя
import.bat    // Батник для CopyBase
testparam.bat // Батник для тестов параметров
base.json     // Параметры этой базы
import.json   // Параметры базы, из которой нужно импортировать
param_os.json // Файл с ссылкой на другие файлы параметров
Restore_BaseName_PC.sql // SQL скрипт для восстановления в текущую базу из базы-источника

Исходный код и всегда самая свежая версия доступна на гитхабе https://github.com/Stepa86/1C-Deploy-and-CopyDB

25 Comments

  1. Soloist

    Годно. Здорово было бы, чтобы ещё версию 1С цепляла, как у текущего сервера. Может это возможно через реестр посмотреть?

    И было бы бомбой автоматизировать автоматическое обновление любой конфигурации стоящей на поддержке. Типа скрипт мониторит текущие версии конфигурации на https://releases.1c.ru/total и если видит что-то новое, то составляет оптимальный путь к обновлению, скачивает нужные поставки и последовательно обновляет (с запуском 1С в режиме предприятия разумеется).

    Reply
  2. nomadon

    (1) для обновления уже есть наработки oscript-AutoUpdateIB

    Reply
  3. Soloist

    (2) спасибо, заценим. Антон ещё мне в личку кинул решение конкретно по моей проблеме http://helpme1c.ru/obnovlyator-1s-gruppovoe-paketnoe-obnovlenie-vsex-baz-za-odin-raz

    Reply
  4. romankoav

    «бекап» убил )))

    Reply
  5. Brawler

    Чет какой-то сложный процесс описан))

    Пользователей обязательно трогать?

    Средствами SQL легко делается бэкап со сжатием (так быстрее) и не выгоняя пользователей.

    Потом бэкап разворачивается в новой тестовой базе.

    Можно даже базу на 1С сервере одну и ту же тестовую использовать, только на SQL ее удалять и заново создавать. Сервак 1С новую базу сам подключит как только она будет создана вновь.

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

    Reply
  6. Stepa86

    (5) При копировании базы а) Пользователи не трогаются б) Используются те же средства SQL, только заскриптованные в) Скрипт по восстановлению можно использовать любой, в том числе с созданием новой базы.

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

    (4) У меня нет ни одной публикации, где бы не придрались к моему русскому/английскому. Я уже начинаю комплексовать (на самом деле нет)

    Reply
  7. AntonSm

    Про Deploy.os можно сказать, что этот велосипед уже придуман.

    Называется deployka.

    https://github.com/oscript-library/deployka

    Reply
  8. Stepa86

    (7) А если заглянуть в гитхаб, то станет видно, что этот проект основан на деплойке и расширяет ее возможности.

    Reply
  9. sorb

    Спасибо!

    Reply
  10. JohnyDeath

    Спасибо! В хозяйстве обязательно пригодится

    Reply
  11. 1cProfit

    Ошибка.

    Reply
  12. Stepa86

    (11) В параметрах для копирования базы нужно указать

    «Cluster.UseLock»: false

    Иначе он настройки кластера пытается протестировать.

    Reply
  13. dis_2015

    Добрый день.

    Получаю вот такую ошибку:

    00:00. Инициализация
    00:00.  ! Включен режим тестирования параметров
    00:00.  ОШИБКА Ошибка чтения файла C:1CDevauto_restorePCparamexe1c.json: Не удалось прочитать JSON. {Модуль C:Program Files (x86)OneScriptlibjsonsrcjson.os / Ошибка в строке: 558 / JSON: Неверный формат данных в позиции 182.}
    00:00.  ОШИБКА Ошибка чтения файла C:1CDevauto_restorePCparamsql.json: Не удалось прочитать JSON. {Модуль C:Program Files (x86)OneScriptlibjsonsrcjson.os / Ошибка в строке: 558 / JSON: Неверный формат данных в позиции 7.}
    00:00.  ОШИБКА Ошибка чтения файла import.json: Не удалось прочитать JSON. {Модуль C:Program Files (x86)OneScriptlibjsonsrcjson.os / Ошибка в строке: 589 / JSON: Некорректный пакет данных в позиции 3.}
    {Модуль C:1CDevauto_restoresrcКлассыПараметрыРаботы.os / Ошибка в строке: 101 / Конструктор не найден (КомандаУправлениеСеансами)}

    В exe1c.json вот такое

    {
    «v8version»: «8.3.9.2170»,
    «EXE1CV8»: «C:\Program Files (x86)\1cv8\%v8version%\bin\1cv8.exe»,
    «EXERAC»: «C:\Program Files (x86)\%v8version%\bin\rac.exe»,
    
    }

    В sql.json вот это

     {
    // Удалять ли промежуточный бекап после восстановения
    «SQL.DelBackup»: true,
    // Использовать ли восстановление из бекапа
    «SQL.UseRestore»: true,
    // Параметры сервера SQL-источника. Откуда будет копироваться база
    «Source_SQL.User»: «sa»,
    // Использовать ли выполнение бекапа.
    // Если не использовать, но «SQL.UseRestore»: true, то база будет восстановлена из файла «FileBackup»
    «Source_SQL.UseBackup»: true,
    «Source_SQL.Password»: «*****»,
    «Source_SQL.Server»: «srv»,
    // Выполнять ли подключение к хранилищу после восстановления
    «Repo.Blind»: true,
    // Обновлять ли базу данных после подключения к хранилищу
    «UpdateCfg»: true,
    // Отключение использования блокировки.
    «Cluster.UseLock»: false
    }

    Показать

    Подскажите в чем может быть проблема ?

    Reply
  14. Stepa86

    (13) В exe1c.json последняя запятая лишняя, а в остальных json комментарии не поддерживаются видимо, их нужно удалить. И надо последнюю версию скачать с гитхаба, там ошибка «Ошибка в строке: 101 / Конструктор не найден (КомандаУправлениеСеансами)}» исправлена

    Reply
  15. dis_2015

    (14)

    Спасибо. Это помогло. Но дальше я получил другую ошибку

    Далее я установил библиотеку readparams

    opm install readparams

    Снова запустил проверку параметров

    Получаю ошибку

    C:1CDevauto_restorePCDIS>oscript C:1CDevauto_restoresrcCopyBase.os -testparam import.json
    {Модуль C:Program Files (x86)OneScriptlibpackage-loader.os / Ошибка в строке: 90 / Невозможно загрузить модуль ЧтениеПараметров. Такой символ уже определен.}
    Reply
  16. dis_2015

    Разобрался )

    Reply
  17. Stepa86

    (16) Что было? В идеале про ошибки писать в ишузы в гитхабе

    Reply
  18. dis_2015

    Я библиотеку чтение параметров вначале положил еще в папку lib к самому CopyBase.os и был конфликт

    Reply
  19. Fragster

    а я такое на bash сделал… правда не уничерсальное, и cygwin пришлось поставить на винду….

    Reply
  20. maxx

    1.) После прочтения не понял для PostgreSQL эти скрипты подходят?

    2.) Эти скрипты необязательно запускать на сервере, где крутиться сервер 1С, можно с любой машины, где прямое подключение к базе?

    Reply
  21. Stepa86

    (20) 1) Разрабатывал только под ms sql, т.к. используется утилита SQLCMD. Код открыт, можно попытаться переделать под себя под постгри. По идее там только один модуль адаптировать

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

    Reply
  22. Wadus161

    Спасибо за статью! Отличная штука! Уже пользуюсь. OneScript мощный инструмент.

    Reply
  23. bogdan_sukonnov

    Для тех кто будет смотреть на этот инструмент: очень хорошая разработка, но подкачала версия библиотеки deployka , на которой основывался автор. Та старая deployka не могла устанавливать блокировку регламентных заданий. Поскольку deployka сделана как отдельный инструмент, запускаемый из командной строки с параметрами, а автор хотел расширить ее логику, ему пришлось дописать деплойку, потеряв возможность обновления. Я долго это все выяснял и теперь не уверен что делать. Хотелось бы найти такое же решение, как и это, с удобными параметрами, с тестами, с оповещениями в мессенжер. Но чтобы оно было готовое. Т.к. найду ли я время доработать новую деплойку, умеющую блокировать регламентные задания, под использование в данном окружении, неясно…

    Reply
  24. Stepa86

    (23) У меня регл. задания блокировались. Вот даже коммит чтоб блокировка лучше работала https://github.com/Stepa86/1C-Deploy-and-CopyDB/commit/b3402866aec2cc87847563158469b80bdf040021 . Вы точно последнюю версию взяли?

    Reply
  25. Niki_Pro

    (24) наверное bogdan_sukonnov имел ввиду что в вашей разработке потерялось возможность обновления оригинальной deployka. У Вас как-то учитываются новые релизы deployka? (хотя она последнее время не менялась, но тем не менее)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *