gifts2017

Восстановление SQL базы данных после неудачного обновления

Опубликовал Роман Волошин (BlaSo) в раздел Администрирование - Тестирование и исправление

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

К сожалению, на момент починки не смог найти статью с похожей проблемой:
http://infostart.ru/public/390768/
http://infostart.ru/public/391766/ 

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


Итак, что имеем:

  1. MS SQL Server 2008 + 1C 8.2.19
  2. Свежий ночной бекап (если такового нет, прочтения вышеуказанных ссылок вам не избежать)
  3. В Предприятие зайти невозможно - дает ошибку на какой-то тип
  4. Конфигуратор открывается нормально, можно сохранить в файл конфигурацию и конфигурацию БД, любые другие операции с конфигурацией БД (обновление, сравнение, открытие) приводят к вылету Конфигуратора.
  5. Тестирование и исправление (Реструктуризация таблиц) также ведут к моментальному вылету Конфигуратора.


Поиск способа решения:

  1. Проверка БД средствами SQL показала что ошибок нет
  2. Выгрузка в dt и загрузка обратно без ошибок, но ничего не дает: успешно получаем такую же базу с битой конфигурацией.
  3. Загрузка конфигурации целиком из файла также безуспешно.
  4. Создание новой базы из сохраненной конфигурации и копирование из нее нужных данных - имена таблиц SQL будут не совпадать.

Решение:

  1. Делаем бекап поврежденной базы (бекапы лишними не бывают) (у меня она называется ForGamesWithRestore)!
  2. Сохраняем конфигурацию из поврежденной базы (если она отличается от конфигурации в бекапе).
  3. Разворачиваем бекап в параллельную базу (напр. назовем ее FromBackUp).
  4. В поврежденной базе чистим таблицу ConfigSave (это изменения конфигурации, которые не удалось применить к Конфигурации БД):
    DELETE FROM ForGamesWithRestore.dbo.ConfigSave
    GO
  5. Очищаем таблицы Config, DBSchema, Params в поврежденной базе, и копируем их базы FromBackUp:
     
    DELETE FROM ForGamesWithRestore.dbo.Config
    GO
    DELETE FROM ForGamesWithRestore.dbo.DBSchema
    GO
    DELETE FROM ForGamesWithRestore.dbo.Params
    GO
    INSERT INTO ForGamesWithRestore.dbo.Config SELECT * FROM From_BackUp.dbo.Config
    INSERT INTO ForGamesWithRestore.dbo.DBSchema SELECT * FROM From_BackUp.dbo.DBSchema
    INSERT INTO ForGamesWithRestore.dbo.Params SELECT * FROM From_BackUp.dbo.Params
  6. Если структуры конфигураций базы и бекапа не отличались, то на этом все.

  7. Если отличия в метаданных были, то важно понимать что на текущем этапе таблицы SQL не соответствуют структуре конфигурации, напр. в моем случае  в таблице с измененным справочником присутствовали две колонки, про которые Конфигуратор не знал.

  8. Пробуем обновить Конфигурацию из файла (сохраняли на шаге 2). При возникновении ошибок читаем ссылки указанные в начале

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Alexei Zhovner (jan27) 28.03.16 13:03
Если очищать таблицу целиком - truncate быстрее
Irwin; BlaSo; +2 Ответить
2. Руслан Ибрагимов (break) 30.03.16 09:14
можно один раз настроить триггер на сохранение Config и всегда иметь его свежую версию http://infostart.ru/public/327674/
3. Виталий (PVG_73) 30.03.16 10:24
Надо взять на заметку....
4. Игорь <...> (I_G_O_R) 30.03.16 21:24
А что мешает делать бэкап перед обновлением? Я всегда делаю, точнее я настроил регламентную операцию, которая делает бэкап в определенное время. Если мне нужно обновить в другое время, то приходится конечно запускать ручками.
5. Роман Волошин (BlaSo) 31.03.16 02:57
(2) break, отличный вариант! только в бекап нужно добавить и некоторые другие таблицы: DBSchema, ConfigSave, Params

(4) I_G_O_R, Мешают только полчаса на его создание и довольно частые изменения конфигурации
6. Игорь <...> (I_G_O_R) 31.03.16 20:24
(5) бэкап журнала транзакций или дифференциального копирования вполне достаточно, они делаются довольно быстро.
7. Евгений (Ekovichev) 02.04.16 08:59
(4) I_G_O_R, Мешает база на 200Гб:)
8. Вадим Титов (flyDrag) 11.04.16 19:44