Дано:
Произвольная таблица (регистр, документ, справочник) в произвольной базе данных 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 падает с ошибкой - одна из причин может быть в том, что в вашей БД есть индексы, отличные от стандартных платформенных (добавленные вручную) - их необходимо физически удалить (именно удалить, а не отключить) перед запуском обновления.
UPD 10.09.2019
Если обновление v2 падает с ошибкой вида:
При работе механизма реструктуризации второй версии возникла ошибка. Код возврата: 1. Операция: prepare.
одна из возможных причин может быть следующей:
- вы добавили реквизит в документ/справочник/регистр и после добавления отсортировали список реквизитов по имени/синониму;
В этом случае java падает в зацикливание. Решение: сначала просто добавить реквизит, выполнить реструктуризацию по v2, затем уже отсортировать реквизиты и выполнить обновление по v1.
UPD 13.04.2022
На свежих релизах платформы (начиная с какой версии - не подскажу, не проверял, но точно старше 8.3.12) для включения настройки обновления v2 нужно редактировать "клиентский" conf.cfg, то есть файл на ПК, где физически открыт конфигуратор.