Свертка БД 1С: обрезка до выбранной даты средствами MS SQL




Внешняя обработка, позволяющая произвести анализ размера БД и грубую обрезку данных до выбранной даты средствами MS SQL. Управляемые формы, 1С:Предприятие 8.3 (8.3.9.1818).

   В работе программиста 1С порой возникают нетривиальные задачи. Одна из таких задач — обрезка баз данных, имеющих очень большие физические размеры. Причины  возникновения этой задачи самые разнообразные — критическое падение производительности информационной системы, проблемы технического обслуживания  БД (проведение регламентных работ, формирование бекапов), создание тестовых баз разработки для подключения к хранилищу и прочее. Как пример — решение проблемы производительности с помощью разделения основной рабочей ИБ на БЕК/ФРОНТ с помощью формирования РИБ, состоящей из отчетной полной базы и небольшой рабочей БД, содержащей только срез данных, необходимый для регистрации текущих хозяйственных операций.   

   Особенность задачи свертки базы в том, что ее решение типовыми средствами — сложный и неприемлемо долгий процесс. Поэтому, да простят меня непреклонные приверженцы твердого соблюдения лицензионного соглашения, для свертки данных я использую исключительно средства MS SQL.

   В представленной разработке собраны основные методы одного из способов быстрой очистки БД до определенной даты. Обработка предназначена для любых конфигураций на платформе 1С:Предприятие 8.3 (8.3.9.1818 и выше), работающих в режиме управляемого приложения. При желании, не составит труда доработать ее под любую конфигурацию V8.2 и выше. Для использования обработки требуются параметры доступа к SQL с правом создания и изменения таблиц.
   
Краткое описание возможностей обработки

  При подключении к базе SQL сразу предоставляется следующая аналитическая информация: 
  — размер БД и наличие свободного пространства;
  — дата последней резервной копии и ее размер;
  — список первых 30 таблиц максимального размера с указанием внутреннего имени, количества строк и размера в МБ;
  — список таблиц, очищенных или обрезанных с помощью данной обработки ранее.

 

Основные команды обработки:

  — команда "Обновить исходные данные анализа" обновляет параметры выбранной БД и список таблиц максимального размера;

  — команда "Выполнить сжатие БД (shrink)" запускает сжатие БД. Т.к. операция длительная, запрос сжатия выполняется асинхронно;

  — команда "Выполнить анализ выбранных таблиц" определяет размер данных до и после указанной даты среза. Размер в МБ рассчитывается исходя из  количества строк и среднего веса 1 строки;

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

 — команда "Обрезка выбранных таблиц до границы среза"  создает копии отмеченных таблиц и заполняет их срезом данных с указанной даты. Срез данных определяется по реквизиту, указанному в списке таблиц в поле "Реквизит среза". Для табличных частей доступен вариант среза "По основной таблице", при этом срез данных ТЧ формируется по набору ссылок, отобранных в основной таблице объекта. В завершение операции, исходные таблицы  заменяются соответствующими копиями, переименовываются и остаются в базе в качестве резерва для возможности отката в исходное состояние.

  — команда "Подменить выбранные таблицы пустыми" подобна предыдущей, но новые таблицы подмены остаются пустыми;

  — команда "Полная очистка выбранных таблиц (TRUNCATE)» производит мгновенную полную очистку выбранных таблиц без возможности восстановления  данных. Команда опасная, на рабочих БД советую использовать ее очень осторожно;

  — команда "Удалить временные таблицы" удаляет все временные таблицы, созданные при свертке БД ранее и не удаленные автоматически по каким-либо причинам, к примеру из-за технического сбоя.

  Запуск всех "опасных" команд производится только после предварительного подтверждения. 
Для большинства основных команд доступен просмотр текста сформированного скрипта SQL в отдельном окне. Пустые таблицы при анализе/свертке игнорируются.

  Команды работы с резервными копиями таблиц расположены на вкладке "Очищенные (обрезанные) таблицы": 

  — команда "Восстановить исходные данные таблиц" возвращает исходные таблицы данных переименованием, таблицы подмены удаляются;

  — команда "Удалить резервные таблицы исходных данных" удаляет исходные таблицы данных непосредственно, восстановление исходных данных после этого невозможно.

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

Всем удачи!

 

Обновление от 2024.11.22:

Добавлена команда "Сжать данные таблиц". По команде выбранные таблицы сжимаются средствами MSSQL. Данная операция позволяет  существенно сократить размер БД без удаления записей.

Более подробно здесь: https://docs.microsoft.com/ru-RU/sql/relational-databases/data-compression/data-compression?view=sql-server-2024

 

