diff --git a/bucket_test.go b/bucket_test.go
index 66f9a1f..30b5b88 100644
--- a/bucket_test.go
+++ b/bucket_test.go
@@ -5,8 +5,6 @@ import (
 	"encoding/binary"
 	"errors"
 	"fmt"
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
 	"log"
 	"math/rand"
 	"os"
@@ -15,6 +13,8 @@ import (
 	"testing"
 	"testing/quick"
 
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
 	bolt "go.etcd.io/bbolt"
 )
 
diff --git a/cmd/bbolt/main.go b/cmd/bbolt/main.go
index 0dba9de..26a1313 100644
--- a/cmd/bbolt/main.go
+++ b/cmd/bbolt/main.go
@@ -202,7 +202,7 @@ func (cmd *CheckCommand) Run(args ...string) error {
 	}
 
 	// Open database.
-	db, err := bolt.Open(path, 0666, nil)
+	db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
 	if err != nil {
 		return err
 	}
@@ -279,7 +279,7 @@ func (cmd *InfoCommand) Run(args ...string) error {
 	}
 
 	// Open the database.
-	db, err := bolt.Open(path, 0666, nil)
+	db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
 	if err != nil {
 		return err
 	}
@@ -651,7 +651,7 @@ func (cmd *PagesCommand) Run(args ...string) error {
 	}
 
 	// Open database.
-	db, err := bolt.Open(path, 0666, nil)
+	db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
 	if err != nil {
 		return err
 	}
@@ -745,7 +745,7 @@ func (cmd *StatsCommand) Run(args ...string) error {
 	}
 
 	// Open database.
-	db, err := bolt.Open(path, 0666, nil)
+	db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
 	if err != nil {
 		return err
 	}
@@ -880,7 +880,7 @@ func (cmd *BucketsCommand) Run(args ...string) error {
 	}
 
 	// Open database.
-	db, err := bolt.Open(path, 0666, nil)
+	db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
 	if err != nil {
 		return err
 	}
@@ -945,7 +945,7 @@ func (cmd *KeysCommand) Run(args ...string) error {
 	}
 
 	// Open database.
-	db, err := bolt.Open(path, 0666, nil)
+	db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
 	if err != nil {
 		return err
 	}
@@ -1040,7 +1040,7 @@ func (cmd *GetCommand) Run(args ...string) error {
 	}
 
 	// Open database.
-	db, err := bolt.Open(path, 0666, nil)
+	db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
 	if err != nil {
 		return err
 	}
diff --git a/cmd/bbolt/main_test.go b/cmd/bbolt/main_test.go
index 4ea1a12..f656980 100644
--- a/cmd/bbolt/main_test.go
+++ b/cmd/bbolt/main_test.go
@@ -11,6 +11,7 @@ import (
 	"strconv"
 	"testing"
 
+	"github.com/stretchr/testify/require"
 	bolt "go.etcd.io/bbolt"
 	main "go.etcd.io/bbolt/cmd/bbolt"
 )
@@ -21,6 +22,8 @@ func TestInfoCommand_Run(t *testing.T) {
 	db.DB.Close()
 	defer db.Close()
 
+	defer requireDBNoChange(t, dbData(t, db.Path), db.Path)
+
 	// Run the info command.
 	m := NewMain()
 	if err := m.Run("info", db.Path); err != nil {
@@ -39,6 +42,8 @@ func TestStatsCommand_Run_EmptyDatabase(t *testing.T) {
 	defer db.Close()
 	db.DB.Close()
 
+	defer requireDBNoChange(t, dbData(t, db.Path), db.Path)
+
 	// Generate expected result.
 	exp := "Aggregate statistics for 0 buckets\n\n" +
 		"Page count statistics\n" +
@@ -116,6 +121,8 @@ func TestStatsCommand_Run(t *testing.T) {
 	}
 	db.DB.Close()
 
+	defer requireDBNoChange(t, dbData(t, db.Path), db.Path)
+
 	// Generate expected result.
 	exp := "Aggregate statistics for 3 buckets\n\n" +
 		"Page count statistics\n" +
@@ -163,6 +170,8 @@ func TestBucketsCommand_Run(t *testing.T) {
 	}
 	db.DB.Close()
 
+	defer requireDBNoChange(t, dbData(t, db.Path), db.Path)
+
 	expected := "bar\nbaz\nfoo\n"
 
 	// Run the command.
@@ -198,6 +207,8 @@ func TestKeysCommand_Run(t *testing.T) {
 	}
 	db.DB.Close()
 
+	defer requireDBNoChange(t, dbData(t, db.Path), db.Path)
+
 	expected := "foo-0\nfoo-1\nfoo-2\n"
 
 	// Run the command.
@@ -234,6 +245,8 @@ func TestGetCommand_Run(t *testing.T) {
 	}
 	db.DB.Close()
 
+	defer requireDBNoChange(t, dbData(t, db.Path), db.Path)
+
 	expected := "val-foo-1\n"
 
 	// Run the command.
@@ -420,7 +433,7 @@ func fillBucket(b *bolt.Bucket, prefix []byte) error {
 }
 
 func chkdb(path string) ([]byte, error) {
-	db, err := bolt.Open(path, 0666, nil)
+	db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
 	if err != nil {
 		return nil, err
 	}
@@ -453,3 +466,17 @@ func walkBucket(parent *bolt.Bucket, k []byte, v []byte, w io.Writer) error {
 		return walkBucket(parent, k, v, w)
 	})
 }
+
+func dbData(t *testing.T, filePath string) []byte {
+	data, err := os.ReadFile(filePath)
+	require.NoError(t, err)
+	return data
+}
+
+func requireDBNoChange(t *testing.T, oldData []byte, filePath string) {
+	newData, err := os.ReadFile(filePath)
+	require.NoError(t, err)
+
+	noChange := bytes.Equal(oldData, newData)
+	require.True(t, noChange)
+}
diff --git a/db.go b/db.go
index 328b2ce..e462f8a 100644
--- a/db.go
+++ b/db.go
@@ -4,7 +4,6 @@ import (
 	"errors"
 	"fmt"
 	"hash/fnv"
-	"log"
 	"os"
 	"runtime"
 	"sort"
@@ -555,7 +554,7 @@ func (db *DB) close() error {
 		if !db.readOnly {
 			// Unlock the file.
 			if err := funlock(db); err != nil {
-				log.Printf("bolt.Close(): funlock error: %s", err)
+				return fmt.Errorf("bolt.Close(): funlock error: %w", err)
 			}
 		}