Я пытаюсь преобразовать .frm (файлы данных SQL) в текстовые файлы. Причина этого в том, что я хочу увидеть, как движок SQL хранит данные «за кулисами». Например: при использовании хранилища SQL «ENUM» «INTEGER» называется «INDEX». Так что если кто-нибудь знает программное обеспечение или метод для преобразования .frm в .txt, спасибо всем и хорошего дня.
решение1
В этой статье представлен проверенный способ сделать это:
Основы того, как это сделать, не слишком сложны для понимания, а вот детали становятся запутанными. Первая часть этой проблемы — как извлечь определение таблицы из файлов .frm. Я расскажу о второй части проблемы в другом посте. Вы можете написать программу, которая читает и анализирует файл .frm и выводит определение таблицы, но это большая работа — особенно когда вы можете обмануть MySQL, чтобы он сделал это за вас. Вот как это сделать для файла foo.frm.
mysql> CREATE TABLE `test`.`foo` (id int) ENGINE=InnoDB;
Мы создали таблицу InnoDB с именем foo. MySQL записал файлы foo.frm и foo.ibd в $datadir/test. Он также сделал запись этой таблицы в словаре данных.
mysql> FLUSH TABLES;
Это заставляет MySQL закрыть все открытые таблицы и очистить кэш запросов. Идея состоит в том, чтобы заставить MySQL забыть о таблице «foo`», которую мы только что создали.
bash# cp foo.frm /var/lib/mysql/test;
Мы просто перезаписали определение таблицы для test.foo. Мы сделали это на горячем, пока MySQL еще работал.
mysql> SHOW CREATE TABLE `test`.`foo`;
Это выведет определение таблицы для файла foo.frm, который мы только что скопировали в тестовый каталог. MySQL, вероятно, будет немного сбит с толку, так как информация в файле .frm, скорее всего, не будет соответствовать информации в системном табличном пространстве. Вы, вероятно, увидите сообщение вроде этого в вашем журнале ошибок:
[ОШИБКА] Таблица ./test/foo не имеет первичного ключа в словаре данных InnoDB, но имеет его в MySQL! Если вы создали таблицу с версией MySQL < 3.23.54 и не определили первичный ключ, но определили уникальный ключ со всеми столбцами, отличными от NULL, то MySQL внутренне рассматривает этот ключ как первичный ключ. Вы можете исправить эту ошибку с помощью dump + DROP + CREATE + повторного импорта таблицы.
Но это ничего, просто приберитесь.
mysql> DROP TABLE `test`.`foo`;
Чтобы избежать раздражения от необходимости выполнять этот процесс для нескольких сотен таблиц, используйте скрипт, предоставленный по адресу:статья bluegecko. Тебя следует отсортировать. Чагберт.