MongoDB的基本操作以及在CentOS7下配置复制集与分片(超级详细,一周的空余时间学习整理,希望能帮助更多的人)
MongoDB
编制:D
版本:v1.0
日期:2020年7月10日
环境:centos7
mongodb 版本:4.2.8
一、windows下配置
注:下方为我windows下的mongoDB登陆用户名(根据自身设置修改)
mongodb://qyd:wasd2671jkluio@localhost
1.MongoDB在windows下的基础配置
https://www.runoob.com/mongodb/mongodb-window-install.html
2.MongoDB角色及权限设置
https://www.jianshu.com/p/62736bff7e2e
https://www.cnblogs.com/swordfall/p/10841418.html
3.php调用MongoDB报错的解决方式(进去点个赞)
https://blog.csdn.net/FalconKkv/article/details/107001402
4.php调用mongoDB的使用方法
https://www.cnblogs.com/wujuntian/p/8352586.html
5.数据库导出命令(进入管理员cmd直接打就可以,其中myFirstMongoDB为你的数据库名称,f:\tt为导出的路径名称)
mongodump -h 127.0.0.1 -d myFirstMongoDB -o f:\tt
6.数据导入命令
mongorestore.exe -d newDB f:/tt/myFirstMongoDB
链接:https://www.cnblogs.com/softwarefang/p/9823062.html
二、linux下配置
查看端口netstat -ntlp
我mongo下的bin目录位置
/home/qyd/Documents/mongodb-linux-x86_64-rhel70-4.2.8/bin
1.centos7.0下配置mongoDB
https://www.cnblogs.com/zhunong/p/12736471.html
2.找上面的博客配置可能会报一个错,这个错会夹在众多打印中间,不太好发现:exception in initAndListen: NonExistentPath: Data directory /data/db not found., terminating
mongod 没找到路径,解决办法:创建该路径:sudo mkdir /data/db/ -p
3.与windows不同的一点,无法通过快捷启动服务方式(net start MongoDB)启动linux下的服务,
只能在该bin目录下运行./mongod以后,新开一个命令行窗口再进入bin下执行./mongo开启(注:这个bin目录为mongo解压后的bin不是根目录的bin千万别弄错)
4.这条成功推翻了上一条,我也懒得改上面了,假设你已经可以在bin目录下运行mongo了
进入/etc/profile,下方的PATH:/home/qyd/Documents/mongodb-linux-x86_64-rhel70-4.2.8/bin
将之前的更新成上面这句以后,终端执行,使系统环境变量立即生效
source /etc/profile
5.将mongo路径软链到/usr/bin路径下,方便随处执行mongo命令,终端执行
换为你的bin
ln -s /home/qyd/Documents/mongodb-linux-x86_64-rhel70-4.2.8/bin
6.回到任意路径下,执行mongo命令,连接mongod服务,在当前终端不要离开,测试mongo/mongod任意一个命令,如果可以执行,则重启生效,重启结束,就完成了
7.使用角色登录
db.auth(‘root’,‘999999’)
8.出现问题无法使用其他ip访问的情况
先将进程打开,然后kill -9 xxxx
之后使用修复模式执行
/usr/local/mongodb/bin/mongod -f usr/local/mongodb/bin/mongod.conf --repair
看是否成功,如果成功,再次启动
/usr/local/mongodb/bin/mongod -f usr/local/mongodb/bin/mongod.conf
之后mongo --host=192.168.62.158连接(换成自己的ip)
查看效果,不成功的话,则需要重新配置mongodb.conf文件
注意,关闭服务的时候一定要用这个,不要使用kill
db.shutdownServer()
三、使用账户登录以及权限描述的具体方法
运行mongod服务并使用对应用户登录示例:
mongod --config /home/…/bin/mongodb.config
mongo testDB -u test -p testpsw
创建用户
use admin
db.createUser( {user: "admin",pwd: "123456",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
//管理员↑
//管理员↑
//普通用户↓
db.createUser({user: "test",pwd: "testpsw",roles: [ { role: "readWrite", db: "mydb" } ]}
)
查看用户:
show users
角色描述:
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限。
删除用户:
示例:
需要使用管理员账号进入对应库内删除
db.dropUser(“admin”) //删除名为admin的用户
db.dropAllUser() // 删除当前库的所有用户
修改用户密码:
方法1:db.changeUserPassword(“usertest”,“changepass”);
方法2:db.updateUser(“usertest”,{pwd:“changepass1”});
四、高级检索方式
(mongo中是可以直接使用js语句的)
1.游标查询
比如:
> use admin //切换到admin > switched to db admin > show dbs //查看所有数据库 > admin 0.000GB > config 0.000GB > local 0.000GB > qydtestdb1 0.000GB > use testDB //如果没有testDB,创建testDB > switched to db testDB > db.createCollection('testtable1'); //testDB下创建,testtable1表 > { "ok" : 1 } > for(var i=0;i<100;i++){ //for循环插入100条数据,使用js语法 > ... db.testtable1.insert({_id:i+1,name:"qyd"+i,num:i}) > ... } > WriteResult({ "nInserted" : 1 }) > db.testtable1.find().count(); //查看当前testtable1表的条数 > 100 > db.testtable1.find() //查看testtable1的数据 > { "_id" : 1, "name" : "qyd0", "num" : 0 } > { "_id" : 2, "name" : "qyd1", "num" : 1 } > { "_id" : 3, "name" : "qyd2", "num" : 2 } > { "_id" : 4, "name" : "qyd3", "num" : 3 } > { "_id" : 5, "name" : "qyd4", "num" : 4 } > { "_id" : 6, "name" : "qyd5", "num" : 5 } > { "_id" : 7, "name" : "qyd6", "num" : 6 } > { "_id" : 8, "name" : "qyd7", "num" : 7 } > { "_id" : 9, "name" : "qyd8", "num" : 8 } > { "_id" : 10, "name" : "qyd9", "num" : 9 } > { "_id" : 11, "name" : "qyd10", "num" : 10 } > { "_id" : 12, "name" : "qyd11", "num" : 11 } > { "_id" : 13, "name" : "qyd12", "num" : 12 } > { "_id" : 14, "name" : "qyd13", "num" : 13 } > { "_id" : 15, "name" : "qyd14", "num" : 14 } > { "_id" : 16, "name" : "qyd15", "num" : 15 } > { "_id" : 17, "name" : "qyd16", "num" : 16 } > { "_id" : 18, "name" : "qyd17", "num" : 17 } > { "_id" : 19, "name" : "qyd18", "num" : 18 } > { "_id" : 20, "name" : "qyd19", "num" : 19 } > Type "it" for more > it //输入it可查看接下来的20条 > var mycurser = db.testtable1.find({_id:{$lte:5}}) //创建一个游标,目前的大小限制为小于等于5,游标会从头开始,所以开头的下一条为第一条数据 > while(mycurser.hasNext()){ printjson(mycurser.next()); } //while循环这个游标,hasNext()方法为看他是否存在下一条,next()是取下一条,printjson打印 > { "_id" : 1, "name" : "qyd0", "num" : 0 } > { "_id" : 2, "name" : "qyd1", "num" : 1 } > { "_id" : 3, "name" : "qyd2", "num" : 2 } > { "_id" : 4, "name" : "qyd3", "num" : 3 } > { "_id" : 5, "name" : "qyd4", "num" : 4 } > for(var mycursor=db.testtable1.find({_id:{$lte:5}});mycursor.hasNext();){ //使用for循环也是一样的 > ... printjson(mycursor.next()) > ... } > { "_id" : 1, "name" : "qyd0", "num" : 0 } > { "_id" : 2, "name" : "qyd1", "num" : 1 } > { "_id" : 3, "name" : "qyd2", "num" : 2 } > { "_id" : 4, "name" : "qyd3", "num" : 3 } > { "_id" : 5, "name" : "qyd4", "num" : 4 } > var mycursor = db.testtable1.find({_id:{$lte:5}}) //使用forEach,obj代表当前的游标处在的单元 > mycursor.forEach(function(obj){printjson(obj)}) > { "_id" : 1, "name" : "qyd0", "num" : 0 } > { "_id" : 2, "name" : "qyd1", "num" : 1 } > { "_id" : 3, "name" : "qyd2", "num" : 2 } > { "_id" : 4, "name" : "qyd3", "num" : 3 } > { "_id" : 5, "name" : "qyd4", "num" : 4 } > var mycursor = db.testtable1.find({_id:{$lte:5}}) //还不明白可以看这个例子 > mycursor.forEach(function(obj){print('your id is'+obj._id)}); > your id is1 > your id is2 > your id is3 > your id is4 > your id is5 > var mycursor = db.testtable1.find().skip(95) //跳过多少行 > mycursor.forEach(function(obj){printjson(obj)}) > { "_id" : 96, "name" : "qyd95", "num" : 95 } > { "_id" : 97, "name" : "qyd96", "num" : 96 } > { "_id" : 98, "name" : "qyd97", "num" : 97 } > { "_id" : 99, "name" : "qyd98", "num" : 98 } > { "_id" : 100, "name" : "qyd99", "num" : 99 }> var mycursor = db.testtable1.find().skip(50).limit(10) //跳过50行取10行 > mycursor.forEach(function(obj){printjson(obj)}) > { "_id" : 51, "name" : "qyd50", "num" : 50 } > { "_id" : 52, "name" : "qyd51", "num" : 51 } > { "_id" : 53, "name" : "qyd52", "num" : 52 } > { "_id" : 54, "name" : "qyd53", "num" : 53 } > { "_id" : 55, "name" : "qyd54", "num" : 54 } > { "_id" : 56, "name" : "qyd55", "num" : 55 } > { "_id" : 57, "name" : "qyd56", "num" : 56 } > { "_id" : 58, "name" : "qyd57", "num" : 57 } > { "_id" : 59, "name" : "qyd58", "num" : 58 } > { "_id" : 60, "name" : "qyd59", "num" : 59 }> var mycursor = db.testtable1.find().skip(50).limit(5) //不打印直接以数组形式返回 > mycursor.toArray() > [ > { > "_id" : 51, > "name" : "qyd50", > "num" : 50 > }, > { > "_id" : 52, > "name" : "qyd51", > "num" : 51 > }, > { > "_id" : 53, > "name" : "qyd52", > "num" : 52 > }, > { > "_id" : 54, > "name" : "qyd53", > "num" : 53 > }, > { > "_id" : 55, > "name" : "qyd54", > "num" : 54 > } > ] > > var mycursor = db.testtable1.find().skip(50).limit(5) //使用toArray查看具体某项 > printjson(mycursor.toArray()[4]) > { "_id" : 55, "name" : "qyd54", "num" : 54 }
2.索引:
常用操作:
添加索引–> db.collection.ensureIndex({name:1})
查看索引–> db.collection.getIndexes()
删除索引–> db.collection.dropIndex({name:1})
查询子项–> db.collection.find({‘spc.area’:‘taiwan’})
为子项添加索引–> db.collection.ensureIndex({‘spc.area’:1})
同时添加多个索引–> db.collection.ensureIndex({sn:1,name:-1})
添加唯一索引–> db.collection.ensureIndex({email:1},{unique:true})
稀疏索引–> db.collection.ensureIndex({email:1},{sparse:true});
哈希索引–> db.collection.ensureIndex({email:‘hashed’})
重建索引–> db.collection.reIndex()
使用方式:
首先任何语句后都可以加.explain()查看细节
假设创建999条数据如下:
for (var i=1;i<1000;i++){ ... db.people.insert({sn:i,name:"student"+i})} WriteResult({ "nInserted" : 1 }) db.people.find().count() 999 db.people.find() { "_id" : ObjectId("5f044036291a298d7675b2eb"), "sn" : 1, "name" : "student1" } { "_id" : ObjectId("5f044036291a298d7675b2ec"), "sn" : 2, "name" : "student2" } { "_id" : ObjectId("5f044036291a298d7675b2ed"), "sn" : 3, "name" : "student3" } { "_id" : ObjectId("5f044036291a298d7675b2ee"), "sn" : 4, "name" : "student4" } { "_id" : ObjectId("5f044036291a298d7675b2ef"), "sn" : 5, "name" : "student5" } { "_id" : ObjectId("5f044036291a298d7675b2f0"), "sn" : 6, "name" : "student6" } { "_id" : ObjectId("5f044036291a298d7675b2f1"), "sn" : 7, "name" : "student7" } { "_id" : ObjectId("5f044036291a298d7675b2f2"), "sn" : 8, "name" : "student8" } { "_id" : ObjectId("5f044036291a298d7675b2f3"), "sn" : 9, "name" : "student9" } { "_id" : ObjectId("5f044036291a298d7675b2f4"), "sn" : 10, "name" : "student10" } { "_id" : ObjectId("5f044036291a298d7675b2f5"), "sn" : 11, "name" : "student11" } { "_id" : ObjectId("5f044036291a298d7675b2f6"), "sn" : 12, "name" : "student12" } { "_id" : ObjectId("5f044036291a298d7675b2f7"), "sn" : 13, "name" : "student13" } { "_id" : ObjectId("5f044036291a298d7675b2f8"), "sn" : 14, "name" : "student14" } { "_id" : ObjectId("5f044036291a298d7675b2f9"), "sn" : 15, "name" : "student15" } { "_id" : ObjectId("5f044036291a298d7675b2fa"), "sn" : 16, "name" : "student16" } { "_id" : ObjectId("5f044036291a298d7675b2fb"), "sn" : 17, "name" : "student17" } { "_id" : ObjectId("5f044036291a298d7675b2fc"), "sn" : 18, "name" : "student18" } { "_id" : ObjectId("5f044036291a298d7675b2fd"), "sn" : 19, "name" : "student19" } { "_id" : ObjectId("5f044036291a298d7675b2fe"), "sn" : 20, "name" : "student20" } Type "it" for more
加入索引,1为正序-1为倒序> db.people.ensureIndex({sn:1}) //创建索引 > { > "createdCollectionAutomatically" : false, > "numIndexesBefore" : 1, > "numIndexesAfter" : 2, > "ok" : 1 > }> db.people.getIndexes() //查看索引,id和sn,id为自带的sn为自己创建的 > [ > { > "v" : 2, > "key" : { > "_id" : 1 > }, > "name" : "_id_", > "ns" : "testDB.people" > }, > { > "v" : 2, > "key" : { > "sn" : 1 > }, > "name" : "sn_1", > "ns" : "testDB.people" > } > ]> db.people.ensureIndex({name:-1}) //再次创建name索引,倒序 > { > "createdCollectionAutomatically" : false, > "numIndexesBefore" : 2, > "numIndexesAfter" : 3, > "ok" : 1 > }> db.people.dropIndex({name:-1}) //删除索引,我们删除的是倒序索引“name” > { "nIndexesWas" : 3, "ok" : 1 }> db.people.dropIndexes() //删除除_id的所有其他索引 > { > "nIndexesWas" : 2, > "msg" : "non-_id indexes dropped for collection", > "ok" : 1 > } > db.people.getIndexes() //获取索引,发现只有_id > [ > { > "v" : 2, > "key" : { > "_id" : 1 > }, > "name" : "_id_", > "ns" : "testDB.people" > } > ] > > db.people.ensureIndex({sn:1,name:-1}) //同时创建多个索引{"createdCollectionAutomatically" : false,"numIndexesBefore" : 1,"numIndexesAfter" : 2,"ok" : 1 }> 查询子项:db.shop.find({'spc.area':'taiwan'}) > db.shop.insert({name:'Nokia',spc:{weight:120,area:'taiwan'}}); //插入两条数据,spc的子项area为taiwan和hanguo > WriteResult({ "nInserted" : 1 }) > db.shop.insert({name:'sumsong',spc:{weight:100,area:'hanguo'}}); > WriteResult({ "nInserted" : 1 }) > db.shop.find({name:'Nokia'}) //查找name为Nokia的项 > { "_id" : ObjectId("5f0457192314195032b33168"), "name" : "Nokia", "spc" : { "weight" : 120, "area" : "taiwan" } } > > db.shop.find({'spc.area':'taiwan'}) //spc.area,记得加冒号左边的引号 > { "_id" : ObjectId("5f0457192314195032b33168"), "name" : "Nokia", "spc" : { "weight" : 120, "area" : "taiwan" } }> db.shop.ensureIndex({'spc.area':1}) //为子项添加索引 > { > "createdCollectionAutomatically" : false, > "numIndexesBefore" : 1, > "numIndexesAfter" : 2, > "ok" : 1 > }刚刚是普通索引,接下来: 唯一索引:db.teacher.ensureIndex({email:1},{unique:true}) > db.teacher.ensureIndex({email:1},{unique:true}) //使用unique:true给email设置为唯一索引 > { > "createdCollectionAutomatically" : false, > "numIndexesBefore" : 1, > "numIndexesAfter" : 2, > "ok" : 1 > } > > 当添加email为key为唯一key以后,我无法重复添加一样key的数据比如 > db.teacher.insert({email:"c@163.com"}) //添加了一条email:"c@163.com" > WriteResult({ "nInserted" : 1 }) > db.teacher.getIndexes() //获取当前索引 > [ > { > "v" : 2, > "key" : { > "_id" : 1 > }, > "name" : "_id_", > "ns" : "testDB.teacher" > }, > { > "v" : 2, > "unique" : true, > "key" : { > "email" : 1 > }, > "name" : "email_1", > "ns" : "testDB.teacher" > } > ] > db.teacher.insert({email:"c@163.com"}) //再次添加相同的email:"c@163.com"会报错 > WriteResult({ > "nInserted" : 0, > "writeError" : { > "code" : 11000, > "errmsg" : "E11000 duplicate key error collection: testDB.teacher index: email_1 dup key: { email: \"c@163.com\" }" > } > })
稀疏索引:db.teacher.ensureIndex({email:1},{sparse:true});
举个栗子:
db.teacher.insert({}) //插入一条空数据 WriteResult({ "nInserted" : 1 }) db.teacher.find() //查询表 { "_id" : ObjectId("5f0461dceb04e9c035bf7a9d"), "email" : "a@163.com" } { "_id" : ObjectId("5f0461dfeb04e9c035bf7a9e"), "email" : "b@163.com" } { "_id" : ObjectId("5f053bb8caddd86cd63d7505"), "email" : "c@163.com" } { "_id" : ObjectId("5f053d84caddd86cd63d7507") } db.teacher.ensureIndex({email:1}) //插入索引email正序 { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } db.teacher.find({email:null}) //直接查找email为空的,可以正常查询到 { "_id" : ObjectId("5f053d84caddd86cd63d7507") }稀疏索引概念:如果针对某一个键(email)做索引,针对不含email的文档,将不建立索引 与之相对,普通索引会把该文档的email列的值认为NULL并创建索引 适用于:小部分文档含有某列时 db.teacher.ensureIndex({email:1},{sparse:true}); //创建稀疏索引{sparse:true} { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } db.teacher.find({email:1}) //查询不到没有email的根据email:null查询,普通可以查到,稀疏查不到
哈希索引: db.teacher.ensureIndex({email:‘hashed’})
特点:时间复杂度低,数据多的情况下推荐使用
db.teacher.dropIndexes() //首先删除所有索引 { "nIndexesWas" : 2, "msg" : "non-_id indexes dropped for collection", "ok" : 1 } db.teacher.ensureIndex({email:'hashed'}) //创建哈希索引email { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } db.teacher.find({email:'a@163.com'}) //查找a@163.com { "_id" : ObjectId("5f0461dceb04e9c035bf7a9d"), "email" : "a@163.com" } db.teacher.find({email:'a@163.com'}).explain() //查看细节 { "queryPlanner" : {"plannerVersion" : 1,"namespace" : "testDB.teacher","indexFilterSet" : false,"parsedQuery" : {"email" : {"$eq" : "a@163.com"}},"queryHash" : "F4C3CE3A","planCacheKey" : "214EB173","winningPlan" : {"stage" : "FETCH","filter" : {"email" : {"$eq" : "a@163.com"}},"inputStage" : {"stage" : "IXSCAN","keyPattern" : {"email" : "hashed"},"indexName" : "email_hashed","isMultiKey" : false,"isUnique" : false,"isSparse" : false,"isPartial" : false,"indexVersion" : 2,"direction" : "forward","indexBounds" : {"email" : ["[2069420833715827975, 2069420833715827975]"]}}},"rejectedPlans" : [ ] }, "serverInfo" : {"host" : "www.test.com","port" : 27017,"version" : "4.2.8","gitVersion" : "43d25964249164d76d5e04dd6cf38f6111e21f5f" }, "ok" : 1 }
重建索引: db.collection.reIndex()
一个表经过多次修改后,导致表的文件产生空洞,索引文件如此。
可以通过索引重建,来提交索引的效率,类似mysql中的optimize table
作用:重建collection中的所有索引,包括_id
意义:减少索引文件碎片,提升索引效率
五、导入与导出
注:以下的所有操作,在没有权限要求的库中,都可以直接将./mongo/bin/目录下的mongodb.config中的auth设置为false,在输入命令的时候可以不输入:-u和-p
1.导入、导出可以操作的是本地的mongodb服务器,也可以是远程的
所以,都有如下通用选项:
-h host 主机
–port port 端口
-u username 用户名
-p passwd 密码
2.mongoexport 导出json格式的文件
问:导出哪个库,哪张表,哪几列,哪几行?
-d 库名
-c 表名
-f field1,field2…列名
-q 查询条件
-o 导出的文件名称
–csv 导出csv格式
开始导出:
导出json
首先进入mongo目录的bin目录下。ls查看是否有mongoexport,找到后
终端输入:
[root@www bin]# mongoexport -h 127.0.0.1 --port 27017 -u 'test' -p 'testpassword' -d testDB -c people -o ./locateInfo.json
即可使用test用户导出testDB库的文件为locateInfo.json
(我尝试直接使用超级管理员导出这个文件夹的时候它提示连接失败了,貌似只能用该db下的用户才可以导出)
下方为增加-q查询条件的使用方式,–query和-q都ok
[root@www bin]# mongoexport -h 127.0.0.1 --port 27017 -u 'test' -p 'testpassword' -d testDB -c people --query '{"sn":{"$lte":100}}' -o ./locateInfo5.json
2020-07-08T01:34:17.100-0700 connected to: mongodb://127.0.0.1:27017/
2020-07-08T01:34:17.105-0700 exported 100 records
导出csv
[root@www bin]# mongoexport -h 127.0.0.1 --port 27017 -u 'test' -p 'testpassword' -d testDB -c people -f name,sn --query '{"sn":{"$lte":100}}' --type=csv -o ./locateInfo.csv
2020-07-08T01:41:46.973-0700 connected to: mongodb://127.0.0.1:27017/
2020-07-08T01:41:46.976-0700 exported 100 records
注意,csv文件需要制定-f,也就是需要指定导出的列
上方导出的文件样式为:
name,sn
student1,1
student2,2
student3,3
student4,4
student5,5
student6,6
student7,7
student8,8
student9,9
student10,10
student11,11...(共100条)
导出csv的目的,便于和传统数据库交换数据
开始导入:
导入json
[root@www bin]# mongoimport -h 127.0.0.1 --port 27017 -u 'q' -p '123456' -d qydtestdb1 -c shop --type json --file ./locateInfo5.json
2020-07-08T02:01:21.114-0700 connected to: mongodb://127.0.0.1:27017/
2020-07-08T02:01:21.149-0700 100 document(s) imported successfully. 0 document(s) failed to import.
使用用户”q“向qydtestdb1数据库中的shop表中导入了 ./locateInfo5.json 中的数据
[root@www bin]# mongoimport -h 127.0.0.1 --port 27017 -u 'q' -p '123456' -d qydtestdb1 -c test100 --type json --file ./locateInfo5.json
2020-07-08T02:03:26.661-0700 connected to: mongodb://127.0.0.1:27017/
2020-07-08T02:03:26.761-0700 100 document(s) imported successfully. 0 document(s) failed to import.
如果表没有,则会创建该表,上方的意思为创建一个为test100的表
导入csv
[root@www bin]# mongoimport -h 127.0.0.1 --port 27017 -u 'q' -p '123456' -d qydtestdb1 -c testcsv --type=csv --headerline --file ./locateInfo.csv
2020-07-08T02:24:47.783-0700 connected to: mongodb://127.0.0.1:27017/
2020-07-08T02:24:47.788-0700 100 document(s) imported successfully. 0 document(s) failed to import.
使用用户”q“将./locateInfo.csv 文件导入到数据库testcsv中
–headerline,跳过第一行
–type需要改为csv
由于csv文件第一行为没有用的描述行,所以需要使用–headerline跳过第一行
二进制导出:
[root@www bin]# mongodump -h 127.0.0.1 --port 27017 -u 'q' -p '123456' -d qydtestdb1 -c shop //二进制导出qydtestdb1中的shop
2020-07-08T02:33:31.120-0700 writing qydtestdb1.shop to dump/qydtestdb1/shop.bson
2020-07-08T02:33:31.122-0700 done dumping qydtestdb1.shop (102 documents)
[root@www bin]# ls
bin locateInfo5.json mongodb.conf mongoimport mongostat
bsondump locateInfo.csv mongodump mongoreplay mongotop
dump mongo mongoexport mongorestore peopleTest.json
install_compass mongod mongofiles mongos
[root@www bin]# cd dump/[root@www dump]# cd qydtestdb1/
[root@www qydtestdb1]# ls
shop.bson shop.metadata.json
导出的文件放在了当前bin目录下的dump中以数据库名称命名的文件(qydtestdb1),进去可以看到最终导出了一个json一个bson文件
[root@www qydtestdb1]# mongodump -h 127.0.0.1 --port 27017 -u 'q' -p '123456' -d qydtestdb1
2020-07-08T02:56:23.982-0700 writing qydtestdb1.shop to dump/qydtestdb1/shop.bson
2020-07-08T02:56:23.983-0700 done dumping qydtestdb1.shop (102 documents)
2020-07-08T02:56:24.005-0700 writing qydtestdb1.qydtesttable1 to dump/qydtestdb1/qydtesttable1.bson
2020-07-08T02:56:24.016-0700 done dumping qydtestdb1.qydtesttable1 (2 documents)
2020-07-08T02:56:24.016-0700 writing qydtestdb1.testcsv2 to dump/qydtestdb1/testcsv2.bson
2020-07-08T02:56:24.017-0700 writing qydtestdb1.testcsv to dump/qydtestdb1/testcsv.bson
2020-07-08T02:56:24.017-0700 writing qydtestdb1.test100 to dump/qydtestdb1/test100.bson
2020-07-08T02:56:24.017-0700 done dumping qydtestdb1.testcsv2 (100 documents)
2020-07-08T02:56:24.018-0700 done dumping qydtestdb1.testcsv (100 documents)
2020-07-08T02:56:24.018-0700 done dumping qydtestdb1.test100 (100 documents)
[root@www qydtestdb1]# ls
dump shop.bson shop.metadata.json
[root@www qydtestdb1]# cd dump/qydtestdb1/
[root@www qydtestdb1]# ls
qydtesttable1.bson test100.bson testcsv.bson
qydtesttable1.metadata.json test100.metadata.json testcsv.metadata.json
shop.bson testcsv2.bson
shop.metadata.json testcsv2.metadata.json
[root@www qydtestdb1]#
如果再导出的时候不指定表,则会将所有的表全部导出
二进制导入:
我首先将qydtestdb1数据库再mongo中删除,然后用下方命令再刚刚的dump文件夹中恢复qydtestdb1数据库
mongorestore -u q -p 123456 -d qydtestdb1 ./dump/qydtestdb1 //恢复数据库2020-07-08T04:16:02.924-0700 the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead
2020-07-08T04:16:02.924-0700 building a list of collections to restore from dump/qydtestdb1 dir
2020-07-08T04:16:02.924-0700 reading metadata for qydtestdb1.shop from dump/qydtestdb1/shop.metadata.json
2020-07-08T04:16:02.925-0700 reading metadata for qydtestdb1.test100 from dump/qydtestdb1/test100.metadata.json
2020-07-08T04:16:02.926-0700 reading metadata for qydtestdb1.testcsv from dump/qydtestdb1/testcsv.metadata.json
2020-07-08T04:16:02.962-0700 reading metadata for qydtestdb1.testcsv2 from dump/qydtestdb1/testcsv2.metadata.json
2020-07-08T04:16:02.962-0700 restoring qydtestdb1.testcsv from dump/qydtestdb1/testcsv.bson
2020-07-08T04:16:02.967-0700 no indexes to restore
2020-07-08T04:16:02.967-0700 finished restoring qydtestdb1.testcsv (100 documents, 0 failures)
2020-07-08T04:16:02.967-0700 reading metadata for qydtestdb1.qydtesttable1 from dump/qydtestdb1/qydtesttable1.metadata.json
2020-07-08T04:16:02.968-0700 restoring qydtestdb1.shop from dump/qydtestdb1/shop.bson
2020-07-08T04:16:02.972-0700 restoring indexes for collection qydtestdb1.shop from metadata
2020-07-08T04:16:02.974-0700 restoring qydtestdb1.test100 from dump/qydtestdb1/test100.bson
2020-07-08T04:16:03.008-0700 no indexes to restore
2020-07-08T04:16:03.008-0700 finished restoring qydtestdb1.test100 (100 documents, 0 failures)
2020-07-08T04:16:03.010-0700 restoring qydtestdb1.qydtesttable1 from dump/qydtestdb1/qydtesttable1.bson
2020-07-08T04:16:03.012-0700 no indexes to restore
2020-07-08T04:16:03.012-0700 finished restoring qydtestdb1.qydtesttable1 (2 documents, 0 failures)
2020-07-08T04:16:03.015-0700 restoring qydtestdb1.testcsv2 from dump/qydtestdb1/testcsv2.bson
2020-07-08T04:16:03.018-0700 no indexes to restore
2020-07-08T04:16:03.018-0700 finished restoring qydtestdb1.testcsv2 (100 documents, 0 failures)
2020-07-08T04:16:03.022-0700 finished restoring qydtestdb1.shop (102 documents, 0 failures)
2020-07-08T04:16:03.022-0700 404 document(s) restored successfully. 0 document(s) failed to restore.
[root@www bin]#
六、replication set复制集
定义:多台服务器维护相同的数据副本,提高服务器的可用性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-egPQ38tq-1594379012742)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200709120650965.png)]
Replication set设置过程
1.克隆主从虚拟机
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-085gNdn9-1594379012745)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200709154106617.png)]
右击你当前的虚拟机名称–>管理–>克隆
在克隆向导中点击下一步,而后选中虚拟机中的当前状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eJqg6opI-1594379012746)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200709154157177.png)]
选择创建完整克隆
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gBq3lMyJ-1594379012747)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200709154224699.png)]
取名我这里更改成了primary,克隆的另外的两个我改名为secondary1和secondary2,文件夹也可以根据要求随意更改,之后点击完成即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IlcSBHu9-1594379012748)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200709154255431.png)]
2.启动虚拟机
由于是克隆的虚拟机,所以账号密码都跟之前是一样的,三个都启动并且修改mongo/bin/目录下的mongodb.conf文件内容为如下,具体文件夹可根据自己需求更改
注意:最后一行为必须项,此行将作为复制集的_id
#任何机器可以连接
#bind_ip_all = true
port=27017
bind_ip=0.0.0.0 #默认是127.0.0.1
dbpath=/home/qyd/Documents/data/
logpath=/home/qyd/Documents/logs/mongodb.log #日志文件
logappend=true
fork=true #设置后台运行
#auth=true #开启认证
#smallfiles=true #开启小文件存储
replSet=qyd_repl
shardsvr=true #分片集群必需属性
3.创建复制集
先进入你想成为主的服务器中,开启服务进入mongo,并且use admin,输入js脚本如下
> use admin switched to db admin>var rsconf = { _id:'qyd_repl', members:[ { _id:0, host:'192.168.62.158:27017' }, { _id:1, host:'192.168.62.159:27017' }, { _id:2, host:'192.168.62.160:27017' } ] } > printjson(rsconf) //打印看到刚刚添加的变量rsconf {"_id" : "qyd_repl","members" : [{"_id" : 0,"host" : "192.168.62.158:27017"},{"_id" : 1,"host" : "192.168.62.159:27017"},{"_id" : 2,"host" : "192.168.62.160:27017"}] } >
初始化
初始化rsconf(执行这一步之前一定要关闭防火墙)
关闭防火墙命令 :systemctl stop firewalld
rs.initiate(rsconf)
{
"ok" : 1,
"$clusterTime" : {"clusterTime" : Timestamp(1594276538, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}
},
"operationTime" : Timestamp(1594276538, 1)
}
查看状态:
//查看当前状态是否添加成功
qyd_repl:PRIMARY> rs.status()
{"set" : "qyd_repl","date" : ISODate("2020-07-09T06:37:33.007Z"),"myState" : 1,"term" : NumberLong(1),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"heartbeatIntervalMillis" : NumberLong(2000),"majorityVoteCount" : 2,"writeMajorityCount" : 2,"optimes" : {"lastCommittedOpTime" : {"ts" : Timestamp(1594276649, 1),"t" : NumberLong(1)},"lastCommittedWallTime" : ISODate("2020-07-09T06:37:29.585Z"),"readConcernMajorityOpTime" : {"ts" : Timestamp(1594276649, 1),"t" : NumberLong(1)},"readConcernMajorityWallTime" : ISODate("2020-07-09T06:37:29.585Z"),"appliedOpTime" : {"ts" : Timestamp(1594276649, 1),"t" : NumberLong(1)},"durableOpTime" : {"ts" : Timestamp(1594276649, 1),"t" : NumberLong(1)},"lastAppliedWallTime" : ISODate("2020-07-09T06:37:29.585Z"),"lastDurableWallTime" : ISODate("2020-07-09T06:37:29.585Z")},"lastStableRecoveryTimestamp" : Timestamp(1594276609, 1),"lastStableCheckpointTimestamp" : Timestamp(1594276609, 1),"electionCandidateMetrics" : {"lastElectionReason" : "electionTimeout","lastElectionDate" : ISODate("2020-07-09T06:35:49.553Z"),"electionTerm" : NumberLong(1),"lastCommittedOpTimeAtElection" : {"ts" : Timestamp(0, 0),"t" : NumberLong(-1)},"lastSeenOpTimeAtElection" : {"ts" : Timestamp(1594276538, 1),"t" : NumberLong(-1)},"numVotesNeeded" : 2,"priorityAtElection" : 1,"electionTimeoutMillis" : NumberLong(10000),"numCatchUpOps" : NumberLong(0),"newTermStartDate" : ISODate("2020-07-09T06:35:49.576Z"),"wMajorityWriteAvailabilityDate" : ISODate("2020-07-09T06:35:50.777Z")},"members" : [{"_id" : 0,"name" : "192.168.62.158:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 619,"optime" : {"ts" : Timestamp(1594276649, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2020-07-09T06:37:29Z"),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "could not find member to sync from","electionTime" : Timestamp(1594276549, 1),"electionDate" : ISODate("2020-07-09T06:35:49Z"),"configVersion" : 1,"self" : true,"lastHeartbeatMessage" : ""},{"_id" : 1,"name" : "192.168.62.159:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 114,"optime" : {"ts" : Timestamp(1594276649, 1),"t" : NumberLong(1)},"optimeDurable" : {"ts" : Timestamp(1594276649, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2020-07-09T06:37:29Z"),"optimeDurableDate" : ISODate("2020-07-09T06:37:29Z"),"lastHeartbeat" : ISODate("2020-07-09T06:37:31.619Z"),"lastHeartbeatRecv" : ISODate("2020-07-09T06:37:32.662Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncingTo" : "192.168.62.158:27017","syncSourceHost" : "192.168.62.158:27017","syncSourceId" : 0,"infoMessage" : "","configVersion" : 1},{"_id" : 2,"name" : "192.168.62.160:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 114,"optime" : {"ts" : Timestamp(1594276649, 1),"t" : NumberLong(1)},"optimeDurable" : {"ts" : Timestamp(1594276649, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2020-07-09T06:37:29Z"),"optimeDurableDate" : ISODate("2020-07-09T06:37:29Z"),"lastHeartbeat" : ISODate("2020-07-09T06:37:31.619Z"),"lastHeartbeatRecv" : ISODate("2020-07-09T06:37:32.622Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncingTo" : "192.168.62.158:27017","syncSourceHost" : "192.168.62.158:27017","syncSourceId" : 0,"infoMessage" : "","configVersion" : 1}],"ok" : 1,"$clusterTime" : {"clusterTime" : Timestamp(1594276649, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}},"operationTime" : Timestamp(1594276649, 1)
}
qyd_repl:PRIMARY>
测试复制集
数据测试
qyd_repl:PRIMARY> use studentdb
switched to db studentdb
qyd_repl:PRIMARY> db.student.insert({_id:1,name:'曲耀达',enname:'qyd',age:23});
WriteResult({ "nInserted" : 1 })
qyd_repl:PRIMARY> db.student.insert({_id:2,name:'乔越鑫',enname:'qyx',age:23});
WriteResult({ "nInserted" : 1 })
qyd_repl:PRIMARY> db.student.find().pretty()
{ "_id" : 1, "name" : "曲耀达", "enname" : "qyd", "age" : 23 }
{ "_id" : 2, "name" : "乔越鑫", "enname" : "qyx", "age" : 23 }
添加完以后,先使用数据库图形界面管理工具查看一下,连接主服务器PRIMARY,我这里是192.168.62.158,这个工具无法连接从服务器SECONDARY
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ClnZckJ3-1594379012749)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200709145518487.png)]
可以看到是有的,这个时候我们再xshell中登录复制集查看,在show dbs的时候,会提示如下报错
qyd_repl:SECONDARY> show db
2020-07-08T23:51:52.084-0700 E QUERY [js] uncaught exception: Error: don't know how to show [db] :
shellHelper.show@src/mongo/shell/utils.js:1139:11
shellHelper@src/mongo/shell/utils.js:790:15
@(shellhelp2):1:1
qyd_repl:SECONDARY> show dbs
2020-07-08T23:51:53.462-0700 E QUERY [js] uncaught exception: Error: listDatabases failed:{"operationTime" : Timestamp(1594277509, 1),"ok" : 0,"errmsg" : "not master and slaveOk=false","code" : 13435,"codeName" : "NotMasterNoSlaveOk","$clusterTime" : {"clusterTime" : Timestamp(1594277509, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
} :
这个时候我们可以使用rs.help中的方法,rs.slaveOk()来允许访问,运行以后如下
qyd_repl:SECONDARY> rs.slaveOk()
qyd_repl:SECONDARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
newqydtest 0.000GB
qydtestdb1 0.000GB
studentdb 0.000GB
testDB 0.000GB
qyd_repl:SECONDARY>
qyd_repl:SECONDARY> use studentdb
switched to db studentdb
qyd_repl:SECONDARY> db.student.find().pretty()
{ "_id" : 1, "name" : "曲耀达", "enname" : "qyd", "age" : 23 }
{ "_id" : 2, "name" : "乔越鑫", "enname" : "qyx", "age" : 23 }
qyd_repl:SECONDARY>
目前我们有两个从节点(集),当我们需要添加或删除的时候可以执行
rs.add(192.168.xx.xx:2701x)
rs.remove(192.168.xx.xx:2701x)
执行完上面两行中的任意一行后,执行
rs.reconfig(rsconfig) 重新读取config即可
修改完记得rs.status()查看状态
崩溃测试
我们将主服务器使用db.shutdownServer()关掉
qyd_repl:PRIMARY> db.shutdownServer()
shutdown command only works with the admin database; try 'use admin'
qyd_repl:PRIMARY> use admin
switched to db admin
qyd_repl:PRIMARY> db.shutdownServer()
2020-07-09T00:24:00.115-0700 I NETWORK [js] DBClientConnection failed to receive message from 127.0.0.1:27017 - HostUnreachable: Connection closed by peer
server should be down...
2020-07-09T00:24:00.134-0700 I NETWORK [js] trying reconnect to 127.0.0.1:27017 failed
2020-07-09T00:24:00.138-0700 I NETWORK [js] reconnect 127.0.0.1:27017 failed failed
2020-07-09T00:24:00.141-0700 I NETWORK [js] trying reconnect to 127.0.0.1:27017 failed
2020-07-09T00:24:00.141-0700 I NETWORK [js] reconnect 127.0.0.1:27017 failed failed
然后在从服务器中输入rs.status()测试当前状态
qyd_repl:SECONDARY> rs.status()
{"set" : "qyd_repl","date" : ISODate("2020-07-09T07:24:21.036Z"),"myState" : 1,"term" : NumberLong(2),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"heartbeatIntervalMillis" : NumberLong(2000),"majorityVoteCount" : 2,"writeMajorityCount" : 2,"optimes" : {"lastCommittedOpTime" : {"ts" : Timestamp(1594279460, 1),"t" : NumberLong(2)},"lastCommittedWallTime" : ISODate("2020-07-09T07:24:20.121Z"),"readConcernMajorityOpTime" : {"ts" : Timestamp(1594279460, 1),"t" : NumberLong(2)},"readConcernMajorityWallTime" : ISODate("2020-07-09T07:24:20.121Z"),"appliedOpTime" : {"ts" : Timestamp(1594279460, 1),"t" : NumberLong(2)},"durableOpTime" : {"ts" : Timestamp(1594279460, 1),"t" : NumberLong(2)},"lastAppliedWallTime" : ISODate("2020-07-09T07:24:20.121Z"),"lastDurableWallTime" : ISODate("2020-07-09T07:24:20.121Z")},"lastStableRecoveryTimestamp" : Timestamp(1594279429, 1),"lastStableCheckpointTimestamp" : Timestamp(1594279429, 1),"electionCandidateMetrics" : {"lastElectionReason" : "stepUpRequestSkipDryRun","lastElectionDate" : ISODate("2020-07-09T07:23:59.057Z"),"electionTerm" : NumberLong(2),"lastCommittedOpTimeAtElection" : {"ts" : Timestamp(1594279429, 1),"t" : NumberLong(1)},"lastSeenOpTimeAtElection" : {"ts" : Timestamp(1594279429, 1),"t" : NumberLong(1)},"numVotesNeeded" : 2,"priorityAtElection" : 1,"electionTimeoutMillis" : NumberLong(10000),"priorPrimaryMemberId" : 0,"numCatchUpOps" : NumberLong(0),"newTermStartDate" : ISODate("2020-07-09T07:24:00.117Z"),"wMajorityWriteAvailabilityDate" : ISODate("2020-07-09T07:24:00.800Z")},"electionParticipantMetrics" : {"votedForCandidate" : true,"electionTerm" : NumberLong(1),"lastVoteDate" : ISODate("2020-07-09T06:35:49.553Z"),"electionCandidateMemberId" : 0,"voteReason" : "","lastAppliedOpTimeAtElection" : {"ts" : Timestamp(1594276538, 1),"t" : NumberLong(-1)},"maxAppliedOpTimeInSet" : {"ts" : Timestamp(1594276538, 1),"t" : NumberLong(-1)},"priorityAtElection" : 1},"members" : [{"_id" : 0,"name" : "192.168.62.158:27017","health" : 0,"state" : 8,"stateStr" : "(not reachable/healthy)","uptime" : 0,"optime" : {"ts" : Timestamp(0, 0),"t" : NumberLong(-1)},"optimeDurable" : {"ts" : Timestamp(0, 0),"t" : NumberLong(-1)},"optimeDate" : ISODate("1970-01-01T00:00:00Z"),"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),"lastHeartbeat" : ISODate("2020-07-09T07:24:20.123Z"),"lastHeartbeatRecv" : ISODate("2020-07-09T07:23:59.024Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "Error connecting to 192.168.62.158:27017 :: caused by :: Connection refused","syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","configVersion" : -1},{"_id" : 1,"name" : "192.168.62.159:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 3439,"optime" : {"ts" : Timestamp(1594279460, 1),"t" : NumberLong(2)},"optimeDate" : ISODate("2020-07-09T07:24:20Z"),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "could not find member to sync from","electionTime" : Timestamp(1594279439, 1),"electionDate" : ISODate("2020-07-09T07:23:59Z"),"configVersion" : 1,"self" : true,"lastHeartbeatMessage" : ""},{"_id" : 2,"name" : "192.168.62.160:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 2922,"optime" : {"ts" : Timestamp(1594279450, 1),"t" : NumberLong(2)},"optimeDurable" : {"ts" : Timestamp(1594279450, 1),"t" : NumberLong(2)},"optimeDate" : ISODate("2020-07-09T07:24:10Z"),"optimeDurableDate" : ISODate("2020-07-09T07:24:10Z"),"lastHeartbeat" : ISODate("2020-07-09T07:24:19.106Z"),"lastHeartbeatRecv" : ISODate("2020-07-09T07:24:20.804Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncingTo" : "192.168.62.159:27017","syncSourceHost" : "192.168.62.159:27017","syncSourceId" : 1,"infoMessage" : "","configVersion" : 1}],"ok" : 1,"$clusterTime" : {"clusterTime" : Timestamp(1594279460, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}},"operationTime" : Timestamp(1594279460, 1)
}
qyd_repl:PRIMARY>
由上方members中的提示看出,我们的主机192.168.62.158:27017的health为0,代表已经宕掉了
此时我们再看我们从服务器中的192.168.62.159:27017的stateStr字段显示为PRIMARY,此时代表它已经自动成为了新的主服务器。
此时再向192.168.62.159:27017,也就是现在的PRIMARY中写一条数据,
qyd_repl:PRIMARY> db.student.insert({_id:3,name:"孟繁松",enname:'mfs',age:26})
WriteResult({ "nInserted" : 1 })
然后在另一台SECONDARY也就是192.168.62.160:27017上访问
qyd_repl:SECONDARY> db.student.find().pretty()
{ "_id" : 1, "name" : "曲耀达", "enname" : "qyd", "age" : 23 }
{ "_id" : 2, "name" : "乔越鑫", "enname" : "qyx", "age" : 23 }
{ "_id" : 3, "name" : "孟繁松", "enname" : "mfs", "age" : 26 }
qyd_repl:SECONDARY>
通过测试
七、Shard分片
需要的集群环境:
2个分片复制集
shard(192.168.62.158:27017、192.168.62.159:27017、192.168.62.160:27017)
shard(192.168.62.158:27018、192.168.62.159:27018、192.168.62.160:27018)
1个config复制集
(192.168.62.158:28018、192.168.62.159:28018、192.168.62.160:28018)
1个mongos节点
创建新的conf
三台虚拟机都进入mongo/bin/ 在文件夹中创建新的conf文件mongodb2.conf
内容跟之前的conf只有:
①端口port
②数据及log文件夹名称dbpath和logpath
③复制集id名称replSet不同
#任何机器可以连接
#bind_ip_all = true
port=27018
bind_ip=0.0.0.0 #默认是127.0.0.1
dbpath=/home/qyd/Documents/data/db2
logpath=/home/qyd/Documents/logs/mongodb2.log #日志文件
logappend=true
fork=true #设置后台运行
#auth=true #开启认证
smallfiles=true #开启小文件存储
replSet=qyd_repl2
shardsvr=true #分片集群必须有的属性
启动第二个副本集
3台虚拟机都启动副本集
mongod --config mongodb2.conf
运行netstat -ntlp查看是否两个mongo都启动成功(三台都要看)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rS3Uk3Wr-1594379012750)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200710112250641.png)]
(非强迫症无需执行:由于刚刚我们崩溃测试中将158机器的服务干掉了。所以现在159为复制集的主节点,我们现在进入三台虚拟机的mongo中,db.shutdownServer()干掉159,然后rs.status()查看,158是否恢复成主节点,操作很简单,不再阐述)
现在进入27018
mongo -port 27018
先配置27018的复制集
> use admin switched to db admin > var rsconf2 = { _id:'qyd_repl2', members:[ { _id:0, host:'192.168.62.158:27018' }, { _id:1, host:'192.168.62.159:27018' }, { _id:2, host:'192.168.62.160:27018' } ] } > printjson(rsconf2) {"_id" : "qyd_repl2","members" : [{"_id" : 0,"host" : "192.168.62.158:27018"},{"_id" : 1,"host" : "192.168.62.159:27018"},{"_id" : 2,"host" : "192.168.62.160:27018"}] } >
然后,检查防火墙,检查防火墙,检查防火墙*100000000000000,重要的事情说tm1000000000000000遍,我这步tm防火墙不知道啥时候自己开了,各种找问题一直配一直提示一个SECONDARY两个STARTUP,心态差点崩溃。he!tui!萨比防火墙!
关闭防火墙命令 :systemctl stop firewalld
rs.initiate(rsconf2)初始化,与上面步骤一样,然后rs.status()查看状态。
搭建config节点复制集
创建config节点配置文件:mongodb-cfg.conf,下方ip需要修改
systemLog:destination: file path: "/home/qyd/Documents/mongo-cfg/logs/mongodb.log"logAppend: true
storage:journal:enabled: truedbPath: "/home/qyd/Documents/mongo-cfg/data"
processManagement:fork: true
net: bindIp: 192.168.62.158port: 28018
replication:oplogSizeMB: 2048replSetName: "configReplSet"
sharding:clusterRole: configsvr
三台都启动复制集
然后./mongod --config ./mongodb-cfg.conf
三台启动服务
mongo -host 192.168.62.158 -port 28018
mongo -host 192.168.62.159 -port 28018
mongo -host 192.168.62.160 -port 28018
rs.initiate({"_id" : "configReplSet","configsvr": true,"members" : [{"_id" : 0,"host" : "192.168.62.158:28018"},{"_id" : 1,"host" : "192.168.62.159:28018"},{"_id" : 2,"host" : "192.168.62.160:28018"}]
})
ok:1则代表成功
可以re.status()查看状态也可以多敲两下回车等待选举
mongos节点(158)
mongos配置文件
systemLog:destination: filepath: "/home/qyd/Documents/mongos/log/mongos.log"logAppend: true
processManagement:fork: true
net:bindIp: 192.168.62.158port: 28017
sharding:configDB: configReplSet/192.168.62.158:28018,192.168.62.159:28018,192.168.62.160:28018
启动mongos
[root@www bin]# vim mongos.conf
[root@www bin]# ./mongos --config ./mongos.conf
about to fork child process, waiting until server is ready for connections.
forked process: 19583
child process started successfully, parent exiting
[root@www bin]#
登录进去mongos
mongo 192.168.62.158:28017
[root@www bin]# mongo 192.168.62.158:28017
MongoDB shell version v4.2.8
connecting to: mongodb://192.168.62.158:28017/test?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("a3d99e8c-dd19-4dd1-9c0b-1c7a851fa328") }
MongoDB server version: 4.2.8
Server has startup warnings:
2020-07-10T02:48:51.618-0700 I CONTROL [main]
2020-07-10T02:48:51.618-0700 I CONTROL [main] ** WARNING: Access control is not enabled for the database.
2020-07-10T02:48:51.618-0700 I CONTROL [main] ** Read and write access to data and configuration is unrestricted.
2020-07-10T02:48:51.618-0700 I CONTROL [main] ** WARNING: You are running this process as the root user, which is not recommended.
2020-07-10T02:48:51.618-0700 I CONTROL [main]
mongos>
添加集群中的分片节点
use admin
添加shard1复制集
db.runCommand({addshard:"qyd_repl/192.168.62.158:27017,192.168.62.159:27017,192.168.62.160:27017",name:"shard1"})
添加shard2复制集
db.runCommand({addshard:"qyd_repl2/192.168.62.158:27018,192.168.62.159:27018,192.168.62.160:27018",name:"shard1"})
mongos> use admin
switched to db admin
mongos> db.runCommand({addshard:"qyd_repl/192.168.62.158:27017,192.168.62.159:27017,192.168.62.160:27017",name:"shard1"})
{"shardAdded" : "shard1","ok" : 1,"operationTime" : Timestamp(1594374949, 13),"$clusterTime" : {"clusterTime" : Timestamp(1594374949, 13),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}mongos> db.runCommand({addshard:"qyd_repl2/192.168.62.158:27018,192.168.62.159:27018,192.168.62.160:27018",name:"shard2"})
{"shardAdded" : "shard2","ok" : 1,"operationTime" : Timestamp(1594375027, 6),"$clusterTime" : {"clusterTime" : Timestamp(1594375027, 6),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}
mongos>
查看分片
mongos下执行,列举分片list
db.runCommand({listshards:1})
mongos> db.runCommand({listshards:1})
{"shards" : [{"_id" : "shard1","host" : "qyd_repl/192.168.62.158:27017,192.168.62.159:27017,192.168.62.160:27017","state" : 1},{"_id" : "shard2","host" : "qyd_repl2/192.168.62.158:27018,192.168.62.159:27018,192.168.62.160:27018","state" : 1}],"ok" : 1,"operationTime" : Timestamp(1594375164, 1),"$clusterTime" : {"clusterTime" : Timestamp(1594375164, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}
mongos>
当前集群中有shard1,shard2分片,状态值为1,可用
mongos下执行,查看分片状态
sh.status()
mongos> sh.status()
--- Sharding Status --- sharding version: {"_id" : 1,"minCompatibleVersion" : 5,"currentVersion" : 6,"clusterId" : ObjectId("5f0835abc00f35f52d31f67a")}shards: //如果不加分片,则没有此字段{ "_id" : "shard1", "host" : "qyd_repl/192.168.62.158:27017,192.168.62.159:27017,192.168.62.160:27017", "state" : 1 }{ "_id" : "shard2", "host" : "qyd_repl2/192.168.62.158:27018,192.168.62.159:27018,192.168.62.160:27018", "state" : 1 }active mongoses:"4.2.8" : 1autosplit:Currently enabled: yesbalancer:Currently enabled: yesCurrently running: noFailed balancer rounds in last 5 attempts: 0Migration Results for the last 24 hours: 96 : Successdatabases:{ "_id" : "config", "primary" : "config", "partitioned" : true }config.system.sessionsshard key: { "_id" : 1 }unique: falsebalancing: truechunks:shard1 928shard2 96too many chunks to print, use verbose if you want to force print{ "_id" : "newqydtest", "primary" : "shard1", "partitioned" : false, "version" : { "uuid" : UUID("95fdf301-28c7-4598-bf34-1dd757c7d9d8"), "lastMod" : 1 } }{ "_id" : "qydtestdb1", "primary" : "shard1", "partitioned" : false, "version" : { "uuid" : UUID("74de6677-e10d-4e0a-9b2a-8cd57ec0b490"), "lastMod" : 1 } }{ "_id" : "studentdb", "primary" : "shard1", "partitioned" : false, "version" : { "uuid" : UUID("4be7bec8-9d8b-4e1b-88b9-d890bda92445"), "lastMod" : 1 } }{ "_id" : "testDB", "primary" : "shard1", "partitioned" : false, "version" : { "uuid" : UUID("9377ae06-ccc7-47d8-ac47-8fd13e980e39"), "lastMod" : 1 } }mongos>
如果分片没加的话上方是没有shards字段的
测试分片集群
开启数据库分片配置
db.runCommand({enablesharding:"testshard"})
使用库testshard配分片做索引↑
mongos> db.runCommand({enablesharding:"testshard"})
{"ok" : 1,"operationTime" : Timestamp(1594375579, 6),"$clusterTime" : {"clusterTime" : Timestamp(1594375579, 7),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}
ok:1为成功
创建分片的key(键),下方是基于id配置的
db.runCommand({shardcollection:"testshard.users",key:{id:1}})
注意,如果不是空表,需要声明索引,我们使用的是空表,所以直接就可以使用
mongos> db.runCommand({shardcollection:"testshard.users",key:{id:1}})
{"collectionsharded" : "testshard.users","collectionUUID" : UUID("990c759d-b577-4bf1-8761-9b91aa5c2ea6"),"ok" : 1,"operationTime" : Timestamp(1594375845, 6),"$clusterTime" : {"clusterTime" : Timestamp(1594375845, 6),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}
创建索引(如果使用的不是空表,不是第一次操作)
use testsharddb.users.ensureIndex({id:1})
#给id创建一个索引
mongos> use testshard
switched to db testshard
mongos> db.users.ensureIndex({id:1})
{"raw" : {"qyd_repl2/192.168.62.158:27018,192.168.62.159:27018,192.168.62.160:27018" : {"numIndexesBefore" : 2,"numIndexesAfter" : 2,"note" : "all indexes already exist","ok" : 1}},"ok" : 1,"operationTime" : Timestamp(1594376135, 1),"$clusterTime" : {"clusterTime" : Timestamp(1594376136, 4),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}
mongos>
添加50w条测试数据
var arr=[];
for(var i=0;i<500000;i++){var uid = i;var name = "name"+1;arr.push({"id":uid,"name":name});
}
db.users.insertMany(arr);
运行sh.status()查看。没啥效果
说明数据量太少
我们再次运行上面的js脚本。这次将50w改为150w
var arr=[];
for(var i=0;i<500000;i++){var uid = i;var name = "name"+1;arr.push({"id":uid,"name":name});
}
db.users.insertMany(arr);
等待一会添加完成以后
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kmaVTS7o-1594379012750)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200710183521158.png)]
可以看出一部分放到了分片1一部分放到了分片2
0-----166667、166667----250000在分片1上
250000----333334、333334----457502、457502------最后在分片2上
其他分片集群的命令
#添加分片
db.runCommand({addshard:"qyd_repl/192.168.62.158:27017,192.168.62.159:27017,192.168.62.160:27017",name:"shard1"})
#删除分片
db.runCommand({removeShard:"shard2"})
rded" : “testshard.users”,
“collectionUUID” : UUID(“990c759d-b577-4bf1-8761-9b91aa5c2ea6”),
“ok” : 1,
“operationTime” : Timestamp(1594375845, 6),
“$clusterTime” : {
“clusterTime” : Timestamp(1594375845, 6),
“signature” : {
“hash” : BinData(0,“AAAAAAAAAAAAAAAAAAAAAAAAAAA=”),
“keyId” : NumberLong(0)
}
}
}
#### 创建索引(如果使用的不是空表,不是第一次操作)
use testshard
db.users.ensureIndex({id:1})
```shell
#给id创建一个索引
mongos> use testshard
switched to db testshard
mongos> db.users.ensureIndex({id:1})
{"raw" : {"qyd_repl2/192.168.62.158:27018,192.168.62.159:27018,192.168.62.160:27018" : {"numIndexesBefore" : 2,"numIndexesAfter" : 2,"note" : "all indexes already exist","ok" : 1}},"ok" : 1,"operationTime" : Timestamp(1594376135, 1),"$clusterTime" : {"clusterTime" : Timestamp(1594376136, 4),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}
mongos>
添加50w条测试数据
var arr=[];
for(var i=0;i<500000;i++){var uid = i;var name = "name"+1;arr.push({"id":uid,"name":name});
}
db.users.insertMany(arr);
运行sh.status()查看。没啥效果
说明数据量太少
我们再次运行上面的js脚本。这次将50w改为150w
var arr=[];
for(var i=0;i<500000;i++){var uid = i;var name = "name"+1;arr.push({"id":uid,"name":name});
}
db.users.insertMany(arr);
等待一会添加完成以后
[外链图片转存中…(img-kmaVTS7o-1594379012750)]
可以看出一部分放到了分片1一部分放到了分片2
0-----166667、166667----250000在分片1上
250000----333334、333334----457502、457502------最后在分片2上
其他分片集群的命令
#添加分片
db.runCommand({addshard:"qyd_repl/192.168.62.158:27017,192.168.62.159:27017,192.168.62.160:27017",name:"shard1"})
#删除分片
db.runCommand({removeShard:"shard2"})
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 归并排序以及时间复杂度及Master Theorem(主方法)
目录1.归并排序概念2.算法的复杂度3.主方法Master Theorem3.1 Master Theorem概念3.2 Master Theorem例子分析4.利用Master Theorem求归并排序时间复杂度我们上一篇博客重点回顾了复杂度的概念,以及基本的复杂度计算方法。这篇博客我们利用归并排序Merge Sort算法带着大家深入…...
2024/5/10 7:22:59 - vue 线上部署 流程
1. vue 打包1. 输入 npm run build:prod 打包, 得到 dist 文件夹的打包结果,build:prod 是由这里来的,打包结果得到 dist 文件2 . 配置nginx server {listen 8000;server_name localhost;# 文件路径location / {try_files $uri $uri/ @router;root D:\study\admi…...
2024/5/10 9:02:34 - 程序幂等性设计
场景分析(增删改)下订单(重复订单) 支付(重复支付) 短信发送 (一个用户发送多条)前端按钮只可操一次 token机制 使用post/Redirect/Get模式 在session中存放特殊标志后端使用唯一索引防止幂等性 Token+ Redis幂等 状态机幂等 乐观锁实现幂等 防重表实现幂等性 select + i…...
2024/5/10 10:42:03 - css flex弹性盒子
讲真的 我之前用弹性盒子里面属性还是挺多的,但是我就挑拣我经常用的那几个用,其他的可能都不太清楚是干哈的。这次又重新学习一遍(偷的懒迟早要还回来的,哈哈).flex {display: flex; }display: flex 是变成了一个弹性盒子了,就是把块级/或者行变成了弹性盒子元素(在一行…...
2024/5/10 8:10:13 - mac电脑快捷键(持续更新)
1、快速查找软件command+space2、显示/隐藏文件夹shift+cmmand+.3、路径输入command+shift+g4、快速打开软件command+tab5、截图command+shift+3command+shift+46、注销Command-Shift-Q7、强制注销ommand-Shift-Option-Q8、睡眠control+shift+电源键9、选择是否关机睡眠注销con…...
2024/5/10 7:26:11 - (三:2020.07.10)nnUNet附录解析(持续更新认识)
医学图像深度学习分割方法的自动设计(三)(nnUNet /2020.04)《Automated Design of Deep Learning Methods for Biomedical Image Segmentation》A. Dataset detailsB. nnU-Net Design Principles(启发式规则的设计)B.1 蓝图参数1. 网络架构设计决策2. 选择最好的UNet配置…...
2024/5/10 4:36:07 - 解决vue中v-html元素中标签样式
通过 >>> 可以使得在使用scoped属性的情况下,穿透scoped,修改其他组件的值.introduction>>> img{width: 100%;object-fit: fill; }...
2024/4/26 0:25:48 - ARM实验4 —— WDT看门狗实验
WDT看门狗实验:实验内容:编程实现看门狗功能,观察看门狗作用编程实现看门狗喂狗实验目的:了解看门狗的目的,掌握看门狗的使用方法实验平台:FS_6818开发平台,Ubuntu,secureCRT。概念:WatchDog Timer (WDT):看门狗定时器。看门狗用于监测处理器是否由于噪音或者外部干…...
2024/4/4 20:09:17 - 实训day8
1.创建两个学生链表,含有姓名、年龄的信息,一个链 表存放男生,一个链表存放女生。 2.将上面两个链表合并,按学生的年龄进行排序,合 成新的链表. 3.将上题中建立的链表进行反转,实现按年龄的逆序 排列 4.``在上面的实现的新链表中,给定一个年龄,迅速查 找和该学生年龄最接…...
2024/5/3 7:22:24 - GIL
GILGIL定义GIL存在原因GIL不是Python特性GIL的弊端如何解决 GIL定义 GIL,the Global Interpreter Lock,直译为“全局解释锁” GIL存在原因 CPython在执行多线程的时候并不是线程安全的,为了线程间数据的一致性和状态同步的完整性。 GIL不是Python特性 GIL是Python解释器(Cp…...
2024/5/8 12:33:11 - 深度探索JFR - JFR详细介绍与生产问题定位落地 - 3. 各种Event详细说明与JVM调优策略(3)
本文基于 OpenJDK 113. 虚拟机相关 Event 3.3. JIT即时编译相关 JIT 即时编译可能会遇到编译后的代码缓存占满,或者因为空间有限或者代码设计问题,导致某些关键方法需要重编译导致性能问题,以及因为代码块过大导致编译失败从而性能有问题,这些问题我们可以通过 JFR 中相关的…...
2024/4/17 21:36:10 - 比较大小 (10分)
#include<stdio.h> int main() {int x,y,z,t;scanf("%d %d %d",&x,&y,&z);if(x>y){t=y;y=x;x=t;} if(x>z){t=z;z=x;x=t;} if(y>z){t=z;z=y;y=t;}printf("%d->%d->%d\n",x,y,z);return 0;}...
2024/5/5 7:34:26 - 为什么用DAO+VO老是在Set set = map.keySet()报错?
下面是完整代码 1.BookDao.java package dao; import vo.Book; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.HashMap; public class BookDao { private Connectionconn=null; public…...
2024/5/7 14:45:46 - java实习生应该具备那些知识
这里讲所需知识可能比较的多,我认为有一下知识后能使自己完全胜任这个职位,甚至可以直接比过其他实习生,从而使自己获得更好的优势。 第一:java基础 认真看一遍 java核心技术卷一,会常见的集合类用法,最主要两个 ArrayList 和 HashMap,水平到可以刷 leetcode easy 和一些…...
2024/5/7 14:50:59 - Activiti流程框架(1)_快速搭建测试环境
本篇主要介绍在办公环境无网络的情况下如何快速地搭建Activiti的测试环境,以便于日后的开发流程测试学习使用; 搭建好的效果如下:搭建的过程主要包括以下步骤: 1、 官网下载Activiti,不同版本Activiti的文件夹组织结构略有不同,以5.22.0为例;Database:包含了23张流程相关…...
2024/5/7 14:31:05 - 析构函数
析构函数对象过期时自动调用的特殊成员函数 析构函数一般用来完成清理工作 析构函数的名称就是在类名前加上~ 析构函数没有参数,只有一个...
2024/5/3 17:43:36 - QT编码问题踩得坑-----(1)
问题1:sql查收数据库所得之赋值结构体,每次赋值之前,将结构体变量清空,或将申请的对象放在while循环内部,防止后一次赋值在前一次的基础上覆盖。测试点:后一次的值比前一次的小时,后面的值会出错。...
2024/5/7 14:36:09 - 锤子剪刀布
import java.util.Scanner; //锤子剪刀布 public class Main_071 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);//甲乙两人,以甲为记录,甲胜即乙负;int win = 0;int lose = 0;int equ = 0;int winC = 0;int winB = 0;int winJ = 0;int …...
2024/5/7 13:07:04 - MyBatis框架的使用及源码分析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder
在上一篇文章(MyBatis框架的使用及源码分析(一))的demo中看到了SessionFactory的创建过程:String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSession…...
2024/5/5 7:12:47 - 【运维开发】window环境下使用 vagrant+VirtualBox安装centos7+docker环境
window环境下使用 vagrant+VirtualBox安装centos7+docker环境 互联网开发中,我们为了在本地模拟线上环境,但是又局限于我们机器的数量,所有我们在我们的window机子上按照docker容易来装我们日常使用的服务,由于我们生成环境大多都是用centos,所有我们需要在window环境下搭…...
2024/5/5 12:12:35
最新文章
- STM32的ADC详解
ADC即模拟数字转换器,通常用于将外部的模拟量信号转换为数字信号。STM32的ADC是12位逐次逼近型的模拟数字转换器,最大可以计数到4095,有18个通道,16个外部通道和2个内部通道。 ADC框图 ADC的功能框图可以分为七个部分:…...
2024/5/10 13:55:50 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/9 21:23:04 - 面试算法-166-排序链表
题目 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 解 class Solution {public ListNode sortList(ListNode head) {if (head null || head.next null…...
2024/5/9 14:17:08 - macU盘在电脑上读不出来 u盘mac读不出来怎么办 macu盘不能写入
对于Mac用户来说,使用U盘是很常见的操作,但有时候可能会遇到Mac电脑无法读取U盘的情况,这时候就需要使用一些特定的工具软件来帮助我们解决问题。本文就来告诉大家macU盘在电脑上读不出来是怎么回事,u盘mac读不出来怎么办。 一、m…...
2024/5/9 23:34:18 - 基于深度学习的机场航拍小目标检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)
摘要:在本博客中介绍了基于YOLOv8/v7/v6/v5的机场航拍小目标检测系统。该系统的核心技术是采用YOLOv8,并整合了YOLOv7、YOLOv6、YOLOv5算法,从而进行性能指标的综合对比。我们详细介绍了国内外在机场航拍小目标检测领域的研究现状、数据集处理…...
2024/5/10 0:01:55 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/10 12:36:12 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/9 15:10:32 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/9 4:20:59 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/7 11:36:39 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/8 20:48:49 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/7 9:26:26 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/8 19:33:07 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/8 20:38:49 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/10 10:22:18 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/9 17:11:10 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57