Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Нужен совет по восстановлению данных / 10 сообщений из 10, страница 1 из 1
22.05.2012, 11:52:20
    #37805446
saefido7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет по восстановлению данных
Добрый день, коллеги.

Случилась неприятность - при выполнении maintenance опреаций был потерян файл одной из таблиц. К сожалению, приходится восстанавливать картину мира по косвенным признакам, поэтому за 100% точность описания ситуации не ручаюсь. К тому же, полностью отсутствует опыт администрирования MySQL, поэтому прошу заранее простить неточности/умолчания.

Итак, предварительно, события развивались так. На разделе, где располагалась БД MySQL (storage engine = InnoDB), быстро заканчивалось место. Было принято решение сжать одну из самых больших таблиц (AGGREGATES, исходный размер был 300+GB). Предварительно, таблица была перенесена на другой раздел диска, где (!) хранился lvm snapshot основного раздела. Затем, видимо, было выполнено что-то типа:

Код: sql
1.
Optimize table AGGREGATES;



MySQL начал формировать образ сжатой таблицы в temp:
Код: plaintext
 /var/lib/mysql/TEMP/#sql-931_1d.ibd

Спустя какое-то время, файл ibdata1 распух до 140GB, временный файл AGGREGATES дорос до 75GB. В этот момент благополучно закончилось место на разделе lvm snapshot, что, цитирую сисадминов, "равносильно полной его потере". В итоге, исходный файл AGGREGATES.ibd был потерян. Все, что осталось - это временный файл, в котором, по предварительной оценке, бОльшая половина от исходного объема информации.

Вопросы:

1. Можно ли восстановить из временного файла хотя бы ту информацию, которая успела туда записаться?
2. Насколько трудоемок этот процесс?

Заранее благодарен за любые разумные советы.
...
Рейтинг: 0 / 0
22.05.2012, 12:42:17
    #37805612
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет по восстановлению данных
saefido7, в порядке бреда:

поднимаете отдельный mysql сервер(чтобы ещё чего-нибудь не потерять)
ставите там режим innodb_file_per_table=1
создаёте таблицу aggregates с такой же структурой, что и у утерянной
тормозите mysql
ищете файл aggregates.ibd
заменяете его вашим куском (только название оставьте aggregates.ibd)
стартуете mysql
скорее всего, ничего не получается, но вдруг?..
...
Рейтинг: 0 / 0
22.05.2012, 13:00:19
    #37805660
saefido7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет по восстановлению данных
Да, tanglir, спасибо, это первое что приходит в голову. Однако этот эксперимент мы можем выполнить не раньше выходных. Кроме того, велика вероятность, что "не прокатит". И снова встанет вопрос - что можно сделать еще?
...
Рейтинг: 0 / 0
22.05.2012, 13:12:16
    #37805703
netwind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет по восстановлению данных
Меня смущает название таблицы AGGREGATES. Если это агрегированные данные, то в чем смысл этих действий ? не проще ли их пересчитать из первичных ?

как я понимаю, версия от percona может всосать даже подпорченный файл
http://www.mysqlperformanceblog.com/2012/01/25/how-to-recover-a-single-innodb-table-from-a-full-backup/. Стандартные версии тоже обладают частичной возможностью подбирать файлы с помощью IMPORT/DISCARD TABLESPACE.

Если есть структура таблицы, то можно восстанавливать данные по маске. Есть методики, гуглите. Могу даже вам восстановить небесплатно и дорого.
...
Рейтинг: 0 / 0
22.05.2012, 13:17:59
    #37805721
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет по восстановлению данных
saefido7что можно сделать еще?а что ещё? разве что самопальная читалка ibd-файлов (описание формата вроде должно быть в своб.доступе)...
ЗЫ. Неужели у вас не было бэкапов?
...
Рейтинг: 0 / 0
22.05.2012, 13:23:33
    #37805745
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет по восстановлению данных
>не проще ли их пересчитать из первичных ?
Может быть, ТСу приходила некая уже агрегированная инфа. Или пересчёт займёт 2 недели ))

>как я понимаю, версия от percona может всосать даже подпорченный файл
а где там про подпорченные файлы?
...
Рейтинг: 0 / 0
22.05.2012, 13:32:48
    #37805769
netwind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет по восстановлению данных
я невнимательно прочитал
авторPercona Server relaxes a lot of limitations and is able to import tables from different Server instance, when table was altered or truncated in the meanwhile. Though this only works if table was
“exported” with Xtrabackup
as this exports essential information from main tablespace which is not stored in .ibd file
ну да, не особо то и поможет.

