Когда не помогает DBCC DBREINDEX («RA4674»)…
Violation of primary key constraint ‘PK_RA4674’. Cannot insert duplicate key in object
Эта статья для администраторов и программистов 1С, если Вы не имеете достаточных знаний и полномочий, выполнять эти манипуляции на реальных данных нельзя (пока не научитесь).
Статья описывает порядок восстановления периферийных и центральных баз УРБД (в обмене участвуют все объекты, компонента "Расчет" не используется).
Если в периферийной базе некоторые объекты не мигрируют в ЦБ или наоборот в центральной базе есть объекты, которых не должно быть в перефирийке, использование этого способа восстановления не опробовано, при обмене необходимо учтитывать возможные несоответствия, которые можно выявить сравнением структуры объектов и модулей конфигураций центральной и периферийной базы и настройки правил обмена.
Как восстановить работоспособность информационной базы 1С:Предприятие 7.7 (SQL) на распределенке (УРБД)? Используем следующей рецепт (Windows Server 2003 + MS SQL 7), в случае файловой базы можно опустить шаг 5:
1) Пользователям периферийной базы отправляем команду Пуск — Выполнить -> net send * за 10 минут до начала операций "через 10 минут всем выйти из 1С7.7!" Начинаем в конфигураторе выполнять обмен. Для тех, кто не в курсе как это делается — пример порядка ручного обмена в УРБД.
2) В конфигураторе центральной базы выполняем автообмен (выгрузку из центральной базы в периферийные базы). Для этого в
центральной базе устанавливаем флажки (выгрузка "префикс периферийной базы ПБ").
3) Повторное сообщение net send "Всем выйти из 1С7.7!" Если закрывашка встроенна в базу, воспользуемся ей.
4) Выгоняем всех пользователей из периферийной базы. Закрываем на сервере открытые файлы периферийной базы: Пуск — Мой компьютер — Управление — Общие папки — Открытые файлы — контекстное меню — все задачи — закрыть открытый файл. Желательно выгонять пользователей не в одиночку, ато если они успеют "пролезать" в базу sql тогда мароки по их выгону гораздо больше.
5) Удаляем сеансы периферийной базы на сервере SQL — в Query Analyzer хранимой процедурой sp_who смотрим кто в базе, в дальних колонках написано название базы, и на всех жертвах, кто остался в нашей периферийной базе выполняем команду "kill НомерПроцесса".
6) Иногда (после длительной яростной "зомби-фермы" с пользователями с многократным глубоким проникновением в 1С и выкидыванием) базу данных для обмена открыть невозможно. Файлы закрыты, процесса на SQL сервере нет, а в мониторе пользователь висит. В этом случае удаляем из временные файлы из профиля пользователя и вре менные файлы 1С из общего профиля. Неисключено, что прийдется перезагружать сервер 1С.
//Если бы мы просто выполняли обмен, а не восстановление периферийной базы, то порядок действий был бы следующий. В
//периферийной базе выполняем обмен — загрузку из центральной в периферийную и выгрузка из периферийной в центральную
//(для этого запускаем в конфигураторе периферийной базы автообмен и устанавливаем флажки загрузка ЦБ и выгрузка ЦБ, где
//ЦБ — префикс центральной базы). Пишем пользователям периферийной базы сообщение "можно работать в 1С". Вместо этого делаем следующее:
7) В поломанной периферийной базе выполняем обмен — выгрузка из периферийной в центральную (для этого запускаем в конфигураторе периферийной базы автообмен и устанавливаем флажок выгрузка в ЦБ).
8) Для всех периферийных баз, где не нужно восстанавливать бекап, выполняем загрузку из центральной и выгрузку в центральную.
9) В центральной выполняем обмен — загрузку из периферийной базы в центральную (загрузка ПБ) для всех периферийных баз.
10) Средствами SQL Server делаем бекап центральной базы и загружаем его в ту периферийную, которая не работает. В центральной базе предварительно стоит обрезать журнал регистрации SQL (сделать shrink) потому что он тоже размножится по периферийным базам когда мы загрузим в них Бекап. Шринк делается как написано в отдельной статье //infostart.ru/public/168314/
11) Удаляем в новой периферийной базе таблицы 1SDWNLDS, 1SUPDTS, CJ7287, CJ7289. Таблицы CJ7287, CJ7289 относятся к компоненте "Расчет" и способ их преобразования при замене периферийной базы централкой мне не известен, но заменить их из бекапа не удается, в центральной базе они бывает портятся (нарушена структура индексов CJ7287, CJ7289 и центральная база без монопольного режима не стартует) .
12) В таблице _1SDBSET есть поле DBSTATUS, оно может принимать следующие значения: P — Центральная M — Текущая N — Периферийная (непроинициирована) C — Периферийная. Редактируем таблицу в новой периферийной базе 1SDBSET, удаляем в ней все строчки кроме строчки данной периферийной ПБ и центральной ЦБ базы. В оставшихся двух строчках меняем статусы, в колонке DBSTATUS переназываем, меняем местами значения полей M и P.
13) В новой периферийной базе в таблице _1ssystem меняем префикс центральной ЦБ на префикс периферийной ПБ.
14) В новой периферийной базе в конфигураторе прописываем соединение с SQL базой.
15) Актуализируем оперативные итоги в периферийной базе (Управление оперативными итогами — делаем расчет оперативных итогов) и последние документы из последовательностей проводим текущей датой.
16) В режиме 1С: Предприятия устанавливаем константу "Префикс информационной базы Для УРИБ "ПБ"
17) Все, пишем пользователям периферийной базы сообщение "можно работать в 1С". После того, как научились выполнять такое восстановление периферийной базы, особенно если периферийных баз несколько, можно больше не делать ежедневные бекапы.
Техническое описание механизмов УРБД изложено в статьях
http://kb.mista.ru/article.php?id=20
http://kb.mista.ru/article.php?id=45&
http://argat.h11.ru/URBDStructure.html
http://1c.proclub.ru/modules/newbb/viewtopic.php?topic_id=258258&forum=2&viewmode=flat&order=ASC&start=all
Альтернативный метод "обрезки" ("свертки") базы 1С.77 на конкретную дату через УРБД
//infostart.ru/public/17072/
Плагин для лечения выгрузки и загрузки больших баз в 1С 7.7
//infostart.ru/public/15364/
Быстрый метод создания периферийной базы УРБД (скрипт SQL)
//infostart.ru/public/92564/
Я давно использую метод описанный в статье для восстановления периферийных баз. Я имею ввиду подмену испорченной периферийной SQL базы базой централки с последующим редактированием таблиц. Также удаляю таблицы если мне нужно оставить скажем одни справочники. Но обычно придерживаюсь принципа если база «шевелится» — выгрузка и загрузка. И все становится на место. Иногда приходилось делать из периферийки централку удалением таблицы 1SSYSTEM. Так что если у Вас УРБД можно спать спокойно. Одновременно сразу все не накроется. Есть еще более жесткие методы к урбд. Это редактирование DAT файла в архиве при обменах. Тот кто делал это тот меня поймет.
Ай маладец, а что будешь делать с объектами, которые не мигрируют в ЦБ ?
Т.е те, для которых миграция — «место создания» ?
Всё, алес — всё твоё «восстановление» коту под хвост
+ нигде не упоминается в статье, что нужно прибить все объекты, которых не должно быть в этой перефирийке во всех табличках.
(4) Ёпрст, Поправляю, статья писалась для случая периферийных и центральных баз идентичной структуры.
(3) вообще-то и здесь оно естьhttp://infostart.ru/public/17072/
зачем на proclub ссылку?
(5) Структура как раз идентична, миграция разная)))
Вобщем автор, много слов, и как-то сумбурно все. Плюс зачем упоминание про CJ7287, CJ7289 ?? (компонента «Расчет»)
(6) Dolly_EV, Инструкция практическая (что делать), а по поводу расчета спасибо исправляю — у нас расчет не используется.
Чтобы не менять ручками таблицы, есть скрипт
http://infostart.ru/public/92564/
(8) maxis33, спасибо,
http://infostart.ru/public/92564/
Быстрый метод создания периферийной базы УРБД (скрипт SQL)
должно пригодиться!
+(6) сдается мне что CJ7287, CJ7289 не во всех базах есть и не во всех означают одно и то же 🙂
Очень порадовало — «не делать бекапы».
>17) Все, пишем пользователям периферийной базы сообщение «можно работать в 1С». После того, как научились выполнять такое восстановление периферийной базы, особенно если периферийных баз несколько, можно больше не делать ежедневные бекапы.
(10) ander_, я отдельно упомянул, что хоть таблицы CJ7287 и CJ7289 не используются, с ними периодически возникают проблемы в 1С с использованием распределенки, много о проблемах с этими таблицами можно найти в гугли, только рецепты их исправления сложнее, чем здесь мной описанный.
Ну не знаю 7.7 практически умерла.
Но взял пару интересных задумок попробую на 8.2
Спасибо за статью.
Какой-то изысканный бред.
При нормально настроенной системе бэкапов все это не нужно.
вместо описываемого геморроя проще сделать пару скрипотов или отработок.
Актуальность поднимать распределенку только лишь ради бекапа я в данной публикации не обосновывал, хотя действительно получилось похоже, согласен. То, что обмен между идентичными базами повышает надежность опровергнуть нельзя. Кроме того, базы 1С могут работать с разной производительностью, например если в них разное количество пользователей или если есть внешние источники данных (например ком-соединение).
классно , пригодится
Можно найти объект, на котором прерывается загрузка данных обмена из периферийной в центральную базу (которую очень не хочется восстанавливать из образа).
http://www.klerk.ru/print/1996
В общем есть еще одна интересная статья на эту тему
суть в том, что таблицы 1С (напрммер таблицу регистра или таблицу журнала) можно соединять с таблицей регистрации плана обмена (_1supdts) для поиска проблемного объекта на котором прерывается обмен. Сначала смотрим журнал регистрации:
затем в поле DOCNO ищем тот документ, на котором прекратилась загрузка (последний загружннный по журналу регистрации оказался сбойным):
распроводим сбойный документ или удаляем из таблицы (_1supdts) сбойную запись и весь пакет загружается.
текст запроса восстановить загрузку данных обмена в 1с 7.7
найти и исправить ошибку отказ от обмена следующий по таблице _1supdts документ, на котором прекратилась загрузка (следующий по таблице _1supdts документ за загружнным по журналу регистрации оказался сбойным)
sel ect _1SJOURN.*, _1supdts.* from _1SJOURN
inner join _1supdts
on _1SJOURN.IDDOC = _1supdts.OBJID
select * fr om _1supdts
Пришлось бороться с сообщением «Изменения конфигурации не загружались в ИБ из которой пришел файл переноса»
1) Делаем выгрузку из ПБ;
http://pro1c.org.ua/index.php?showtopic=2789
2) Изменяем конфу в ЦБ и пытаемся загрузить выгрузку -> получаем: “Изменения конфигурации не загружались в ИБ из которой пришел файл переноса”;
3) Делаем выгрузку из ЦБ. Обязательно загружаем этот архив на ПБ, иначе часть документов из ЦБ не выгрузится в ПБ;
4) Просмотрщиком открываем файл 1Cv77Dld.id (выгрузки ЦБ) и наблюдаем строчку похожую на:
{“Download ID”,B32CA7C5-4FC6-431D-ABF8-2A5E6F7658F9,“KL”,3BB40AD2-5DDA-4E39-83BB-ADB5C65A081F,“ЦБ”,8BAA3284-2B8C-450E-868F-781896A54BC4,“9|KL”}
(ага! запоминаем цифру 9);
5) Распаковываем файл 1Cv77Chs.dat, прибывший из ПБ;
6) Ищем строчку похожую на {“8|ЦБ”}} (за ключевым словом Acknowledgements, у меня 4-я сверху);
7) Меняем 8 на 9 и запаковываем обратно;
8) Теперь в ЦБ все замечательно загружается!
Подводя итоги:
1) Номер выгрузки из ЦБ в файле 1Cv77Dld.id всегда должен соответствовать номеру выгрузки из ПБ в файле 1Cv77Chs.dat.
2) ВНИМАНИЕ!!! Такой фокус не рекомендуется проделывать при структурных изменениях конфигурации!
Ссылка на источник:
20) можно открыть в SQL таблицу _1сupdates и удалить строку с ид базы приемника и всеми нулями.
Решение задачи восстановления документа ранее введенного и отсутствующего в базе.
Поиск отсутствующих документов выполняем следующей обработкой:
Показать
Оказывается, пропал документ всего один.
Странно, что при поиске в журнале регистрации по представлению найден другой документ «РнСкНС060885» введенный исторически ранее чем проблемный, привязанный в журнале регистрацию по uid к этому представлению «РнСцНС000357».
В базе данных 1C 7.7, в журнале _1sjourn найден по номеру документ который не отображается в общем журнале документов 1С 7.7
требуется восстановить документ «РнСцНС000357».
(21)
Проверено, действительно работает, данные загружаются.