diff --git a/leveldb/batch.go b/leveldb/batch.go
index 407bc72..548f25d 100644
--- a/leveldb/batch.go
+++ b/leveldb/batch.go
@@ -7,7 +7,6 @@
 package leveldb
 
 import (
-	"bufio"
 	"encoding/binary"
 	"fmt"
 	"io"
@@ -308,96 +307,6 @@
 	return
 }
 
-func readBatch(br *bufio.Reader, fn func(i int, kt keyType, k, v []byte) error) error {
-	var k, v []byte
-	for i := 0; ; i++ {
-		// Key type.
-		c, err := br.ReadByte()
-		if err != nil {
-			if err == io.EOF {
-				err = nil
-			}
-			return err
-		}
-		kt := keyType(c)
-		if kt > keyTypeVal {
-			return newErrBatchCorrupted(fmt.Sprintf("bad record: invalid type %#x", uint(kt)))
-		}
-
-		// Key.
-		x, err := binary.ReadUvarint(br)
-		if err == nil {
-			k = ensureBuffer(k, int(x))
-			_, err = io.ReadFull(br, k)
-		}
-		if err != nil {
-			if err == io.ErrUnexpectedEOF {
-				err = newErrBatchCorrupted("bad record: invalid key length")
-			}
-			return err
-		}
-
-		// Value.
-		if kt == keyTypeVal {
-			x, err = binary.ReadUvarint(br)
-			if err == nil {
-				v = ensureBuffer(v, int(x))
-				_, err = io.ReadFull(br, v)
-			}
-			if err != nil {
-				if err == io.ErrUnexpectedEOF {
-					err = newErrBatchCorrupted("bad record: invalid value length")
-				}
-				return err
-			}
-
-			if err := fn(i, kt, k, v); err != nil {
-				return err
-			}
-		} else {
-			if err := fn(i, kt, k, nil); err != nil {
-				return err
-			}
-		}
-	}
-	return nil
-}
-
-func readBatchToMem(br *bufio.Reader, expectSeq uint64, mdb *memdb.DB) (seq uint64, batchLen int, err error) {
-	header, err := br.Peek(batchHeaderLen)
-	if err != nil && err != io.EOF {
-		// Let's decodeBatchHeader returns "too short" error.
-		return 0, 0, err
-	}
-	seq, batchLen, err = decodeBatchHeader(header)
-	if err != nil {
-		return 0, 0, err
-	}
-	if seq < expectSeq {
-		return 0, 0, newErrBatchCorrupted("invalid sequence number")
-	}
-	// Discard is guaranteed to succeed without reading from the underlying
-	// io.Reader.
-	br.Discard(batchHeaderLen)
-	var ik []byte
-	var decodedLen int
-	err = readBatch(br, func(i int, kt keyType, k, v []byte) error {
-		if i >= batchLen {
-			return newErrBatchCorrupted("invalid records length")
-		}
-		ik = makeInternalKey(ik, k, seq+uint64(i), kt)
-		if err := mdb.Put(ik, v); err != nil {
-			return err
-		}
-		decodedLen++
-		return nil
-	})
-	if err == nil && decodedLen != batchLen {
-		err = newErrBatchCorrupted(fmt.Sprintf("invalid records length: %d vs %d", batchLen, decodedLen))
-	}
-	return
-}
-
 func encodeBatchHeader(dst []byte, seq uint64, batchLen int) []byte {
 	dst = ensureBuffer(dst, batchHeaderLen)
 	binary.LittleEndian.PutUint64(dst, seq)
diff --git a/leveldb/batch_test.go b/leveldb/batch_test.go
index b37ed7c..62775f7 100644
--- a/leveldb/batch_test.go
+++ b/leveldb/batch_test.go
@@ -7,7 +7,6 @@
 package leveldb
 
 import (
-	"bufio"
 	"bytes"
 	"fmt"
 	"testing"
@@ -82,10 +81,6 @@
 				t.Logf("batch.replayInternal: %v", err)
 				return false
 			}
-			if err := readBatch(bufio.NewReader(bytes.NewReader(batch.data)), testBatch); err != nil {
-				t.Logf("readBatch: %v", err)
-				return false
-			}
 
 			abatch.append(rbatch)
 			rbatch.Reset()
