|
|
|
Нужен совет по восстановлению данных
|
|||
|---|---|---|---|
|
#18+
Добрый день, коллеги. Случилась неприятность - при выполнении maintenance опреаций был потерян файл одной из таблиц. К сожалению, приходится восстанавливать картину мира по косвенным признакам, поэтому за 100% точность описания ситуации не ручаюсь. К тому же, полностью отсутствует опыт администрирования MySQL, поэтому прошу заранее простить неточности/умолчания. Итак, предварительно, события развивались так. На разделе, где располагалась БД MySQL (storage engine = InnoDB), быстро заканчивалось место. Было принято решение сжать одну из самых больших таблиц (AGGREGATES, исходный размер был 300+GB). Предварительно, таблица была перенесена на другой раздел диска, где (!) хранился lvm snapshot основного раздела. Затем, видимо, было выполнено что-то типа: Код: sql 1. MySQL начал формировать образ сжатой таблицы в temp: Код: plaintext Спустя какое-то время, файл ibdata1 распух до 140GB, временный файл AGGREGATES дорос до 75GB. В этот момент благополучно закончилось место на разделе lvm snapshot, что, цитирую сисадминов, "равносильно полной его потере". В итоге, исходный файл AGGREGATES.ibd был потерян. Все, что осталось - это временный файл, в котором, по предварительной оценке, бОльшая половина от исходного объема информации. Вопросы: 1. Можно ли восстановить из временного файла хотя бы ту информацию, которая успела туда записаться? 2. Насколько трудоемок этот процесс? Заранее благодарен за любые разумные советы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2012, 11:52:20 |
|
||
|
Нужен совет по восстановлению данных
|
|||
|---|---|---|---|
|
#18+
saefido7, в порядке бреда: поднимаете отдельный mysql сервер(чтобы ещё чего-нибудь не потерять) ставите там режим innodb_file_per_table=1 создаёте таблицу aggregates с такой же структурой, что и у утерянной тормозите mysql ищете файл aggregates.ibd заменяете его вашим куском (только название оставьте aggregates.ibd) стартуете mysql скорее всего, ничего не получается, но вдруг?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2012, 12:42:17 |
|
||
|
Нужен совет по восстановлению данных
|
|||
|---|---|---|---|
|
#18+
Да, tanglir, спасибо, это первое что приходит в голову. Однако этот эксперимент мы можем выполнить не раньше выходных. Кроме того, велика вероятность, что "не прокатит". И снова встанет вопрос - что можно сделать еще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2012, 13:00:19 |
|
||
|
Нужен совет по восстановлению данных
|
|||
|---|---|---|---|
|
#18+
Меня смущает название таблицы AGGREGATES. Если это агрегированные данные, то в чем смысл этих действий ? не проще ли их пересчитать из первичных ? как я понимаю, версия от percona может всосать даже подпорченный файл http://www.mysqlperformanceblog.com/2012/01/25/how-to-recover-a-single-innodb-table-from-a-full-backup/. Стандартные версии тоже обладают частичной возможностью подбирать файлы с помощью IMPORT/DISCARD TABLESPACE. Если есть структура таблицы, то можно восстанавливать данные по маске. Есть методики, гуглите. Могу даже вам восстановить небесплатно и дорого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2012, 13:12:16 |
|
||
|
Нужен совет по восстановлению данных
|
|||
|---|---|---|---|
|
#18+
saefido7что можно сделать еще?а что ещё? разве что самопальная читалка ibd-файлов (описание формата вроде должно быть в своб.доступе)... ЗЫ. Неужели у вас не было бэкапов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2012, 13:17:59 |
|
||
|
Нужен совет по восстановлению данных
|
|||
|---|---|---|---|
|
#18+
>не проще ли их пересчитать из первичных ? Может быть, ТСу приходила некая уже агрегированная инфа. Или пересчёт займёт 2 недели )) >как я понимаю, версия от percona может всосать даже подпорченный файл а где там про подпорченные файлы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2012, 13:23:33 |
|
||
|
Нужен совет по восстановлению данных
|
|||
|---|---|---|---|
|
#18+
я невнимательно прочитал автор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 ну да, не особо то и поможет. Так что только восстановление по маске. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2012, 13:32:48 |
|
||
|
Нужен совет по восстановлению данных
|
|||
|---|---|---|---|
|
#18+
AGGREGATES - это действительно агрегированные данные, построенные из первичных. Пересчитать не получится, т.к. первичные данные хранятся максимум двое суток, после - удаляются. Хранить все тики нереально, слишком большой объем. Агрегаты же хранятся "вечно". netwind, по поводу "восстановить небесплатно и дорого" - прошу сформулировать Ваши условия мне в почту. Такой вариант тоже прорабатывается. Где Вы находитесь территориально? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2012, 13:52:23 |
|
||
|
Нужен совет по восстановлению данных
|
|||
|---|---|---|---|
|
#18+
Автору уже вряд ли надо, а на будущее вот рецепт. 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. Насколько трудоемок этот процесс? Как видите, задача тривиальная ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2013, 04:09:39 |
|
||
|
Нужен совет по восстановлению данных
|
|||
|---|---|---|---|
|
#18+
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 . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2013, 04:12:14 |
|
||
|
|

start [/forum/topic.php?fid=47&tid=1836017]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 269ms |
| total: | 370ms |

| 0 / 0 |
