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.
Odpowiedzi:
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-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 umieść wszystkie bazy danych w jednym wierszu. Następnie zrób
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 {}"
źródło
mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txt
Edytuj plik i przeniesienie wszystkich baz danych do jednego wiersza. Następnie zróbmysqldump dbname `cat tables.txt`
gawk '{print $1"," }' tables.txt > baktables.sql
. Dzięki!mysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql test -e "DROP TABLE {}"
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]
źródło
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_%
mysql
i nie będziesz musiał uruchamiać funkcji,grep
aby odfiltrowaćTables_in
wiersz.show tables like "bak\_%"
nic nie zwróci, cała baza danych zostanie zrzucona. Jakiś sposób, aby temu zapobiec?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.
źródło
mysql -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
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
źródło
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.
źródło
Począwszy od MySQL 5.7,
mysqlpump
narzę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).
źródło
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
źródło
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'`
źródło
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
źródło