Восстановление базы из DT, если она не хочет восстанавливаться

Публикация № 1643162 14.04.22

Администрирование БД - Архивирование (backup)

восстановление данных

Решение некоторых проблем при восстановлении базы из dt.

Как говорится, админы делятся на тех, кто делает бекапы, и тех, кто уже делает. А из тех, кто уже делает, выделяются те, кто эти бекапы проверяют (народная мудрость).

К сожалению, если есть выгрузка базы в .dt, есть ненулевой шанс эту выгрузку не загрузить обратно, с чем мне в последнее время несколько раз и пришлось столкнуться. И это даже не касается крупных баз, которые не могут загрузиться в файловый вариант. Просто файловая база может быть незначительно повреждена, так что при работе это незаметно, и выгружаться нормально, но выгруженные повреждения не дадут базу загрузить обратно. Например, в результате повреждения в таблице образовалось несколько пустых строк, но по таблице построен уникальный индекс. Или образовалось null-значение в поле с ограничением not null. Или строковые данные повредились, и 1С из строкового поля "на 10 символов" выгрузит 200 символов мусора. Все эти проблемы всплывают только при попытке воспользоваться выгрузкой.

 

 

К сожалению, формат DT закрытый, и просто так проблемы в нём поправить нельзя. Мне в таких случаях помогла загрузка базы в серверный вариант с PostgreSQL.

Во-первых, PostgreSQL молча обрезает слишком длинные строки. А во-вторых, используя триггеры, можно модифицировать данные при загрузке, чтобы исправить ошибки. Работать в PostgreSQL можно из "штатной" утилиты pgAdmin.

1С загружает базу в следующем порядке:

1. удаляются таблицы базы если они были

2. Создаётся и загружается таблица CONFIG и прочие служебные таблицы и создаётся новая структура таблиц.

3. Таблицы заполняются данными

4. После заполнения очередной таблицы создаются индексы, и начинается заполнение следующей таблицы.

Возможно, встретится ошибка с таким сообщением:

Попытка вставки неуникального значения в уникальный индекс: РегистрСведений.ЦеныНоменклатуры
23502: ERROR:  null value in column "_fld16137_type" violates not-null constraint
DETAIL:  Failing row contains (0001-01-01 00:00:00, \x00000000000000000000000000000000, \x00000000000000000000000000000000, \x00000000000000000000000000000000, 0.00, f, null, \x00000000, \x00000000000000000000000000000000, f, \x00000000000000000000000000000000, 0).
CONTEXT:  COPY _inforg16131, line 6537

Ключевое здесь сообщение "null value in column "_fld16137_type" violates not-null constraint". Тогда можно поступить следующим образом:

Нужно создать триггерную функцию такого вида:

CREATE OR REPLACE FUNCTION public.qqqq()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$

BEGIN
  IF (NEW._period IS NULL)
	OR(NEW._recordertref IS NULL)OR(NEW._recorderrref IS NULL)THEN
    RETURN NULL;
  END IF;
  IF NEW._lineno IS NULL THEN
    NEW._lineno=0;
  END IF;
  IF NEW._active IS NULL THEN
    NEW._active=false;
  END IF;
  IF NEW._fld18947rref IS NULL THEN
    NEW._fld18947rref='\\x00000000000000000000000000000000';
  END IF;
  IF NEW._fld18950 IS NULL THEN
    NEW._fld18950=0;
  END IF;
  RETURN NEW;
END
$BODY$;

Для каждой таблицы с такими проблемами по своей функции. Здесь имена полей нужно брать из сообщения об ошибках. В этом примере - если не заполнен _period или _recordertref или _recorderrref запись просто пропускается. Если не заполнены остальные поля - им присваиваю значение. Скорее всего это повреждённые записи, с утерянными или мусорными данными, решение тут надо принимать на месте - возможно стоит просто пропустить эту запись. Если нужно запись сохранить - значение нужно смотреть по типу использования

При загрузке 1С не удаляет триггерные функции, но назначить триггер придётся таблице после её создания. Это можно попробовать сделать через событийный триггер (см. ниже), но я делал есть вручную. Нужно назначить таблице триггер, указать созданную триггерную функцию и событие - BEFORE INSERT

 

 

