mongoDB常用命令
1. mongoDB常用命令
1.1. DB相关
1.1.1. 启动
su - mongo
mongod -f /etc/mongodb/mongodb27017.conf
1.1.2. 登录:
mongo admin -uroot -p --port=27017
1.1.3. 关闭mongodb
mongod -shutdown -dbpath=/mongodata/db
1.1.4. 删除数据库:
use dbname;
db.dropDatabase();
1.1.5. 删除集合
use dbname;
db.collectionname.drop()
1.1.6. 连接测试:
/mongodb3.6.17/bin/mongo ip:27017 -uuser -p --authenticationDatabase=admin
1.1.7. 取任意10条数据
db.oplog.rs.find().limit(10).pretty();
1.2. 用户权限相关
1.2.1. 通过创建一个用户,赋予用户root权限
use admin;
db.createUser(
{
user:"root",
pwd:"123456",
roles:[{role:"root",db:"admin"}]
}
);
附:添加用户时各个角色对应权限
- 1.数据库用户角色:read、readWrite;
- 2.数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 3.集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 4.备份恢复角色:backup、restore
- 5.所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 6.超级用户角色:root
1.2.2. 添加管理用户:
use admin
db.createUser( {user: "admin",pwd: "123456",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
db.createUser({user:"root",pwd:"root123!@#",roles:[{role:"root",db:"admin"},{role:"readWrite",db:"admin"},{role:"clusterAdmin",db:"admin"},{role:"clusterManager",db:"admin"},{ role: "userAdminAnyDatabase", db: "admin" }]});
1.2.3. 新增普通用户权限:
use admin;
db.createUser({user:"migu",pwd:"Migu#321$!",roles:[{role:"readAnyDatabase",db:"admin"}]});
readAnyDatabase访问所有数据库的只读权限
登录测试,指定认证库
mongo logReportDB -udata_sec -p --port 9955 --authenticationDatabase=admin
1.2.4. 给指定数据库新增业务账号:
use admin;
db.createUser({user:"dispersion",pwd:"mgclmh#dispersion2021",roles:[{role:"readWrite",db:"dispersion_prod"}]});
1.2.5. 指定认证方式
use admin;
db.createUser({user:"data_sec",pwd:"d#IuM3_7S9t",roles:[{role:"readAnyDatabase",db:"admin"}],mechanisms : ["SCRAM-SHA-1"]});
1.2.6. 查询所有库下的用户:
use admin
db.system.users.find().pretty();
db.system.users.find({user:"zty_libo"}).pretty();
简洁显示:
db.system.users.find({},{"_id":1});
1.2.7. 主节点上查询admin 库下的用户:
use admin;
db.getUsers();
1.2.8. 授权:
db.grantRolesToUser( "ticket" , [ { role: "dbOwner", db: "pc_ticket" },{ role: "dbOwner", db: "pc_payment" } ]) ;
给用户一个readAnyDatabase权限
db.grantRolesToUser( "zty_libo" , [ { role: "readAnyDatabase", db: "admin" }]) ;
1.2.9. 回收权限:
db.revokeRolesFromUser( "migu", [{role:"clusterMonitor",db:"admin"}] );
1.2.10. 删除用户
删除用户dbabd_user
> use admin
> db.dropUser("dbabd_user")
或者
> use admin
> db.runCommand({ dropUser: "user02" })
1.2.11. 7.修改密码
use admin;
db.changeUserPassword('root','root123!@#');
4.2.10版本:
db.updateUser(
"root1",
{
pwd: "Z3Lvl!EDmp1",
mechanisms:["SCRAM-SHA-1"]
}
);
1.3. 添加白名单
- clientSource 就是针对客户端的IP 做白名单控制
- serverAddress 就是针对客户端的IP 做白名单控制
1.3.1. 创建一个用户并添加白名单
use admin;
db.createUser(
{
user: "test1",
pwd: "test1",
roles: [ { role: "readWrite", db: "admin" } ],
authenticationRestrictions: [ {
clientSource: ["192.0.2.0"],
serverAddress: ["198.51.100.0"]
} ]
}
)
1.3.2. 对于已经创建的用户添加白名单
db.updateUser(
"test2",
{
authenticationRestrictions: [ {
clientSource: ["192.0.2.0"],
serverAddress: ["198.51.100.0"]
} ]
}
);
1.4. 监控
1.4.1. 启动监控:
db.enableFreeMonitoring()
1.4.2. 关闭监控:
db.enableFreeMonitoring()
监控地址:
https://cloud.mongodb.com/freemonitoring/cluster/P537HTQMMIBTUFNQUHTKVLMJWY67YYXY
1.5. 索引
基本语法:
db.collection.createIndex(keys, options)
1.5.1. 1、查看集合索引
db.col.getIndexes()
#查看Playlist集合上的索引
db.Playlist.getIndexes()
删除集合
use admin
db.aggregate( [
{$currentOp : { allUsers: true ,idleConnections:false} },
{$project:{opid:1,client:1,op:1,ns:1,microsecs_running:1,command:1}},
{$match:{client:{$exists:true}}},
{$sort:{microsecs_running:-1}}
]).pretty();
db.killOp(13141)
use goldkinn_gateway_log_dev;
db.GlobalGatewayLog.remove({})
db.GlobalGatewayLog.find().count();
1.5.2. 2、查看集合索引大小
db.col.totalIndexSize()
1.5.3. 3、删除集合所有索引
db.col.dropIndexes()
1.5.4. 4、删除集合指定索引
db.col.dropIndex("索引名称")
1.5.5. 5、创建单独索引:
db.col.createIndex({"title":1})
1.5.6. 6、创建组合索引:
db.col.createIndex({"title":1,"description":-1})
1.5.7. 实例:
db.friend.createIndex({"unique":1});
db.friend.createIndex({"from":1});
db.friend.createIndex({"to":1});
1.5.8. 查看数据行数:
db.FileExchangeTask.count()
1.5.9. 查看数据文件大小:
db.getCollection("FileExchangeTask").totalSize()
1.5.10. 获取MongoDB中collection
db.collection.dataSize()
//collection中的数据大小
db.collection.storageSize()
//为collection分配的空间大小,包括未使用的空间
db.collection.totalIndexSize()
collection中索引数据大小
db.collection.totalSize()
collection中索引+data所占空间
1.6. 副本集合分片集群相关
1.6.1. 查看oplog配置的大小
---从3.6开始,可以使用 replSetResizeOplog命令修改oplog大小(主备都需要修改,建议先修改备库,修改之后写入配置文件)
- 查看
use local
db.oplog.rs.stats().maxSize
或者
rs.printReplicationInfo();
- 修改oplog大小(单位M),修改前检查磁盘空间剩余量
use admin;
db.adminCommand({replSetResizeOplog:1, size: 10240});
10240 表示10G
该值的范围990M-1T
- 修改之后修改配置文件
## for rep
replication:
oplogSizeMB: 10240
1.6.1.1. 备节点查询之前需要先执行:
rs.slaveOk();
1.6.2. 修改复制集密码:
修改复制集的密码需要重新添加复制集节点,修改密码直接在主节点修改即可
1.6.2.1. 移除仲裁节点
rs.remove("localhost:27000")
rs.status
1.6.2.2. 修改密码
use admin;
db.changeUserPassword('root','root123!@#');
1.6.2.3. 添加仲裁节点:
rs.addArb("192.169.100.160:27018")
rs.status
1.6.2.4. 查看延迟:
rs.printSlaveReplicationInfo();
rs.status();
rs.printReplicationInfo();
rs.printSlaveReplicationInfo()
1.6.2.5. 查看分片集群的复制集的配置:
rs.config();
sh.status();
1.6.2.6. 查看复制集状态
rs.status();
1.6.2.7. 主库查看 oplog 日志剩余可使用时间:
rs.printReplicationInfo();
1.6.2.8. 日志和慢日志分析
cat log |grep ERROR
mloginfo mongodb.log --queries --sort count
cat mongodb.log|grep error
grep op_msg
grep op_query
oplog.rs 的慢日志不管
1.6.2.9. 查看表的碎片:
碎片处理:
compass处理
1.6.2.10. 查看数据库负载(mongostat)
mongostat -uroot --authenticationDatabase=admin --port=27017
1.6.3. 设置隐藏节点
1.6.4. MongoDB 副本集主从切换方法
1.6.4.1. 一、方法一rs.setpDown()
将Primary节点降级为Secondary节点
myapp:PRIMARY> rs.stepDown()
这个命令会让primary降级为Secondary节点,并维持60s,如果这段时间内没有新的primary被选举出来,这个节点可以要求重新进行选举。
也可手动指定时间
myapp:PRIMARY> rs.stepDown(30)
在执行完该命令后,原Secondary node3:27017升级为Primary。
操作后再次rs.status();检查状态。
1.6.5. 7、后台创建索引
(建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引)
db.values.createIndex({open: 1, close: 1}, {background: true})
1.6.6. 8、后台创建唯一索引:
db.values.createIndex({open: 1, close: 1}, {background: true,unique: true})
1.7. 分片集群相关命令
列出分片列表
use admin
db.runCommand( { listShards : 1 } )
#查看集群细节
使用 db.printShardingStatus() 或者 sh.status() 查看集群细节,两个命令是等价的.
sh.status()
1.8. pmm相关
1.8.1. 一般用户创建到admin 下面:
use admin; (认证库)
db.getSiblingDB("admin").createUser({
user: "pmm",
pwd: "s3cR#tpa$$worD",
roles: [
{ role: "clusterMonitor", db: "admin" },
{ role: "read", db: "local" }
]
});
1.9. 导入导出
1.9.1. 导出csv文件(mongoexport)
mongoexport -h 10.25.149.83 --port 27017 -uroot -p'xxxxxx' --authenticationDatabase admin --db db_name -c Dynamic --out data.csv -q '{"status":"1","type":"2"}' -f "_id ","textDynamicInfo.content"
1.9.2. 导出json文件
mongoexport --authenticationDatabase=admin -uroot -d AKTM -c Dynamic --fields=_id,textDynamicInfo.content --query='{status:1,type:2}' -o dynamic.json --type=json
参数说明:
./mongoexport -h 源主机 --port 端口 -u 用户 -p 密码 --authenticationDatabase 认证数据库 -d 备份源数据库 -c 备份源集合 -o 备份输出文件 -q '{"insert_time":ISODate("2018-04-03T12:15:40.647Z")}'
1.9.3. mongodump和mongorestore
mongodump -h 127.0.0.1 --port 27017 -u root -p 'xxxx' --authenticationDatabase admin -d user_prod -o /home/mongodump
mongorestore -h 127.0.0.1 --port 27018 -u root -p 'Migu#34@1B' --authenticationDatabase admin --numParallelCollections=12 -d user_cloud_prod --dir /home/mongodump/user_prod
mongorestore入库非常慢,而且系统中没有锁,I/O资源也正常, 内存足够,但是导入就是非常慢
可以将备机重新初始化
--excludeCollection <collection_name>
--excludeCollectionsWithPrefix <collection_prefix>
重复以排除1个以上
。但是要排除多个集合,您可以重复excludeCollection参数(我认为这就是数组的含义)。示例
您可以添加--collection COLLECTION_NAME以转储所需的集合。默认情况下,如果您未指定要从数据库中转储的集合,则MongoDump将转储该数据库中的所有集合。
从Mongo 3.4开始,现在可以从Mongo数据库转储进行还原时指定--nsExclude 选项,该选项将从还原操作中排除指定的名称空间。当mongodump操作已经发生时,这特别有用。
您可以使用通配符排除多个集合:
mongorestore --db test --nsExclude 'test.*_tmp'
或者,也可以指定多个--nsExclude选项:
mongorestore --db test --nsExclude 'test.collection1' --nsExclude 'test.collection2'
高金:
/opt/mongodb-database-tools-rhel70-x86_64-100.5.2/bin/mongodump -hdds-bp10cacb1a2987441.mongodb.rds.aliyuncs.com --port 3717 -u root -p'xxxxx' --authenticationDatabase admin -d gkdb_center_price -o /home/mongo
/opt/mongodb-database-tools-rhel70-x86_64-100.5.2/bin/mongorestore -hdds-bp10cacb1a2987441.mongodb.rds.aliyuncs.com --port 3717 -u root -p 'xxxx' --authenticationDatabase admin --numParallelCollections=6 -d gkdb_center_price_uat --dir /home/mongo/gkdb_center_price
导出指定集合(表)
/usr/local/mongodb-database-tools-rhel70-x86_64-100.5.2/bin/mongodump -h121.196.58.174 --port 32017 -u root -p'GJsp123abcABC' --authenticationDatabase admin -d gkdb_center_price_test --collection p_price_adjust_item -o /data/mongoDB/mongodb_backup
1.10. 执行计划
1.10.1. explain方式
查看某一个查询的执行计划,
db.FileExchangeTask.find({name:1}).explain()
查看表上(集合上)是否有索引:
db.Audit.getIndexes();
1.10.2. profile
show profile
db.system.profile.find().sort({$natural:-1}).limit(1).pretty();
db.students.find({age:{$lt:10}}).explain();
1.11. 标准 URI 连接语法
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
mongodb:// 这是固定的格式,必须要指定。
username:password@ 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登录这个数据库
host1 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。
portX 可选的指定端口,如果不填,默认为27017
/database 如果指定username:password@,连接并验证登录指定数据库。若不指定,默认打开 test 数据库。
?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开
1.12. 时间相关
1.12.1. 时间关键字
$dayOfYear: 返回该日期是这一年的第几天(全年 366 天)。
$dayOfMonth: 返回该日期是这一个月的第几天(1到31)。
$dayOfWeek: 返回的是这个周的星期几(1:星期日,7:星期六)。
$year: 返回该日期的年份部分。
$month: 返回该日期的月份部分( 1 到 12)。
$week: 返回该日期是所在年的第几个星期( 0 到 53)。
$hour: 返回该日期的小时部分。
$minute: 返回该日期的分钟部分。
$second: 返回该日期的秒部分(以0到59之间的数字形式返回日期的第二部分,但可以是60来计算闰秒)。
$millisecond:返回该日期的毫秒部分( 0 到 999)。
$dateToString: { $dateToString: { format: , date: } }。
1.12.2. 获取中国标准时间:
var mydate=Date();
输出:
mydate
1.12.3. ObjectId方式
由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间:
> var newObject = ObjectId()
> newObject.getTimestamp()
ISODate("2017-11-25T07:21:10Z")
ObjectId 转为字符串
> newObject.str
5a1919e63df83ce79df8b38f
1.13. 常见的认证方式报错
db.createUser({user:"data_sec",pwd:"d#IuM3_7S9t",roles:[{role:"readAnyDatabase",db:"admin"}]});
db.system.users.find({user:"data_sec"}).pretty();2021-12-21T14:29:19.060+0800 E QUERY [thread1] Error: couldn't add user: Use of SCRAM-SHA-256 requires undigested passwords :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.createUser@src/mongo/shell/db.js:1437:15
解决方案:修改mechanisms加密方式为SCRAM-SHA-1
db.createUser({
user: "admin",
pwd: "xxx",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ],
mechanisms : ["SCRAM-SHA-1"]
})
查用户:
mongo admin -uroot -p'Migu#34@1B' --port=27018 --eval "DBQuery.shellBatchSize = 9999; db.system.users.find().pretty()" >add.txt
cat add.txt | grep user|grep -v "db"|grep -v _id|grep -v role|grep -v UUID|awk -F : '{print $2}'|awk -F \" '{print $2}'
rm add.txt

浙公网安备 33010602011771号