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



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



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



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



mysqldump -u username -p mydatabase bak_*


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



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

502   9  

9 ответов:

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

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

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

мое любимое:

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

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

еще один 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

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

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`

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

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

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

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

мое решение:

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

базы данных -MySQL и имя пользователя у-п -е 'показать таблицы, как "префикс%"' | команда grep -v с Tables_in | команды xargs базе команды mysqldump-U имя_пользователя -P > на свалку.sql

Comments

    Ничего не найдено.