it-swarm.com.ru

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

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

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

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

mysqldump -u username -p mydatabase bak_*

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

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

70
thaddeusmt

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

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

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

Мое любимое:

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

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

46
Stephen M. Harris

Другой 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, если сравнивать ваши 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
eleg

Хороших ответов уже много, но я пришел сюда с такой вариацией:

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
Andrey Verbitskiy

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

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

2
Marcus

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

Мое решение:

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
user3453061

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

0
bhrached