Posts Tagged ‘mysql’

mysql – sichern von Prozeduren, Funktionen und Triggern

MySQL 5 kommt mit vielen netten neuen Features, wie z.B. stored procedures oder triggers.
Kurz soll erläutert werden, wie man mittels mysqldump Prozeduren, Trigger etc. sichern kann.

mysqldump sichert via default alle trigger aber KEINE Prozeduren/Funktionen. Für das Verhalten von mysqldump sind 2 Optionen verantwortlich:

  • –routines – Defaultwert ist FALSE
  • –triggers – Defaultwert ist TRUE

Also wenn zusätzlich zu den Triggern, die Prozeduren mit gesichert werden sollen, muss die Option –routines dem Script etc. mit übergeben werden.

mysqldump <mysqldump optionen> --routines > outputfile.sql 

Nehmen wir an, wir wollen nur die gespeicherte Prozeduren und Trigger sichern und nicht die MySQL-Tabellen und Daten (dies kann nützlich sein, wenn diese z.B. geändert werden oder diese auf einer anderen Datenbank importiert werden soll, der bereits die Daten, nicht aber die gespeicherten Prozeduren und / oder Trigger enthält), dann sollten wir folgendes tun:

mysqldump --routines --no-create-info --no-data --no-create-db --skip-opt <database> > outputfile.sql

Dies sichert allerdings nur die Prozeduren,Trigger und Funktionen der angegebenen datenbank <database>. Um diese zu importieren benutzen wir folgenden Befehl:

mysql <database> < outputfile.sql

Beispieldatensätze aus einer MySQL Datenbank ziehen

Hier eine Quick & Dirty Anleitung, die zeigt, wie man einen kleinen Probedatensatz aus einer MySQL-Datenbank mittels mysqldump zieht. Wir brauchen zum Beispiel öfters eine kleine Momentaufnahme aus sehr großen Produktionsdatenbanken, um sie in ein Entwicklungs- oder Test-Datenbank einzuspielen. Sagen wir mal, wir brauchen 1000000 Datensätze aus allen Tabellen in der Datenbank. Dazu benutzen wir einfach die Option – where = “true LIMIT X”, wobei X der Anzahl Datensätzen entspricht die wir benötigen.

mysqldump --opt --where="true LIMIT 1000000" mydb > mydb1M.sql

This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary

Als ich heute ein Backup einspielen wollte, um eine Replikation erneut aufzusetzen, stolperte ich über folgenden Fehler:

ERROR HY000: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

Wenn wir eine gespeicherte Funktion erstellen, müssen diese entweder als deterministisch deklariert oder es muss festgelegt werden, dass sie keine Daten modifizieren. Andernfalls kann sie für die Datenwiederherstellung oder Replikation Unsicherheiten bergen … so dass MySQL Handbuch. Zur Lockerung der  Bedingungen für die Erstellung einer Funktion setzen wir die globale Systemvariable log_bin_trust_function_creators auf 1. Diese Variable hat den Standardwert 0.

  1. > SET GLOBAL log_bin_trust_function_creators = 1;

Darüber hinaus können  wir diese Variable genaus als Option beim Start des MySQL Servers übergeben –log-bin-trust-function-creators=1. Mehr Informationen gibt es [hier]. Und dann klappt es auch mit dem Einspielen des Backup :-)

nach oben