powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Нужен совет по восстановлению данных
10 сообщений из 10, страница 1 из 1
Нужен совет по восстановлению данных
    #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
Нужен совет по восстановлению данных
    #37805612
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saefido7, в порядке бреда:

поднимаете отдельный mysql сервер(чтобы ещё чего-нибудь не потерять)
ставите там режим innodb_file_per_table=1
создаёте таблицу aggregates с такой же структурой, что и у утерянной
тормозите mysql
ищете файл aggregates.ibd
заменяете его вашим куском (только название оставьте aggregates.ibd)
стартуете mysql
скорее всего, ничего не получается, но вдруг?..
...
Рейтинг: 0 / 0
Нужен совет по восстановлению данных
    #37805660
saefido7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, tanglir, спасибо, это первое что приходит в голову. Однако этот эксперимент мы можем выполнить не раньше выходных. Кроме того, велика вероятность, что "не прокатит". И снова встанет вопрос - что можно сделать еще?
...
Рейтинг: 0 / 0
Нужен совет по восстановлению данных
    #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
Нужен совет по восстановлению данных
    #37805721
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saefido7что можно сделать еще?а что ещё? разве что самопальная читалка ibd-файлов (описание формата вроде должно быть в своб.доступе)...
ЗЫ. Неужели у вас не было бэкапов?
...
Рейтинг: 0 / 0
Нужен совет по восстановлению данных
    #37805745
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>не проще ли их пересчитать из первичных ?
Может быть, ТСу приходила некая уже агрегированная инфа. Или пересчёт займёт 2 недели ))

>как я понимаю, версия от percona может всосать даже подпорченный файл
а где там про подпорченные файлы?
...
Рейтинг: 0 / 0
Нужен совет по восстановлению данных
    #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
Нужен совет по восстановлению данных
    #37805838
saefido7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AGGREGATES - это действительно агрегированные данные, построенные из первичных. Пересчитать не получится, т.к. первичные данные хранятся максимум двое суток, после - удаляются. Хранить все тики нереально, слишком большой объем. Агрегаты же хранятся "вечно".

netwind, по поводу "восстановить небесплатно и дорого" - прошу сформулировать Ваши условия мне в почту. Такой вариант тоже прорабатывается. Где Вы находитесь территориально?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Нужен совет по восстановлению данных
    #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
Нужен совет по восстановлению данных
    #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
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Нужен совет по восстановлению данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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