Новый режим реструктуризации (обновление базы данных на сервере в режиме v2)

Публикация № 934237

Администрирование - Оптимизация БД (HighLoad)

реструктуризация обновление баз данных

160
Данная статья скорее является заметкой и отчетом об успешном использовании нового механизма реструктуризации баз данных 1С. Актуально для больших баз данных.

Дано:

Произвольная таблица (регистр, документ, справочник) в произвольной базе данных 1С, 100 млн строк, 60 Гб места на жестких дисках.

Требуется:

1. Добавить 1 произвольный реквизит (измерение).

2. Добавить индекс по уже существующему реквизиту (измерению).

3. Удалить 1 или несколько существующих реквизитов (измерений).

 

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

- создание копии исходной таблицы с новой структурой колонок;

- select из старой таблицы insert в новую;

- переименование новой таблицы, truncate старой таблицы.

И все это в транзакции.

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

 

Наш любимый вендор 1С наконец-таки пошел навстречу крупным компаниям, использующим платформу для промышленных решений и серьезной автоматизации. Начиная с версии 8.3.11 появился новый механизм реструктуризации, более "интеллектуальный", чем описанный выше.

Как он отработает?

1. Для любой таблицы будет выполнена инструкция alter table. Выполняется мгновенно. Без копирования строк из старой таблицы в новую. Будет добавлена колонка в таблицу БД с указанным Вами типом. Если тип, к примеру, ссылочный - значение колонки во всех строках будет вида "ПустаяСсылка" (16-ричное число 0x00000000000000000000000000000000).

2. Для добавления индекса сразу будет запущена инструкция create index. Без копирования строк из старой таблицы в новую. Если индексов несколько - команды create выполняются параллельно. На таблице 100 млн строк индексы по 3 реквизитам добавились за 30 минут (реальный живой тест не на самом мощном ПК с обычным жестким диском, не SSD).

3. В случае с реквизитом будет также выполнена инструкция alter. А вот в случае с удалением измерения из регистра накопления (например) - все несколько сложнее. Платформе придется выполнить "свертку" (group by) по новому составу измерений и записать новые данные в новую таблицу. Также это вызовет и перезапись таблицы итогов. 

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

Проведенные тесты:

1. Таблица табличной части документа, 80 млн строк, добавлены индексы по 3-м реквизитам ТЧ. Отработало за 35 минут.

2. Таблица периодического регистра сведений (ЦеныНоменклатуры), у 3-х измерений установлено свойство "ведущее". 100 млн. строк. Индексы построились за 1 час 20 минут.

При всех операциях лог-файл "распухал" вполне прогнозируемо относительно исходного размера таблицы в мегабайтах.

 

Как запустить обновление в новом режиме?

1. На сервере 1С обязательно должен быть установлен runtime Java 8. Разрядность Java обязательно должна совпадать с разрядностью сервер 1С. Для 32 бит качаем 32 бит, для 64 - 64. Скачать можно здесь: https://java.com/ru/download/

2. На сервере БД 1С, для службы агента sql обязательно должны быть разрешены подключения по TCP/IP (настраивается в диспетчере конфигурации SQL). Драйвер JDBC использует подключение tcp/ip для выполнения запросов t-sql.

3.1 Пакетный запуск

Текст скрипта для PowerShell (файлы .ps1)

Start-Sleep -Seconds 3
Get-WMIObject Win32_Process|where{$_.name -eq '1cv8.exe' -and $_.getowner().user -eq $env:UserName}|%{stop-process $_.ProcessId}Start-Sleep -Seconds 1
Start-Process -FilePath "C:\Program Files (x86)\1cv8\8.3.12.1529\bin\1cv8.exe" -ArgumentList " CONFIG /S localhost\bd_test /N UpdateRobot /P 123456 /UC 123456789 /UpdateDBCfg -Server -v2 "

В БД 1С должен быть создан пользователь UpdateRobot, с одной единственной ролью, с одним единственным правом доступа "Обновление конфигурации базы данных". Все остальные права доступа (администрирование, администрирование данных) - не нужны.

В таком режиме ход обновления можно отслеживать только через консоль администрирования кластера 1С и с помощью инструментов сервера БД (MS SQL Studio).

3.2 Настройка файла conf

Смотрим, что написано в файле conf

