Лише таблиці Mysqldump з певними префіксами / символами підстановки Mysqldump?


84

У мене є ця величезна, брудна база даних, яку я прибираю. У ньому розміщено понад 500 таблиць, що є результатом поєднання Magento Enterprise та Joomla в одній БД.

Що ще гірше, існує набір із 70+ таблиць Joomla, які взагалі не використовуються. Усі вони мають префікс bak_.

Просто видалити ці bak_таблиці буде легко, але я хочу спершу їх «запекти» (подивіться, що я там зробив?). У думках я можу уявити таку команду:

mysqldump -u username -p mydatabase bak_*

Але це не працює. Який найкращий спосіб зробити це? Дякую!

РЕДАГУВАТИ: Так, я міг би чітко перерахувати 70 таблиць, які слід включити, або ~ 430 таблиць для виключення, але я шукаю кращий спосіб зробити це, якщо це можливо.


відповідь - вибрати цю таблицю за запитом та передати цей запит за допомогою mysqldump, тому що mysqldump не підтримує регулярний вираз, дякую, удачі
Даріч,

1
Я думаю , що відповідь на ваше запитання тут: stackoverflow.com/questions/2949330 / ...
Рагу

Відповідь, надана @minaz, явно краща, ніж відповідь, яку зараз позначено як найкращу. Допомогло б позначити це як краще, якщо ви, звичайно, погоджуєтесь.
Дан Даскалеску,

Відповіді:


121

Ви можете вказати імена таблиць у командному рядку одне за іншим, але без символів підстановки. mysqldump databasename table1 table2 table3

Ви також можете використовувати, --ignore-tableякщо це було б коротше.

Інша ідея полягає в тому, щоб отримати таблиці у файл з чимось подібним

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

Відредагуйте файл і отримайте всі бази даних в один рядок. Тоді зробіть

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

Щоб скинути таблиці в один рядок (не рекомендується), ви можете зробити наступне

mysql -NB  information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql dbname -e "DROP TABLE {}"

4
Але в будь-якому випадку, мені доведеться перерахувати 70 таблиць, які потрібно проігнорувати, або 430 таблиць, які потрібно включити. Цього я намагаюся уникати. Я повинен був бути більш чітким у своєму питанні, але дякую за відповідь. Це б працювало, так;)
thaddeusmt

1
Інша ідея полягає в тому, щоб перетворити таблиці у файл, десь щось на зразок mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txtРедагувати файл, і отримати всі бази даних в один рядок. Потімmysqldump dbname `cat tables.txt`
sreimer

У підсумку я просто скинув таблиці bak_, але все одно використав це, щоб отримати список таблиць. Потім я зіткнув їх разом із комами, щоб створити великий оператор DROP TABLE gawk '{print $1"," }' tables.txt > baktables.sql. Дякую!
thaddeusmt

Будь-який спосіб зробити це в однокласснику? тобто: без використання тимчасового файлу як посередника?
Tom Auger

3
Це зробить цеmysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql test -e "DROP TABLE {}"
sreimer

59

Ось простий спосіб:

mysql [dbname] -u [username] -p[password] -N -e 'show tables like "bak\_%"' | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]

4
це повинно бути show tables like "<prefix>\_%"тому, що _це також узагальнюючий символ, і його слід уникнути ... інакше ви можете отримати проблему з таблицями, що мають однаковий префікс-префікс, як bak_ і bak2_, обидва збігаютьсяbak_%
reox

5
Ви можете передати -N mysqlі вам не потрібно буде запускати, grepщоб відфільтрувати Tables_inрядок.
Дан Даскалеску,

1
Працював у мене, але з mysql -NB.
wesamly

Якщо show tables like "bak\_%"нічого не повертає, вся база даних скидається. Будь-який спосіб запобігти цьому?
Seb33300

57

Мій улюблений:

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

Усі відповіді мають майже однаковий підхід, але це найбільш стислий синтаксис.


11
для тих, хто цікавиться, ці прапори - -B batch -e execute -s тихий режим (менше виходу) dev.mysql.com/doc/refman/5.6/en/mysql-command-options.html
jsh

Я обожнюю це. Я багато разів повертався сюди, щоб захопити цей фрагмент!
Джейсон Галутен,

Незначна проблема: Можливо, вам доведеться ввести параметри імені користувача та пароля як для команд mysqldump, так і для mysql. І якщо виклик mysql не вдається, mysqldump за замовчуванням скидає всю базу даних, що може бути величезним, особливо у випадках, коли ви схильні скидати лише підмножину даних.
gwideman

це не працює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
cloudbud

2

Ще один рядок для вилучення списку імен таблиць, mysql -sN …а потім використовуйте кожен елемент у циклі оболонки "for ... in ...", щоб скинути їх:

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

або (розширена версія)

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

Або використовуйте "group_concat" для об'єднання * імен таблиць, якщо вони досить короткі:

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"

* деякі обмеження, такі як значення "group_concat_max_len" (зазвичай дорівнює 1024, див. ваші 70 таблиць), можуть перешкоджати.


Той же принцип, але для скидання всіх таблиць, крім тих, що починаються на "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

Вже є багато хороших відповідей, але я прийшов сюди з такими варіаціями:

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`

Цією дією я зробив дамп таблиці за допомогою маски, як% mask%, з бази даних в один файл. Сподіваємось, комусь це буде корисно.


2

Починаючи з MySQL 5.7, mysqlpumpінструмент підтримує фільтрування імен таблиць за шаблонами.

Зверніть увагу, що це напівзапечений інструмент, тому вам потрібно переконатися, що він підтримує необхідні функціональні можливості, і що він виконує їх правильно (наприклад, станом на MySQL 5.7.12 експорт тригерів не працює).


3
Виявляється, "mysqlpump" не є друкарською помилкою. dev.mysql.com/doc/refman/5.7/en/mysqlpump.html . Так, параметр --include-tables abc% дозволяє вказати таблиці для скидання за допомогою символів підстановки. Але, схоже, немає способу змусити mysqlpump виключити перегляди. Так, справді досить напівпічний.
gwideman

1

Спираючись на деякі інші приємні відповіді тут, я створив сценарій оболонки, щоб зробити це ще простішим. Цей скрипт генерує 3 файли у вихідних даних - один зі структурою для всіх таблиць, один із даними для всіх невиключених таблиць, а другий із даними для всіх "виключених" таблиць (ви можете прокоментувати це, якщо ви насправді не т це потрібно). Тоді ви можете використовувати той, який вам потрібен.

#!/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

0

Моє рішення:

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

mysql DATABASE -u USERNAME -p -e 'показати таблиці типу "PREFIX%"' | grep -v Таблиці_в | xargs mysqldump БАЗА ДАНИХ -u КОРИСТУВАЧ -p> DUMP.sql

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.