tło
Chciałbym podać podzbiór mojej bazy danych wymagany do odtworzenia select
zapytania. Moim celem jest, aby mój przepływ pracy obliczeniowej był odtwarzalny (jak w odtwarzalnych badaniach ).
Pytanie
Czy istnieje sposób na włączenie tej instrukcji select do skryptu, który zrzuca dane, których dotyczy zapytanie, do nowej bazy danych, tak aby baza danych mogła zostać zainstalowana na nowym serwerze mysql, a instrukcja działałaby z nową bazą danych. Nowa baza danych nie powinna zawierać zapisów oprócz tych, które zostały użyte w zapytaniu.
Aktualizacja: Dla wyjaśnienia nie jestem zainteresowany zrzutem csv wyników zapytań. Muszę tylko zrzucić podzbiór bazy danych, aby można go było zainstalować na innym komputerze, a następnie samo zapytanie można odtworzyć (i zmodyfikować w odniesieniu do tego samego zestawu danych).
Przykład
Na przykład moja analiza może zapytać o podzbiór danych, który wymaga rekordów z wielu (w tym przykładzie 3) tabel:
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');
Odpowiedzi:
mysqldump ma opcję --where , aby wykonać klauzulę WHERE dla danej tabeli.
Chociaż nie jest możliwe wykonanie mysqldump kwerendy łączenia, można wyeksportować określone wiersze z każdej tabeli, aby każdy wiersz pobrany z każdej tabeli był później zaangażowany w łączenie.
W przypadku podanego zapytania konieczne byłoby trzykrotne mysqldump:
Najpierw mysqldump wszystkie wiersze table3 o nazwie w („opłata”, „fi”, „fo”, „fum”):
Następnie mysqldump wszystkie wiersze table2, które mają pasujące wartości table3_id z pierwszego mysqldump:
Następnie mysqldump wszystkie wiersze table1, które mają pasujące wartości table1_id z drugiego mysqldump:
Uwaga: Ponieważ drugi i trzeci mysqldump wymagają użycia więcej niż jednej tabeli, należy użyć opcji --lock-all-tables .
Utwórz nową bazę danych:
Na koniec załaduj trzy mysqldumps do innej bazy danych i spróbuj dołączyć do niej w nowej bazie danych.
W kliencie mysql uruchom zapytanie dotyczące łączenia
Spróbuj !!!
OSTRZEŻENIE: Jeśli nie zostanie poprawnie zindeksowany, drugi i trzeci mysqldump mogą trwać wiecznie !!!
Na wszelki wypadek zindeksuj następujące kolumny:
Zakładam, że id jest kluczem podstawowym table3.
źródło
--where
klauzulę w dokumentacji; poinformuje cię, jak to działa, gdy mam szansę go wypróbować.Uznałbym za pomocą „outfile” jako część SELECT zamiast mysqldump aby rozwiązać ten problem. Możesz utworzyć dowolną instrukcję SELECT, a następnie dołączyć „INTO OUTFILE” /path/to/outfile.csv „...” na końcu z odpowiednią konfiguracją dla wyjścia w stylu CSV. Następnie możesz po prostu użyć czegoś takiego jak składnia „ LOAD DATA INFILE ...”, aby załadować dane do nowej lokalizacji schematu.
Na przykład za pomocą SQL:
Pamiętaj, że potrzebujesz wystarczającej ilości miejsca na docelowej partycji dysku.
źródło
Load Data Infile
.csv do nowej bazy danych. Teraz można wykonać zapytanie.Narzędzie mysqldump ma opcję --tables, która pozwala określić, które tabele należy zrzucić. Pozwala określić listę tabel.
Nie znam żadnego łatwiejszego (zautomatyzowanego) sposobu.
źródło
delete from table1 where id not in (.....);
, jeśli jest to najłatwiejszy sposób, dopóki skrypt może być zautomatyzowany, nie jest konieczne, aby istniało określone narzędzie.Przydało mi się coś takiego:
From http://krosinski.blogspot.com/2012/12/using-table-join-with-mysqldump.html
źródło
Czy wypróbowałeś już funkcję cytowania w mysql?
zapisz powyższe, jako query.sql
źródło
W MySQL:
W wierszu poleceń:
Na serwerze docelowym skonfiguruj ~ / .my.cnf
Importuj na serwer docelowy
źródło
napisałem mały skrypt dla podobnego problemu, oto on: https://github.com/digitalist/mysql_slice
tzn. masz to zapytanie :
masz ten zrzut :
źródło