Mysqldump tylko tabele z określonym prefiksem / mysqldump wildcards?

Mam ogromną, brudną bazę danych, którą sprzątam. Mieści ponad 500 tabel, co jest wynikiem połączenia Magento Enterprise z Joomla w jednym DB.

Aby pogorszyć sytuację, istnieje zestaw 70 + tabel Joomla, które w ogóle nie są używane. Wszystkie są poprzedzone znakiem bak_.

Samo usunięcie tych tabel bak_ będzie łatwe, ale najpierw chcę je "upiec" (zobacz, co tam zrobiłem?). W moim umyśle mogę sobie wyobrazić takie polecenie:

mysqldump -u username -p mydatabase bak_*

Ale to nie praca. Jaki byłby najlepszy sposób, aby to zrobić? Dzięki!

EDIT: tak, mógłbym wyraźnie wymienić 70 tabel do włączenia lub ~430 tabel do wykluczenia, ale szukam lepszego sposobu, aby to zrobić, jeśli to możliwe.

Author: thaddeusmt, 2011-03-11

9 answers

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

Możesz również użyć --ignore-table, jeś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 uzyskaj wszystkie bazy danych w jednej linii. Następnie wykonaj

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

Aby zrzucić 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 {}"
 95
Author: sreimer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-22 16:02:53

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]
 53
Author: minaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-23 20:44:46

Moje Ulubione:

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

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

 43
Author: Stephen M. Harris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-28 22:27:49

Inny, który wyodrębnia listę nazw tabel za pomocą mysql -sN …, a następnie używa 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 "(zwykle równa się 1024, cf Twoje 70 tabel) mogą zakłócać.


Ta sama zasada, ale dla wszystkich tabel z wyjątkiem 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
 2
Author: eleg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-24 14:00:44

Jest już wiele dobrych odpowiedzi, ale przyszedłem tutaj z taką odmianą:

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`

Przez tę akcję zrobiłem zrzut tabeli za pomocą maski Jak %mask% z bazy danych do pojedynczego pliku. Mam nadzieję, że komuś się przyda.

 2
Author: Andrey Verbitskiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-14 16:46:23

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

Zauważ, że jest to na wpół upieczone narzędzie, więc upewnij się, że obsługuje wymagane funkcjonalności i że robi to poprawnie (np. od MySQL 5.7.12 eksport wyzwalaczy jest uszkodzony).

 2
Author: Marcus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-02 09:28:59

Bazując na innych ładnych odpowiedziach, stworzyłem Shell script, aby to jeszcze ułatwić. Skrypt generuje 3 pliki na wyjściu - jeden ze strukturą dla wszystkich tabel, jeden z danymi dla wszystkich tabel nie wykluczonych i jeden z danymi dla wszystkich tabel "wykluczonych"(możesz to skomentować, jeśli naprawdę tego nie potrzebujesz). Następnie możesz użyć tego,którego 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
 1
Author: dtbarne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-27 22:47:37

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'`
 0
Author: user3453061,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-04 11:24:23

Mysql DATABASE - u USERNAME-p-e 'show tables like" PREFIX% "' / grep-v Tables_in / xargs mysqldump DATABASE-u USERNAME-p > DUMP.sql

 0
Author: bhrached,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-06 11:18:48