2008-09-25 30 views

Antwort

8

mysqldump kann eine SQL-Abfrage auszuführen gegeben werden, aus dem sie die Daten für die Deponie nehmen. Sie können dann die Klausel "limit X" in Ihrer Abfrage verwenden, um die Anzahl der Zeilen zu beschränken.

171

Wie skaffman sagt, verwenden Sie die --Wo Option:

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

natürlich, dass Sie die erste Million Zeilen aus jeder Tabelle geben würde.

+12

Was macht die "1" vor der Grenze? – Phob

+24

@Phob: Die Option --where wird grundsätzlich an eine Abfrage der Form 'SELECT * aus der Tabelle WHERE 'angehängt. In diesem Fall erhalten Sie' SELECT * aus der Tabelle WHERE 1 limit 1000000'. Ohne die 1 würden Sie eine ungültige Abfrage haben. Die Angabe von 1 für eine where-Klausel (da 1 immer wahr ist) wählt einfach alle Datensätze aus. –

+20

Wow, was für ein Hack. So kann man sich im Grunde SQL auf diese Weise injizieren. – Phob

-6

Ihr Jungs können es von PHP umgehen, wie folgend:

$username = "username"; 
$password = "password"; 
$db = "dbname"; 
$filename ="dumpfilename.sql"; 
$rows = 10; 
exec("mysqldump --opt --where='1 limit ".$rows."' -u ".$username." -p".$password." ".$db." > ".$filename); 

-Cheers,

45

Wenn Sie n Datensätze aus einer bestimmten Tabelle erhalten möchten Sie etwas tun können:

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

Dadurch werden die ersten 1000000 Zeilen aus der Tabelle table in die Datei dump.sql ausgegeben.

-1

Da die Standardreihenfolge ASC ist, was in dieser Situation selten der Fall ist, benötigen Sie einen ordnungsgemäßen Datenbankentwurf, damit DESC sofort einsatzbereit ist. Wenn alle Ihre Tabellen ONE Primärschlüsselspalte mit dem gleichen Namen haben (natürlich oder Surrogat) können Sie leicht die n neuesten Datensätze Dump mit:

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

Dies ist ein guter Grund, warum sollten Sie immer Ihre PK Name des id und vermeiden Sie zusammengesetzte PK's, sogar in Assoziationstabellen (verwenden Sie stattdessen Ersatzschlüssel).

+0

Tun Sie dies (Name ID und vermeiden Sie Composite PK's) und Sie müssen die relationale Datenbank Theorie ignorieren. – mpoletto

+0

Wenn Sie Ihre Datenbank nach den Best Practices der relationalen Datenbank entwerfen, definieren Sie Ihre PKs basierend auf Daten und Entitäten. Sie können beispielsweise --option --where = "1 LIMIT 10000" verwenden. Ohne ORDER BY funktioniert das, weil MySQL auf natürliche Weise sortiert, was bedeutet, dass es der Indexreihenfolge des PKs folgt. Dann werden alle FK verknüpfter Tabellen nur Daten enthalten, die in ihrer Referenztabelle vorhanden sind, da die Reihenfolge identisch ist. – mpoletto

+0

Die Verwendung von IDs ist eine wahre Plage vieler Entwickler. IDs wie PKs zu haben ist gleich, hat keine PKs. Ihre Integrität wurde durchbrochen, weil in den meisten Fällen eine automatische Inkrementierungsnummer nichts mit den Entitätsdaten zu tun hat. – mpoletto

Verwandte Themen