Mysqldump tylko tabele z określonymi prefiksami / symbolami wieloznacznymi Mysqldump?

84

Mam ogromną, niechlujną bazę danych, którą czyszczę. Mieści ponad 500 tabel, co jest wynikiem połączenia Magento Enterprise z Joomla w jednej bazie danych.

Co gorsza, istnieje zestaw ponad 70 tabel Joomla, które w ogóle nie są używane. Wszystkie mają przedrostek bak_.

Samo usunięcie tych bak_tabel będzie łatwe, ale najpierw chcę je „upiec” (widzisz, co tam zrobiłem?). W mojej głowie wyobrażam sobie takie polecenie:

mysqldump -u username -p mydatabase bak_*

Ale to nie działa. Jaki byłby najlepszy sposób na zrobienie tego? Dzięki!

EDYCJA: Tak, mógłbym wyraźnie wymienić 70 tabel do uwzględnienia lub ~ 430 tabel do wykluczenia, ale szukam lepszego sposobu, aby to zrobić, jeśli to możliwe.

thaddeusmt
źródło
odpowiedź brzmi: wybierz tę tabelę za pomocą zapytania i przekaż to zapytanie za pomocą mysqldump, ponieważ mysqldump nie obsługuje wyrażenia regularnego dzięki powodzenia
Daric
1
Myślę, że odpowiedź na twoje pytanie jest tutaj: stackoverflow.com/questions/2949330/…
raghu
Odpowiedź udzielona przez @minaz jest wyraźnie lepsza niż odpowiedź obecnie oznaczona jako najlepsza. Pomogłoby to oznaczyć jako lepsze, jeśli oczywiście się z tym zgadzasz.
Dan Dascalescu

Odpowiedzi:

121

Nazwy tabel można określać w wierszu poleceń jedna po drugiej, ale bez symboli wieloznacznych. mysqldump databasename table1 table2 table3

Możesz również użyć, --ignore-tablejeśli byłoby to krótsze.

Innym pomysłem jest umieszczenie tabel w pliku z czymś w rodzaju

mysql -N information_schema -e "select table_name from tables where table_schema = 'databasename' and table_name like 'bak_%'" > tables.txt 

Edytuj plik i umieść wszystkie bazy danych w jednym wierszu. Następnie zrób

mysqldump dbname `cat tables.txt` > dump_file.sql

Aby upuścić tabele w jednym wierszu (niezalecane), możesz wykonać następujące czynności

mysql -NB  information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql dbname -e "DROP TABLE {}"
sreimer
źródło
4
Ale tak czy inaczej, będę musiał wymienić 70 tabel do zignorowania lub 430 tabel do uwzględnienia. To jest to, czego staram się unikać. Powinienem był wyrazić się bardziej jasno w moim pytaniu, ale dziękuję za odpowiedź. To by zadziałało, tak;)
thaddeusmt
1
Innym pomysłem jest przeniesienie tabel do pliku za pomocą czegoś takiego jak mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txtEdytuj plik i przeniesienie wszystkich baz danych do jednego wiersza. Następnie zróbmysqldump dbname `cat tables.txt`
sreimer
Skończyło się na tym, że porzuciłem tabele bak_, ale nadal użyłem tego do uzyskania listy tabel. Następnie otworzyłem je razem z przecinkami, aby utworzyć dużą instrukcję DROP TABLE gawk '{print $1"," }' tables.txt > baktables.sql. Dzięki!
thaddeusmt
Czy jest jakiś sposób, aby to zrobić w jednej linijce? tj .: bez używania pliku tymczasowego jako pośrednika?
Tom Auger,
3
To wystarczymysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql test -e "DROP TABLE {}"
sreimer,
59

Oto prosty sposób:

mysql [dbname] -u [username] -p[password] -N -e 'show tables like "bak\_%"' | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]
minaz
źródło
4
powinno tak być, show tables like "<prefix>\_%"ponieważ _jest również symbolem wieloznacznym i należy go zmienić ... w przeciwnym razie możesz mieć problem z tabelami, które mają taki sam prefiks-prefiks, jak bak_ i bak2_, które będą pasować w dniubak_%
reox
5
Możesz przekazać -N do mysqli nie będziesz musiał uruchamiać funkcji, grepaby odfiltrować Tables_inwiersz.
Dan Dascalescu,
1
Pracował dla mnie, ale z mysql -NB.
wesamly
Jeśli show tables like "bak\_%"nic nie zwróci, cała baza danych zostanie zrzucona. Jakiś sposób, aby temu zapobiec?
Seb33300
57

Mój ulubiony:

mysqldump DBNAME $(mysql -D DBNAME -Bse "show tables like 'wp\_%'") > FILENAME.sql

Wszystkie odpowiedzi mają prawie takie samo podejście, ale jest to najbardziej zwięzła składnia.

