В работе программиста 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
Обработка хорошая, скачал и использую для создания тестовой базы уменьшенного размера.
Есть пару замечаний:
1. Не всегда корректно группирует метаданные в дереве таблиц — в корневой элемент Регистр.РН1 запихнула таблицы других регистров.
2. Выводит только топ 30 больших таблиц. Хотелось бы этот вопрос самостоятельно задавать, 30 или 50 или 100
3. В современных конфигурациях могут быть таблицы платформенной истории данных — их обработка не показывает вовсе.
А так, в целом — достойная вещь, лично мне кучу времени сэкономила для подготовки тестовой среды. Автору спасибо
(1) Не надо умничать, если не в теме. Базу размером более 100Гб, с несколькими миллионами документов невозможно свернуть без прямой работы с SQL. Такие обработки очень нужны и плохо только, что 1с сама не даёт такие методики по сверке больших баз.
(4) Извините, может и резковато я ответил, но не надо приводить лицензионное соглашение, как аргумент. В данном случае это выглядит немного по детски. Вы не работали с большими базами, у Вас нет опыта в данной области. По этому критиковать наработки экспертов вы не можете. Сами эксперты 1С, которые работают в 1С и преподают на курсах 1С используют методы прямого доступа SQL к данным 1с. Это примерно, как использовать хирургические методы при лечении пациента, опасно, но жизненно необходимо.
https://its.1c.ru/db/metod8dev/content/2922/hdoc
А лицензионное соглашение говорит о том, что 1с не гарантирует нормальную работу информационной базы, если вы напрямую лезете к данным. Все на свой страх и риск. Но программа 1с при этом не становиться пиратской, это не взлом и не кряк.
И кстати, делать бэкапы и восстанавливать базу 1С надо именно из бэкапов SQL, а не из DT файла. На это есть четкая рекомендация самой 1С:
(6)Уважаемые коллеги! Как автор публикации, я не вижу ни малейшего повода реагировать на мнение imh9305 настолько грубо и оскорбительно. Оно аргументировано и имеет место быть. Давайте не будем опускаться до оскорблений и превращать техническое обсуждение наших разработок в посиделки тролей.
(5) ну как бы понятно, что dt-шник нужен только для перехода от файловой к клиент-серверной и от ms sql server к постгресу, и что битые данные могут не выгрузиться.
эксперты если так делают — так я и не против них писал вообще-то, на то он и эксперт.
предположу, что найдется «эксперт», который подобной обработкой что-то сломает в рабочей базе.
я подобные решения если и буду использовать, то в самом крайнем случае. ну и есть база у меня немаленькая, для тестов на ней интересная идея ее использовать, вполне может пригодится. ну и опыта набраться.
dmitrydemenew — спасибо за обработку.
автор удаленного сообщения, которое в уведомлениях я прочел — в личку напиши.
(8)
Попробуйте выгрузить несколько терабайт в ДТ и отпишитесь, пожалуйста, о результатах.
Зря Вы так. Если к базе действительно требуется такой скальпель, то это база не ООО Вектор, а вполне себе из разряда Highload. И в таких компаниях в 99.99% есть хотя бы один да специалист, который знает, что он делает и для чего. А базенки на несколько Гб режутся и стандартными средствами вполне себе приемлемо.
(2) для создания тестовых баз Вы можете секционировать большие таблицы и при создании тестовой просто транкейтить по partition. Очень удобно и быстро. И, кстати, для Вашей задачи будет даже лучшим решением, нежели обстригать обработкой из сабжа, что, конечно же, НЕ УМАЛЯЕТ ее качества.
(9) понятия не имею, зачем выгружать базу в несколько терабайт в ДТ как и то, откуда у Вас статистика в 99,99%.
честно говоря не ожидал, что тут за высказывание своего мнения могут заклевать, как будто я кому-то навредить хотел. на этом прекращаю этот бесполезный спор.
(11)Я не хотел заклевать или обидеть. Просто Вы написали, что ДТшник нужен для перехода на постгю. Новичок прочитает Ваше высказывание и примет к сведению не совсем верное мнение.
По поводу высказывания мнения, то это узконаправленное сообщество, где люди делятся рабочими решениями, задают вопросы и получают ответы. Это не пикабу и мнение здесь в идеале должно быть либо технически верным, либо обязательно исправленным.
(10) это все известно и чудесно, но когда дают бэкап продуктивной базы и говорят: «вот, обрежь его», там никаких партиций и секционирования нет и в помине. Вот и приходится сидеть, писать скрипты ручками
Коллеги, добрый день!
Только у меня такая ошибка?
Ткните пальцем плиз, где посмотреть решение.
Спасибо!
В итоге сам решил. Нужно внести пару записей в реестр и перезарузиться.
Подробности в статье:
https://support.microsoft.com/ru-ru/help/4077486/secdoclienthandshake-ssl-security-error-installing-dynamics-crm-server
Продолжаем разговор 🙂
УТ 11.4.6. Платформа 8.3.12.1685. Сборка SQL — 14.0.2072.2.
Пытаюсь обрезать РС.ВерсииОбъектов на дату. (типовой регистр, не менялся).
Получаю ошибку на скрине 1. (про неправильный синтаксис).
Смотрим итоговый запрос (Скрин 2) на что ругается SQL.
Видим 2 выделенных строки.
Далее смотрим описание на сайте microsoft, а там сказано следующее — скрин 3.
То есть передан аргумент неверного типа.
Вот тут я совсем не силен и поправить сам не смог 🙂
И еще одна ошибка при нажатии кнопки «Рассчитать время обрезки таблиц» (скрин 4)
Какие типы полей регистра в 1С?
_Fld12610 — ВерсияОбъекта. Тип ХранилищеЗначения.
_Fld12611 — ТабличныеДокументы. Тип ХранилищеЗначения.
(18)Исправил обработку
Добрый день
А как shrink применяется? Есть скрипт, написанный вручную. Все прекрасно, но shrink работает бесконечно долго. База 4Тб. Гугл выводит на статью где сказано: если у вас внутри БД есть строки неограниченной длины (text, varchar и т.п.) — смиритесь и страдайте. А без shrink теряется всякий смысл таких очисток (по-крайней мере для нашего случая). Не возникало такой проблемы?
(20)Да, к сожалению shrink — достаточно длительная операция. На днях обрезали базу документооборота исходным размером 1.4Тб. Пусть не 4Тб, но размер все же внушительный. Для интереса, замерил скорость сжатия — около 10 Мб/с. (300 Гб за ~8,5ч.).
— не соглашусь, обрезание базы производится часто не только ради освобождения дискового пространства, а для решения проблем производительности системы, возникающих при работе с таблицами большого размера