Begrenzung der Anzahl der Datensätze von mysqldump?

137

Ich versuche, eine kleine Stichprobe von Datensätzen aus einer großen Datenbank in eine Testdatenbank zu laden.

Wie können Sie mysqldump anweisen, Ihnen nur n von 8 Millionen Datensätzen zu geben?

Vielen Dank

Phil
quelle

Antworten:

212

Verwenden Sie, wie Skaffman sagt, die Option --where :

mysqldump --opt --where="1 limit 1000000" database

Das würde Ihnen natürlich die ersten Millionen Zeilen aus jeder Tabelle geben.

Adam Bellaire
quelle
15
Was macht die "1" vor dem Limit?
Phob
31
@Phob: Die Option --where wird grundsätzlich an eine Abfrage des Formulars angehängt. SELECT * from table WHERE In diesem Fall erhalten Sie also SELECT * from table WHERE 1 limit 1000000. Ohne die 1 hätten Sie eine ungültige Abfrage. Wenn Sie 1 für eine where-Klausel angeben (da 1 immer wahr ist), werden einfach alle Datensätze ausgewählt.
Adam Bellaire
24
Wow, was für ein Hack. Sie können sich also im Grunde genommen auf diese Weise in SQL einfügen.
Phob
6
Erhält dies alle Fremdschlüsselintegritäten bei? Wenn nicht, gibt es eine Möglichkeit, dies zu tun?
Keithxm23
4
Vielen Dank! Darüber hinaus können Sie Folgendes verwenden mysqldump --opt --where="1 limit 1000000 offset 1000000" --no-create-info database , um die zweite Seite mit 1 Million Datensätzen abzurufen. Stellen Sie sicher, dass Sie das Flag --no-create-info auf anderen Seiten als der ersten verwenden, um nur die Daten zu sichern und das Erstellungs-Tabellenmaterial wegzulassen.
Pfuri
59

Wenn Sie nDatensätze aus einer bestimmten Tabelle abrufen möchten, können Sie Folgendes tun:

mysqldump --opt --where="1 limit 1000000" database table > dump.sql

Dadurch werden die ersten 1000000Zeilen aus der genannten Tabelle ausgegebentable in die Datei geschrieben dump.sql.

Casper André Casse
quelle
9

mysqldump kann eine SQL-Abfrage zur Ausführung erhalten, aus der die Daten für den Speicherauszug entnommen werden. Sie können dann die Klausel "limit X" in Ihrer Abfrage verwenden, um die Anzahl der Zeilen zu beschränken.

Skaffman
quelle
6

Da die Standardreihenfolge ASC ist, was in dieser Situation selten der Fall ist, benötigen Sie ein ordnungsgemäßes Datenbankdesign, damit DESC sofort funktioniert. Wenn alle Ihre Tabellen EINE Primärschlüsselspalte mit demselben Namen haben (natürlich oder als Ersatz), können Sie die n neuesten Datensätze einfach wie folgt sichern:

mysqldump --opt --where="1 ORDER BY id DESC limit 1000000" --all-databases > dump.sql

Dies ist ein perfekter Grund, warum Sie immer die ID Ihrer PK benennen sollten und zusammengesetzte PKs auch in Zuordnungstabellen vermeiden sollten (verwenden Sie stattdessen Ersatzschlüssel).

Andreas Bergström
quelle
1
Wenn Sie dies tun (ID benennen und zusammengesetzte PKs vermeiden), müssen Sie die relationale Datenbanktheorie ignorieren.
Mpoletto
1
Wenn Sie Ihre Datenbank gemäß den Best Practices der relationalen Datenbank entwerfen und Ihre PKs basierend auf Daten und Entitäten definieren, können Sie beispielsweise --option --where = "1 LIMIT 10000" verwenden. Ohne ORDER BY funktioniert dies, da MySQL auf natürliche Weise ordnet, was gleichbedeutend damit ist, dass es der Indexreihenfolge der PK folgt. Dann haben alle FK verwandter Tabellen nur Daten, die in der Referenztabelle vorhanden sind, da die Reihenfolge dieselbe ist.
Mpoletto
Die Verwendung von IDs ist eine echte Plage vieler Entwickler. IDs wie PKs zu haben ist dasselbe wie keine PKs zu haben. Ihre Integrität war ins Wanken geraten, da in den meisten Fällen eine automatische Inkrementierungsnummer nichts mit den Entitätsdaten zu tun hat.
Mpoletto
@mpoletto --where = "1 LIMIT 10000" wählt nur die ersten 10000 Einträge aus. Der springende Punkt meiner Antwort war zu zeigen, wie Sie die neuesten X-Einträge erhalten würden, was normalerweise das ist, was Sie wollen. Ich verstehe auch nicht, was Namenskonventionen mit "Ignorieren der relationalen Datenbanktheorie" zu tun haben. Ich denke, Sie haben meine Antwort falsch verstanden. Die meisten gängigen ORMs wie EF, Django ORM usw. verwenden standardmäßig "id" für PK-Spalten und geben diese an, da es überflüssig ist, "users.user_id" anstelle von "users.id" zu sagen.
Andreas Bergström
Wenn Sie sagen, dass es einen "perfekten Grund gibt, warum Sie immer Ihre PK-ID benennen und zusammengesetzte PKs vermeiden sollten", ignorieren Sie die relationale Datenbanktheorie. Ihr Argument zu "beliebtesten ORMs" ist ungültig, da diese ORMs Tabellen mit IDs benötigen, um zu funktionieren.
mpoletto