Stephen M. Harris
źródło
11
dla ciekawskich te flagi to -B batch -e execute -s tryb cichy (mniej danych wyjściowych) dev.mysql.com/doc/refman/5.6/en/mysql-command-options.html
jsh
Uwielbiam to. Wracałem tu wiele razy, aby pobrać ten fragment!
Jason Galuten
Niewielka gotowość: może być konieczne wprowadzenie parametrów nazwy użytkownika i hasła, zarówno dla poleceń mysqldump, jak i mysql. A jeśli wywołanie mysql nie powiedzie się, mysqldump domyślnie zrzuca całą bazę danych, co może być ogromne, szczególnie w przypadkach, gdy masz skłonność do zrzucenia tylko podzbioru danych.
gwideman
to nie działamysql -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" -N -e 'show databases like "auth\_%"' | xargs mysqldump -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" > test
cloudbud
2

Kolejny oneliner do wyodrębniania listy nazw tabel, mysql -sN …a następnie używania każdego elementu w pętli powłoki „for… in…”, aby je upuścić:

for f in `mysql dbname -sN -e "SHOW TABLES LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

lub (wersja rozszerzona)

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND TABLE_NAME LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

Lub użyj „group_concat”, aby połączyć * nazwy tabel, jeśli są wystarczająco krótkie:

tables=`mysql dbname -srN -e "SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR ',') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname'  AND TABLE_NAME LIKE 'bak\_%' "`; mysql dbname -rsN -e "DROP TABLE $tables"

* niektóre ograniczenia, takie jak wartość „group_concat_max_len” (zazwyczaj równa się 1024, porównaj z 70 tabelami) mogą przeszkadzać.


Ta sama zasada, ale do zrzucania wszystkich tabel oprócz tych zaczynających się od „bak_”:

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND NOT(TABLE_NAME LIKE 'bak\_%') "` ; do mysqldump -u [u] -p dbname "$f" >> dump_dbname.sql; done
eleg
źródło
2

Jest już wiele dobrych odpowiedzi, ale przyjechałem tutaj z taką wariacją:

mysql MY_DATABASE -N -u MY_MYSQLUSER -p -e 'show tables like "%MY_LIKE_CODE%";' |
xargs mysqldump MY_DATABASE -u MY_MYSQLUSER -p |
gzip > ~/backup/`date +%Y%m%d:::%H:%M:%S-MY_DAMP.sql.gz`

W ten sposób wykonałem zrzut tabeli przy użyciu maski, takiej jak% mask%, z bazy danych do pojedynczego pliku. Miejmy nadzieję, że ktoś uzna to za przydatne.

Andrinux
źródło
2

Począwszy od MySQL 5.7, mysqlpumpnarzędzie obsługuje filtrowanie nazw tabel za pomocą wzorców.

Zauważ, że jest to niedopracowane narzędzie, więc musisz upewnić się, że obsługuje wymagane funkcje i że wykonuje je poprawnie (np. Od MySQL 5.7.12 eksport wyzwalaczy jest uszkodzony).

Marcus
źródło
3
Okazuje się, że „mysqlpump” nie jest literówką. dev.mysql.com/doc/refman/5.7/en/mysqlpump.html . Tak, opcja --include-table abc% umożliwia określenie tabel do zrzucenia przy użyciu symbolu wieloznacznego. Wydaje się jednak, że nie ma sposobu, aby mysqlpump wykluczał widoki. Tak, rzeczywiście całkiem na wpół upieczony.
gwideman
1

Opierając się na innych fajnych odpowiedziach, stworzyłem skrypt powłoki, aby to jeszcze ułatwić. Ten skrypt generuje 3 pliki na wyjściu - jeden ze strukturą dla wszystkich tabel, jeden z danymi dla wszystkich niewykluczonych tabel i jeden z danymi dla wszystkich „wykluczonych” tabel (możesz to zakomentować jeśli naprawdę tego nie zrobisz potrzebuję tego). Następnie możesz użyć tych, których potrzebujesz.

#!/bin/bash

echo -n "DB Password: "
read -s PASSWORD

HOST=yourhostname.com
USER=youruser
DATABASE=yourdatabase

MAIN_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES WHERE Tables_in_dashboard NOT LIKE 'bigtable_%';")
STATS_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES LIKE 'bigtable_%';")

echo "Dumping structure..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-data | gzip > structure.sql.gz

echo "Dumping main data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $MAIN_TABLES | gzip > data.sql.gz

echo "Dumping big table data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $STATS_TABLES | gzip > big_table_data.sql.gz
dtbarne
źródło
0

Moje rozwiązanie:

mysqldump -u username -p mydatabase `mysql -B --disable-column-names -u username -p mydatabase -e "SHOW TABLES LIKE 'bak\_%'" | sed ':a;N;$!ba;s/\n/ /g'`
user3453061
źródło
0

mysql BAZA DANYCH -u NAZWA UŻYTKOWNIKA -p -e 'pokaż tabele, takie jak "PREFIX%"' | grep -v Tables_in | xargs mysqldump BAZA DANYCH -u NAZWA UŻYTKOWNIKA -p> DUMP.sql

bhrached
źródło