diff --git a/src/common/namedb/namedb.h b/src/common/namedb/namedb.h
index 10d2cdd53540d6798b82244ae166f28188af3a1b..e3017079b772f4433eda44b18a78c111df929f28 100644
--- a/src/common/namedb/namedb.h
+++ b/src/common/namedb/namedb.h
@@ -42,7 +42,7 @@ struct namedb_api {
 
 	/* Context operations */
 
-	knot_namedb_t *(*init)(const char *handle, mm_ctx_t *mm);
+	knot_namedb_t *(*init)(const char *config, mm_ctx_t *mm);
 	void (*deinit)(knot_namedb_t *db);
 
 	/* Transactions */
diff --git a/src/common/namedb/namedb_lmdb.c b/src/common/namedb/namedb_lmdb.c
index 5e0b4ae4d34d68154ef25ceda7e6729a9c0c52e7..25f4acca54557a6a7fbffa32dc2a3d4b6faff02c 100644
--- a/src/common/namedb/namedb_lmdb.c
+++ b/src/common/namedb/namedb_lmdb.c
@@ -17,10 +17,14 @@
 #ifdef HAVE_LMDB
 
 #include <lmdb.h>
+#include <sys/stat.h>
 
 #include "common/namedb/namedb_lmdb.h"
 #include "libknot/errcode.h"
 
+#define LMDB_DIR_MODE 0770
+#define LMDB_FILE_MODE 0660
+
 struct lmdb_env
 {
 	MDB_dbi dbi;
@@ -28,14 +32,30 @@ struct lmdb_env
 	mm_ctx_t *pool;
 };
 
-static int dbase_open(struct lmdb_env *env, const char *handle)
+static int create_env_dir(const char *path)
+{
+	int r = mkdir(path, LMDB_DIR_MODE);
+	if (r == -1 && errno != EEXIST) {
+		return knot_errno_to_error(errno);
+	}
+
+	return KNOT_EOK;
+}
+
+static int dbase_open(struct lmdb_env *env, const char *path)
 {
 	int ret = mdb_env_create(&env->env);
 	if (ret != 0) {
 		return ret;
 	}
 
-	ret = mdb_env_open(env->env, handle, 0, 0644);
+	ret = create_env_dir(path);
+	if (ret != KNOT_EOK) {
+		mdb_env_close(env->env);
+		return ret;
+	}
+
+	ret = mdb_env_open(env->env, path, 0, LMDB_FILE_MODE);
 	if (ret != 0) {
 		mdb_env_close(env->env);
 		return ret;
@@ -70,7 +90,7 @@ static void dbase_close(struct lmdb_env *env)
 	mdb_env_close(env->env);
 }
 
-static knot_namedb_t *init(const char *handle, mm_ctx_t *mm)
+static knot_namedb_t *init(const char *config, mm_ctx_t *mm)
 {
 	struct lmdb_env *env = mm_alloc(mm, sizeof(struct lmdb_env));
 	if (env == NULL) {
@@ -78,7 +98,7 @@ static knot_namedb_t *init(const char *handle, mm_ctx_t *mm)
 	}
 	memset(env, 0, sizeof(struct lmdb_env));
 
-	int ret = dbase_open(env, handle);
+	int ret = dbase_open(env, config);
 	if (ret != 0) {
 		mm_free(mm, env);
 		return NULL;
diff --git a/src/knot/zone/timers.c b/src/knot/zone/timers.c
index 9492eb12065f0748a9f39eb863ef45bd74144e42..63c9ce1d1e16a3fc25645239b1ab5dbcff6c9065 100644
--- a/src/knot/zone/timers.c
+++ b/src/knot/zone/timers.c
@@ -15,6 +15,7 @@
  */
 
 #include "libknot/dname.h"
+#include "common/mem.h"
 #include "common/namedb/namedb.h"
 #include "common/namedb/namedb_lmdb.h"
 #include "knot/zone/timers.h"
@@ -125,7 +126,16 @@ knot_namedb_t *open_timers_db(const char *storage)
 	// No-op if we don't have lmdb, all other operations will no-op as well then
 	return NULL;
 #else
-	return namedb_lmdb_api()->init(storage, NULL);
+	char *path = sprintf_alloc("%s/timers", storage);
+	if (!path) {
+		return NULL;
+	}
+
+	knot_namedb_t *db = namedb_lmdb_api()->init(path, NULL);
+
+	free(path);
+
+	return db;
 #endif
 }