1、首先连接数据库
mongosh "mongodb://localhost:27017"
2、选择目标数据库
show databases;#显示所有数据库
use lidb;#使用某数据库
3、查看当前分析级别
db.getProfilingStatus()
输出
{ was: 0, slowms: 100, sampleRate: 1, ok: 1 }
#was=0表示关闭;was=1表示开启
4、开启慢查询日志(临时,重启失效)
#方法一
db.setProfilingLevel(1, { slowms: 100 }) // 记录超过100ms的操作
#方法二
db.setProfilingLevel(1, {
slowms: 100,
filter: { op: "query" } // 只记录查询操作
})
再执行如下命令查看状态:
db.getProfilingStatus()
输出
{ was: 1, slowms: 100, sampleRate: 1, ok: 1 }
表示设置成功
5、查看慢查询记录
#查询超过100ms的慢日志
db.system.profile.find({millis: {$gt: 100}})
// 查看最近的慢查询
db.system.profile.find().sort({ ts: -1 }).limit(5).pretty()
// 分析特定慢查询
db.system.profile.find({
millis: { $gt: 200 }, // 超过200ms的操作
op: "query" // 只查询操作
}).pretty()
6、不同数据库不同设置
// 设置db1
use db1
db.setProfilingLevel(1, { slowms: 50 })
// 设置db2
use db2
db.setProfilingLevel(1, { slowms: 200 })
7、修改采样率不改变级别
// 保持当前级别,只修改采样率
db.setProfilingLevel(1, { sampleRate: 0.3 })
8、修改慢查询阈值(不改变级别)
db.adminCommand({
profile: 0, // 0=保持当前级别
slowms: 30 // 新阈值
})
9、全局设置(影响所有数据库)
db.adminCommand({
setParameter: 1,
slowMS: 50
})
10、生产环境推荐配置
db.setProfilingLevel(1, {
slowms: 50,
sampleRate: 0.8
})
11、定期清理分析数据:
// 清空分析数据
db.system.profile.drop()
// 重建集合
db.createCollection("system.profile", {
capped: true,
size: 100 * 1024 * 1024 // 100MB
})
12、永久配置:
# mongod.conf 添加
operationProfiling:
mode: slowOp
slowOpThresholdMs: 100
slowOpSampleRate: 1.0
13、直接查看日志文件
# 查看慢查询日志
tail -f /usr/local/mongodb/logs/log.txt | grep "slow query"
# 过滤耗时超过100ms的操作
grep "ms" /usr/local/mongodb/logs/log.txt | awk -F 'ms' '{if ($1 > 100) print $0}'