C:\Program Files (x86)\1cv8\8.3.12.1529\bin\conf

Ка правило, путь в нем указан так: ConfLocation=C:\Program Files (x86)\1cv8\conf

Правим указанный файл так, чтобы он содержал строку: UpdateDBCfg=v2

Пример:

SystemLanguage=System
UpdateDBCfg=v2

Далее, чтобы обновиться в режиме v2:

Конфигуратор - конфигурация БД - обновить конфигурацию БД на сервере.

 

Тесты проводились: платформа 8.3.12.1529 (клиент-сервер, 32 бит), сервер БД MS SQL 2012.

Буквально недавно в нашей организации таким образом было успешно обновлено 14 баз данных 1С размером от 500 Гб до 1 Тб.

ВАЖНО (выдержка с ИТС):

"2-я версия механизма реструктуризации работает только для клиент-серверного варианта работы информационной базы в том случае, если в качестве СУБД используется Microsoft SQL Server или PostgreSQL. Если планируется использование 2-й версии механизма реструктуризации совместно с СУБД Microsoft SQL Server, то сервер «1С:Предприятия» для соединения с СУБД должен использовать сетевой протокол TCP/IP (в терминах СУБД). Работа 2-й версии механизма реструктуризации не поддерживается в том случае, если сервер «1С:Предприятия» подключается к СУБД Microsoft SQL Server с использованием сетевых протоколов Разделяемая память или Именованные каналы."

https://its.1c.ru/db/v8311doc#bookmark:adm:TI000000376

UPD 14.06.2019

ВАЖНО: Если обновление по v2 падает с ошибкой - одна из причин может быть в том, что в вашей БД есть индексы, отличные от стандартных платформенных (добавленные вручную) - их необходимо физически удалить (именно удалить, а не отключить) перед запуском обновления.

160

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. nyam-nyam 31.10.18 17:22 Сейчас в теме
Ещё по теме для тех кто тюнингует 1С+MS SQL: https://its.1c.ru/db/metod8dev/content/5945/hdoc.
nytlenc; Дмитрий74Чел; Dach; Repich; +4 Ответить
2. Dach 272 31.10.18 17:48 Сейчас в теме
(1) да, весьма в тему, спасибо!
39. nytlenc 273 24.06.19 11:51 Сейчас в теме
(2) и еще в догонку по теме "для тех кто тюнингует 1С+MS SQL" http://v8.1c.ru/predpriyatie/questions_licence.htm#lrvs1cpp

это к последнему апдейту
ВАЖНО: Если обновление по v2 падает с ошибкой - одна из причин может быть в том, что в вашей БД есть индексы, отличные от стандартных платформенных (добавленные вручную) - их необходимо физически удалить (именно удалить, а не отключить) перед запуском обновления.
3. user612295_death4321 31.10.18 19:53 Сейчас в теме
Буду тестировать скоро отключение режима совместимости 8.2))) БД почти 3 ТБ.
4. vcv 84 31.10.18 20:02 Сейчас в теме
Двойственные чувства.
С одной стороны слава тебе Господи, наконец-то 1С сподобилась взяться за то, что куча народа ждало еще со времён 7.7. С другой стороны тут и Java, тут и Powershell… А сплясать в водолазном костюме в гамаке не надо?
Antonov.AV; blackjack666; CodeNull; Brawler; Krio2; insurgut; manlak; memb3r; babys; sm.artem; Silenser; monkbest; Yakud3a; alest; Gang031; o.nikolaev; Ta_Da; djam_arttek; comol; Boulala; roman77; ilialin; zqzq; user747571; frkbvfnjh; LavinVadik; DrAku1a; slawanix; +28 Ответить
5. slawanix 12 31.10.18 23:08 Сейчас в теме
(4) аналогичные чувства... только обрадоваться хотел, но остался вопрос, почему нельзя сделать это всё прямо из платформы, по кнопке «сделать всё хорошо»?
Brawler; memb3r; Serg3141; djam_arttek; +4 Ответить
6. Vladimir Litvinenko 31.10.18 23:36 Сейчас в теме
(4) Java - это отголоски наработок по платформе 1C 8.4. Развитие этой версии идет медленно и новостей давно не слышно, но ее наработки постепенно появляются в 8.3. На Java никто писать не заставляет, а представить машину без JRE сейчас сложно. И судя по всему с Java придется дружить всё больше - EDT, сервер взаимодействия и т.д.

