MongoDB副本集停实例后执行rs.status()报BSON UTF-8错误
解决MongoDB副本集单实例停止后rs.status()报BSON UTF-8错误的问题
检查副本集实例日志
停止的实例可能在关闭过程中写入了含非UTF-8字符的元数据,导致副本集状态文档异常。前往各实例的日志目录(如指定的--dbpath路径下的mongod.log),搜索BSON或UTF-8相关报错,定位出问题的节点和具体字段。手动修复副本集配置文档
登录存活的主节点,执行rs.conf()查看配置,检查members数组中对应停止节点的host、tags等字段是否存在非UTF-8字符。若发现异常,通过rs.reconfig()修正:var cfg = rs.conf(); // 示例:修正索引为2的节点host字段 cfg.members[2].host = "127.0.0.1:27019"; rs.reconfig(cfg);若主节点不可达,可添加
{force: true}参数强制重配置。给MongoDB实例添加启动参数
为每个mongod实例添加--utf8validation false启动参数,全局关闭UTF-8校验,避免局部非UTF-8字符触发错误:mongod --port 27017 --dbpath ./data/db1 --replSet rs0 --utf8validation false清理系统profile集合
若系统profile集合存在异常数据,可能导致副本集状态查询出错。直接清空该集合:db.system.profile.drop();如需重新开启 profiling,执行
db.setProfilingLevel(1)即可。调整系统区域设置
西班牙语区域的LC环境变量可能影响字符处理,启动mongod前临时切换为英文UTF-8环境:- Linux/macOS:
export LC_ALL=en_US.UTF-8 mongod --port 27017 --dbpath ./data/db1 --replSet rs0 - Windows:
chcp 65001 mongod --port 27017 --dbpath ./data/db1 --replSet rs0
- Linux/macOS:
Node.js端原生驱动调用
绕过mongoose封装,直接使用MongoDB原生驱动执行状态查询并关闭UTF-8校验:const mongoose = require('mongoose'); async function getReplStatus() { const adminDb = mongoose.connection.db.admin(); const status = await adminDb.command( { replSetGetStatus: 1 }, { enableUtf8Validation: false } ); console.log(status); }
内容的提问来源于stack exchange,提问作者Hikaros
相关产品推荐
相关产品推荐

