Is there any tools or code to read dgraph badger files?

I want to make the binary data in vlog or sst human readable .
Then I can use it to do some check or help me find bugs .
Is there any tools or sample code or docs to make do this?
just like readelf for elffile.

Hi @BlankRain, you may want to look at badger info command.

okay, I will try later .

Thank you. It’s nice.

@Naman Is there anyway to know the data type of my data stored in badger? It’s all bytes.

[2020-09-28T17:26:47+08:00] MANIFEST       94 B MA
[        3 minutes earlier] 000004.sst    966 B L1 
[                      now] 000000.vlog  2.8 kB VL

[2020-09-28T17:22:48+08:00] KEYREGISTRY    28 B

Level 0 size:          0 B
Level 1 size:        966 B
Total index size:    966 B
Value log size:     2.8 kB

1 extra file.
0 missing files.
0 empty files.
0 truncated manifests.
badger 2020/09/30 12:09:23 INFO: All 1 tables opened in 2ms
badger 2020/09/30 12:09:23 INFO: Replaying file id: 0 at offset: 2783
badger 2020/09/30 12:09:23 INFO: Replay took: 8.656µs

SSTable [Li, Id, Total Keys including internal keys] [Left Key, Version -> Right Key, Version]
SSTable [L1, 004, 0000028] [0000000000000001000000000000000000000000, v2 ->         726166746964, v1]

key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", version=2, meta=40	size: 26	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", version=3, meta=40	size: 61	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", version=4, meta=40	size: 26	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03", version=5, meta=40	size: 90	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", version=6, meta=40	size: 72	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05", version=7, meta=40	size: 84	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06", version=8, meta=40	size: 90	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a", version=9, meta=40	size: 56	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b", version=10, meta=40	size: 69	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t", version=11, meta=40	size: 80	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n", version=12, meta=40	size: 76	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\v", version=15, meta=40	size: 26	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\f", version=16, meta=40	size: 88	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r", version=17, meta=40	size: 90	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e", version=18, meta=40	size: 56	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f", version=19, meta=40	size: 56	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", version=20, meta=40	size: 63	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11", version=21, meta=40	size: 60	meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01hs\x00\x00\x00\x00", version=21, meta=40	size: 20	meta: b0000
key="raftid", version=1, meta=40	size: 14	meta: b0000

Total Number of keys: 20

In badger, we put bytes to bytes.

    txn := db.NewTransaction(true)
	defer txn.Discard()
	// Use the transaction...
	err := txn.Set([]byte(key), []byte(value))

If the key is string ,like “raftid”, it’s nice to read, However, if It’s bytes created by binary.BigEndian.PutUint32(b[0:8], uint32(value)) or something else. It’s not easy to read.

It can convert the bytes to a string or an int.
Question A: How can I get the final type of the data in badger?
Question B: what’s the data in p, zw ,w ?

I want to make a dgraph viewer in key-value level.

You cannot. Badger is a key-value store and does not store the type info. To it every key is a byte.

zw directory stores the RAFT information for zero while w stores the same for alpha. Dgraph stores the data in form of posting lists in the p directory.

That’s great!! To learn about posting lists, you might want to look at Data Storage section in Dgraph paper. Copying from paper, here is an example

<0x01> <follower> <0xab> .
<0x01> <follower> <0xbc> .
<0x01> <follower> <0xcd> .
key = <follower, 0x01>
value = <0xab, 0xbc, 0xcd, ...>

Feel free for follow up questions.

okay, Thank you. I will try it later.

I find dgraph debug can read and print the key-values in badger.
p is posting
w is write ahead log for alpha
zw is write ahead log for zero

It’s a nice tool.