Так что только восстановление по маске.
...
Рейтинг: 0 / 0
22.05.2012, 13:52:23
    #37805838
saefido7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет по восстановлению данных
AGGREGATES - это действительно агрегированные данные, построенные из первичных. Пересчитать не получится, т.к. первичные данные хранятся максимум двое суток, после - удаляются. Хранить все тики нереально, слишком большой объем. Агрегаты же хранятся "вечно".

netwind, по поводу "восстановить небесплатно и дорого" - прошу сформулировать Ваши условия мне в почту. Такой вариант тоже прорабатывается. Где Вы находитесь территориально?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
20.09.2013, 04:09:39
    #38402274
Aleksandr Kuzminsky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет по восстановлению данных
Автору уже вряд ли надо, а на будущее вот рецепт.

saefido71. Можно ли восстановить из временного файла хотя бы ту информацию, которая успела туда записаться?

Восстановить можно, и скорее всего почти все.

Для работы понадобится новый диск, на котором можно работать, не перезеписав данные на оригинальном диске.
Например, если раздел с данными был на /dev/sda - работаем на /dev/sdb. Можно примонтировать удаленный NFS, но будет медленно.

Итак, рабочая директория на другом диске - /dev/sdb

Качаем последнюю ревизию Recovery toolkit:

# bzr branch lp:percona-data-recovery-tool-for-innodb

Компилируем. (Оно потребует ncurses-dev и mysql-devel - ставим предварительно).

# make

Дальше page_parser ищет InnoDB страницы.
Можно просканировать временный файл
# ./page_parser -f "#sql-931_1d.ibd"
а можно и весь раздел.

# ./page_parser -f /dev/sda

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

Дальше процедура будет отличаться для первого и второго случая.

Случай №1.
page_parser сгенерирует директорию pages-XXXXX, где XXXX - время в секундах. Внутри еще две директории: FIL_PAGE_INDEX, FIL_PAGE_TYPE_BLOB . Внутри FIL_PAGE_INDEX/ будет несколько директорий вида 0-XYZ . Например, 0-100, 0-101, 0-102.
Нам нужна директория с минимальным числом - 0-100 - тут хранятся данные.

Утилита constraints_parser может достать эти данные из директории pages-XXXXX/FIL_PAGE_INDEX/0-100 .
Но ей надо знать структруру таблицы. Можно ручками описать структуру в файле include/table_defs.h , но лучше ее сгенерировать с помощью
./create_defs.pl . Эта утилита подключается к живому MySQL серверу, читает структуру нужной таблицы и генерирует table_defs.h в стандартный вывод.

# ./create_defs.pl --db test --table AGGREGATES --host a.b.c.d --user root --password qwerty > include/table_defs.h

Проверяем include/table_defs.h на предмет того, что в нем перечислены все поля и нет ошибок.
Дальше перекомпилируем еще раз

# make

Ну и наконец, достаем данные:

./constraints_parser -5f pages-XXXXX/FIL_PAGE_INDEX/0-100 > dump 2> load.sql

таблица в текстовом дампе будет в файле dump, а LOAD DATA INFILE команда , чтобы загрузить этот файл, будет в load.sql

Случай №2.

Задача усложняется тем, что мы не знаем в какой из директорий 0-xyz хранилась наша таблица. МОжно поискать grep-ом или угадать судя по размеру директории. Можно поискать в InnoDB словаре.
Когда директория найдена, задача сводится к случаю №1.

saefido72. Насколько трудоемок этот процесс?


Как видите, задача тривиальная ;-)
...
Рейтинг: 0 / 0
20.09.2013, 04:12:14
    #38402275
Aleksandr Kuzminsky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет по восстановлению данных
tanglirsaefido7, в порядке бреда:

поднимаете отдельный mysql сервер(чтобы ещё чего-нибудь не потерять)
ставите там режим innodb_file_per_table=1
создаёте таблицу aggregates с такой же структурой, что и у утерянной
тормозите mysql
ищете файл aggregates.ibd
заменяете его вашим куском (только название оставьте aggregates.ibd)
стартуете mysql
скорее всего, ничего не получается, но вдруг?..

Идея может выстрелить. Но space_id в ibd файле будет отличаться. Как лечить, я писал тут - http://www.mysqlperformanceblog.com/2011/05/13/connecting-orphaned-ibd-files/


Chris Calender предложил еще один метод http://www.chriscalender.com/?p=28 .
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Нужен совет по восстановлению данных / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]