Создать можно в диалоге, или таким запросом:
 

CREATE TRIGGER tbl1_flt
    BEFORE INSERT
    ON public._acc50
    FOR EACH ROW
    EXECUTE FUNCTION public.qqqq();

Где tbl1_flt - произвольно заданное имя
_acc50 - имя таблицы, вставку в которую данных фильтруем
qqqq() - имя созданной триггерной функции

Т.е. сначала нужно создать функцию, затем начать загрузку, и когда таблица появилась - назначить триггер.

Если загрузка прерывается по ошибке неуникальных данных:

Попытка вставки неуникального значения в уникальный индекс:
23505: ERROR:  could not create unique index "_inforg16131_1" РегистрСведений.ЦеныНоменклатуры
DETAIL:  Key (_fld1224, _period, _fld16132rref, _fld16133rref, _fld16134rref)=(0, 0001-01-01 00:00:00, \x00000000000000000000000000000000, \x00000000000000000000000000000000, \x00000000000000000000000000000000) is duplicated.

Это уже этап создания индексов по загруженным данным. В этом сообщении мусорные данные, но они могут быть и не мусорными. В этом случаем нам могут помочь СОБЫТИЙНЫЕ ТРИГГЕРЫ PostgreSQL. В отличие от строчных такой триггер может вызываться перед выполнением SQL команды create index, что позволит подчистить лишнее.

Нужно сначала создать функцию, в которой будем чистить лишние данные. К сожалению, есть сложности с определением какая именно команда и над каким объектом вызывается, возможно возникающие исключения будем гасить. Пример такой функции, удаляющей данные:

CREATE OR REPLACE FUNCTION public.asnitch()
    RETURNS event_trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$

DECLARE
  r record;
BEGIN
--	r:=pg_event_trigger_ddl_commands();
--    RAISE NOTICE 'snitch: % %', tg_event, tg_tag;
	BEGIN
		DELETE FROM _inforg16131
		WHERE _fld16132rref='\\x00000000000000000000000000000000'
		AND _fld16133rref='\\x00000000000000000000000000000000';
	EXCEPTION
		WHEN others THEN
	END;
	BEGIN
		DELETE FROM _inforg16131
		WHERE _fld16132rref='\\x008593706655162bac11eb41f32fa23c';
	EXCEPTION
		WHEN others THEN
	END;
END;
$BODY$;

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

Функция создана, теперь надо создать триггер. В диалоге:

 

 

Или запросом:

CREATE EVENT TRIGGER sss ON DDL_COMMAND_START
    WHEN TAG IN ('CREATE INDEX')
    EXECUTE PROCEDURE public.asnitch();

Таким образом функция будет вызываться перед каждым созданием индексов, и можно производить разные манипуляции над данными.

Для интересующихся - ссылка на документацию по PostgreSQL на русском

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 501 15.04.22 00:17 Сейчас в теме
"К сожалению, формат DT закрытый".
Будут проблемы с DT - приходите ко мне - формат DT знаю, умею, могу...
kser87; maXon777; +2 Ответить
2. Pasha1st 674 15.04.22 08:46 Сейчас в теме
(1) Да я тоже его смотрел, и даже точечно исправления вносил. Как-то нет желания повторять :)
Тогда вопрос по .dt - я правильно понял что данные таблиц идут в порядке следования в DBSchema (который идёт как "Database" после данных спецтаблиц)? И список полей надо оттуда же парсить?
6. kser87 2268 15.04.22 14:03 Сейчас в теме
(1) напиши статью, оценим
zaic; kraynev-navi; +2 Ответить
3. Sedaiko 441 15.04.22 11:59 Сейчас в теме
Самый надежный вариант - не делать "бэкапы" в dt.
Для файловой базы - копируется и zip'уется 1cv8.1cd, для клиент-серверной - средствами СУБД.
*.dt служит для переноса данных между разными СУБД

