Welche Art von Datenbank wird von "updatedb" und "locate" verwendet?

25

Das locateProgramm findutilsdurchsucht eine oder mehrere Datenbanken mit Dateinamen und zeigt Übereinstimmungen an. Dies kann als sehr schneller findBefehl verwendet werden, wenn die Datei während der letzten Aktualisierung der Dateinamendatenbank vorhanden war.

Es gibt heutzutage viele Arten von Datenbanken,

Welche Art von Datenbank wird updatedbaktualisiert und locateverwendet?

Vielen Dank.

Tim
quelle
Unabhängig davon, ob locate tatsächlich BerkelyDB verwendet, lohnt es sich, dies zu untersuchen - es ist ein sehr alter, einfacher und effektiver festplattenbasierter Schlüsselwertspeicher.
PJC50
@ pjc50 Ich würde gerne. Wo sind die Dateien für die Datenbank? Wie soll ich deren Inhalt ansehen?
Tim
Zum lokalisieren? serverfault.com/questions/454127/…
pjc50
"Seite nicht gefunden", der Link sollte serverfault.com/questions/454127/…
Tim
Was bedeuten die "Schlüssel" und "Werte" in der Datenbank? Wenn ich Stephen Kitts Kommentar unix.stackexchange.com/questions/379725/… richtig verstehe , ist die Datenbank kein Schlüsselwert.
Tim

Antworten:

29

Implementierungen von locate/ verwenden in der updatedbRegel spezifische Datenbanken, die auf ihre Anforderungen zugeschnitten sind, und keine generische Datenbank-Engine. Sie finden diese spezifischen Datenbanken in jeder Implementierung dokumentiert. beispielsweise:

  • GNU findutils'ist in dokumentiert locatedb(5)und ist so ziemlich nur eine Liste von Dateien (mit einem bestimmten Komprimierungsalgorithmus);
  • mlocateist in dokumentiert mlocate.db(5)und kann auch als Liste von Verzeichnissen und Dateien (mit Metadaten) betrachtet werden.
Stephen Kitt
quelle
Vielen Dank. Wo und wie kann ich die Prinzipien des Entwurfs und der Implementierung spezifischer Datenbanken erlernen, die auf spezifische Anforderungen zugeschnitten sind? Ich würde mich über Hinweise zum Lesen freuen.
Tim
11
Designing Datenbanken läuft darauf hinaus, die Gestaltung Datenstrukturen nach unten, so etwa diejenigen erfahren, und dann über die Größe-versus-Speed - Design Kompromisse ... Ich weiß nicht , von einer bestimmten Ressource , die gut wäre, vielleicht so etwas wie Perlen Programmierung wäre Eine nette Einführung in die Art und Weise, wie man über diese Themen nachdenkt (und sie auch nicht überdenkt).
Stephen Kitt
Vielen Dank. Ich habe etwas über Datenstrukturen gelernt, und die nächste Frage wäre, Referenzen und Wege zu finden, um von Datenstrukturen zu Datenbanken zu gelangen.
Tim
2
Datenbanken, wie sie von verwendet werden, locatesind nur Datenstrukturen, die auf der Festplatte gespeichert sind. Daher ist es relativ einfach, von den Datenstrukturen zu den entsprechenden Datenbanken zu gelangen. Das Verschieben in Datenbanken, während Ihre Frage sie präsentiert, ist eine ganz andere Sache; Es gibt Bücher und Kurse zu diesen Themen. Das Entwerfen und Entwickeln eines Datenbankverwaltungssystems wie MongoDB oder PostgreSQL ist heutzutage eines der schwierigeren Probleme in der Informatik und in der Softwareentwicklung, insbesondere wenn Sie die verteilten Aspekte berücksichtigen.
Stephen Kitt
2
Ich habe im Laufe der Jahre ein gutes Stück mit locatedb & mlocate.db gemacht. Ich hatte ursprünglich Perl-Code, um in Debian ein LocateB für mein dlocateProgramm zu generieren . Am Ende stellte ich fest, dass das einfache Durchsuchen einer Textdatei um ein Vielfaches schneller war als das Durchsuchen eines lokalisierten B, und angesichts der Größe der Festplatten waren die Einsparungen bei der Dateigröße heutzutage unbedeutend. Also habe ich einfach auf grep umgestellt. Ich habe auch einen lokalen Cron-Job, der mlocate.db nach der Ausführung des mlocate-Cron-Jobs als Klartext ausgibt, den ich mit einem lokalen qlocateShell-Skript suche mlocate.
cas
13

