`updatedb`和`locate`使用哪种数据库?


25

locate程序findutils扫描一个或多个文件名数据库并显示所有匹配项。find如果文件在上次文件名数据库更新期间存在,则可以将其用作快速命令。

如今有多种数据库,

那么,updatedb更新和locate使用哪种数据库?

谢谢。


不管loc是否实际使用BerkelyDB,都值得您进行调查-这是一个非常古老,简单,有效的基于磁盘的键值存储。
pjc50

@ pjc50我很乐意。数据库文件在哪里?我应如何查看其内容?
蒂姆(Tim)


“找不到页面”,链接应为serverfault.com/questions/454127/…–
蒂姆(Tim)

那么“键”和“值”在数据库中代表什么呢?如果我正确理解了Stephen Kitt的评论unix.stackexchange.com/questions/379725/…,则该数据库不是键值。
蒂姆(Tim)

Answers:


29

locate/的实现updatedb通常使用根据其需求量身定制的特定数据库,而不是通用数据库引擎。您将找到每个实现记录的那些特定数据库。例如:

  • GNU findutils'记录在中locatedb(5),并且几乎只是文件列表(具有特定的压缩算法);
  • mlocate的记录在中mlocate.db(5),也可以视为目录和文件(带有元数据)的列表。

谢谢。我在哪里以及如何学习针对特定需求量身定制的设计和实施特定数据库的原则?我将不胜感激任何阅读参考。
蒂姆(Tim)

11
设计数据库可以归结为设计数据结构,因此,请先了解它们,然后再了解大小与速度之间的设计折衷...我不知道某个特定的资源会很好,也许像Programming Pearls这样的资源会很不错。很好地介绍了关于这些主题的思考方式(也没有过多考虑它们)。
斯蒂芬·基特

谢谢。我已经学到了有关数据结构的知识,下一个问题是找到从数据结构到数据库的引用和方法。
蒂姆(Tim)

2
所使用的数据库locate只是存储在磁盘上的数据结构,因此从数据结构转到相应的数据库相对简单。按照您的问题提出的观点迁移到数据库完全是另一回事。有专门针对这些主题的书籍和课程。设计和开发数据库管理系统(例如MongoDB或PostgreSQL)是当今计算机科学和软件工程中较难解决的问题之一,尤其是当您涉及分布式方面时。
斯蒂芬·基特

2
多年来,我在locateb&mlocate.db上做了很多工作。我最初有perl代码来为我dlocate在debian中的程序生成一个locationb 。我最终发现,仅对文本文件进行grep操作比搜索一次locatedb要快许多倍,并且由于这些天的磁盘大小,文件大小的节省是微不足道的。所以我改用grep。我还有一个本地cron作业,在mlocate cron作业运行后将mlocate.db转储为纯文本,我使用本地qlocateshell脚本进行搜索mlocate
cas

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

2
谢谢。最后的两个命令是做什么的?
蒂姆(Tim)

2
@Tim第一条命令是find从根目录(/)搜索文件系统(),而不降级到其他文件系统(-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,它是键/值无守护程序数据库。点击链接获取更多信息。摘自Wikipedia:

Berkeley DB(BDB)是一个软件库,旨在为键/值数据提供高性能的嵌入式数据库。Berkeley DB用C编写,带有用于C ++,C#,Java,Perl,PHP,Python,Ruby,Smalltalk,Tcl和许多其他编程语言的API绑定。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格式,这是手册页的标题:

一个mlocate数据库以一个文件头开始:一个8字节的魔术数字(如C文字那样是“ \ 0mlocate”),4个字节用于大字节序的配置块大小,1个字节用于文件格式版本(0),1个“要求可见性”标志的一个字节(0或1),2个字节的填充以及数据库根目录的NUL终止路径名。

标头后跟一个配置块,该配置块可确保在某些配置更改可能影响数据库内容时不重用数据库。配置块的大小(以字节为单位)存储在文件头中。配置块是一系列变量分配,按变量名称排序。每个变量分配都包含一个NUL终止的变量名称和一个NUL终止值的有序列表。值列表以另一个NUL字符终止。使用的顺序由strcmp()函数定义。


2
这取决于locate/ updatedb... 的执行情况
Stephen Kitt

2
mlocate绝对不使用Berkeley DB。
斯蒂芬·基特

1
您是否有任何来源支持您的BerkeleyDB索赔?答案的第二部分与此矛盾。
马太福音
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.