и к тому же делать "бэкапы" в dt всегда дольше, чем длятся правильные способы резервного копирования
IgorS; marsohod; Borisych; v3132; +4 Ответить
4. Pasha1st 674 15.04.22 12:53 Сейчас в теме
(3) ну пользователи обычно не понимают таких тонкостей.
Вот одна из историй - база слегка попортилась, клиент самостоятельно решил вылечить - выгрузил в dt, и попробовал загрузить обратно туда же. Копию 1cd не делал, исходный запоролся, и остался только dt который не загружался...
8. RustIG 15.04.22 19:50 Сейчас в теме
(4) почем нынче восстановление базы? тыщ 10 поди за результат?
7. RustIG 15.04.22 19:49 Сейчас в теме
(3) выгружаю дт для переноса файловых баз клиентов к себе на ноут - файл дт весит меньше, чем файл 1cd - быстрее копируется по интернету
9. Pasha1st 674 15.04.22 22:53 Сейчас в теме
(7) потому что в .dt 1. нет мусора, 2.он сжатый (практически zip). Если 1сд сжать архиватором получится примерно такой же размер, особенно если перед этим сделать сжатие в ТиИ.
oleg-x; SerVer1C; +2 Ответить
5. kser87 2268 15.04.22 14:02 Сейчас в теме
Интересная идея грузить dt в серверные базы. Возьму на заметку
10. user1777567 11.05.22 13:21 Сейчас в теме
Добрый день! Есть база dt под восстановление с такой же ошибкой, напишите, кто может восстановить
Оставьте свое сообщение

См. также

Скрипт удобного восстановления базы MSSQL при дифференциальном резервировании Промо

Архивирование (backup) Платформа 1С v7.7 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv7 Россия Бесплатно (free)

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

20.01.2011    31987    Ivon    12    

Резервное копирование PostgreSQL 12 и восстановление на определенный момент времени

Архивирование (backup) Платформа 1С v8.3 Россия Бесплатно (free)

Непрерывное архивирование базы данных PostgreSQL на 12ой версии и восстановление на определенный момент времени.

11.08.2021    5333    Vismut    5    

Классическое резервное копирование

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

04.02.2021    1712    creatermc    11    

Управление конфигуратором в режиме агента с помощью python

Инструменты администратора БД Архивирование (backup) DevOps и автоматизация разработки Платформа 1С v8.3 Конфигурации 1cv8 1С:Франчайзи, автоматизация бизнеса Россия Бесплатно (free)

Управление конфигуратором 1С:Предприятие в режиме агента. Опыт применения с реализацией на языке python. Результат получен с использованием интерактивной сессии оболочки через invoke_shell().

06.08.2020    2631    Alex10166    2    

Восстановление SQL базы 1С 8.2. рухнувшей во время сохранения конфигурации. Промо

Корректировка данных Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

При обновлении конфигурации вылетела 1С. После чего наотрез отказалась входить в базу. При этом в конфигураторе выдавалось сообщение "Внимание!!! При обновлении данных, после последней реструктуризации, произошла критическая ошибка. Повторить обновление?" Потом выходило сообщение "Обнаружена незавершённая операция сохранения конфигурации. Для продолжения необходимо завершить операцию". Горела кнопка Ок - на этом работоспособность конфигуратора и базы заканчивалась.

08.02.2012    137320    VanDiesel1    140    

Выгрузка в dt на сервере 1С по расписанию с завершением соединений и подключением к консоли сервера через com

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Россия Бесплатно (free)

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

16.04.2020    12994    karamazoff    49    

Тонкая настройка ежедневного резервного копирования базы данных 1С средствами SQL ver. 2014 (SP3) - 12.0.6024.0 (X64)

Архивирование (backup) Платформа 1С v8.3 Россия Бесплатно (free)

Хочу вам предложить небольшой пример, как можно реализовать резервное копирование 1С-ых баз данных средствами SQL. Данный материал не претендует на пулитцеровскую премию. Но возможно кому-то будет интересно узнать, что-то новенькое. Данный материал для резервного копирования только одной базы данных. А именно, если у вас 20-ть баз, то вам придется создавать 20-ть планов обслуживания для каждой базы индивидуально. (Слава разработчикам SQL, они разрешили копировать блоки из одного плана в другой, вам остается только произвести небольшую настройку для каждого скопированного блока - некоторые настройки блоков сбрасываются и выставляются значением по умолчанию и остаются неактивными)

07.10.2019    16936    DrZombi    53    

