2010-01-08 4 views
1

Я пишу тестовую структуру, в которой мне нужно захватить состояние базы данных MySQL (структура таблицы, содержимое и т. Д.).MySQL: Дамп базы данных из SQL-запроса

Мне нужно это, чтобы реализовать проверку того, что состояние не было изменено после определенных операций. (Autoincrement значения может быть разрешено изменить, но я думаю, что я смогу справиться с этим.)

Свалка предпочтительно должен быть в удобочитаемом формате (предпочтительно кода SQL, как туздЫшпр делает).

Я хочу ограничить свою тестовую структуру только подключением к MySQL. Для захвата состояния должно быть не вызовите mysqldump или получите доступ к файловой системе (например, файлы copy * .frm или сделайте SELECT INTO в файле, трубы в порядке).

Поскольку это будет тестовый код, меня не касается производительность. Однако мне нужно надежное поведение.

Каков наилучший способ реализации необходимых мне функций?

Предполагаю, что я должен основывать свой код на некоторых существующих инструментах резервного копирования с открытым исходным кодом ... На что лучше всего смотреть?

Update: Я не уточняя язык я пишу это в (нет, это не PHP), так как я не думаю, что я мог бы повторно использовать код, как это — мой случай, а специальные (для практические цели, позволяет предполагать MySQL C API). Код будет работать в Linux.

+0

Какой язык? фреймворк? Платформа? – mopoke

+0

* Он не должен обращаться к файловой системе *. Это слишком неоднозначно и широко, и вы действительно, действительно не можете обойти это. Я думаю, вы, вероятно, имеете в виду * Он не должен использовать команды командной строки *, это правда? – BalusC

+0

Я обновил свой вопрос по языку и файловой системе. –

ответ

2

Учитывая ваши требования, я думаю, что вы остались с (псевдо-код + SQL)

tables = mysql_fetch "SHOW TABLES" 
foreach table in tables 
    create = mysql_fetch "SHOW CREATE TABLE table" 
    print create 
    rows = mysql_fetch "SELECT * FROM table" 
    foreach row in rows 
     // or could use VALUES (v1, v2, ...), (v1, v2, ...), .... syntax (maybe preferable for smaller tables) 
     insert = "INSERT (fiedl1, field2, field2, etc) VALUES (value1, value2, value3, etc)" 
     print insert 

В основном, принеси список всех таблиц, а затем ходить каждую таблицу и генерировать INSERT заявления для каждой строки вручную (у большинства apis есть простой способ получить список имен столбцов, иначе вы можете вернуться к вызову DESC TABLE).

SHOW CREATE TABLE сделано для вас, но я уверен, что нет ничего аналогичного SHOW INSERT ROWS.

И, конечно, вместо печати дампа вы можете делать с ним все, что хотите.

+0

Сколько информации я пропустил бы при таком подходе? –

+1

Вы не пропустили бы никаких данных из своих таблиц, потому что 'SHOW CREATE TABLE' включает в себя все столбцы, индексы, ограничения, последний автоматический прирост и т. Д. Однако я не беспокоился о снижении любых метаданных, таких как представления, пользователи, гранты и т. д. Если эта информация для вас важна, есть «ПОКАЗЫВЫЕ ПРОСМОТРЫ», «ПОКАЗАТЬ ГРАНТЫ» или вытащить таблицы из базы данных «mysql». –

1

Если вы не хотите использовать инструменты командной строки, другими словами, вы хотите сделать это полностью в пределах определенного php или любого другого языка, который вы используете, то почему бы вам не перебирать таблицы, используя сам SQL. например, чтобы проверить структуру таблицы, одним простым методом было бы захватить снимок структуры таблицы с помощью SHOW CREATE TABLE table_name, сохранить результат, а затем позже сделать вызов еще раз и сравнить результаты.

Просмотрели ли вы исходный код для mysqldump? Я уверен, что большинство из того, что вы хотите, будет содержаться в этом.

DC

+0

Ну, mysqldump - это 5K + строк кода GPL-ed C с большим количеством особых случаев ... http://bazaar.launchpad.net/~mysql/mysql-server/mysql-5.1/annotate/head:/ client/mysqldump.c Если я собираюсь адаптировать его для своих нужд ... Я бы скорее позвонил ему из командной строки. (Я бы все еще хотел этого избежать). –

+0

Если вы открыты для утилит командной строки, посмотрите отличный маакит http://www.maatkit.org/tools.html – DeveloperChris

+0

Спасибо, но если я не сработаю с командой line, я буду использовать mysqldump для уменьшения внешних зависимостей. Я все равно хотел бы найти решение только для SQL-запросов. –

0

Если Вы не строите экспорт самостоятельно, я не думаю, что есть простое решение для экспорта и проверки данных. Если вы сделаете таблицу за стол, могут быть полезны LOAD DATA INFILE и SELECT ... INTO OUTFILE.

Мне легче перестроить базу данных для каждого теста. По крайней мере, я знаю точное состояние данных. Конечно, для выполнения этих тестов требуется больше времени, но это хороший стимул для абстрагирования операций и записи меньших тестов, зависящих от базы данных.

Другая альтернатива, которую я использую в некоторых проектах, где проект не позволяет такое хорошее разделение, используя InnoDB или какой-либо другой механизм транзакционной базы данных, работает хорошо. Пока вы отслеживаете транзакции или отключите их во время теста, вы можете просто начать транзакцию в setUp() и откат в tearDown().

+0

Спасибо, я не хочу использовать INFILE и OUTFILE, так как я не хочу (явно) касаться файловой системы из моего кода рамки. –

+0

Что касается перестройки базы данных - да, я делаю то же самое. Проблема в том, что я должен протестировать пользовательскую логику «отката» (не связанную с транзакциями SQL), где я «совершаю» несколько изменений в БД, а затем «откатываю» их по одному, все в одном контрольная работа. –

Смежные вопросы