mysqldump игнорирует таблицу с подстановочными знаками
Мне нужно сделать дамп базы данных, содержащей 50 нечетных таблиц, из которых я хочу исключить около 15 нечетных, которые имеют префикс exam_
Я старался mysqldump --ignore-table=dbname.exam_*
и даже попробовал --ignore-table=dbname.exam_%
Это не сработало, как ожидалось. Я должен был использовать --ignore-table
многократно.
Изменить: я видел несколько сценариев оболочки, которые перечисляют tables not like tablename_%
и передать его mysqldump
,
Тем не менее, я хотел бы знать, есть ли опция в mysqldump или mysql, как таковая, чтобы сделать то же самое без необходимости сценария.
Edit-add: в конце концов использовал скрипт для сброса БД, исключая таблицы, используя ignore-table=
многократно.
2 ответа
Нет, такой опции нет в mysqldump
Команда, как говорят в документах:
--ignore стол =db_name.tbl_name
Не сбрасывайте заданную таблицу, которая должна быть указана с использованием обоих
имена баз данных и таблиц. Чтобы игнорировать несколько таблиц, используйте эту опцию
многократно. Эта опция также может быть использована для игнорирования представлений.
Вы можете получить имена таблиц из 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
Я думаю, используя 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%';