Настройка резервного копирования (резервирования) баз данных 1С: Предприятие на MS SQL Server

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Настройка резервного копирования (резервирования) баз данных на "бюджетной" версии 1С Предприятие под MS SQL Server. Используется пример MS SQL Server 2008 R2 под Windows. Для малых и средних предприятий, исключая производственные и торговые, так как тестирование на них не проводилось.

30.10.2018    13660    unclevad    16    

К вопросу об архивации баз 1С (и снова, и снова...) Промо

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Из своего опыта хочу напомнить о самом простом способе архивации баз типовыми средствами 1С и планировщика Windows.

08.01.2010    27758    grum01    14    

Работа с конфигуратором по протоколу SSH (не в режиме агента)

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Бесплатно (free)

Рабочее решение запуска пакетного скрипта конфигуратора 1С через SSH-клиента.

28.04.2018    11969    vsbronnikov    3    

Резервное копирование "онлайн" клиент-серверных баз в dt (не отключая пользователей)

Архивирование (backup) Платформа 1С v8.3 Бесплатно (free)

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

03.10.2017    28027    konstanta_online    82    

Настройка зеркалирования базы для MS SQL

Архивирование (backup) HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

19.05.2017    36336    MsDjuice    21    

Быстрый бэкап изменяемых данных

Архивирование (backup) Платформа 1С v8.3 Бесплатно (free)

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

19.01.2017    9817    ogroup    25    

Рекомендации по организации резервного копирования для систем с Windows Server / Windows SQL Server

Архивирование (backup) Платформа 1С v8.3 Бесплатно (free)

В данной статье мы рассмотрим работу с резервными копиями базы данных 1С, а также некоторые приемы, оптимизирующие работу с резервными копиями.

10.10.2016    20764    Zebar    12    

Резервное копирование и восстановление базы 1С средствами PostgreSQL

Архивирование (backup) Платформа 1С v8.3 Бесплатно (free)

Алгоритм резервного копирования баз 1С: 8 средствами PostgreSQL.

01.08.2016    78913    dimisa    35    

Как я восстанавливал разрушенную базу

Архивирование (backup) Корректировка данных Обмен между базами 1C Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

УТ10.3 на Платформе 8.2 на базе MSSQL была разрушена после попытки её восстановить после неудачного динамического обновления. Таблица Config целевой базы была заменена на содержимое таблицы Config от другой рабочей базы. Но на самом деле конфигурации у них существенно отличались, поэтому после таких действий целевая база рухнула окончательно. Что же делать?

21.08.2015    31196    METAL    25    

Просто и сердито. Архивирование (backup) типовых конфигураций 1С 8.2, 8.3

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

После эксплуатации различных "бесплатных" обработок и скриптов решил написать свой cmd-файл для ежедневного архивирования баз 1С. Работает на конфигурациях, где есть процедуры "ЗавершитьРаботуПользователей" и "РазрешитьРаботуПользователей" (т.е. во всех типовых, в нетиповые данные модули можно скопировать из типовых). Сохраняет файлы как локально так и на удаленном файловом сервере. Автоматически удаляет старые архивы и копирует на удалённый сервер отсутствующие. Расписание задается установкой соответствующего задания (запуска cmd-файла по времени) в планировщике задач Windows. Для борьбы с зависшими сеансами, рекомендуется настроить в режиме конфигуратора параметры информационной базы: "Время засыпания пассивного сеанса" и "Время завершения спящего сеанса".

18.06.2015    19539    Prelude    14    

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

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В 1С:Предприятии 8.2 есть ограничение на выгрузку базы в формате DT. Выгрузить базу можно, только если в ней нет активных пользователей. В этой статье поделюсь способом, как обойти это ограничение и сделать невозможное.

16.09.2013    54905    yurega    55    

Восстановление SQL базы 1С 8.2. после неудачного сохранения конфигурации

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Россия Бесплатно (free)

При динамическом обновлении, в процессе сохранения конфигурации, вылетела база 1С и отказалась заходить в режим Конфигуратора, выдавая сообщение "Внимание!!! При обновлении данных, после последней реструктуризации, произошла ошибка. Повторить обновление?", если ответить утвердительно, то появлялось сообщение "Обнаружена незавершенная операция сохранения конфигурации. Для продолжения работы необходимо завершить операцию.", после чего Конфигуратор закрывался.

