MongoDB报错:主机未启用日志时无法使用'j'选项问题排查
问题:MongoDB部署测试环境时出现journaling相关错误
错误信息
com.mongodb.MongoCommandException: Command failed with error 2 (BadValue): 'cannot use 'j' option when a host does not have journaling enabled' on server localhost:34653. The full response is {"ok": 0.0, "errmsg": "cannot use 'j' option when a host does not have journaling enabled", "code": 2, "codeName": "BadValue"}
完整堆栈跟踪
Caused by: com.mongodb.MongoCommandException: Command failed with error 2 (BadValue): 'cannot use 'j' option when a host does not have journaling enabled' on server localhost:34653. The full response is {"ok": 0.0, "errmsg": "cannot use 'j' option when a host does not have journaling enabled", "code": 2, "codeName": "BadValue"} at com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:175) at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:303) at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:259) at com.mongodb.internal.connection.UsageTrackingInternalConnection.sendAndReceive(UsageTrackingInternalConnection.java:99) at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.sendAndReceive(DefaultConnectionPool.java:450) at com.mongodb.internal.connection.CommandProtocolImpl.execute(CommandProtocolImpl.java:72) at com.mongodb.internal.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:218) at com.mongodb.internal.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:269) at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:131) at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:123) at com.mongodb.operation.CommandOperationHelper.executeWriteCommand(CommandOperationHelper.java:369) at com.mongodb.operation.CommandOperationHelper.executeWriteCommand(CommandOperationHelper.java:360) at com.mongodb.operation.CommandOperationHelper.executeCommand(CommandOperationHelper.java:284) at com.mongodb.operation.CommandOperationHelper.executeCommand(CommandOperationHelper.java:277) at com.mongodb.operation.CreateIndexesOperation$1.call(CreateIndexesOperation.java:177) at com.mongodb.operation.CreateIndexesOperation$1.call(CreateIndexesOperation.java:172) at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:530) at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:492) at com.mongodb.operation.CreateIndexesOperation.execute(CreateIndexesOperation.java:172) at com.mongodb.operation.CreateIndexesOperation.execute(CreateIndexesOperation.java:72) at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:206) at com.mongodb.client.internal.MongoCollectionImpl.executeCreateIndexes(MongoCollectionImpl.java:886) at com.mongodb.client.internal.MongoCollectionImpl.createIndexes(MongoCollectionImpl.java:869) at com.mongodb.client.internal.MongoCollectionImpl.createIndexes(MongoCollectionImpl.java:864) at com.mongodb.client.internal.MongoCollectionImpl.createIndex(MongoCollectionImpl.java:849) at com.github.cloudyrock.mongock.driver.mongodb.sync.v4.repository.MongoSync4RepositoryBase.createRequiredUniqueIndex(MongoSync4RepositoryBase.java:99) at com.github.cloudyrock.mongock.driver.mongodb.sync.v4.repository.MongoSync4RepositoryBase.ensureIndex(MongoSync4RepositoryBase.java:58) at com.github.cloudyrock.mongock.driver.mongodb.sync.v4.repository.MongoSync4RepositoryBase.initialize(MongoSync4RepositoryBase.java:43) at com.github.cloudyrock.mongock.driver.core.driver.ConnectionDriverBase.initialize(ConnectionDriverBase.java:40) at com.github.cloudyrock.mongock.runner.core.executor.MigrationExecutor.initializationAndValidation(MigrationExecutor.java:225) at com.github.cloudyrock.spring.v5.core.SpringMigrationExecutor.initializationAndValidation(SpringMigrationExecutor.java:31) at com.github.cloudyrock.mongock.runner.core.executor.MigrationExecutor.executeMigration(MigrationExecutor.java:63) at com.github.cloudyrock.spring.v5.core.SpringMigrationExecutor.executeMigration(SpringMigrationExecutor.java:37) at com.github.cloudyrock.mongock.runner.core.executor.MongockRunnerBase.execute(MongockRunnerBase.java:53) ... 49 common frames omitted
依赖配置
<dependency> <groupId>com.github.cloudyrock.mongock</groupId> <artifactId>mongock-bom</artifactId> <version>4.3.8</version> <type>pom</type> <scope>import</scope> </dependency>
<dependency> <groupId>com.github.cloudyrock.mongock</groupId> <artifactId>mongock-spring-v5</artifactId> </dependency> <dependency> <groupId>com.github.cloudyrock.mongock</groupId> <artifactId>mongodb-springdata-v3-driver</artifactId> </dependency>
Mongock配置
@Bean public MongockSpring5.MongockApplicationRunner mongockApplicationRunner( ApplicationContext springContext, MongoTemplate mongoTemplate) { log.debug("Configuring Mongock"); return MongockSpring5.builder() .setDriver(SpringDataMongoV3Driver.withDefaultLock(mongoTemplate)) // package to scan for migrations .addChangeLogsScanPackage("ru.fabit.visor.config.dbmigrations") .setSpringContext(springContext) .setEnabled(true) .buildApplicationRunner(); }
已尝试操作
- 执行
mongod --journal命令临时启动MongoDB,但问题未解决
解决方案
方案1:永久开启MongoDB的journaling功能
测试环境的MongoDB可能未通过配置文件启用journaling,临时执行mongod --journal仅对当前启动实例生效,服务重启后会恢复原有配置。
- 找到MongoDB的配置文件(通常名为
mongod.conf,路径可能是/etc/mongod.conf或自定义路径) - 在配置文件中添加或修改以下配置:
storage: journal: enabled: true - 重启MongoDB服务,确保配置生效
- 验证journaling状态:登录MongoDB Shell,执行
db.serverStatus().journaling,返回{ enabled: true }即为开启成功
方案2:修改Mongock配置,禁用write concern的j选项
Mongock默认可能使用了包含j: true的write concern(要求操作写入journal),而测试环境MongoDB未开启journaling导致冲突。可以通过配置Mongock使用不依赖journal的write concern:
修改Mongock的Bean配置,在driver中设置WriteConcern:
@Bean public MongockSpring5.MongockApplicationRunner mongockApplicationRunner( ApplicationContext springContext, MongoTemplate mongoTemplate) { log.debug("Configuring Mongock"); // 初始化driver并设置不依赖journal的write concern SpringDataMongoV3Driver driver = SpringDataMongoV3Driver.withDefaultLock(mongoTemplate); driver.setWriteConcern(WriteConcern.ACKNOWLEDGED); // 仅要求MongoDB确认操作接收 return MongockSpring5.builder() .setDriver(driver) .addChangeLogsScanPackage("ru.fabit.visor.config.dbmigrations") .setSpringContext(springContext) .setEnabled(true) .buildApplicationRunner(); }
说明:开发环境正常是因为默认安装的MongoDB通常会自动开启journaling,而测试环境可能为了性能或其他原因手动关闭了该功能。
内容的提问来源于stack exchange,提问作者Шатов Данил
相关产品推荐
相关产品推荐