Scheint eine flache Datei mit C-Strukturen zu sein, die mit den Gnu LibC OBSTACKS-Makros geschrieben / gelesen wurden

Siehe Quellen

https://github.com/msekletar/mlocate/blob/master/src/updatedb.c#L720

https://github.com/msekletar/mlocate/blob/master/src/locate.c#L413

Sie könnten etwas Ähnliches mit bekommen

find / -xdev -type f -not -path \*\.git\/\* | gzip -9 > /tmp/files.gz
zgrep file_i_want /tmp/files.gz
jmullee
quelle
2
Vielen Dank. Was machen die beiden Befehle am Ende?
Tim
2
Der Befehl @Tim First durchsucht das Dateisystem ( find) vom Stammverzeichnis ( /) aus, ohne in Verzeichnisse auf anderen Dateisystemen ( -xdev), reguläre Dateien ( -type f) und nicht in *.gitVerzeichnissen ( -not -path \*\.git\/\*) abzusteigen . Es komprimiert die Ausgabe ( | gzip -9) und speichert sie in einer Datei /tmp/files.gz( > /tmp/files.gz). Die nächste Zeile sucht zgrepnach einer Datei file_i_wantin einer komprimierten Datei/tmp/files.gz
piotrekkr
2

Soweit ich weiß, steckt dahinter Berkeley DB , eine daemonlose Key / Value-Datenbank. Folgen Sie dem Link für weitere Informationen. Auszug aus Wikipedia:

Berkeley DB (BDB) ist eine Softwarebibliothek, die eine leistungsfähige eingebettete Datenbank für Schlüssel- / Wertdaten bereitstellen soll. Berkeley DB ist in C mit API-Bindungen für C ++, C #, Java, Perl, PHP, Python, Ruby, Smalltalk, Tcl und viele andere Programmiersprachen geschrieben. BDB speichert beliebige Schlüssel- / Datenpaare als Byte-Arrays und unterstützt mehrere Datenelemente für einen einzelnen Schlüssel. Berkeley DB ist keine relationale Datenbank.

Der Speicherort der Datenbank in RHEL / CentOS ist /var/lib/mlocate/mlocate.db(bei den anderen Distributionen nicht sicher). Der Befehl locate --statisticsgibt Ihnen Informationen über den Speicherort und einige Statistiken der Datenbank (Beispiel):

Database /var/lib/mlocate/mlocate.db:
        16,375 directories
        242,457 files
        11,280,301 bytes in file names
        4,526,116 bytes used to store database

Für das mlocate-Format ist hier der Kopf der Manpage:

Eine mlocate-Datenbank beginnt mit einem Dateikopf: 8 Byte für eine magische Zahl ("\ 0mlokal" wie ein C-Literal), 4 Byte für die Konfigurationsblockgröße in Big Endian, 1 Byte für die Dateiformatversion (0), 1 Byte Byte für das Flag "Sichtbarkeit erforderlich" (0 oder 1), 2-Byte-Abstand und ein mit NUL abgeschlossener Pfadname des Stamms der Datenbank.

Auf den Header folgt ein Konfigurationsblock, der sicherstellt, dass Datenbanken nicht wiederverwendet werden, wenn sich einige Konfigurationsänderungen auf ihren Inhalt auswirken könnten. Die Größe des Konfigurationsblocks in Bytes wird im Dateikopf gespeichert. Der Konfigurationsblock ist eine Folge von Variablenzuweisungen, die nach Variablennamen sortiert sind. Jede Variablenzuweisung besteht aus einem NUL-terminierten Variablennamen und einer geordneten Liste von NUL-terminierten Werten. Die Werteliste wird mit einem weiteren NUL-Zeichen abgeschlossen. Die verwendete Reihenfolge wird durch die Funktion strcmp () definiert.

Romeo Ninov
quelle
2
Es kommt auf die Umsetzung von locate/ updatedb...
Stephen Kitt
2
mlocateBerkeley DB wird definitiv nicht verwendet.
Stephen Kitt
1
Haben Sie eine Quelle, die Ihren BerkeleyDB-Anspruch stützt? Der zweite Teil Ihrer Antwort widerspricht dem.
Mat