Können mysqldump-Dump-Trigger und -Prozeduren?

10

Gibt es eine Möglichkeit, einen mysqldump zu erstellen, der alle Trigger und Prozeduren einer bestimmten Datenbank speichert?

Vor einiger Zeit habe ich gelesen, dass dies mysqldumpauch meine Auslöser retten wird, aber es sieht nicht so aus. Meine zweite verwandte Frage ist, wie ich eine SQL-Datei einchecken kann, wenn Trigger vorhanden sind.

Dole Doug
quelle

Antworten:

9

Normalerweise trenne ich Trigger nicht von den Tabellen, für die sie bestimmt waren. Ich entleere so:

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

Überprüfen Sie, ob Routinen und Auslöser wie folgt vorhanden sind:

SELECT COUNT(1) FROM mysql.proc;

SELECT COUNT(1) FROM information_schema.triggers;

SELECT * FROM information_schema.triggers\G

Wenn Sie dies für alle DBs in der MySQL-Instanz ausführen möchten, gehen Sie folgendermaßen vor:

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

Auf diese Weise werden gespeicherte Prozeduren in einem Routine-Dump für die Datenbank gespeichert, während das Schema und die Trigger in einem anderen Dump gespeichert werden.

RolandoMySQLDBA
quelle
@dole Rolando hat das Recht, Trigger / Prozeduren zu sichern. Wenn Sie sehen möchten, ob sie in einer SQL-Datei vorhanden sind, öffnen Sie sie und suchen Sie nach 'CREATE TRIGGER'-Aufrufen. Wenn in * nix,grep 'CREATE TRIGGER'
Derek Downey
@ RolandoMySQLDBA, Wird nicht --triggersstandardmäßig ausgegeben ? Was wäre der Unterschied zwischen --no-data --routines --triggersvs --no-data --routines?
Pacerier
1
@Pacerier Es gab Situationen, in denen ich keine Trigger wollte und diese --skip-triggersbei solchen Gelegenheiten verwendete (z. B. das Einrichten von Slaves, die die Trigger nicht benötigten). Als ständige Erinnerung an die Möglichkeit, Optionen zu überspringen, verwende ich in mysqldumps ( --routines, --triggers) immer bestimmte Flags , auch wenn sie Standard sind. Es ist also nur eine persönliche Präferenz. Wenn Sie darauf vertrauen, dass eine Standardeinstellung von Version zu Version Standard bleibt und sich niemals mit Ad-hoc-Situationen befasst, drücken Sie die mysqldumps nach Bedarf aus, solange der resultierende mysqldump für Sie korrekt ist.
RolandoMySQLDBA
@ RolandoMySQLDBA - Was macht -A -N?
MontyPython
Ich habe reguläre Ausdrücke verwendet, um DROP-Triggeranweisungen voranzustellen: Ersetzen Sie diese: (\ / * \! 50003 CREATE * \ / \ / * \! 50017 DEFINER \ = some_text_here * \ / \ / * \! 50003 TRIGGER (. *?) ) Mit diesem: DROP TRIGGER / *! 50032 IF EXISTS * / $2;; \ n $ 1
AlexandruSerban