# mongodb - 备忘录

# 好记性不如烂笔头

因为用 mongodb 只是兴趣使然,所以偶尔要用的时候,经常记不住一些常用知识点。比如想不起日志在哪里 - -

# 1. 启动关闭和登录

# 指定配置文件
mongod -f /etc/mongod.conf

# 登录指定端口
mongo --port 27017
1
2
3
4
5

# 1.备份与恢复

备份很重要

  1. 带权限的备份命令如下
mongodump -h 127.0.0.1:27018 --username "test" --password "123456" --authenticationDatabase="test" -d "test" -o /data/back
1
  • -h 指定ip端口
  • -d 指定要备份的数据库
  • -o 输出路径
  1. 恢复数据
mongorestore -h 127.0.0.1:27018 --username "test" --password "123456" --authenticationDatabase="test" --db "test" --drop /data/back
1
  • --db 需要恢复的数据库实例。
  • --drop 恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
  • <path> 默认最后一个参数是:备份数据所在位置。

# 2.日志系统

mongodb 中主要有四种日志:系统日志,Journal日志,oplog日志,慢查询日志。

# 系统日志

系统日志,它记录 mongodb 启动和停止的操作,连接和删库(狗头),以及服务器在运行过程中发生的任何异常信息;配置系统日志也非常简单,在运行 mongod 的时候增加一个参数 logpath,就可以设置;

mongod -logpath='/var/log/mongodb/mongod.log' -logappend.
1

也可以在 mongodb 的 config 文件中配置;linux 下 conf 位置 /etc/mongod.conf

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
1
2
3
4
5

# Journal日志

开启 Journal 日志可以为 mongodb 增加额外的可靠性保障。开启后,mongodb 先在内存保存写操作,并记录 journal 日志到磁盘,然后定期集中提交(默认是100ms),最后在正式数据库执行更改。为了保证 journal 日志文件的一致性,写日志是一个原子操作。

如果开启了 journal 日志功能,mongodb 会在数据目录下创建一个 journal 文件夹,用来存放日志。同时这个目录也会有一个 last-sequence-number 文件。如果 mongodb 安全关闭的话,会自动删除此目录下的所有文件,如果是崩溃导致的关闭,不会删除日志文件。在MongoDB进程重启的过程中,journal日志文件用于自动修复数据到一个一致性的状态。

可以通过 storage.smallFiles 参数来配置 journal 日志文件的大小。

开启方式:

mongod -journal
1

或者在 mongodb 的 config 文件中配置:

# Where and how to store data.
storage:
  journal:
    enabled: true
1
2
3
4

# Oplog主从日志

mongodb 的高可用复制策略有一个叫做 Replica Set. Replica Set 复制过程中有一个服务器充当主服务器,而一个或多个充当从服务器,主服务将更新写入一个本地的 collection 中,这个 collection 记录着发生在主服务器的更新操作。并将这些操作分发到从服务器上。这个日志是 Capped Collection 。利用如下命令可以配置:mongod -oplogSize=1024 单位是M

# 慢查询日志

慢查询记录了执行时间超过了所设定时间阀值的操作语句。慢查询日志对于发现性能有问题的语句很有帮助,建议开启此功能并经常分析该日志的内容。要配置这个功能只需要在 mongod 启动时候设置 profile 参数即可。例如想要将超过5s的操作都记录,可以使用如下语句:

mongod --profile=1 --slowms=5

profile 有三个值:0,1,2。它们表示的意义如下:

0 – 不开启
1 – 记录慢命令 (默认为>100ms)
2 – 记录所有命令
1
2
3

也可以在客户端调用 db.setProfilingLevel(级别,时间)

db.setProfilingLevel( level , slowms );
db.setProfilingLevel( 1 , 10 );
1
2

# 参考

上次更新: 10/11/2022, 4:40:37 PM