Powershell для примера же приведен. Там кроме команды запуска 1С с параметрами "UpdateDBCfg -Server -v2" и нет ничего, одна консольная команда. Не внешнюю же обработку для выполнения одной консольной команды писать...
9. DrAku1a 1304 01.11.18 02:19 Сейчас в теме
(6)
Там кроме команды запуска 1С с параметрами "UpdateDBCfg -Server -v2" и нет ничего

CMD не подойдёт?
21. comol 3961 01.11.18 13:19 Сейчас в теме
(6)
а представить машину без JRE сейчас сложно
представить машину с JRE при нормальном админе сейчас сложно. Я про Win конечно...

Просто Java программистов "как грязи" и 1С решили подбирать весь мусор и писать на том подо что есть программисты. На Java не пишут системное ПО нормальные люди конечно, просто C++ ника нормального попробуй найди
Brawler; Synoecium; Evg-Lylyk; monkbest; +4 5 Ответить
31. philya 77 07.11.18 08:13 Сейчас в теме
(21) я на java драйвера для фискальных регистраторов пишу, очень удобно, т.к. один код работает под виндой, линуксом и андроидом. Что я делаю не так? С++ я тоже умею.
manuel; Boulala; memb3r; LordKim; milov.aleksey; pfilyk; +6 Ответить
32. 7OH 33 07.11.18 11:06 Сейчас в теме
(31) драйвера или обёртки для готовых dll\so ?
33. philya 77 07.11.18 20:51 Сейчас в теме
(32) библиотеки работы с com/usb готовые, драйвера мои что-то типа....

@Override
public ByteBuffer getCommand() {
ByteBuffer data = ByteBuffer.allocate(12 + cashier.length() + cashierFiscalId.length());
data.order(ByteOrder.LITTLE_ENDIAN);
data.putShort((short) 2); // отчет об открытии смены
data.putShort((short) (4 + cashier.length() + 4 + cashierFiscalId.length()));
data.putShort((short) 1021);
data.putShort((short) cashier.length());
data.put(cashier.getBytes(Charset.forName("IBM866")));
data.putShort((short) 1203);
data.putShort((short) cashierFiscalId.length());
data.put(cashierFiscalId.getBytes(Charset.forName("IBM866")));

setData(data);
return super.getCommand();
}
38. Evil Beaver 6080 24.06.19 10:26 Сейчас в теме
(21) Ну при всей моей нелюбви к Джаве, я бы все-таки не стал называть ее мусором :) Тот же Apache Kafka на ней написан и шустр до безобразия.
41. Antonov.AV 12.07.19 06:34 Сейчас в теме
(4) я думал только у меня такое ощущение)
7. palsergeich 01.11.18 00:08 Сейчас в теме
Я один раз пробовал.
Мне вывело сообщение ошибка и на какой то внутренний модуль.
Гугл сказал что ничего не светит. я сказал ок и по старому за 6 часов обновился.
Обидно конечно.
28. Repich 255 01.11.18 13:49 Сейчас в теме
(7)
Вот такое у меня сейчас. Ковыряемся. Ради спортивного интереса хочу докопаться до причин.