18 Comments

  1. Dach

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

    Есть пару замечаний:

    1. Не всегда корректно группирует метаданные в дереве таблиц — в корневой элемент Регистр.РН1 запихнула таблицы других регистров.

    2. Выводит только топ 30 больших таблиц. Хотелось бы этот вопрос самостоятельно задавать, 30 или 50 или 100

    3. В современных конфигурациях могут быть таблицы платформенной истории данных — их обработка не показывает вовсе.

    А так, в целом — достойная вещь, лично мне кучу времени сэкономила для подготовки тестовой среды. Автору спасибо

    Reply
  2. zabaluev

    (1) Не надо умничать, если не в теме. Базу размером более 100Гб, с несколькими миллионами документов невозможно свернуть без прямой работы с SQL. Такие обработки очень нужны и плохо только, что 1с сама не даёт такие методики по сверке больших баз.

    Reply
  3. zabaluev

    (4) Извините, может и резковато я ответил, но не надо приводить лицензионное соглашение, как аргумент. В данном случае это выглядит немного по детски. Вы не работали с большими базами, у Вас нет опыта в данной области. По этому критиковать наработки экспертов вы не можете. Сами эксперты 1С, которые работают в 1С и преподают на курсах 1С используют методы прямого доступа SQL к данным 1с. Это примерно, как использовать хирургические методы при лечении пациента, опасно, но жизненно необходимо.

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

    И кстати, делать бэкапы и восстанавливать базу 1С надо именно из бэкапов SQL, а не из DT файла. На это есть четкая рекомендация самой 1С: https://its.1c.ru/db/metod8dev/content/2922/hdoc

    Reply
  4. dmitrydemenew

    (6)Уважаемые коллеги! Как автор публикации, я не вижу ни малейшего повода реагировать на мнение imh9305 настолько грубо и оскорбительно. Оно аргументировано и имеет место быть. Давайте не будем опускаться до оскорблений и превращать техническое обсуждение наших разработок в посиделки тролей.

    Reply
  5. imh9305

    (5) ну как бы понятно, что dt-шник нужен только для перехода от файловой к клиент-серверной и от ms sql server к постгресу, и что битые данные могут не выгрузиться.

    эксперты если так делают — так я и не против них писал вообще-то, на то он и эксперт.

    предположу, что найдется «эксперт», который подобной обработкой что-то сломает в рабочей базе.

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

    dmitrydemenew — спасибо за обработку.

    автор удаленного сообщения, которое в уведомлениях я прочел — в личку напиши.

    Reply
  6. buganov

    (8)

    для перехода от ms sql server к постгресу

    Попробуйте выгрузить несколько терабайт в ДТ и отпишитесь, пожалуйста, о результатах.

    предположу, что найдется «эксперт», который подобной обработкой что-то сломает в рабочей базе.

    Зря Вы так. Если к базе действительно требуется такой скальпель, то это база не ООО Вектор, а вполне себе из разряда Highload. И в таких компаниях в 99.99% есть хотя бы один да специалист, который знает, что он делает и для чего. А базенки на несколько Гб режутся и стандартными средствами вполне себе приемлемо.

    Reply
  7. buganov

    (2) для создания тестовых баз Вы можете секционировать большие таблицы и при создании тестовой просто транкейтить по partition. Очень удобно и быстро. И, кстати, для Вашей задачи будет даже лучшим решением, нежели обстригать обработкой из сабжа, что, конечно же, НЕ УМАЛЯЕТ ее качества.

    Reply
  8. imh9305

    (9) понятия не имею, зачем выгружать базу в несколько терабайт в ДТ как и то, откуда у Вас статистика в 99,99%.

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

    Reply
  9. buganov

    (11)Я не хотел заклевать или обидеть. Просто Вы написали, что ДТшник нужен для перехода на постгю. Новичок прочитает Ваше высказывание и примет к сведению не совсем верное мнение.

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

    Reply
  10. Dach

    (10) это все известно и чудесно, но когда дают бэкап продуктивной базы и говорят: «вот, обрежь его», там никаких партиций и секционирования нет и в помине. Вот и приходится сидеть, писать скрипты ручками

    Reply
  11. Wi5hMaCTeP

    Коллеги, добрый день!

    Только у меня такая ошибка?

    Ткните пальцем плиз, где посмотреть решение.

    Спасибо!

    Reply
  12. Wi5hMaCTeP

    В итоге сам решил. Нужно внести пару записей в реестр и перезарузиться.

    Подробности в статье:

    https://support.microsoft.com/ru-ru/help/4077486/secdoclienthandshake-ssl-security-error-installing-dynamics-crm-server

    Reply
  13. Wi5hMaCTeP

    Продолжаем разговор 🙂

    УТ 11.4.6. Платформа 8.3.12.1685. Сборка SQL — 14.0.2072.2.

    Пытаюсь обрезать РС.ВерсииОбъектов на дату. (типовой регистр, не менялся).

    Получаю ошибку на скрине 1. (про неправильный синтаксис).

    Смотрим итоговый запрос (Скрин 2) на что ругается SQL.

    Видим 2 выделенных строки.

    Далее смотрим описание на сайте microsoft, а там сказано следующее — скрин 3.

    То есть передан аргумент неверного типа.

    Вот тут я совсем не силен и поправить сам не смог 🙂

    И еще одна ошибка при нажатии кнопки «Рассчитать время обрезки таблиц» (скрин 4)

    Reply
  14. dmitrydemenew

    Какие типы полей регистра в 1С?

    Reply
  15. Wi5hMaCTeP

    _Fld12610 — ВерсияОбъекта. Тип ХранилищеЗначения.

    _Fld12611 — ТабличныеДокументы. Тип ХранилищеЗначения.

    Reply
  16. dmitrydemenew

    (18)Исправил обработку

    Reply
  17. demka123

    Добрый день

    А как shrink применяется? Есть скрипт, написанный вручную. Все прекрасно, но shrink работает бесконечно долго. База 4Тб. Гугл выводит на статью где сказано: если у вас внутри БД есть строки неограниченной длины (text, varchar и т.п.) — смиритесь и страдайте. А без shrink теряется всякий смысл таких очисток (по-крайней мере для нашего случая). Не возникало такой проблемы?

    Reply
  18. dmitrydemenew

    (20)Да, к сожалению shrink — достаточно длительная операция. На днях обрезали базу документооборота исходным размером 1.4Тб. Пусть не 4Тб, но размер все же внушительный. Для интереса, замерил скорость сжатия — около 10 Мб/с. (300 Гб за ~8,5ч.).

    без shrink теряется всякий смысл таких очисток

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

    Reply

Leave a Comment

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