mysqldump ignora tabela com curinga

8

Preciso fazer um despejo de um banco de dados contendo 50 tabelas ímpares, das quais desejo excluir cerca de 15 ímpares que tenham prefixo exam_

Eu tentei mysqldump --ignore-table=dbname.exam_* e até tentei --ignore-table=dbname.exam_% Não funcionou como o esperado. Eu tive que usar --ignore-tablevárias vezes.

Edit: Eu vi alguns scripts de shell que listam tables not like tablename_%e passam para mysqldump.

No entanto, gostaria de saber se existe uma opção no mysqldump ou mysql, como tal, para fazer o mesmo sem ter que criar um script.

Editar-adicionar: Eventualmente, foi usado um script para despejar o banco de dados excluindo tabelas, usando ignore-table=várias vezes.

anup
fonte
você pode postar o script que você usou? talvez hospedá-lo em gist.github.com
rubo77
@ rubo77: Não tenho mais esse script. Foi um roteiro básico. Usando o comando mysql, obtive uma lista de tabelas que queria excluir. Codificou a lista em um script BASH para produzir dump sempre que necessário. Felizmente para mim, a lista era constante. Como alternativa, uma solução postada aqui pode ser útil com relação a scripts.
anup
Melhor ainda: TABLES=`mysql --skip-column-names [DB-NAME] -e 'show tables' | grep -v 'exam_'` mysqldump [DB-NAME] $TABLES > mysqldump.sql
anup 18/11/2015

Respostas:

13

Não, não há opção como essa no mysqldumpcomando, como dizem os documentos :

--ignore-table = db_name.tbl_name

Não despeje a tabela especificada, que deve ser especificada usando os
nomes de banco de dados e tabela. Para ignorar várias tabelas, use esta opção
várias vezes. Essa opção também pode ser usada para ignorar visualizações.

NickW
fonte
Como um aparte, pode valer a pena criar um usuário despejo mysql que não tem acesso a essas tabelas, em seguida, tentar um mysqldump --all-databasespouco para ver se ele erros fora, ou apenas pula para a próxima DDB ..
NickW
Ainda não tentei, mas parece bom. Quanto à solução, escrevi um shell script para evitar as tabelas.
anup
@ NickW Isso pode funcionar. Mas se você quiser mais flexibilidade, precisará fazer uma consulta separada para obter os nomes das tabelas. Veja minha resposta abaixo.
Buttle Butkus
versão rápida e suja: engana o banco de dados. use a interface web do phpMyAdmin para remover facilmente as tabelas que você não deseja ver. despeje e não é necessário curinga. se você deseja executar a CLI e não se importa com uma terceira etapa sitepoint.com/community/t/drop-tables-with-wildcard/18537/4
TheSatinKnight
3

Você pode obter os nomes de tabela que deseja do mysql e usá-los para criar seus parâmetros de despejo do mysql.

No exemplo abaixo, basta substituir "someprefix" pelo seu prefixo (por exemplo, "exam_").

A SHOW TABLESconsulta pode ser alterada para encontrar outros conjuntos de tabelas. Ou você pode usar uma consulta na INFORMATION_SCHEMAtabela para usar ainda mais critérios.

#/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

Isso foi criado com a ajuda desta resposta sobre como obter "todas as tabelas com exclusão no bash": https://stackoverflow.com/a/9232076/631764

e esta resposta sobre ignorar tabelas com algumas partes usadas: https://stackoverflow.com/a/425172/631764

Buttle Butkus
fonte
Com base na resposta selecionada, escrevi um script semelhante à sua resposta. Obrigado por colocar isso. Edit: apenas lembrei que eu usei dois comandos com pipe e grep excluir padrão.
anup 31/12/18
0

Eu acho que usar o information_schemaé um bom caminho a seguir.

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%';
user3783243
fonte