mysqldump игнорирует таблицу с подстановочными знаками


8

Мне нужно сделать дамп базы данных, содержащей 50 нечетных таблиц, из которых я хочу исключить около 15 нечетных, которые имеют префикс exam_

Я пытался mysqldump --ignore-table=dbname.exam_* и даже пытался --ignore-table=dbname.exam_% Это не сработало, как ожидалось. Я должен был использовать --ignore-tableнесколько раз.

Редактировать: я видел несколько сценариев оболочки, которые перечисляют tables not like tablename_%и передают его mysqldump.

Тем не менее, я хотел бы знать, есть ли опция в mysqldump или mysql, как таковая, чтобы сделать то же самое без необходимости сценария.

Редактировать-добавить: в конечном итоге использовать сценарий для дампа БД за исключением таблиц, используя ignore-table=несколько раз.


Вы можете опубликовать сценарий, который вы использовали? возможно, разместите его на gist.github.com
rubo77

@ rubo77: у меня больше нет этого сценария. Это был основной сценарий. Используя команду mysql, я получил список таблиц, которые я хотел исключить. Жестко запрограммировал список в сценарии BASH, чтобы при необходимости создавать дамп. К счастью для меня, список был постоянным. Кроме того, решение, опубликованное здесь, может быть полезным в отношении сценариев.
Anup

А еще лучше: TABLES=`mysql --skip-column-names [DB-NAME] -e 'show tables' | grep -v 'exam_'` mysqldump [DB-NAME] $TABLES > mysqldump.sql
Anup

Ответы:


13

Нет, в mysqldumpкоманде нет такой опции , как говорят в документации :

--ignore стол = db_name.tbl_name

Не создавайте дамп данной таблицы, которая должна быть указана с использованием
базы данных и имен таблиц. Чтобы игнорировать несколько таблиц, используйте эту опцию
несколько раз. Эта опция также может использоваться для игнорирования представлений.


Кроме того, возможно, стоит создать пользователя дампа mysql, который не имеет доступа к этим таблицам, а затем попытаться mysqldump --all-databasesпросто проверить, нет ли ошибок или просто перейти к следующему дБ.
NickW

Не пробовал, но звучит хорошо. Что касается решения, я написал сценарий оболочки, чтобы избежать таблиц.
Anup

@NickW Это может сработать. Но если вам нужна большая гибкость, вам нужно выполнить отдельный запрос, чтобы получить имена таблиц. Смотрите мой ответ ниже.
Баттл Буткус

Быстрая и грязная версия: дублировать базу данных. используйте веб-интерфейс phpMyAdmin, чтобы легко удалять таблицы, которые вы не хотите видеть. затем дамп и подстановочный знак не требуется. если вы хотите выполнить CLI и не возражаете против третьего шага sitepoint.com/community/t/drop-tables-with-wildcard/18537/4
TheSatinKnight

3

Вы можете получить имена таблиц из mysql, а затем использовать их для построения параметров дампа mysql.

В приведенном ниже примере просто замените «someprefix» на ваш префикс (например, «exam_»).

SHOW TABLESЗапрос может быть изменен , чтобы найти другие наборы таблиц. Или вы можете использовать запрос к INFORMATION_SCHEMAтаблице, чтобы использовать еще больше критериев.

#/bin/bash

#this could be improved but it works
read -p "Mysql username and password" user pass

#specify your database, e.g. "mydb"
DB="mydb"

SQL_STRING='SHOW TABLES LIKE "someprefix%";'
DBS=$(echo $SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#next two lines untested, but intended to add a second excluded table prefix
#ANOTHER_SQL_STRING='SHOW TABLES LIKE "otherprefix%";'
#DBS="$DBS""\n"$(echo $ANOTHER_SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#-B is for batch - tab-separated columns, newlines between rows
#-s is for silent - produce less output
#both result in escaping special characters

#but the following might not work if you have special characters in your table names
IFS=$'\n' read -r -a TABLES <<< $DBS

IGNORE="--ignore_table="$DB"."
IGNORE_TABLES=""

for table in $TABLES; do
        IGNORE_TABLES=$IGNORE_TABLES" --ignore_table="$DB"."$table
done

#Now you have a string in $IGNORE_TABLES like this: "--ignore_table=someprefix1 --ignore_table=someprefix2 ..."

mysqldump $DB --routines -u $user -p$pass $IGNORE_TABLES > specialdump.sql

Это было построено с помощью этого ответа о получении «всех таблиц с исключением в bash»: https://stackoverflow.com/a/9232076/631764

и этот ответ о пропуске таблиц с использованием некоторого bash: https://stackoverflow.com/a/425172/631764


Основываясь на выбранном ответе, я написал скрипт, похожий на ваш ответ. Спасибо, что подняли это. Редактировать: только что вспомнил, что я использовал две команды с шаблоном pipe и grep exclude.
Anup

0

Я думаю, что использование information_schema- хороший путь для этого.

select group_concat(concat('--ignore-table=', TABLE_SCHEMA, '.', table_name) SEPARATOR ' ') 
from information_schema.tables 
where TABLE_SCHEMA = 'Actual_DB_NAME' and TABLE_NAME like 'Actual_TABLE_NAME%';
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.