Задний план
Я хотел бы предоставить подмножество моей базы данных, необходимое для воспроизведения select
запроса. Моя цель - сделать мой вычислительный рабочий процесс воспроизводимым (как в воспроизводимых исследованиях ).
Вопрос
Есть ли способ, которым я могу включить этот оператор выбора в сценарий, который сбрасывает запрашиваемые данные в новую базу данных, так что база данных может быть установлена на новом сервере MySQL, и оператор будет работать с новой базой данных. Новая база данных не должна содержать записей в дополнение к тем, которые были использованы в запросе.
Обновление: для пояснения, я не заинтересован в дампе CSV результатов запроса. Что мне нужно сделать, так это сбросить подмножество базы данных, чтобы его можно было установить на другом компьютере, а затем сам запрос можно было бы воспроизвести (и изменить по отношению к тому же набору данных).
пример
Например, мой анализ может запрашивать подмножество данных, для которого требуются записи из нескольких (в этом примере 3) таблиц:
select table1.id, table1.level, table2.name, table2.level
from table1 join table2 on table1.id = table2.table1_id
join table3 on table3.id = table2.table3_id
where table3.name in ('fee', 'fi', 'fo', 'fum');
Ответы:
mysqldump имеет опцию --where, чтобы выполнить предложение WHERE для данной таблицы.
Несмотря на то, что mysqldump невозможно выполнить запрос на соединение, вы можете экспортировать определенные строки из каждой таблицы, чтобы каждая строка, извлеченная из каждой таблицы, была позже включена в объединение.
Для вашего данного запроса вам нужно выполнить mysqldump три раза:
Во-первых, mysqldump все строки таблицы 3 с именем в ('fee', 'fi', 'fo', 'fum'):
Затем mysqldump все строки table2, которые имеют совпадающие значения table3_id из первого mysqldump:
Затем mysqldump все строки таблицы table1, которые имеют совпадающие значения table1_id из второго mysqldump:
Примечание: поскольку для второго и третьего mysqldumps требуется использование более одной таблицы, необходимо использовать --lock-all-tables .
Создайте свою новую базу данных:
Наконец, загрузите три mysqldumps в другую базу данных и попытайтесь соединиться там в новой базе данных.
В клиенте mysql запустите ваш запрос на присоединение
Попробуйте!
ВНИМАНИЕ: Если не проиндексированы правильно, второй и третий mysqldumps может занять вечно !!!
На всякий случай проиндексируйте следующие столбцы:
Я предполагаю, что id является первичным ключом таблицы 3.
источник
--where
пункт в документации; дам вам знать, как это работает после того, как я получу шанс попробовать.Я решил бы использовать 'outfile' как часть вашего SELECT вместо mysqldump для решения этой проблемы. Вы можете создать любой оператор SELECT, который вам нужен, а затем добавить в конце «INTO OUTFILE» /path/to/outfile.csv '... »с соответствующей конфигурацией для вывода в стиле CSV. Тогда вы можете просто использовать что-то вроде синтаксиса « LOAD DATA INFILE ...», чтобы загрузить данные в новое местоположение схемы.
Например, используя ваш SQL:
Имейте в виду, что вам понадобится достаточно свободного места на целевом разделе диска.
источник
Load Data Infile
для загрузки этот .csv в эту новую базу данных. Теперь запрос может быть выполнен.Утилита mysqldump имеет опцию --tables, которая позволяет вам указать, какие таблицы выгружать. Позволяет указать список таблиц.
Я не знаю более простого (автоматизированного) способа.
источник
delete from table1 where id not in (.....);
, если это самый простой способ, поскольку сценарий можно автоматизировать, нет необходимости в том, чтобы существовал конкретный инструмент.Что было полезно для меня, было что-то вроде:
От http://krosinski.blogspot.com/2012/12/using-table-join-with-mysqldump.html
источник
Вы пробовали функцию цитаты в MySQL?
сохранить выше, как query.sql
источник
В MySQL:
В командной строке:
На целевом сервере настройте ~ / .my.cnf
Импорт на целевой сервер
источник
я написал небольшой скрипт для аналогичной проблемы, вот он: https://github.com/digitalist/mysql_slice
т.е. у вас есть этот запрос :
Вы получили эту свалку :
источник