Какую базу данных используют `updatedb` и` locate`?

25

locateПрограмма findutilsсканирования одного или нескольких баз данных имен файлов и отображает любые совпадения. Это можно использовать как очень быструю findкоманду, если файл присутствовал во время последнего обновления базы данных имен файлов.

В настоящее время существует много видов баз данных,

Так какую базу данных updatedbобновлять и locateиспользовать?

Спасибо.

Тим
источник
Независимо от того, использует ли locate BerkelyDB, вам стоит изучить его - это очень старое, простое и эффективное хранилище ключей на основе дисков.
pjc50
@ pjc50 Я бы с удовольствием. Где находятся файлы для базы данных? Как мне просмотреть их содержимое?
Тим
Для локации? serverfault.com/questions/454127/…
pjc50
«Страница не найдена», ссылка должна быть на serverfault.com/questions/454127/…
Тим
Так что же представляют «ключи» и «значения» в базе данных? Если я правильно понимаю комментарий Стивена Китта unix.stackexchange.com/questions/379725/… , база данных не является ключом-значением.
Тим

Ответы:

29

Реализации locate/ updatedbобычно используют конкретные базы данных, адаптированные к их требованиям, а не универсальный механизм баз данных. Вы найдете эти конкретные базы данных, документированные каждой реализацией; например:

  • GNU findutils'задокументирован locatedb(5)и представляет собой просто список файлов (с определенным алгоритмом сжатия);
  • mlocateЭто задокументировано mlocate.db(5)и может также рассматриваться как список каталогов и файлов (с метаданными).
Стивен Китт
источник
Спасибо. Где и как я могу узнать принципы проектирования и реализации конкретных баз данных с учетом конкретных требований? Буду признателен за любые ссылки для чтения.
Тим
11
Проектирование баз данных сводится к проектированию структур данных, поэтому узнайте об этом, а затем о компромиссах между размером и скоростью проектирования ... Я не знаю конкретного ресурса, который был бы хорош, возможно, что-то вроде Programming Pearls было бы хорошее введение в способ мышления на эти темы (и не слишком продумывая их тоже).
Стивен Китт
Спасибо. Я кое-что узнал о структурах данных, и следующим вопросом будет поиск ссылок и способов перехода от структур данных к базам данных.
Тим
2
Используемые базы данных - locateэто просто структуры данных, хранящиеся на диске, поэтому переход от структур данных к соответствующим базам данных относительно прост. Переход к базам данных, когда ваш вопрос представляет их, - это совсем другое; Есть книги и курсы, посвященные этим темам. Проектирование и разработка системы управления базами данных, такой как MongoDB или PostgreSQL, является сегодня одной из наиболее сложных проблем в области компьютерных наук и разработки программного обеспечения, особенно когда вы добавляете распределенную сторону вещей.
Стивен Китт,
2
За последние годы я сделал немало работы с расположенным по адресу localb & mlocate.db. Первоначально у меня был Perl-код для генерации локалиста для моей dlocateпрограммы в Debian. В итоге я обнаружил, что простой поиск текстового файла был во много раз быстрее, чем поиск в расположенном б, и с учетом размера дисков в наши дни экономия размера файла была незначительной. Так что я переключился на просто grep. У меня также есть локальное задание cron, которое выводит файл mlocate.db в виде обычного текста после выполнения задания mlocate cron, которое я ищу с помощью qlocateсценария локальной оболочки… гораздо быстрее, чем выполняемый, mlocateа также имеет некоторые полезные дополнительные параметры.
КАС
13

Кажется, что это простой файл структур C, написанный / прочитанный с использованием макросов Gnu LibC OBSTACKS

Посмотреть источники

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

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

Вы можете получить что-то подобное с

find / -xdev -type f -not -path \*\.git\/\* | gzip -9 > /tmp/files.gz
zgrep file_i_want /tmp/files.gz
jmullee
источник
2
Спасибо. Что делают две команды в конце?
Тим
2
@Tim Первая команда выполняет поиск файловой системы ( find) из /каталога root ( ), не спускаясь в каталоги других файловых систем ( -xdev), обычные файлы ( -type f), а не в *.gitкаталоги ( -not -path \*\.git\/\*). Он сжимает вывод ( | gzip -9) и сохраняет его в файл /tmp/files.gz( > /tmp/files.gz). Следующая строка ищет zgrepфайл file_i_wantвнутри сжатого файла/tmp/files.gz
piotrekkr
2

Насколько я знаю, за ними стоит Berkeley DB, которая является базой данных без ключей и значений. Перейдите по ссылке для получения дополнительной информации. Выдержка из Википедии:

Berkeley DB (BDB) - это библиотека программного обеспечения, предназначенная для обеспечения высокопроизводительной встроенной базы данных для данных ключ / значение. Berkeley DB написана на C с привязками API для C ++, C #, Java, Perl, PHP, Python, Ruby, Smalltalk, Tcl и многих других языков программирования. BDB хранит произвольные пары ключ / данные в виде байтовых массивов и поддерживает несколько элементов данных для одного ключа. Berkeley DB не является реляционной базой данных.

Расположение базы данных в RHEL / CentOS /var/lib/mlocate/mlocate.db(не уверен насчет других дистрибутивов). Команда locate --statisticsдаст вам информацию о местоположении и некоторую статистику базы данных (пример):

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

Для формата mlocate вот глава man-страницы:

База данных mlocate начинается с заголовка файла: 8 байтов для магического числа ("\ 0mlocate" как литерал C), 4 байта для размера блока конфигурации с прямым порядком байтов, 1 байт для версии формата файла (0), 1 байт для флага «требуется видимость» (0 или 1), заполнение 2 байтами и NUL-завершенный путь к корню базы данных.

За заголовком следует блок конфигурации, который позволяет избежать повторного использования баз данных, если некоторые изменения конфигурации могут повлиять на их содержимое. Размер блока конфигурации в байтах хранится в заголовке файла. Блок конфигурации представляет собой последовательность назначений переменных, упорядоченных по имени переменной. Каждое присвоение переменной состоит из имени переменной, заканчивающейся NUL, и упорядоченного списка значений, заканчивающихся NUL. Список значений заканчивается еще одним символом NUL. Используемый порядок определяется функцией strcmp ().

Ромео Нинов
источник
2
Это зависит от реализации locate/ updatedb...
Стивен Китт
2
mlocateсовершенно определенно не использует Berkeley DB.
Стивен Китт,
1
Есть ли у вас какой-либо источник, поддерживающий ваши претензии BerkeleyDB? Вторая часть вашего ответа противоречит этому.
Мат