2008-09-15 10 views
24

Wir haben eine Live-MySQL-Datenbank, die 99% INSERTs ist, etwa 100 pro Sekunde. Wir möchten die Daten jeden Tag archivieren, damit wir Abfragen ausführen können, ohne die Hauptdatenbank live zu beeinflussen. Sobald das Archiv fertig ist, möchten wir die Live-Datenbank löschen.Beste Art, Live-MySQL-Datenbank zu archivieren

Was ist der beste Weg, dies ohne (wenn möglich) Sperren INSERTs zu tun? Wir verwenden INSERT DELAYED für die Abfragen.

Antwort

13

http://www.maatkit.org/ hat mk-Archivierungs

Archive oder spülen Zeilen aus einer Tabelle zu einer anderen Tabelle und/oder eine Datei. Es wurde entwickelt, um Daten in sehr kleinen Blöcken effizient zu "knabbern", ohne kritische OLTP-Abfragen (Online Transaction Processing) zu beeinträchtigen. Dies wird mit einem Abfrageplan ohne Backtracking erreicht, der seinen Platz in der Tabelle von Abfrage zu Abfrage behält, sodass jede nachfolgende Abfrage sehr wenig Arbeit für die Suche nach mehr archivierbaren Zeilen leistet.

Eine andere Alternative besteht darin, einfach jeden Tag eine neue Datenbanktabelle zu erstellen. MyIsam hat einige Vorteile dafür, da INSERTs am Ende der Tabelle sowieso nicht generell blockieren und es gibt einen Zusammenführungstabellentyp, um alle wieder zusammen zu sein. Eine Reihe von Websites protokolliert den httpd-Verkehr für solche Tabellen.

Mit Mysql 5.1, gibt es auch Partitionstabellen, die das gleiche tun können.

+0

mk-Archivierungs tut genau das, was ich will! – DavidM

+2

Maatkit wurde Teil von Percona Toolkit - http://www.percona.com/doc/percona-toolkit/2.1/pt-archiver.html –

0

Können Sie zwei gespiegelte Datenbanken behalten? Schreib zu einem, behalte den zweiten als Archiv. Wechseln Sie alle, sagen wir, 24 Stunden (oder wie lange Sie das für angemessen halten). In die Datenbank, die das Archiv war, fügen Sie alle heutigen Aktivitäten ein. Dann sollten die zwei Datenbanken übereinstimmen. Verwenden Sie dies als neue Live-Datenbank. Nimm die archivierte Datenbank und mach was du willst. Sie können alles, was Sie wollen, jetzt sichern/extrahieren/lesen, da es nicht aktiv geschrieben wird.

Es ist wie gespiegelte RAID, wo Sie ein Laufwerk offline für Backup nehmen können, resync es, dann nehmen Sie das andere Laufwerk für die Sicherung.

1

MySQL-Replikation würde dafür perfekt funktionieren.
Master -> der Live-Server.
Slave -> ein anderer Server im selben Netzwerk.

2

Klingt wie Replikation ist die beste Lösung dafür. Nach der Erstsynchronisation erhält der Slave Updates über die Binary Log und wirkt sich somit nicht auf die Master-DB aus.

More on replication.

2

Ich benutze mysql Partitionstabellen und ich habe in allen Aspekten wunderbare Ergebnisse erzielen.

Verwandte Themen