В процессе обновления конфигурации базы данных при работе оптимизированного механизма обновления произошла критическая ошибка
по причине:
Критическая ошибка работы Java-процесса.
Путь к Java: C:\Program Files\Java\jre1.8.0_181\bin\java.exe
Действие: prepare
Process ID: 22296
Код возврата: 1
Ошибка: Exception in thread "main" java.lang.IllegalStateException: Duplicate key ae4a0c5e-f97b-4cf4-96d8-c040bf8e222b
at java.util.stream.Collectors.lambda$throwingMerger$0(Unknown Source)
at java.util.HashMap.merge(Unknown Source)
at java.util.stream.Collectors.lambda$toMap$58(Unknown Source)
at java.util.stream.ReduceOps$3ReducingSink.accept(Unknown Source)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)
at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.util.stream.ReferencePipeline.collect(Unknown Source)
at com._1c.dmf.v8.converters.parameters.documentjournal.GraphContent.<init>(GraphContent.java:24)
at com._1c.dmf.v8.cli.modelparsing.ConfigurationModelParser.deserializeGraphContent(ConfigurationModelParser.java:352)
at com._1c.dmf.v8.cli.modelparsing.ConfigurationModelParser.deserializeValue(ConfigurationModelParser.java:208)
at com._1c.dmf.v8.cli.modelparsing.ConfigurationModelParser.deserializeParameter(ConfigurationModelParser.java:172)
at com._1c.dmf.v8.cli.modelparsing.ConfigurationModelParser.deserializeAttributeParameter(ConfigurationModelParser.java:155)
at com._1c.dmf.v8.cli.modelparsing.ConfigurationModelParser.deserializeEntityParameters(ConfigurationModelParser.java:139)
at com._1c.dmf.v8.cli.modelparsing.ConfigurationModelParser.deserializeParameters(ConfigurationModelParser.java:112)
at com._1c.dmf.v8.cli.modelparsing.ConfigurationModelParser.parse(ConfigurationModelParser.java:92)
at com._1c.dmf.v8.internal.integration.Arguments.getOldModel(Arguments.java:84)
at com._1c.dmf.v8.internal.integration.DmfService.prepareMigration(DmfService.java:64)
at com._1c.dmf.v8.cli.Migration.run(Migration.java:90)
at com._1c.dmf.v8.cli.Migration.main(Migration.java:65)
29. palsergeich 01.11.18 17:05 Сейчас в теме
(28)
at java.util.HashMap.merge(Unknown Source)

Да что то очень похожее.
Причем все базы кроме нужной реструктурировались новым методом нормально.
Но там было не к спеху, и я просто сделал по старинке.
Изменений очень много было, может в этом была проблема?
30. Dach 272 01.11.18 19:43 Сейчас в теме
(28) поставь Яву не 181, а 171 или младше
8. silberRus 65 01.11.18 01:00 Сейчас в теме
Интересно что за данные в базе на 1тб.
10. buganov 57 01.11.18 05:09 Сейчас в теме
(8)скорее всего продажи, чеки, заказы на перемещение / перемещения на магазины.
У нас база 3 Тб
11. dsdred 1026 01.11.18 08:11 Сейчас в теме
(8)Размер базы обычной небольшой торговой сети, может быть еще с небольшим производством...
12. Dach 272 01.11.18 09:25 Сейчас в теме
Можно и cmd. Друзья, конечно это не одна кнопка "сделать всё хорошо", но уже существенный задел. База - склад, продажи, логистика. Плюс у нас ещё и РИБ. Механизм обновления активно используем, все работает... На ИТС информации мало, поэтому посчитал нужным поделиться опытом и отчитаться об успехе) в дальнейшем неплохо было бы иметь возможность обновляться пакетно с возможностью логгировать ход обновления
djam_arttek; +1 Ответить
13. Fox-trot 99 01.11.18 09:31 Сейчас в теме
(12)пока логирование обновления можно наблюдать на стороне базы данных
14. Xershi 651 01.11.18 11:07 Сейчас в теме
У конфигурации режим совместимости был 8.3.11? Или ниже?
15. Dach 272 01.11.18 11:31 Сейчас в теме
(14) режим совместимости был выключен. Но думаю, в режиме совместимости 8.3.11 должно отработать
16. Xershi 651 01.11.18 11:54 Сейчас в теме
(15) значит как и завялено при режиме совместимости 8.3.10 все будет по старому!
17. comol 3961 01.11.18 13:06 Сейчас в теме
О даааа!!!!! Это случилось! В 1С выучили Alter Table!
18. comol 3961 01.11.18 13:08 Сейчас в теме
Малину портит только " На сервере 1С обязательно должен быть установлен runtime Java 8". Вопрос "зачем так" наверное риторический...
19. Dach 272 01.11.18 13:11 Сейчас в теме
(18) весь "интеллект" умных скриптов T-SQL написан на Java, в недрах платформы, насколько я понял ))
20. acanta 57 01.11.18 13:15 Сейчас в теме
(19) т.е. можно в принципе написать левый скрипт на Java, который реструктуризует базу под новую конфигурацию и зальет туда измененный cf с гитхаба или с какого нибудь каталога?
И все будет работать?
23. comol 3961 01.11.18 13:21 Сейчас в теме
(20) можно декомпильнуть то что написано, подправить и юзать как хочется теперь :)
25. acanta 57 01.11.18 13:25 Сейчас в теме
(23) на каждое добавление булева не надекомпилируешься. Но сама идея о неразрывном совмещении данных в базе и их интерфейса достаточно спорная.
При том, что на все итоги и индексы, целостность которых якобы гарантирует платформа, существуют процедуры SQL, выполняющие пересчеты.
22. comol 3961 01.11.18 13:20 Сейчас в теме
(19) в недрах платформы Java нет, иначе мы бы это уже "почувствовали".
Пока надеюсь что и не будет.
26. Dach 272 01.11.18 13:28 Сейчас в теме
(22) ну как-то же она тексты скриптов собирает, в зависимости от выполненных действий в конфигураторе
27. acanta 57 01.11.18 13:36 Сейчас в теме
(26) мы бы тоже хотели знать как и почему alter возник только сейчас. Исторически сложилось, что реструктуризация выполнялась таким образом в DBF. Сначала все измененные файлы складывались в папку NewStru, затем копировались вместо находящихся в базе. Почти цитирую старый мануал: при возникновении сбоя на первом этапе файлы в базе будут первоначальных вариантов и никакие данные не будут утеряны.
При возникновении сбоя на втором этапе часть данных в базе может стать некорректной, но всегда есть возможность скопировать файлы из NewStru и завершить процесс реструктуризации вручную. Исходили из положения что бакап и изменение структуры в процессе работы с DBF по-горячему сделать невозможно, а программист, обслуживающий конфигурацию не полезет в dbf и работу платформы, но точно знает основы работы с файлами в файловом менеджере.

