获取已连接用户的列表

时间:2016-10-25 16:00:02

标签: mongodb

使用shell,我可以获得连接的用户列表吗?我可以使用db.serverStatus()。connections获取连接数,我可以使用

获取主机连接信息
 db.currentOp(true).inprog.forEach(function(d){if (d.client)printjson(d.client)})

但是,我想知道我是否也可以从主机获得连接的用户?

1 个答案:

答案 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: ...

<强>免责声明

  1. 我确信这不是最好的方法,而且MongoDB实际上是我对Javascript的唯一用途所以我可能已经在这里做了一些让真正的Javascript人咬紧牙关的事情。牙齿清洁工 - 可以在更好的实践中自由编辑。

  2. 对于有大量活动的实例,这不起作用,而是抛出此错误。我猜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)