Que tipo de banco de dados o `updatedb` e o` localize` usam?

25

O locateprograma findutilsverifica um ou mais bancos de dados de nomes de arquivos e exibe todas as correspondências. Isso pode ser usado como um findcomando muito rápido se o arquivo estiver presente durante a última atualização do banco de dados de nomes de arquivos.

Atualmente, existem muitos tipos de bancos de dados,

Então, que tipo de banco de dados é updatedbatualizado e locateusado?

Obrigado.

Tim
fonte
Independentemente de o local realmente usar o BerkelyDB, vale a pena investigar - é um armazenamento de valores-chave baseado em disco muito antigo, simples e eficaz.
Pjc50
@ pjc50 eu adoraria. Onde estão os arquivos para o banco de dados? Como vou ver o seu conteúdo?
Tim
Para localizar? serverfault.com/questions/454127/…
pjc50
"Página não encontrada", o link deve ser serverfault.com/questions/454127/…
Tim
Então, o que as "chaves" e "valores" representam no banco de dados? Se eu entendi o comentário de Stephen Kitt unix.stackexchange.com/questions/379725/… corretamente, o banco de dados não é o valor-chave.
Tim

Respostas:

29

As implementações de locate/ updatedbnormalmente usam bancos de dados específicos personalizados para seus requisitos, em vez de um mecanismo de banco de dados genérico. Você encontrará os bancos de dados específicos documentados por cada implementação; por exemplo:

  • O GNU findutils'está documentado locatedb(5)e é basicamente apenas uma lista de arquivos (com um algoritmo de compactação específico);
  • mlocateestá documentado mlocate.db(5)e também pode ser considerado uma lista de diretórios e arquivos (com metadados).
Stephen Kitt
fonte
Obrigado. Onde e como posso aprender os princípios de design e implementação de bancos de dados específicos, adaptados a requisitos específicos? Eu apreciaria todas as referências para leitura.
Tim
11
A criação de bancos de dados se resume a projetar estruturas de dados, então aprenda sobre elas e depois sobre trocas de tamanho e velocidade ... Não conheço um recurso específico que seja bom, talvez algo como Programming Pearls seja uma boa introdução à maneira de pensar sobre esses tópicos (e não pensar demais neles também).
Stephen Kitt
Obrigado. Aprendi algo sobre estruturas de dados, e a próxima pergunta seria encontrar referências e maneiras de passar de estruturas de dados para bancos de dados.
Tim
2
Os bancos de dados usados locatesão apenas estruturas de dados armazenadas no disco, portanto, passar das estruturas de dados para os bancos de dados correspondentes é relativamente simples. Mover para bancos de dados conforme sua pergunta os apresentar é outra coisa completamente; existem livros e cursos dedicados a esses tópicos. Projetar e desenvolver um sistema de gerenciamento de banco de dados como o MongoDB ou o PostgreSQL é hoje um dos problemas mais difíceis da ciência da computação e da engenharia de software, especialmente quando você joga o lado distribuído das coisas.
Stephen Kitt
2
Eu tenho feito um pouco com o locatedb & mlocate.db ao longo dos anos. Eu originalmente tinha um código perl para gerar um localb para o meu dlocateprograma no debian. Acabei descobrindo que apenas o preenchimento de um arquivo de texto era muitas vezes mais rápido do que pesquisar em um localb, e, dado o tamanho dos discos hoje em dia, a economia no tamanho do arquivo era insignificante. Então eu mudei para apenas grep. Eu também tenho um trabalho cron local que despeja mlocate.db em texto sem formatação após a execução do trabalho cron mlocate, que procuro com um qlocatescript de shell local .... muito mais rápido que em execução mlocatee também possui algumas opções extras úteis.
21817
13

Parece ser um arquivo simples de estruturas C, gravado / lido usando as macros do Gnu LibC OBSTACKS

Ver fontes

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

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

Você pode obter algo semelhante com

find / -xdev -type f -not -path \*\.git\/\* | gzip -9 > /tmp/files.gz
zgrep file_i_want /tmp/files.gz
jmullee
fonte
2
Obrigado. Quais são os dois comandos no final?
Tim
2
O comando @Tim First está pesquisando sistema de arquivos ( find) no /diretório raiz ( ), sem descer para diretórios em outros sistemas de arquivos ( -xdev), arquivos regulares ( -type f), e não nos *.gitdiretórios ( -not -path \*\.git\/\*). Comprime a saída ( | gzip -9) e salva no arquivo /tmp/files.gz( > /tmp/files.gz). Linha seguinte é pesquisar com zgreppara o arquivo file_i_wantdentro do arquivo compactado/tmp/files.gz
piotrekkr
2

Tanto quanto eu sei por trás é Berkeley DB, que é o banco de dados sem daemon chave / valor. Siga o link para mais informações. Extrato da Wikipedia:

O Berkeley DB (BDB) é uma biblioteca de software destinada a fornecer um banco de dados incorporado de alto desempenho para dados de chave / valor. O Berkeley DB é escrito em C com ligações de API para C ++, C #, Java, Perl, PHP, Python, Ruby, Smalltalk, Tcl e muitas outras linguagens de programação. O BDB armazena pares de chave / dados arbitrários como matrizes de bytes e suporta vários itens de dados para uma única chave. O Berkeley DB não é um banco de dados relacional.

A localização do banco de dados no RHEL / CentOS é /var/lib/mlocate/mlocate.db(não tenho certeza sobre as outras distribuições). O comando locate --statisticsfornecerá informações sobre a localização e algumas estatísticas do banco de dados (exemplo):

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

Para o formato mlocate, aqui está a página principal do manual:

Um banco de dados mlocate começa com um cabeçalho de arquivo: 8 bytes para um número mágico ("\ 0mlocate" como um literal C), 4 bytes para o tamanho do bloco de configuração em big endian, 1 byte para a versão no formato de arquivo (0), 1 byte para o sinalizador "exigir visibilidade" (0 ou 1), preenchimento de 2 bytes e um nome de caminho terminado por NUL da raiz do banco de dados.

O cabeçalho é seguido por um bloco de configuração, incluído para garantir que os bancos de dados não sejam reutilizados se algumas alterações na configuração puderem afetar seu conteúdo. O tamanho do bloco de configuração em bytes é armazenado no cabeçalho do arquivo. O bloco de configuração é uma sequência de atribuições de variáveis, ordenadas pelo nome da variável. Cada atribuição variável consiste em um nome de variável terminado por NUL e uma lista ordenada de valores terminados por NUL. A lista de valores é finalizada por mais um caractere NUL. A ordem usada é definida pela função strcmp ().

Romeo Ninov
fonte
2
Depende da implementação de locate/ updatedb...
Stephen Kitt
2
mlocatedefinitivamente não usa o Berkeley DB.
Stephen Kitt
11
Você tem alguma fonte de apoio à sua reivindicação do BerkeleyDB? A segunda parte da sua resposta a contradiz.
Mat