Восстановление файлов БД MySQL на Debian GNU/Linux 6.0
Привет всем.
У меня сложилась очень неприятная ситуация.
Сегодня мне нужно было откатить БД.
Делал я это таким образом:
mysql -u root -p < /opt/bcp/project_db-2012-04-05-0141.sql
Когда откат закончился (дамп залился), мне предстояло увидеть очень неприятный сюрприз — в базе стало 12 таблиц вместо более чем 40. Случилась потеря очень важных данных. Посмотрев файл с дампом, я увидел, что он неполный.
Причины того, почему бэкап оказался коцнутым, здесь обсуждать не имеет смысла, но я стал думать, как теперь восстановить сегодняшнее состояние ДБ, с которого я откатился, попутно называя себя идиотом, что не сделал бэкап вручную, перед тем как откатываться.
Очевидно, что вариант восстановления один: попытаться восстановить сами файлы, в которых MySQL хранил таблицы ДБ. Если бы таблицы имели тип MyIsam, то каждая таблица хранилась бы в отдельном файле, который можно было бы попытаться восстановить с помощью одной из утилит для восстановления удаленных файлов. Но все мои таблицы имели тип InnoDB, соответственно вся БД хранилась в одном файле.
Я только программист, и не являюсь даже продвинутым пользователем Линукса, поэтому не знаю точно, возможен ли мой вариант. А вариант такой:
В залитом дампе БД удалялась перед заливанием (стандартный DROP DATABASE IF EXISTS), значит удалялся и файл, в котором хранилась БД, а затем был создан заново при создании БД дампом.
Я хочу узнать — возможно ли, что одна из утилит для восстановления удалённых файлов сможет определить, что существовал такой-то файл, что он был удален, и можно ли его восстановить. Я конечно сомневаюсь в этом (хоть и надеюсь), потому как файл потом был заново создан.
Спасибо.
В залитом дампе БД удалялась перед заливанием (стандартный DROP DATABASE IF EXISTS), значит удалялся и файл, в котором хранилась БД, а затем был создан заново при создании БД дампом.
«БД» в MySQL это папка где хранятся файлы форм(структура таблиц)/индексов/данных. Если таблицы InnoDB то индексы/данные хранятся в другом месте — все в одном файле, и этот файл не удаляется при DROP DATABASE — просто место помечается как свободное. При DROP DATABASE удаляется папка с формами.
Если InnoDB настроено как innodb_file_per_table, тогда в папке лежат *.ibd файлы с данными а в ibdata1 хранится только метаданные.
Бэкап выполнялся в 01.40 ночи, и в это же самое время админ восстанавливал репликацию, видимо что-то пошло не так. Так что ничего такого, что мог бы взять себе на заметку еще кто-то, в этой ситуации нет.