mongodb 常用命令

发布时间: 更新时间: 总字数:1792 阅读时间:4m 作者: IP上海 分享 网址

记录我常用的 mongodb 命令,以备后查。

mongo shell

mongo cli

mongosh "mongodb+srv://mycluster.abcd1.mongodb.net/myFirstDatabase" --apiVersion 1 --username <username>

# 获取所有参数
> db.adminCommand( { getParameter : "*" } )
> db.adminCommand( "getCmdLineOpts" )
> db.adminCommand( { getParameter:1,  syncdelay:1 } )

# 设置参数
mongod --setParameter <parameter>=<value>
mongos --setParameter <parameter>=<value>

db.adminCommand( { setParameter: 1, tcmallocReleaseRate: 5.0 } )
mongod --setParameter "tcmallocReleaseRate=5.0"
mongos --setParameter connPoolMaxShardedInUseConnsPerHost=100

# 获取当前连接数,等价于 exporter 的 mongodb_ss_logicalSessionRecordCache_activeSessionsCount
mongos> db.serverStatus().connections;
{ "current" : 256, "available" : 1024, "totalCreated" : 102400 }

逻辑会话(Logical Sessions)

  • 服务端会话(server sessions)或者逻辑会话(logical sessions)是一种机制,用于在服务端维护和管理客户端的操作状态
  • 应用程序使用客户端会话与服务端会话进行交互
  • 服务端可以缓存的最大会话数默认为 1000000,当会话数大于该值时,将无法显式或者隐式创建会话
  • PyMongo 支持 Python multiprocessing 模块(参考

角色

  • dbAdmin 角色包含执行某些管理任务(与 schema 相关、索引、收集统计信息)的权限,该角色不包含用户和角色管理的权限
  • dbOwner 角色包含对数据所有的管理操作权限。即包含角色 readWrite、dbAdmin 和 userAdmin 的权限
  • userAdmin 角色包含对当前数据库创建和修改角色和用户的权限
  • clusterManager 角色包含对集群监控和管理操作的权限。拥有此角色的用户能够访问集群中的 config 数据库和 local 数据库
  • clusterMonitor 角色包含针对监控工具具有只读操作的权限。如工具 MongoDB Cloud Manager 和工具 Ops Manager
  • hostManager 角色包含针对数据库服务器的监控和管理操作权限
  • clusterAdmin 角色包含 MongoDB 集群管理最高的操作权限。该角色包含 clusterManager、clusterMonitor 和 hostManager 三个角色的所有权限,并且还拥有 dropDatabase 操作命令的权限

创建用户

# 创建 test 数据库,用户名为 admin/admin
use test
db.createUser(
    {
        user: "admin",
        pwd: "admin",
        roles: [{ role: "dbOwner", db: "test" }, { role: "readWrite", db: "test" }]
    }
)

# 使用新用户登录
mongosh 127.0.0.1:27017 -u admin -p admin --authenticationDatabase test

# 查看权限
use test
db.runCommand({ connectionStatus: 1 })

# 查看数据库的用户
db.getUsers()

# 查看用户的权限
> use test
> db.getUser("admin", { showPrivileges: true })

# 添加权限
> use test
> db.grantRolesToUser(
    "user",
    [
        { role: "readWrite", db: "test" },
        { role: "dbabd", db: "test" }
    ]
)

# 更新权限
> use test
> db.updateUser(
    "user",
    {
        customData: { info: "user for dbabd" },
        roles: [
            { role: "dbabd", db: "admin" },
            { role: "read", db: "admin" }
        ]
    }
)

主备切换

cfg = rs.conf()
cfg.members[0].priority = 30
cfg.members[1].priority = 20
cfg.members[2].priority = 10
cfg
rs.reconfig(cfg)

添加/删除节点

replica set 多服务器主从,添加,删除节点

利用 rs.reconfig 添加/删除节点

  • 添加节点
repmore:PRIMARY> config = {_id:"repmore",members:[{_id:0,host:'127.0.0.1:27017',priority :2},{_id:1,host:'127.0.0.1:27018',priority:1}]};   //添加节点
repmore:PRIMARY> rs.reconfig(config);   //使配置生效
repmore:PRIMARY> rs.status();     //查看节点状态

节点添加成功。

注意:新增节点的 replSet 要和其他节点要一样

  • 删除节点(删除节点前最好是先关闭需要删除的节点,之后通过命令 rs.remove 来删除)
repmore:PRIMARY> config = {_id:"repmore",members:[{_id:0,host:'127.0.0.1:27017',priority :2}]};     //删除节点
repmore:PRIMARY> rs.reconfig(config);   //使配置生效
repmore:PRIMARY> rs.status();   //查看节点状态

利用 rs.add 和 rs.remove 来添加删除节点

repmore:PRIMARY> rs.add("127.0.0.1:27018");     //添加节点
repmore:PRIMARY> rs.remove("127.0.0.1:27018");  //删除节

注意:利用 rs.add 和 rs.remove 是不用 rs.reconfig 来使用配置生效的。

常用命令

db.meter.findOne( {counter_name: "ip.floating.incoming.bytes.rate"})
db.meter.count( {counter_name: "ip.floating.incoming.bytes.rate", recorded_at: {$lt: ISODate("2017-10-22T03:19:14.293Z")}})

mongoexport --host 127.0.0.1 --port 27017  -d ceilometer -c  meter -q '{counter_name: "ip.floating.incoming.bytes.rate", recorded_at: {$lt: ISODate("2017-10-22T03:19:14.293Z")}}'  --fields=resource_id,resource_metadata.fixed_ips.0.ip_address,counter_volume,counter_unit,recorded_at,resource_metadata.tenant_id --type=csv -o eip.csv

mongoexport --host 127.0.0.1 --port 27017  -d ceilometer -c  meter -q '{counter_name: "ip.floating.incoming.bytes.rate", recorded_at: {$lt: ISODate("2017-07-02T00:00:00.000Z")}}'  --fields=resource_id,resource_metadata.fixed_ips.0.ip_address,counter_volume,counter_unit,recorded_at,resource_metadata.tenant_id --type=csv -o eip.csv >> export_eip.log

mongoexport --host 127.0.0.1 --port 27017  -d ceilometer -c  meter -q '{counter_name: "ip.floating.incoming.bytes.rate", recorded_at: {$lt: ISODate("2017-07-02T00:00:00.000Z")}}'  --fields=resource_id,resource_metadata.fixed_ips.0.ip_address,counter_volume,counter_unit,recorded_at,resource_metadata.tenant_id --type=csv -o /mongodb-export/eip-20170622-0702.csv >> /mongodb-export/export_eip.log 2>&1

db.meter.find({counter_name: "memory", "resource_id" : "45103dbe-a77f-40dc-a1da-7813e8ce7092"}).limit(10).pretty()

db.meter.find({ resource_id: "a93c5387-a5ac-4ac3-9e01-37a309b04ee0"}).sort({"recorded_at":1}).limit(1)
db.resource.findOne({ metadata."instance_id" : "a93c5387-a5ac-4ac3-9e01-37a309b04ee0"}).limit(1)
db.meter.find({ resource_id: "a93c5387-a5ac-4ac3-9e01-37a309b04ee0"}).sort({"recorded_at":1}).limit(1)
db.resource.findOne({ "metadata.instance_id" : "a93c5387-a5ac-4ac3-9e01-37a309b04ee0"})
db.resource.find({ "metadata.instance_id" : "a93c5387-a5ac-4ac3-9e01-37a309b04ee0"}).sort({"last_sample_timestamp":1}).limit(1)

find

db.resource.find({ "metadata.instance_id" : "6d94e545-209a-4ea3-87a7-f5b237fd11c0"}).sort({"last_sample_timestamp":-1}).limit(1);
db.resource.find({ "metadata.instance_id" : "ce9416c9-2ff9-4a50-bcfa-82b7fb0a8110"}).sort({"last_sample_timestamp":-1}).limit(1);
db.resource.find({ "metadata.instance_id" : "6d94e545-209a-4ea3-87a7-f5b237fd11c0"}).sort({"last_sample_timestamp":-1}).limit(1);
db.resource.find({ "metadata.instance_id" : "6d94e545-209a-4ea3-87a7-f5b237fd11c0"}).sort({"last_sample_timestamp":-1}).limit(1);

update

db.getCollection('cc_ObjDes').update({'bk_obj_id':'listeners'},{$set:{'bk_classification_id':'load_balance'}})
mongodump  -h 127.0.0.1 -p 27017  --db db_name --out cc_TopoGraphics-2018-06-22
mongorestore --host 127.0.0.1:27017 -udb_user -ppwd --db db_name cc_TopoGraphics.bson

oplog 调整

修改顺序:Secondary -> Primary

primary 切换 secondary 命令:

rs.stepDown()

涉及到 Replication Set 的服务:

27018 mongod-config-svr.service
27019 mongod-rs-1.service
27020 mongod-rs-2.service
27021 mongod-rs-3.service

修改一个 Secondary oplog 的步骤:

登录 Secondary 将其从集群剔除

mongo --host 10.0.0.1 --port 27018

use admin
db.shutdownServer()

实际执行

systemctl status mongod-config-svr.service

停止对应的服务

修改配置

注释掉:replication.replSetName 针对 shard (和 config replica set),注释:sharding.clusterRole 修改 net.port 为其他端口: 27022

启动

mongod --port 27022 --dbpath /data-01/mongo-conf-svr
mongod --port 27022 --dbpath /data-01/mongo-rs-1
mongod --port 27022 --dbpath /data-01/mongo-rs-2
mongod --port 27022 --dbpath /data-01/mongo-rs-3

备份 oplog

mongodump --db local --collection 'oplog.rs' --host 10.3.13.61 --port 27022 --out bak/mongo-conf-svr.oplog.rs
mongodump --db local --collection 'oplog.rs' --host 10.3.13.61 --port 27022 --out bak/mongo-rs-1.oplog.rs
mongodump --db local --collection 'oplog.rs' --host 10.3.13.61 --port 27022 --out bak/mongo-rs-2.oplog.rs
mongodump --db local --collection 'oplog.rs' --host 10.3.13.61 --port 27022 --out bak/mongo-rs-3.oplog.rs

重建 oplog

思路:确认 temp 表不存在,将 oplog.rs 旧数据放到 temp 表中,删除 oplog.rs 并新建,将 temp 表插入新的 oplog.rs ,删除 temp。

mongo --host 10.3.13.61 --port 27022

确认 temp 表不存在:

db = db.getSiblingDB('local')

Ensure that the temp temporary collection is empty by dropping the collection

show collections;
db.temp.drop()

将 oplog.rs 旧数据放到 temp 表中:

db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )

db.temp.find()

删除 oplog.rs:

db = db.getSiblingDB('local')
db.oplog.rs.drop()

并新建(100G):

db.runCommand( { create: "oplog.rs", capped: true, size: (40 * 1024 * 1024 * 1024) } )
db.runCommand( { create: "oplog.rs", capped: true, size: (100 * 1024 * 1024 * 1024) } )

将 temp 表插入新的 oplog.rs:

db.oplog.rs.save( db.temp.findOne() )

db.oplog.rs.find()

删除 temp:

db.temp.drop()

停止

db.shutdownServer()

修改配置文件

replication:
  oplogSizeMB: 40960

replication:
  oplogSizeMB: 102400

启动服务

systemctl start mongod-rs-1.service

参考:https://docs.mongodb.com/v3.2/core/replica-set-oplog/

mongostat

mongostat 是 MongoDB 自带的监控工具,其可以提供数据库节点或者整个集群当前的状态视图

mongostat --help

mongostat -h 127.0.0.1 --port 27017 -uroot -proot --authenticationDatabase=admin --discover -n 300 2

# 等价的命令
db.serverStatus()

参数说明:

  • -h:监听的主机
  • --port:监听的端口,默认 27017
  • -u--user:登录用户名
  • -p--password:登录密码
  • --authenticationDatabase:鉴权数据库
  • --discover:启用自动发现,可展示集群中所有分片节点的状态
  • -n 300 2:输出 300 次,每次间隔 2s

Client 软件

参考

  1. https://www.mongodb.com/zh-cn/docs/mongodb-shell/
  2. https://docs.mongoing.com/the-mongo-shell/mongo-shell-quick-reference
  3. https://support.huaweicloud.com/intl/zh-cn/dds_faq/dds_faq.pdf
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数