¿Qué tipo de base de datos usan `updatedb` y` localizar`?

25

El locateprograma findutilsescanea una o más bases de datos de nombres de archivos y muestra las coincidencias. Esto se puede usar como un findcomando muy rápido si el archivo estuvo presente durante la última actualización de la base de datos de nombres de archivo.

Hay muchos tipos de bases de datos hoy en día,

Entonces, ¿qué tipo de base de datos updatedbactualiza y locateusa?

Gracias.

Tim
fuente
Independientemente de si ubicación realmente utiliza BerkelyDB, vale la pena investigarlo: es un almacén de valores de clave basado en disco muy antiguo, simple y efectivo.
pjc50
@ pjc50 me encantaría ¿Dónde están los archivos para la base de datos? ¿Cómo debo ver sus contenidos?
Tim
Para localizar? serverfault.com/questions/454127/…
pjc50
"Página no encontrada", el enlace debe ser serverfault.com/questions/454127/…
Tim
Entonces, ¿qué representan las "claves" y los "valores" en la base de datos? Si entiendo el comentario de Stephen Kitt unix.stackexchange.com/questions/379725/… correctamente, la base de datos no es clave-valor.
Tim

Respuestas:

29

Las implementaciones de locate/ updatedbgeneralmente usan bases de datos específicas adaptadas a sus requisitos, en lugar de un motor de base de datos genérico. Encontrará esas bases de datos específicas documentadas por cada implementación; por ejemplo:

  • GNU findutils'está documentado en locatedb(5), y es prácticamente solo una lista de archivos (con un algoritmo de compresión específico);
  • mlocate's está documentado en mlocate.db(5), y también puede considerarse una lista de directorios y archivos (con metadatos).
Stephen Kitt
fuente
Gracias. ¿Dónde y cómo puedo aprender los principios de diseño e implementación de bases de datos específicas adaptadas a requisitos específicos? Agradecería cualquier referencia para leer.
Tim
11
El diseño de bases de datos se reduce a diseñar estructuras de datos, así que aprenda sobre ellas y luego sobre las compensaciones de diseño de tamaño versus velocidad ... No sé de un recurso específico que sería bueno, tal vez algo como Programming Pearls sería Una buena introducción a la forma de pensar sobre estos temas (y no pensar demasiado en ellos también).
Stephen Kitt
Gracias. Aprendí algo sobre las estructuras de datos, y la siguiente pregunta sería encontrar referencias y formas de pasar de las estructuras de datos a las bases de datos.
Tim
2
Las bases de datos utilizadas por ellos locateson solo estructuras de datos almacenadas en el disco, por lo que pasar de las estructuras de datos a las bases de datos correspondientes es relativamente sencillo. Pasar a las bases de datos cuando su pregunta las presente es otra cosa completamente diferente; Hay libros y cursos dedicados a esos temas. Diseñar y desarrollar un sistema de administración de bases de datos como MongoDB o PostgreSQL es uno de los problemas más difíciles en la ciencia de la computación y la ingeniería de software hoy en día, especialmente cuando se incluye el lado distribuido de las cosas.
Stephen Kitt
2
He hecho bastante con ubicaciónb & mlocate.db a lo largo de los años. Originalmente tenía código perl para generar un b localizado para mi dlocateprograma en Debian. Terminé descubriendo que simplemente agrupar un archivo de texto era muchas veces más rápido que buscar en un ubicaciónb, y dado el tamaño de los discos en estos días, el ahorro de tamaño de archivo era insignificante. Así que me cambié a grep. También tengo un trabajo cron local que volca mlocate.db en texto sin formato después de que se ejecuta el trabajo cron mlocate, que busco con un qlocatescript de shell local ... mucho más rápido que la ejecución mlocatey también tiene algunas opciones adicionales útiles.
cas
13

Parece ser un archivo plano de estructuras C, escritas / leídas usando las macros OBSTACKS de Gnu LibC

Ver fuentes

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

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

Podrías obtener algo similar con

find / -xdev -type f -not -path \*\.git\/\* | gzip -9 > /tmp/files.gz
zgrep file_i_want /tmp/files.gz
jmullee
fuente
2
Gracias. ¿Qué están haciendo los dos comandos al final?
Tim
2
El comando @Tim First está buscando el sistema de archivos ( find) desde el /directorio raíz ( ), sin descender a directorios en otros sistemas de archivos ( -xdev), archivos normales ( -type f), no en *.gitdirectorios ( -not -path \*\.git\/\*). Comprime output ( | gzip -9) y lo guarda en archivo /tmp/files.gz( > /tmp/files.gz). La siguiente línea está buscando el zgreparchivo file_i_wantdentro del archivo comprimido/tmp/files.gz
piotrekkr
2

Por lo que sé, detrás está Berkeley DB, que es una base de datos clave / valor sin demonio. Sigue el enlace para más información. Extracto de Wikipedia:

Berkeley DB (BDB) es una biblioteca de software destinada a proporcionar una base de datos integrada de alto rendimiento para datos de clave / valor. Berkeley DB está escrito en C con enlaces de API para C ++, C #, Java, Perl, PHP, Python, Ruby, Smalltalk, Tcl y muchos otros lenguajes de programación. BDB almacena pares de claves / datos arbitrarios como conjuntos de bytes, y admite múltiples elementos de datos para una sola clave. Berkeley DB no es una base de datos relacional.

La ubicación de la base de datos en RHEL / CentOS es /var/lib/mlocate/mlocate.db(no estoy seguro acerca de las otras distribuciones). El comando locate --statisticsle dará información sobre la ubicación y algunas estadísticas de la base de datos (ejemplo):

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 el formato mlocate, aquí está la página principal:

Una base de datos mlocate comienza con un encabezado de archivo: 8 bytes para un número mágico ("\ 0mlocate" como un literal C), 4 bytes para el tamaño del bloque de configuración en big endian, 1 byte para la versión de formato de archivo (0), 1 byte para el indicador de "requerir visibilidad" (0 o 1), relleno de 2 bytes y un nombre de ruta terminado en NUL de la raíz de la base de datos.

El encabezado va seguido de un bloque de configuración, incluido para garantizar que las bases de datos no se reutilicen si algunos cambios de configuración pueden afectar su contenido. El tamaño del bloque de configuración en bytes se almacena en el encabezado del archivo. El bloque de configuración es una secuencia de asignaciones de variables, ordenadas por nombre de variable. Cada asignación variable consta de un nombre de variable terminado en NUL y una lista ordenada de valores terminados en NUL. La lista de valores termina con un carácter NUL más. El orden utilizado está definido por la función strcmp ().

Romeo Ninov
fuente
2
Depende de la implementación de locate/ updatedb...
Stephen Kitt
2
mlocatedefinitivamente no usa Berkeley DB.
Stephen Kitt
1
¿Tiene alguna fuente que respalde su reclamo de BerkeleyDB? La segunda parte de su respuesta lo contradice.
Mat