Mysqldump только таблицы с определенным префиксом / mysqldump подстановочные знаки?
у меня есть эта огромная, грязная база данных, которую я очищаю. Он содержит более 500 таблиц, что является результатом объединения Magento Enterprise с Joomla в одной БД.
чтобы сделать вещи хуже, есть набор из 70+ таблиц Joomla, которые не используются вообще. Все они имеют префикс bak_.
просто удалив эти bak_ таблицы будет легко, но я хочу, чтобы " бак " их в первую очередь (смотрите, что я там сделал?). В моем сознании я могу представить себе такую команду это:
mysqldump -u username -p mydatabase bak_*
но это не сработает. Каков был бы лучший способ сделать это? Спасибо!
EDIT: Да, я мог бы явно перечислить 70 таблиц для включения или ~430 таблиц для исключения, но я ищу лучший способ сделать это, если это возможно.
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