В SQL есть возможность добавить колонку в таблицу в процессе работы. Немонопольно. Это не проблема для SQL, это проблема конфигуратора, который не умеет работать одновременно с разными версиями данных (до и после) какой то реструктуризации.
Gureev; 7OH; +2 Ответить
34. Andrefan 08.11.18 09:28 Сейчас в теме
(0) Спасибо за интересный материал! Не подскажите, режим совместимости с 8.2.13 возможно заставить работать этот механизм?
35. Dach 272 08.11.18 09:58 Сейчас в теме
(34) к сожалению, нет. Вам придется прибегать к другим методам... О том, как добавлять колонки и индексы в большие таблицы БД - куча статей есть на ИС, в том числе и у меня (не реклама)
36. Kamikadze 46 07.12.18 19:46 Сейчас в теме
Надо добавить, что для клиент - серверного варианта базы нужно перезапустить службу сервера 1С

У меня возникла ошибка

В процессе обновления конфигурации базы данных при работе механизма реструктуризации второй версии произошла критическая ошибка
по причине:
При работе механизма реструктуризации второй версии возникла ошибка. Код возврата: 1. Операция: execute.

Версия платформы 8.3.13.1513
37. dmarenin 229 09.12.18 18:37 Сейчас в теме
40. 3vs 25.06.19 06:20 Сейчас в теме
А, говорят, Java теперь платная, Oracle денег просит за её использование
не в домашнем применении.
42. kauksi 205 19.07.19 11:17 Сейчас в теме
почти типовая УПП...
В процессе обновления конфигурации базы данных при работе оптимизированного механизма обновления произошла критическая ошибка
по причине:
Критическая ошибка работы Java-процесса.
Путь к Java: C:\Program Files (x86)\Java\jre1.8.0_221\bin\java.exe
Действие: prepare
Process ID: 2660
Код возврата: 1
Ошибка: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
43. kauksi 205 19.07.19 11:44 Сейчас в теме
Эта проблема решилась добавлением опции JavaOpts=-Xmx2048m в conf.cfg, но теперь ошибка без расшифровки
Критическая ошибка работы Java-процесса.
Путь к Java: C:\Program Files (x86)\Java\jre1.8.0_221\bin\java.exe
Действие: prepare
Process ID: 3392
Код возврата: 1
Ошибка:
44. kauksi 205 19.07.19 11:45 Сейчас в теме
повышение режима совместимости УПП до 8.3.1 результатов не дало. Видать сырая еще опция
45. Dach 272 19.07.19 15:16 Сейчас в теме
(44) механизм работает с версии 8.3.11. Совместимость должна быть не ниже этой версии
Оставьте свое сообщение