18.07.2013    37975    lord_soth    45    

Резервное копирование 1С средствами MS SQL.

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В этой статье описано самое обычное резервное копирование ИБ 1С при помощи инструментов MS SQL Server 2008 R2, объяснено почему следует делать именно так, а не иначе, и развеяно несколько мифов.

17.02.2013    300556    speshuric    86    

Хранение удаленных документов в отдельной базе. Часть 1.

Инструменты администратора БД Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Резервное хранение данных. Пример работы с внешними источниками данных. Работа с файлами. Подписка на событие. Работа с XML файлами. Сериализатор XDTO.

12.12.2012    16674    egorovntn    10    

Автоматическое регулярное разворачивание оперативных бэкапов (совсем просто) в MS SQL 2008

Архивирование (backup) Платформа 1С v7.7 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv7 Россия Бесплатно (free)

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

10.08.2012    19164    sergiobargio1    6    

Регулярные оперативные копии рабочих баз 1С с помощью MS SQL 2008

Инструменты администратора БД Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

В течение дня необходимо производить отладку "допилов" на свежих копия рабочих баз. Также необходимы актуальные копии и для экспериментов, в том числе и пользователям. На этом замечательном ресурсе есть много полезных публикаций с различными вариантами, как это сделать. В одном из них предлагается использовать инструмент мгновенных снимков баз, которые возможно выполнить только в версии Express Edition. В этом посте очень простой вариант, не требующий дорогостоящей версии MS SQL

01.08.2012    19561    sergiobargio1    8    

Автоматизация создания резервных копий в MS SQL Express Server

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

В версии Microsoft SQL Server 2005/2008/2008R2 Express Edition серверах нет стандартных средств создания резервных копий баз данных по расписанию. Восполнить этот пробел поможет простое решение

18.06.2012    31521    LexSeIch    4    

Бэкап 1С:Предприятие 8.х

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Рекомендации по резервному копированию. Бесплатные программы для бэкапа Egida Backup, Effector saver 3, xStarter.

09.11.2011    28588    sinjevla    10    

Резервное копирование чеков во внешние файлы и их восстановление

Архивирование (backup) Платформа 1С v8.3 1С:Розница Россия Бесплатно (free)

Решение проблемы восстановления потерянных кассовых чеков после восстановления поврежденной базы розницы.

21.10.2011    11909    elizarovs    3    

Архивное копирование 1С8 автоматически и ежедневно

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Выложил ввиду "молодости и горячести" ХД и критики со стороны, дабы не спотыкаться в дальнейшем =)

19.04.2011    8099    AActor    15    

1С и Postgres: Бэкап

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

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

17.12.2010    23129    alexcid    5    

Выгрузка ИБ 1С8 на сервере 1С:Предприятие

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Выгрузка ИБ 1С8 на сервере 1С:Предприятие стандартными средствами ОС и 1С. Без всяких хитростей.

25.10.2010    20484    daulberg    7    

Как выгрузить не всю конфигурацию в файл, а только изменения?

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Хочу поделиться одним способом сохранения не всей конфигурации в файл, а только изменений. Способ довольно заморочный, но он позволяет сохранить любые изменения конфигурации в файл, размер которой уменьшится, скажем, к 300 KB, по сравнению с размером конфигурации в 60 MB. Этот способ эффективен, когда у клиента очень слабое соединение с интернетом или оплачивается помегабайтно.

19.02.2010    38120    modul    78    

Архивирование баз данных 1С и не только... (настройка бесплатной программы Cobian Backup 9)

Архивирование (backup) Платформа 1С v7.7 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv7 Россия Бесплатно (free)

В данной статье описывается создание системы архивирования на основе бесплатной программы Cobian Backup 9 (http://www.cobiansoft.com/cobianbackup.htm)

14.01.2010    64716    Mx00    146    

SQL2005. Выгружаем базу средствами 1С не выгоняя пользователей.

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Очередной велосипед на тему архивации баз данных 1С средствами 1С.

21.09.2009    23188    IamAlexy    26