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.
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 {}"
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]
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.
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
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.
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).
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
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'`
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
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