61

I have a set of Berkeley DB files on my Linux file system that I'd like to examine.

What useful tools exist for getting a quick overview of the contents? I can write Perl scripts that use BDB modules for examining them, but I'm looking for some CLI utility to be able to take a look inside without having to start writing scripts.

mercutio
  • 22,151
  • 10
  • 36
  • 37

9 Answers9

61

Use the db_dump program. It is contained in the package core/db (Arch), db-util (Debian, Ubuntu), sys-libs/db (Gentoo, note that here the binary is called db4.8_dump or whatever version you are using).

On some systems the man pages are not installed, in that case the documentation can be found here. By default, db_dump outputs some hex numbers, which is not really useful if you are trying to analyse the content of a database. Use the -p argument to change this.

Show everything that’s in the file database.db:

db_dump -p database.db

List the databases in the file database.db:

db_dump -l database.db

Show only the content of the database mydb in the file database.db:

db_dump -p -s mydb database.db
cdauth
  • 6,171
  • 3
  • 41
  • 49
27

Check out the db-utils package. If you use apt, you can install it with the following: apt-get install db-util (or apt-get install db4.8-util or whatever version you have or prefer.)

Additional links:

peval27
  • 1,239
  • 2
  • 14
  • 40
David Crow
  • 16,077
  • 8
  • 42
  • 34
  • 6
    An example of how to make sense of the output of db4.8_dump or whatever from that package would be handy. The output format isn't even described in the dump man page itself, and even that doesn't describe 'bytevalue' format or whatever it is..... For prettier output without needing to find and install a package, see the answers using python, e.g. by trjh. – nealmcb Nov 04 '14 at 22:37
  • 3
    my package was names by `db-util` – user123456 Nov 04 '16 at 14:13
16

I found @strickli's answer to be the most helpful, as I didn't want to add any new packages to the machine with the database I was on. However, the db file I was reading was of type btree, not hash, so I had to use bsddb

# file foo.db
foo.db: Berkeley DB (Btree, version 9, native byte-order)

# python
>>> import bsddb
>>> for k, v in bsddb.btopen("*<db filename here...>*").iteritems():
...     print k,v
...
Stefan
  • 171
  • 1
  • 13
trjh
  • 169
  • 1
  • 4
10

As mentioned in the other answers, the db-utils package (db4-utils under RHEL) has some tools. However, db_dump can be unhelpful, since the output is 'bytevalue' format.

For a quick'n'dirty viewer, use python:

me@machine$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
>>> import dbhash
>>> for k, v in dbhash.open( *<db filename here...>* ).iteritems(): print k, v
...

Note that dbhash is deprecated since python 2.6.

strickli
  • 1,581
  • 1
  • 12
  • 7
6

Once you have installed the db utils you can simple do a db_dump on the db file.

Gunnarsson
  • 538
  • 5
  • 5
6

The db_hotbackup utility creates "hot backup" or "hot failover" snapshots of Berkeley DB database environments. Install it with the following

apt-get install db-util

then run following command to take hot backup

db_hotbackup [-cDEguVv] [-d data_dir ...] [-h home] [-l log_dir] [-P password] -b backup_dir

Ishtiaq Ahmed
  • 61
  • 1
  • 1
4

Note that the initial answer says to use "db-utils" package, but the example shows the correct "db-util" package. (with no "s")

1

Under Amazon Linux you can install it with:

yum install db43-utils

Dan Herman
  • 1,395
  • 1
  • 15
  • 26
1

Python 3

from bsddb3 import db
import collections
d = db.DB()
d.open('./file.dat', 'dbname', db.DB_BTREE, db.DB_THREAD | db.DB_RDONLY)
d.keys()
collections.OrderedDict((k, d[k]) for k in d.keys())
kenorb
  • 155,785
  • 88
  • 678
  • 743