Jakiej bazy danych używają `updatedb` i` locate`?

25

locateProgram findutilsskanowania jednego lub więcej baz danych zawierających nazwy plików i wyświetla żadnych meczów. Można tego użyć jako bardzo szybkiego findpolecenia, jeśli plik był obecny podczas ostatniej aktualizacji bazy danych nazw plików.

Obecnie istnieje wiele rodzajów baz danych,

Jakiej bazy danych updatedbaktualizuje i locateużywa?

Dzięki.

Tim
źródło
Bez względu na to, czy locate faktycznie korzysta z BerkelyDB, warto to zbadać - jest to bardzo stary, prosty, skuteczny magazyn kluczy i wartości oparty na dysku.
pjc50
@ pjc50 Chciałbym. Gdzie są pliki bazy danych? Jak wyświetlić ich zawartość?
Tim
Do zlokalizowania? serverfault.com/questions/454127/…
pjc50
„Nie znaleziono strony”, link powinien brzmieć serverfault.com/questions/454127/…
Tim
Co zatem oznaczają „klucze” i „wartości” w bazie danych? Jeśli dobrze rozumiem komentarz Stephena Kitt'a unix.stackexchange.com/questions/379725/… , baza danych nie ma wartości klucza.
Tim

Odpowiedzi:

29

Implementacje locate/ updatedbzazwyczaj wykorzystują określone bazy danych dostosowane do ich wymagań, a nie ogólny silnik bazy danych. Znajdziesz te konkretne bazy danych udokumentowane przez każde wdrożenie; na przykład:

  • GNU findutils'jest udokumentowane locatedb(5)i jest właściwie tylko listą plików (z określonym algorytmem kompresji);
  • mlocatejest udokumentowany mlocate.db(5)i może być również uważany za listę katalogów i plików (z metadanymi).
Stephen Kitt
źródło
Dzięki. Gdzie i jak mogę poznać zasady projektowania i wdrażania określonych baz danych dostosowanych do konkretnych wymagań? Byłbym wdzięczny za wszelkie odniesienia do czytania.
Tim
11
Projektowanie baz danych sprowadza się do projektowania struktur danych, więc dowiedzieć się o nich, a następnie o rozmiarze-versus-prędkość konstrukcyjna kompromisów ... Nie wiem od konkretnego zasobu, że byłoby dobrze, może coś Programowanie Pearls byłoby fajne wprowadzenie do sposobu myślenia na te tematy (i nie przesadzania z nimi).
Stephen Kitt
Dzięki. Nauczyłem się czegoś o strukturach danych, a następnym pytaniem byłoby znalezienie referencji i sposobów przejścia ze struktur danych do baz danych.
Tim
2
Używane bazy danych locateto tylko struktury danych przechowywane na dysku, więc przejście od struktur danych do odpowiednich baz danych jest stosunkowo proste. Przejście do baz danych w odpowiedzi na pytanie jest zupełnie inną sprawą; istnieją książki i kursy poświęcone tym tematom. Projektowanie i rozwijanie systemu zarządzania bazami danych, takiego jak MongoDB lub PostgreSQL, jest obecnie jednym z trudniejszych problemów w informatyce i inżynierii oprogramowania, zwłaszcza gdy rzucasz rozproszoną stronę rzeczy.
Stephen Kitt,
2
Zrobiłem sporo przez lata z lokalizacją & mlocate.db. Pierwotnie miałem kod perla do generowania pliku umiejscowienia dla mojego dlocateprogramu w Debianie . W końcu odkryłem, że samo grepowanie pliku tekstowego było wiele razy szybsze niż wyszukiwanie umiejscowionego dysku, a biorąc pod uwagę rozmiar dysków w dzisiejszych czasach oszczędności rozmiaru pliku były niewielkie. Więc przełączyłem się na grep. Mam także lokalne zadanie cron, które zrzuca mlocate.db do zwykłego tekstu po uruchomieniu zadania cron mlocate, które wyszukuję za pomocą lokalnego qlocateskryptu powłoki .... znacznie szybciej niż uruchamianie, mlocatea także ma kilka przydatnych dodatkowych opcji.
cas
13

Wygląda na płaski plik struktur C napisany / odczytany za pomocą makr Gnu LibC OBSTACKS

Zobacz źródła

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

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

Możesz uzyskać coś podobnego

find / -xdev -type f -not -path \*\.git\/\* | gzip -9 > /tmp/files.gz
zgrep file_i_want /tmp/files.gz
jmullee
źródło
2
Dzięki. Jakie są dwa polecenia na końcu?
Tim
2
@Tim Pierwsze polecenie polega na przeszukiwaniu systemu plików ( find) z katalogu root ( /), bez schodzenia do katalogów w innych systemach plików ( -xdev), zwykłych plikach ( -type f), a nie w *.gitkatalogach ( -not -path \*\.git\/\*). Kompresuje dane wyjściowe ( | gzip -9) i zapisuje je w pliku /tmp/files.gz( > /tmp/files.gz). Następna linia szuka zgreppliku file_i_wantwewnątrz skompresowanego pliku/tmp/files.gz
piotrekkr
2

O ile mi wiadomo, to Berkeley DB, która jest bazą danych demona klucza / wartości. Kliknij link, aby uzyskać więcej informacji. Wyciąg z Wikipedii:

Berkeley DB (BDB) to biblioteka oprogramowania przeznaczona do zapewnienia wysokiej wydajności wbudowanej bazy danych dla danych klucza / wartości. Berkeley DB jest napisany w C z powiązaniami API dla C ++, C #, Java, Perl, PHP, Python, Ruby, Smalltalk, Tcl i wielu innych języków programowania. BDB przechowuje dowolne pary klucz / dane jako tablice bajtów i obsługuje wiele elementów danych dla jednego klucza. Berkeley DB nie jest relacyjną bazą danych.

Lokalizacja bazy danych w RHEL / CentOS jest /var/lib/mlocate/mlocate.db(niepewna co do innych dystrybucji). Polecenie locate --statisticspoda informacje o lokalizacji i niektóre statystyki bazy danych (przykład):

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

Dla formatu mlocate tutaj jest strona man:

Baza danych mlocate zaczyna się od nagłówka pliku: 8 bajtów na liczbę magiczną („\ 0mklamat” jak literał C), 4 bajty na rozmiar bloku konfiguracji w big endian, 1 bajt na wersję formatu pliku (0), 1 bajt dla flagi „wymagają widoczności” (0 lub 1), wypełnienia 2 bajtów i zakończonej przez NUL nazwy ścieżki katalogu głównego bazy danych.

Po nagłówku znajduje się blok konfiguracji, dołączony w celu zapewnienia, że ​​bazy danych nie zostaną ponownie użyte, jeśli niektóre zmiany konfiguracji mogą wpłynąć na ich zawartość. Rozmiar bloku konfiguracji w bajtach jest przechowywany w nagłówku pliku. Blok konfiguracji jest sekwencją przypisań zmiennych uporządkowanych według nazwy zmiennej. Każde zmienne przypisanie składa się z nazwy zmiennej zakończonej przez NUL i uporządkowanej listy wartości zakończonych przez NUL. Lista wartości jest zakończona jeszcze jednym znakiem NUL. Zastosowana kolejność jest zdefiniowana przez funkcję strcmp ().

Romeo Ninov
źródło
2
To zależy od implementacji locate/ updatedb...
Stephen Kitt
2
mlocatezdecydowanie nie używa Berkeley DB.
Stephen Kitt
1
Czy masz jakieś źródło popierające twoje roszczenie BerkeleyDB? Druga część twojej odpowiedzi jest temu sprzeczna.
Mat