У меня огромная беспорядочная база данных, которую я очищаю. Он содержит более 500 таблиц, что является результатом объединения Magento Enterprise с Joomla в одной БД.
Что еще хуже, существует набор из более чем 70 таблиц Joomla, которые вообще не используются. Все они имеют префикс bak_
.
Просто удалить эти bak_
таблицы будет легко, но я хочу сначала «запечь» их (посмотрите, что я там сделал?). Я могу представить себе такую команду:
mysqldump -u username -p mydatabase bak_*
Но это не работает. Как лучше всего это сделать? Благодаря!
РЕДАКТИРОВАТЬ: Да, я мог бы явно указать 70 таблиц для включения или ~ 430 таблиц для исключения, но я ищу лучший способ сделать это, если это возможно.
Ответы:
Вы можете указать имена таблиц в командной строке одно за другим, но без подстановочных знаков.
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
Отредактируйте файл и поместите все базы данных в одну строку. Тогда сделай
Чтобы поместить таблицы в одну строку (не рекомендуется), вы можете сделать следующее
mysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql dbname -e "DROP TABLE {}"
источник
mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txt
Edit the file и поместить все базы данных в одну строку. Тогда делайmysqldump dbname `cat tables.txt`
gawk '{print $1"," }' tables.txt > baktables.sql
. Благодаря!mysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql test -e "DROP TABLE {}"
Вот простой способ:
mysql [dbname] -u [username] -p[password] -N -e 'show tables like "bak\_%"' | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]
источник
show tables like "<prefix>\_%"
потому, что_
это также подстановочный знак и его следует экранировать ... в противном случае вы можете столкнуться с проблемой с таблицами с одинаковым префиксом-префиксом, например, bak_ и bak2_, будут совпадатьbak_%
mysql
и вам не нужно будет запускатьgrep
для фильтрацииTables_in
строки.show tables like "bak\_%"
ничего не возвращает, вся база данных выгружается. Есть ли способ предотвратить это?Моя любимая:
mysqldump DBNAME $(mysql -D DBNAME -Bse "show tables like 'wp\_%'") > FILENAME.sql
Во всех ответах используется почти одинаковый подход, но это самый краткий синтаксис.
источник
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
Еще один инструмент, с помощью которого можно извлечь список имен таблиц,
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
источник
Хороших ответов уже много, но я пришел с такой вариацией:
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% из базы данных в один файл. Надеюсь, кому-то это пригодится.
источник
Начиная с 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 DATABASE -u ИМЯ ПОЛЬЗОВАТЕЛЯ -p -e 'показать таблицы типа "PREFIX%"' | grep -v Tables_in | xargs mysqldump БАЗА ДАННЫХ -u ИМЯ ПОЛЬЗОВАТЕЛЯ -p> DUMP.sql
источник