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

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

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

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

mysqldump -u username -p mydatabase bak_*

Но это не работает. Какой был бы лучший способ сделать это? Спасибо!

EDIT: Да, я мог бы явно указать 70 таблиц для включения или ~ 430 таблиц для исключения, но я ищу лучший способ сделать это, если это возможно.

Ответ 1

Вы можете указывать имена таблиц в командной строке один за другим, но без подстановочных знаков. 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 

Отредактируйте файл и заведите все базы данных в одну строку. Тогда do

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 {}"

Ответ 2

Вот простой способ:

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

Ответ 3

Мое любимое:

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

Все ответы имеют почти одинаковый подход, но это самый лаконичный синтаксис.

Ответ 4

Другой oneliner для извлечения списка имен таблиц с помощью 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, cf ваши 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

Ответ 5

Уже есть много хороших ответов, но я пришел сюда с таким изменением:

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`

В результате этого действия я сделал таблицу dump маской , например% mask%, из базы данных в один файл. Надеюсь, кто-то найдет это полезным.

Ответ 6

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

Обратите внимание, что это полуобработанный инструмент, поэтому вам нужно убедиться, что он поддерживает требуемые функции и правильно их выполняет (например, в MySQL 5.7.12 экспорт триггеров не работает).

Ответ 7

Основываясь на некоторых других приятных ответах здесь, я создал оболочку script, чтобы сделать это еще проще. Этот script генерирует 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

Ответ 8

Мое решение:

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'`

Ответ 9

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