配套课程:《Mongodb 快速入门》
Sessions 管理
查看会话
列出所有session
如果使用访问控制运行,当前用户必须具有对listSessions集群执行操作的权限。
db.aggregate( [ { $listLocalSessions: { allUsers: true } } ] )
或
use config
db.system.sessions.aggregate( [ { $listSessions: { allUsers: true } } ] )
列出指定用户session
db.aggregate( [ { $listLocalSessions: { users: [ { user: "myAppReader", db: "test" } ] } } ] )
或
use config
db.system.sessions.aggregate( [ { $listSessions: { users: [ {user: "myAppReader", db: "test" } ] } } ] )
列出当前用户session
db.aggregate( [ { $listLocalSessions: { } } ] )
或
use config
db.system.sessions.aggregate( [ { $listSessions: { } } ] )
如果没有访问控制的情况下运行,该操作会列出所有会话
session管理
序号 |
命令 |
描述 |
1 |
abortTransaction |
|
2 |
commitTransaction |
|
3 |
endSessions |
|
4 |
killAllSessions |
终止所有会话 |
5 |
killAllSessionsByPattern |
终止与指定模式匹配的所有会话 |
6 |
killSessions |
指定的会话 |
7 |
startSession |
|
8 |
refreshSessions |
刷新空闲会话 |
终止指定会话
db.runCommand( { killSessions: [ { id: UUID("f9b3d8d9-9496-4fff-868f-04a6196fc58a") } ] } )
终止指定用户的所有会话
用户需要具有killAnySession权限,该权限在hostManager内置角色中。
db.runCommand( { killAllSessions: [
{ user: "appReader", db: "db1" },
{ user: "reportWriter", db: "db2" }
] } )
按匹配模式终止所有会话
用户需要具有killAnySession权限,该权限在hostManager内置角色中。以下操作将终止具有指定 uid
且其所有者具有指定角色的所有会话:
db.runCommand( { killAllSessionsByPattern: [
{ "uid" : BinData(0,"oBRA45vMY78p1tv6kChjQPTdYsnCHi/kA/fFMZTIV1o=") },
{ roles: [ { role: "readWrite", db: "test" } ] }
] } )
管理命令
序号 |
命令 |
描述 |
1 |
currentOp |
返回当前正在执行的信息 |
2 |
killOp |
终止指定的操作 |
3 |
compact |
重写集合中的所有数据和索引并对其进行碎片整理 |
4 |
logRotate |
切换服务器日志或审核日志,以防止单个日志文件占太多磁盘空间( db.adminCommand({logRotate:1}) ) |
5 |
setParameter |
|
6 |
getParameter |
|
8 |
getClusterParameter |
|
9 |
setClusterParameter |
|
currentOp
返回当前正在执行的信息,类似mysql中的 "show processlist" 返回的结果,语法
db.adminCommand(
{
currentOp: true,
"$all": true
}
)
或
db.currentOp(true)
db.currentOp( { "$all": true } )
- opid:操作的唯一标识,可以是使用 db.killOp() 终止该操作。opid 在mongod 里是一个 uint32 类型的整数,当你从mongo shell 里看到opid 为负数时,说明你的mongod 已经成功执行超过2147483647(INT32_MAX)次请求了
- active:是否活跃状态
- secs_running:操作运行秒数
- op:操作类型,包括(insert/update/query/remove/getmore/command)
- ns:命名空间
- command:执行的语句
- client:连接的客户端信息
- connectionId:连接id
- waitingForLock:是否等待获取锁
查询在特定数据库上的操作【耗时超过3秒】
db.currentOp(
{
"active" : true,
"secs_running" : { "$gt" : 3 },
"ns" : /^db1\./
}
)
查询等待锁定的写入操作
db.currentOp(
{
"waitingForLock" : true
}
)
列出来自某一客户端的连接
db.currentOp(
{
"active":true,
"client":/172.16/
}
)
统计某客户端连接的个数
db.currentOp({"active":true,"client":/10.33.17/}).inprog.length
或
db.currentOp({"active":true,"client":/10.33.17/})["inprog"].length
注:db.currentOp({"active":true,"client":/10.33.17/})[inprog]的结果是一个数组,length是数组的属性
批量停止 db.killOp()
批量停止:
db.currentOp().inprog.forEach(function(item){db.killOp(item.opid)})
根据条件批量停止:
db.currentOp({"active":true,"secs_running":{"$gt":60},"client":/172.16.0.1/})["inprog"].forEach(function(item){
db.killOp(item["opid"]);
})
以下为JS的写法,当查询超过1000秒的,停止:
db.currentOp().inprog.forEach(function(item){if(item.secs_running > 1000 )db.killOp(item.opid)})
停止某个数据源的查询:
db.currentOp().inprog.forEach(function(item){if(item.ns == "cswuyg.cswuyg")db.killOp(item.opid)})
注意:在执行批量kill前,最好做一次校验
db.currentOp({"active":true,"secs_running":{"$gt":60},"client":/172.16.0.1/})["inprog"].forEach(function(item){
print(item["client"],item["command"]);
})
compact
对集合中的所有数据和索引进行重写和碎片整理。在WiredTiger数据库上,该命令将释放给操作系统不再需要的磁盘空间。compact命令主要接受以下参数:
- compact 集合名称
- force 可选字段。在 4.4 版本之前的版本中,当设置为 true 时,允许该命令在副本集的主节点上运行,但这可能会阻塞主节点上的其他操作,因为 "compact" 操作会独占资源。从v4.4版本开始,即使你指定 "compact" 命令在主节点上运行,它也不会阻塞数据库正在进行的其他 CRUD(创建、读取、更新、删除)操作。
db.runCommand({compact:'集合名称'})
或
db.runCommand({compact:'集合名称',force:true})
单实例 注意事项
- 执行碎片整理前,需将数据库备份
- 阻塞行为与版本相关
版本 |
Blocking Behavior |
Pre 4.4 |
|
4.4 |
compact blocks these operations:db.collection.drop() db.collection.createIndex() db.collection.createIndexes() db.collection.dropIndex() db.collection.dropIndexes() collModAll other operations are permitted. |
Post 4.4.17 |
compact blocks these operations:db.collection.drop() db.collection.createIndex() db.collection.createIndexes() db.collection.dropIndex() db.collection.dropIndexes() collModAll other operations are permitted.The locking order changes. |
- 跟踪进度:可以通过mongo实例日志或currentOp观察其进度。
- 针对操作异常中断,
a.如果启用了日志记录(journaling),数据将保持有效和可用,无论压缩操作的状态如何,可能需要手动重新构建索引。
b.如果没有启用日志记录,则无法保证数据处于有效状态。
副本集 注意事项
- 主节点不会将压缩(compact)命令复制到从节点。
- 在压缩(compact)命令运行时会阻塞写操作。
- 尽可能在从节点上运行压缩(compact)命令。如果无法在从节点上运行压缩操作,请参阅强制选项(force option)
- Starting in MongoDB 4.4.17:
- 在压缩(compact)操作运行时,从节点可以进行复制
- 允许读操作
- 在副本集上执行compact命令过程:
- 先在所有从节点执行compact
- 切换主节点
- 在原主节点上执行compact
- 对从节点的版本特定注意事项
版本 |
阻塞行为 |
Pre 4.4 |
compact blocks all read and write activity.No replication possible.Secondary node is in RECOVERING state. |
4.4 |
compact blocks all write activity.No replication possible.Reads not permitted. |
Post 4.4.17 |
compact blocks all write activity.A secondary node can replicate while compact is running.Reads permitted. |