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

Администрирование - Сервисные утилиты

Набор оскриптов для деплоя базы 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 ..\..\..\src\deploy.os

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

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

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

oscript ..\..\..\src\deploy.os -debug -testparam "..\param\exe1c.json";"..\param\cluster.json";"..\param\sql.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

Скачать файлы

Наименование Файл Версия Размер
ОСкрипты для деплоя и копирования базы данных:
.zip 98,49Kb
01.05.17
15
.zip 98,49Kb 15 Скачать

См. также

Комментарии
1. Иван Григорьев (Soloist) 404 02.05.17 08:43 Сейчас в теме
Годно. Здорово было бы, чтобы ещё версию 1С цепляла, как у текущего сервера. Может это возможно через реестр посмотреть?

И было бы бомбой автоматизировать автоматическое обновление любой конфигурации стоящей на поддержке. Типа скрипт мониторит текущие версии конфигурации на https://releases.1c.ru/total и если видит что-то новое, то составляет оптимальный путь к обновлению, скачивает нужные поставки и последовательно обновляет (с запуском 1С в режиме предприятия разумеется).
2. Денис Харченко (nomadon) 121 02.05.17 09:53 Сейчас в теме
(1) для обновления уже есть наработки oscript-AutoUpdateIB
3. Иван Григорьев (Soloist) 404 02.05.17 11:11 Сейчас в теме
(2) спасибо, заценим. Антон ещё мне в личку кинул решение конкретно по моей проблеме http://helpme1c.ru/obnovlyator-1s-gruppovoe-paketnoe-obnovlenie-vsex-baz-za-odin-raz
4. Александр Романько (romankoav) 02.05.17 12:49 Сейчас в теме
5. Игорь Фелькер (Brawler) 308 02.05.17 12:53 Сейчас в теме
Чет какой-то сложный процесс описан))
Пользователей обязательно трогать?
Средствами SQL легко делается бэкап со сжатием (так быстрее) и не выгоняя пользователей.
Потом бэкап разворачивается в новой тестовой базе.
Можно даже базу на 1С сервере одну и ту же тестовую использовать, только на SQL ее удалять и заново создавать. Сервак 1С новую базу сам подключит как только она будет создана вновь.
Ну и остается только переподключить к хранилищу конфигураций и то не обязательно может быть в этом потребность.
6. Антон Степанов (Stepa86) 831 02.05.17 13:20 Сейчас в теме
(5) При копировании базы а) Пользователи не трогаются б) Используются те же средства SQL, только заскриптованные в) Скрипт по восстановлению можно использовать любой, в том числе с созданием новой базы.
Сейчас чтобы сымпортировать базу из рабочей я делаю двойной клик по батнику и иду наливать кофе, когда возвращаюсь - уже можно полноценно работать. Это как с посудомойкой - она дольше моет и руками получается порой качественнее и быстрее. Но сам факт того, что можно запустить и уйти по делам, решает.

(4) У меня нет ни одной публикации, где бы не придрались к моему русскому/английскому. Я уже начинаю комплексовать (на самом деле нет)
7. Антон Парфенов (AntonSm) 02.05.17 15:26 Сейчас в теме
Про Deploy.os можно сказать, что этот велосипед уже придуман.
Называется deployka.
https://github.com/oscript-library/deployka
8. Антон Степанов (Stepa86) 831 02.05.17 15:55 Сейчас в теме
(7) А если заглянуть в гитхаб, то станет видно, что этот проект основан на деплойке и расширяет ее возможности.
корум; Evil Beaver; sorb; JohnyDeath; +4 Ответить
9. Роман Сюзев (sorb) 02.05.17 16:34 Сейчас в теме
10. Евгений Мартыненков (JohnyDeath) 290 02.05.17 18:17 Сейчас в теме
Спасибо! В хозяйстве обязательно пригодится
11. Маркусов Сергей (1cProfit) 03.05.17 10:14 Сейчас в теме
Ошибка.
Прикрепленные файлы:
12. Антон Степанов (Stepa86) 831 03.05.17 10:36 Сейчас в теме
(11) В параметрах для копирования базы нужно указать
"Cluster.UseLock": false
Иначе он настройки кластера пытается протестировать.
13. Иван Дробышев (dis_2015) 5 15.05.17 11:51 Сейчас в теме
Добрый день.
Получаю вот такую ошибку:

00:00. Инициализация
00:00. 	! Включен режим тестирования параметров
00:00. 	ОШИБКА Ошибка чтения файла C:\1CDev\auto_restore\PC\param\exe1c.json: Не удалось прочитать JSON. {Модуль C:\Program Files (x86)\OneScript\lib\json\src\json.os / Ошибка в строке: 558 / JSON: Неверный формат данных в позиции 182.}
00:00. 	ОШИБКА Ошибка чтения файла C:\1CDev\auto_restore\PC\param\sql.json: Не удалось прочитать JSON. {Модуль C:\Program Files (x86)\OneScript\lib\json\src\json.os / Ошибка в строке: 558 / JSON: Неверный формат данных в позиции 7.}
00:00. 	ОШИБКА Ошибка чтения файла import.json: Не удалось прочитать JSON. {Модуль C:\Program Files (x86)\OneScript\lib\json\src\json.os / Ошибка в строке: 589 / JSON: Некорректный пакет данных в позиции 3.}
{Модуль C:\1CDev\auto_restore\src\Классы\ПараметрыРаботы.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	
}
...Показать Скрыть


Подскажите в чем может быть проблема ?
14. Антон Степанов (Stepa86) 831 15.05.17 12:27 Сейчас в теме
(13) В exe1c.json последняя запятая лишняя, а в остальных json комментарии не поддерживаются видимо, их нужно удалить. И надо последнюю версию скачать с гитхаба, там ошибка "Ошибка в строке: 101 / Конструктор не найден (КомандаУправлениеСеансами)}" исправлена
15. Иван Дробышев (dis_2015) 5 15.05.17 14:41 Сейчас в теме
(14)
Спасибо. Это помогло. Но дальше я получил другую ошибку


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

opm install readparams


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

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

C:\1CDev\auto_restore\PC\DIS>oscript C:\1CDev\auto_restore\src\CopyBase.os -testparam import.json 
{Модуль C:\Program Files (x86)\OneScript\lib\package-loader.os / Ошибка в строке: 90 / Невозможно загрузить модуль ЧтениеПараметров. Такой символ уже определен.}
16. Иван Дробышев (dis_2015) 5 15.05.17 14:47 Сейчас в теме
17. Антон Степанов (Stepa86) 831 15.05.17 14:50 Сейчас в теме
(16) Что было? В идеале про ошибки писать в ишузы в гитхабе
18. Иван Дробышев (dis_2015) 5 15.05.17 14:56 Сейчас в теме
Я библиотеку чтение параметров вначале положил еще в папку lib к самому CopyBase.os и был конфликт
19. Антонио Антонио (Fragster) 683 13.07.17 11:27 Сейчас в теме
а я такое на bash сделал... правда не уничерсальное, и cygwin пришлось поставить на винду....
20. Maxim Goncharov (maxx) 608 14.07.17 10:12 Сейчас в теме
1.) После прочтения не понял для PostgreSQL эти скрипты подходят?

2.) Эти скрипты необязательно запускать на сервере, где крутиться сервер 1С, можно с любой машины, где прямое подключение к базе?
21. Антон Степанов (Stepa86) 831 14.07.17 12:33 Сейчас в теме
(20) 1) Разрабатывал только под ms sql, т.к. используется утилита SQLCMD. Код открыт, можно попытаться переделать под себя под постгри. По идее там только один модуль адаптировать

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