O mysqldump pode despejar gatilhos e procedimentos?

10

Existe alguma maneira de criar um mysqldump que salve todos os gatilhos e procedimentos de um banco de dados especificado?

Algum tempo atrás, li que mysqldumptambém salvará meus gatilhos, mas não parece. Minha segunda pergunta relacionada é como posso fazer o check-in de um arquivo sql se houver gatilhos?

dole doug
fonte

Respostas:

9

Normalmente, não separo os gatilhos das tabelas para as quais eles foram feitos. Eu despejo assim:

mysqldump -u... -p... --no-data --routines --triggers dbname > DBSchema.sql

Verifique a presença de rotinas e gatilhos como este:

SELECT COUNT(1) FROM mysql.proc;

SELECT COUNT(1) FROM information_schema.triggers;

SELECT * FROM information_schema.triggers\G

Se você deseja fazer isso com todos os bancos de dados na instância do MySQL, faça o seguinte:

mysql -u... -p... -A -N -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > /tmp/dblist.txt
for DB in `cat /tmp/dblist.txt`
do
    mysqldump -u... -p... --no-data --no-create-info --routines dbname > ${DB}-routines.sql
    mysqldump -u... -p... --no-data --triggers dbname > ${DB}-schema-triggers.sql
done

Dessa forma, os procedimentos armazenados são executados em um despejo de rotinas para o banco de dados, enquanto o esquema e os disparadores entram em outro despejo.

RolandoMySQLDBA
fonte
@dole Rolando está certo sobre como despejar gatilhos / procedimentos. Se você quiser ver se eles existem em um arquivo sql, abra-o e procure as chamadas 'CREATE TRIGGER'. Se estiver em * nix, #grep 'CREATE TRIGGER'
1133 Derek Downey
@RolandoMySQLDBA, não é --triggersdespejado por padrão? Qual seria a diferença entre --no-data --routines --triggersvs --no-data --routines?
Pacerier
11
@Pacerier Houve situações em que eu não queria gatilhos e usaria --skip-triggersnessas ocasiões (como a criação de escravos que não precisavam dos gatilhos). Como um lembrete constante para mim mesmo da possibilidade de ignorar opções, eu sempre uso certos sinalizadores no mysqldumps ( --routines, --triggers) mesmo que sejam padrão. Então, é apenas uma preferência pessoal. Se você confia que uma configuração padrão continuará sendo padrão de versão para versão e nunca lida com situações adhoc, expresse os mysqldumps conforme necessário, desde que o mysqldump resultante esteja correto para você.
RolandoMySQLDBA
@RolandoMySQLDBA - O que -A -N faz?
MontyPython 19/07
Usei expressões regulares para anexar instruções de gatilho DROP: Substitua isto: (\ / * \! 50003 CREATE * \ / \ / * \! 50017 DEFINER \ = some_text_here * \ / \ / * \! 50003 TRIGGER (. *?) !) com esta: DROP TRIGGER / * 50032 SE EXISTE * / $2;; \ n $ 1
AlexandruSerban