2016-07-18 8 views
-1

Ich möchte alle DB Änderungen in bestimmten DB mit einer Protokolltabelle verfolgen.Verfolgen Sie alle DML/DDL-Änderungen der DB in einer Protokolltabelle mit Trigger in Mysql

Ich habe viele Lösungen überprüft, aber alle geben eine Audit-Tabelle für jede Tabelle in DB. Wie können wir sie mit Hilfe eines Triggers in einer einzigen Tabelle nachverfolgen?

Tabellenspalten können wie haben:

id - primary key 
    db_name -- DB Name 
    version, -- Ignore it(i have a column in my table) 
    event_type, -- DDL/DML command name 
    object_name, -- Table/Procedure/Trigger/Function name which is changed 
    object_type, -- TYpe like table,procedure,trigger 
    sql_command, -- query executed by user 
    username, -- who executed it 
    updated_on -- timestamp 

Vielen Dank im Voraus.

Antwort

0

Ein Trigger, der aufgerufen wird, wenn ddl-Befehle ausgeführt werden (damit Sie sie protokollieren können), existiert in mysql nicht. Sie können aber wollen logfiles verwenden, insbesondere das The General Query Log:

Das allgemeine Abfrageprotokoll ist eine allgemeine Aufzeichnung das, was mysqld tut. Der Server schreibt Informationen in dieses Protokoll, wenn Clients eine Verbindung herstellen oder trennen, und protokolliert jede von Clients empfangene SQL-Anweisung. Das allgemeine Abfrageprotokoll kann sehr nützlich sein, wenn Sie einen Fehler in einem Client vermuten und genau wissen möchten, was der Client an mysqld gesendet hat.

Das Protokoll ist standardmäßig deaktiviert und die Aktivierung kann die Leistung ein wenig verringern. Und es enthält keine indirekten Änderungen (z. B. ddls, die in einer Prozedur ausgeführt werden).

Wenn Sie ein Plugin installieren können, wäre eine etwas konfigurierbarere (und performantere) Alternative die Verwendung eines Audit-Plugins, siehe MySQL Enterprise Audit oder eine freie Implementierung, z. this one, oder Sie können your own schreiben, aber es wird im Grunde die gleichen Dinge wie das allgemeine Protokoll protokollieren.

Eine weitere gute Informationsquelle könnten die information schema und die performance schema sein. Von dort können Sie im Grunde alle Informationen sammeln, die Sie benötigen (besonders die log of recently executed queries) und daraus Ihre Protokolltabelle generieren, aber es würde etwas Arbeit erfordern, alle gewünschten Daten zu sammeln - und sie wird nicht durch Aktionen ausgelöst, also müssen Sie Überprüfen Sie die Änderungen regelmäßig selbst (vergleichen Sie z. B. die Daten in INFORMATION_SCHEMA.TABLES mit einer gespeicherten Kopie, um die hinzugefügten, gelöschten und umbenannten Tabellen zu verfolgen). Auf der anderen Seite, eine regelmäßige mysql_dump gefolgt von einer diff auf die neueste Version könnte viel einfacher sein.

Verwandte Themen