Mysqldump только таблицы с определенными подстановочными знаками префикса / Mysqldump?

84

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

Что еще хуже, существует набор из более чем 70 таблиц Joomla, которые вообще не используются. Все они имеют префикс bak_.

Просто удалить эти bak_таблицы будет легко, но я хочу сначала «запечь» их (посмотрите, что я там сделал?). Я могу представить себе такую ​​команду:

mysqldump -u username -p mydatabase bak_*

Но это не работает. Как лучше всего это сделать? Благодаря!

РЕДАКТИРОВАТЬ: Да, я мог бы явно указать 70 таблиц для включения или ~ 430 таблиц для исключения, но я ищу лучший способ сделать это, если это возможно.

Thaddeusmt
источник
ответ: выберите эту таблицу по запросу и передайте этот запрос с помощью mysqldump, потому что mysqldump не поддерживает регулярное выражение, спасибо, удачи
Daric
1
Я думаю, что ответ на ваш вопрос здесь: stackoverflow.com/questions/2949330/…
raghu
Ответ @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 {}"
Sreimer
источник
4
Но в любом случае мне придется перечислить 70 таблиц, которые нужно игнорировать, или 430 таблиц, которые нужно включить. Этого я стараюсь избегать. Я должен был быть более ясным в своем вопросе, но спасибо за ответ. Это БУДЕТ работать, да;)
thaddeusmt
1
Другая идея состоит в том, чтобы поместить таблицы в файл с помощью чего-то вроде mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txtEdit the file и поместить все базы данных в одну строку. Тогда делай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 08
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 silent mode (less output) 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
Dtbarne
источник
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'`
user3453061
источник
0

mysql DATABASE -u ИМЯ ПОЛЬЗОВАТЕЛЯ -p -e 'показать таблицы типа "PREFIX%"' | grep -v Tables_in | xargs mysqldump БАЗА ДАННЫХ -u ИМЯ ПОЛЬЗОВАТЕЛЯ -p> DUMP.sql

bhrached
источник