diff --git a/src/core/config/mod.rs b/src/core/config/mod.rs
index d2d583a8..d8e1c7d9 100644
--- a/src/core/config/mod.rs
+++ b/src/core/config/mod.rs
@@ -236,6 +236,8 @@ pub struct Config {
 	#[serde(default)]
 	pub rocksdb_read_only: bool,
 	#[serde(default)]
+	pub rocksdb_secondary: bool,
+	#[serde(default)]
 	pub rocksdb_compaction_prio_idle: bool,
 	#[serde(default = "true_fn")]
 	pub rocksdb_compaction_ioprio_idle: bool,
@@ -752,6 +754,7 @@ impl fmt::Display for Config {
 		line("RocksDB Recovery Mode", &self.rocksdb_recovery_mode.to_string());
 		line("RocksDB Repair Mode", &self.rocksdb_repair.to_string());
 		line("RocksDB Read-only Mode", &self.rocksdb_read_only.to_string());
+		line("RocksDB Secondary Mode", &self.rocksdb_secondary.to_string());
 		line(
 			"RocksDB Compaction Idle Priority",
 			&self.rocksdb_compaction_prio_idle.to_string(),
diff --git a/src/database/database.rs b/src/database/database.rs
index ac6f62e9..4c29c840 100644
--- a/src/database/database.rs
+++ b/src/database/database.rs
@@ -38,6 +38,14 @@ impl Database {
 
 	#[inline]
 	pub fn iter_maps(&self) -> impl Iterator<Item = (&MapsKey, &MapsVal)> + Send + '_ { self.map.iter() }
+
+	#[inline]
+	#[must_use]
+	pub fn is_read_only(&self) -> bool { self.db.secondary || self.db.read_only }
+
+	#[inline]
+	#[must_use]
+	pub fn is_secondary(&self) -> bool { self.db.secondary }
 }
 
 impl Index<&str> for Database {
diff --git a/src/database/engine.rs b/src/database/engine.rs
index edf077fc..99d971ed 100644
--- a/src/database/engine.rs
+++ b/src/database/engine.rs
@@ -28,6 +28,8 @@ pub struct Engine {
 	cfs: Mutex<BTreeSet<String>>,
 	pub(crate) db: Db,
 	corks: AtomicU32,
+	pub(super) read_only: bool,
+	pub(super) secondary: bool,
 }
 
 pub(crate) type Db = DBWithThreadMode<MultiThreaded>;
@@ -80,10 +82,13 @@ impl Engine {
 			.collect::<Vec<_>>();
 
 		debug!("Opening database...");
+		let path = &config.database_path;
 		let res = if config.rocksdb_read_only {
-			Db::open_cf_for_read_only(&db_opts, &config.database_path, cfs.clone(), false)
+			Db::open_cf_descriptors_read_only(&db_opts, path, cfds, false)
+		} else if config.rocksdb_secondary {
+			Db::open_cf_descriptors_as_secondary(&db_opts, path, path, cfds)
 		} else {
-			Db::open_cf_descriptors(&db_opts, &config.database_path, cfds)
+			Db::open_cf_descriptors(&db_opts, path, cfds)
 		};
 
 		let db = res.or_else(or_else)?;
@@ -103,6 +108,8 @@ impl Engine {
 			cfs: Mutex::new(cfs),
 			db,
 			corks: AtomicU32::new(0),
+			read_only: config.rocksdb_read_only,
+			secondary: config.rocksdb_secondary,
 		}))
 	}
 
diff --git a/src/service/emergency/mod.rs b/src/service/emergency/mod.rs
index 98020bc2..c99a0891 100644
--- a/src/service/emergency/mod.rs
+++ b/src/service/emergency/mod.rs
@@ -32,6 +32,10 @@ impl crate::Service for Service {
 	}
 
 	async fn worker(self: Arc<Self>) -> Result<()> {
+		if self.services.globals.is_read_only() {
+			return Ok(());
+		}
+
 		self.set_emergency_access()
 			.await
 			.inspect_err(|e| error!("Could not set the configured emergency password for the conduit user: {e}"))?;
diff --git a/src/service/globals/mod.rs b/src/service/globals/mod.rs
index f777901f..f24e8a27 100644
--- a/src/service/globals/mod.rs
+++ b/src/service/globals/mod.rs
@@ -329,4 +329,7 @@ impl Service {
 
 	#[inline]
 	pub fn server_is_ours(&self, server_name: &ServerName) -> bool { server_name == self.config.server_name }
+
+	#[inline]
+	pub fn is_read_only(&self) -> bool { self.db.db.is_read_only() }
 }