使用shell,我可以获得连接的用户列表吗?我可以使用db.serverStatus()。connections获取连接数,我可以使用
获取主机连接信息 db.currentOp(true).inprog.forEach(function(d){if (d.client)printjson(d.client)})
但是,我想知道我是否也可以从主机获得连接的用户?
答案 0 :(得分:1)
MongoDB 3.4.2
我一直希望找到像MySQL SHOW PROCESSLIST
这样的命令,以便轻松获取此类信息。令人失望的是,看起来没有任何功能可以显示当前连接的用户,或者,对于给定的过去或现在的连接,哪个用户启动了它。但是,通过启用性能分析,我们可以通过查看最近的过去来近似一些功能。
在我的情况下,性能分析全局设置为2(可见db.getProfilingLevel()
),因此在每个数据库的生命周期中的某个时刻,会出现一个名为“system.profile”的集合,这是一个上限集合 - 即记录只有在收集完整后才会保留,然后以先进先出的方式更换(见下面的免责声明)。可以像往常一样查询此集合,并保留与每个操作关联的时间戳(ts
)。
var all_dbs = db.runCommand({listDatabases:1});
var now = new Date();
// Modify the number of seconds for a larger or smaller time window
var just_now = new Date(now.getTime() - 1000);
all_dbs.databases.forEach(
function(current_db) {
// The condition there is to exclude internal commands executed by the user "__system"
// To exclude this command itself, add the condition "ns:{$not:/profile$/}"
all_operations = db.getSiblingDB(current_db.name).system.profile.find({user:{$not:/^__/}});
all_operations.forEach(
function(operation) {
if (operation.ts > just_now) {
// Remove the .substring(0,200) to unlimit output length
print(JSON.stringify(operation.ts),
JSON.stringify(operation.user),
JSON.stringify(operation.query||operation.command||operation.updateobj).substring(0,200));
}})});
输出如下:
"1998-04-01T22:14:56.431Z" "<user>@admin" "<database>.<collection>" "{ insert: \"<collection>\", ordered: false, documents: ...
<强>免责声明强>:
我确信这不是最好的方法,而且MongoDB实际上是我对Javascript的唯一用途所以我可能已经在这里做了一些让真正的Javascript人咬紧牙关的事情。牙齿清洁工 - 可以在更好的实践中自由编辑。
对于有大量活动的实例,这不起作用,而是抛出此错误。我猜find()
返回system.profile的结果,并且这些结果在完成执行时不再存在,因此它会中断。 Executor error during find command: CappedPositionLost: CollectionScan died due to position in capped collection being deleted. Last seen record id: RecordId(19041841)