Апр 182013
 

В силу некоторых неприятностей с дисками оказалась испорчена база и бэкап (да, я знаю, что это epic fail, но база не очень важная и когда её потерю заметили, бэкап уже устарел и его удалил скрипт).
Чудом сохранился только дамп, сделанный утилитой exp. Всё было бы неплохо, но этот дамп тоже оказался побитым. На импорте одной из таблиц сессия импорта зависала навечно. К счастью, эта таблица содержала маловажные данные (лог неких операций), от которых можно было безболезненно отказаться.
Итак, попробуем починить файл дампа.

Как мы знаем, классический exp сохраняет данные в полутекстовом формате. Поэтому ничто нам не помешает найти определение испорченной таблицы в файле и вырезать его и все данные этой таблицы из дампа, используя стандартные утилиты linux. Определение таблицы предваряется строкой:

TABLE "ACT_HIST"

Здесь ACT_HIST - имя нашей испорченной таблицы.

Итак, найдём номер строки в файле, где начинается наша таблица ACT_HIST:

$ grep --binary-files=text --line-number --max-count=1 \
 --only-matching 'TABLE "ACT_HIST"' bad_dump.dmp
3070621:TABLE "ACT_HIST"

Теперь с помошью утилиты head создадим новый файл, залив в него все строки до сакральной метки TABLE "ACT_HIST". Аргумент -n 3070620 - это число строк, возвращённое предыдущей командой минус 1:

$ head -n 3070620 bad_dump.dmp > new_dump.dmp

Теперь найдём метку следующей таблицы (она называется ACT_HIST_ARC):

$ grep --binary-files=text --line-number --max-count=1 \
 --only-matching 'TABLE "ACT_HIST_ARC"' bad_dump.dmp
23572534:TABLE "ACT_HIST_ARC"

Найдём общее число строк в файле:

$ wc -l bad_dump.dmp 
30849984 bad_dump.dmp

А теперь зальём в новый файл последние (wc - head + 2) строк, где wc - это вывод предыдущей команды, а head - аргумент утилиты head двумя шагами выше:

$ tail -7277452 bad_dump.dmp >> new_dump.dmp

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

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)