簡介
- NoSQL : 全名為Not Only SQL, 指的是非關(guān)系型的數(shù)據(jù)庫
- 隨著訪問量上升, 網(wǎng)站的數(shù)據(jù)庫性能出現(xiàn)了問題, 于是nosql被設(shè)計出來
- 優(yōu)點 / 缺點
- 優(yōu)點:
- 高可擴展性
- 分布式計算
- 低成本
- 架構(gòu)的靈活性, 半結(jié)構(gòu)化數(shù)據(jù)
- 沒有復(fù)雜的數(shù)據(jù)
- 缺點:
- 沒有標(biāo)準(zhǔn)化
- 有限的查詢功能
- 最終一致是不直觀的程序
- 優(yōu)點:
Mongo DB
基本操作
-
一) 簡介:
- MongoDB是一個基于分布式文件存儲的NoSQL數(shù)據(jù)庫
- 由C++語言編寫, 運行穩(wěn)定, 性能高
- 旨在為WEB應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案
- Mongo DB特點:
- 模式自由: 可以把不同結(jié)構(gòu)的文件存儲在同一個數(shù)據(jù)庫里
- 面向集合的存儲: 適合存儲JSON風(fēng)格文件的形式
- 完整的索引支持: 對任何屬性可索引
- 復(fù)制和高可用性: 支持服務(wù)器之間的數(shù)據(jù)復(fù)制, 支持主-從模式及服務(wù)器之間的相互復(fù)制. 復(fù)制的只要目的是提供用于及自動故障轉(zhuǎn)移
- 自動分片: 支持云級別的伸縮性: 自動分片功能支持水平的數(shù)據(jù)庫集群, 可動態(tài)添加額外的機器
- 豐富的查詢: 支持豐富的查詢表達(dá)方式, 查詢指令使用JSON形式的標(biāo)記, 可輕易查詢文檔中的內(nèi)嵌的對象及數(shù)組
- 快速就地更新: 查詢優(yōu)化器會分析查詢表達(dá)式, 并生成一個高效的查詢計劃
- 高效的傳統(tǒng)存儲方式: 支持二進制數(shù)據(jù)機大型對象(照片)
-
二) 基本操作:
- 三元素 : 數(shù)據(jù)庫, 集合, 文檔
- 集合就是關(guān)系數(shù)據(jù)庫中的表
- 文檔對應(yīng)著關(guān)系數(shù)據(jù)庫中的行
- 文檔 : 就是一個對象, 由鍵值對構(gòu)成, 是json的擴展Bson形式
- 集合 : 類似于關(guān)系數(shù)據(jù)庫中的表, 儲存多個文檔, 結(jié)構(gòu)不固定, 如可以存儲文檔在集合中
- 數(shù)據(jù)庫 : 是一個集合的物理容器, 一個數(shù)據(jù)庫中可以包含多個文檔
- 一個服務(wù)器通常有多個數(shù)據(jù)庫
- 三元素 : 數(shù)據(jù)庫, 集合, 文檔
-
三) 環(huán)境安裝(Ubuntu)
- 1> 下載mongodb的版本(偶數(shù)穩(wěn)定版, 奇數(shù)開發(fā)版)
- 2> 解壓:
tar -zxvf mongodb-linux-x86_64-ubuntu1604-3.4.0.tgz
- 3> 移動到/usr/local目錄下面:
sudo mv - rmongodb-linux-x86_64-ubuntu1604-3.4.0/ /usr/local/mongodb
- 4> 將可執(zhí)行文件添加到PATH路徑中:
export PATH=/usr/local/mongo/bin:$PATH
-
四) 服務(wù)端maogod
- 配置文件在/etc/mongd.conf
- 默認(rèn)端口27017
- 啟動:
sudo service mongod start
- 停止:
sudo service mongod stop
- 重啟:
sudo service mongod restart
-
五) 集合操作
- 1> 集合創(chuàng)建
- 語法:
db.createCollection(name, options)
- name : 是要創(chuàng)建的集合名稱
- options : 是一個文檔, 用于指定集合的配置
- 選項參數(shù)是可選的, 所以只要指定的集合名稱
- 例子 :
db.createCollection("stu")
-
db.createCollection("stu", { capped : true, size : 10})
- capped : 默認(rèn)值為false表示不設(shè)置上限, 值為true表示設(shè)置上限
- size : 當(dāng)capped值為true的時候, 需要指定此參數(shù), 表示上限大小, 當(dāng)文檔達(dá)到上限時, 會將之前的數(shù)據(jù)覆蓋, 單位為字節(jié)
- 語法:
- 2> 查看當(dāng)前數(shù)據(jù)庫的集合
- 語法 :
show collections
- 語法 :
- 3> 刪除
- 語法 :
db.集合名稱.drop()
- 語法 :
- 1> 集合創(chuàng)建
-
六) 數(shù)據(jù)類型
-
MongoDB中差用的集中數(shù)據(jù)類型:
- ObjectID : 文檔ID
- String : 字符串, 最常用, 必須是有效的UTF-8
- Boolean : 存儲一個布爾值, true/false
- Integer : 整數(shù)可以是32位或64位, 這取決于服務(wù)器
- Double : 存儲浮點值
- Arrays : 數(shù)組或列表, 多個值存儲到一個鍵
- Object : 用于嵌入式文檔, 即一個職為一個文檔
- Null : 存儲Null值
- Date : 存儲當(dāng)前日期或時間的UNIX時間格式
-
object id :
- 每個文檔都有一個屬性為: _id, 保證每個文檔的唯一性
- 可以自己去設(shè)置_id插入文檔
- 如果沒有提供, 那么MongoDB為每個文檔提供了一個獨特的_id, 類型為objectID
- objectID是一個12字節(jié)的十六進制數(shù)
- 前4個字節(jié)為當(dāng)前時間戳
- 接下來3個字節(jié)的機器ID
- 接下來的2個字節(jié)中MongoDB的服務(wù)進程id
- 最后3個字節(jié)是簡單的增量值
-
七) 數(shù)據(jù)操作
-
1> 插入
- 語法 :
db.集合名稱.insert(document)
- 插入文檔時, 如果不指定_id參數(shù), MongoDB會為文檔分配一個唯一的ObjectId
db.stu.insert({name:'jack', gender:1})
s1={_id:'20170202',name:'hr'} s1.gender=0 db.stu.insert(s1)
- 語法 :
-
2> 簡單查詢
- 語法 :
db.集合名稱.find()
- 語法 :
-
3> 更新
- 語法 :
db.集合名稱.update( <query>, <update>, {mulit: <boolean>} )
- 參數(shù)query : 查詢條件, 類似于sql語句update中where部分
- 參數(shù)update : 更新操作符, 類似于sql語句update中set部分
- 參數(shù)mulit : 可選, 默認(rèn)是false, 表示只更新找到的第一條記錄, 值為true表示把滿足條件的文檔全部更新
- 例子 :
- 全文檔更新(之前的數(shù)據(jù)全部刪除):
db.stu.update({name : 'hr'}, {name : 'erik'})
- 指定屬性更新, 通過操作符 $set
db.stu.insert({name: 'jack', gender:0}) db.stu.update({name: 'tom'}, {$set:{name: 'lucky'}})
- 修改多條匹配到的數(shù)據(jù):
db.stu.update({}, {$set:{gender:0}}, {multi:true})
- 全文檔更新(之前的數(shù)據(jù)全部刪除):
- 語法 :
-
4> 保存
- 語法 :
db.集合名稱.save(document)
- 如果文檔_id已經(jīng)存在則修改, 如果文檔_id不存在則添加
- 例子 :
db.stusave({_id:'20170202', 'name':'leo', gender:1})
db.stusave({_id:'20170202', 'name':'leo'})
- 語法 :
-
5> 刪除
- 語法 :
db.集合名稱.remove( <query>, { justOne: <boolean> } )
- 參數(shù)query : 可選, 刪除的文檔的條件
- 參數(shù)justOne : 可選, 如果設(shè)為true或1, 則只刪除一條, 默認(rèn)false, 表示刪除多條
- 例子 :
- 只刪除匹配到的第一條:
db.stu.remove({gender:0}, {justOne:true})
- 全部刪除 :
db.stu.remove({})
- 只刪除匹配到的第一條:
- 6> 關(guān)于size的示例
- 當(dāng)超過size的時候, 會覆蓋最老的數(shù)據(jù)
- 語法 :
-
七) 數(shù)據(jù)查詢
-
基本查詢
- 方法find() : 查詢
db.集合名稱.find({條件文檔})
- 方法findOne() : 查詢, 只返回第一個
db.集合名稱.findOne({條件文檔})
- 方法pretty() : 將結(jié)果格式化
db.集合名稱.find({條件文檔}).pretty()
- 方法find() : 查詢
-
比較運算符
- 小于 : $lt
- 小于或等于 : $lte
- 大于 : $gt
- 大于或等于 : $gte
- 不等于 : $ne
- 例子 :
- 查詢name等于old的學(xué)生 :
db.stu.find({name: 'old'})
- 查詢年齡大于或等于18的學(xué)生 :
db.stu.find({age: {$gte:18}})
- 查詢name等于old的學(xué)生 :
-
邏輯運算符
- 邏輯與 : 默認(rèn)是邏輯與的關(guān)系
- 邏輯或 : 使用$for
- 查詢年齡大于18, 或性別為0的學(xué)生 : `` db.stu.find({$for:[{age:{$gt:18}}, {gender:1}]})
- or 和 and 一起使用:
- 查詢年齡大于18, 或性別為0的學(xué)生, 并且學(xué)生的姓名為old : `` db.stu.find({$for:[{age:{$gt:18}}, {gender:1}], name:'old'})
-
范圍運算符
- 使用$in, $nin 判斷是否在某個范圍內(nèi)
- 查詢年齡為18, 28的學(xué)生 :
db.stu.find({age:{$in:[18,28]}})
-
支持正則表達(dá)式
- 使用
//
或者$regex
編寫正則表達(dá)式 - 例子 : 查詢姓黃的學(xué)生
db.stu.find({name:/^黃/}) db.stu.find({name:{name: {$regex:'/^黃'}}})
- 使用
-
自定義查詢
- 使用$where后面寫一個函數(shù), 返回滿足條件的數(shù)據(jù)
- 查詢年齡大于30的學(xué)生:
db.stu.find({$where:function(){return this.age>20}})
-
-
八) 高級查詢
-
limit() : 用于讀取指定數(shù)量的文檔
- 語法:
db.集合名稱.find().limit(NUMBER)
- 參數(shù)NUMBER: 表示要獲取文檔的條數(shù)
- 如果沒有制定參數(shù)則顯示集合中的所有文檔
- 例子: 查詢2條學(xué)生信息
db.stu.find().limit(2)
- 語法:
-
skip() : 用于跳過指定數(shù)量的文檔
- 語法 :
db.集合名稱.find().skip(NUMBER)
- 參數(shù)NUMBER: 表示跳過的記錄條數(shù), 默認(rèn)值為0
- 例子 : 查詢從第三條開始的學(xué)生信息
db.stu.find().skip(2)
- 語法 :
-
投影:
- 在查詢的返回結(jié)果中, 只選擇必要的字段, 而不是選擇一個文檔的整個字段
- 語法 :
db.集合名稱.find({}, {字段名稱:1, ...})
-> 參數(shù)為字段與值, 值為1表示顯示, 為0表示不顯示 - 特殊: 對于_id列默認(rèn)是顯示的, 如果不顯示需要明確設(shè)置為0
-
排序:
- 方法sort(): 用于對結(jié)果集進行排序
- 語法 :
db.集合名稱.find().sort({字段:1,...})
-> 參數(shù)1為升序, -1為降序 - 例子 :
db.stu.find().sort({gender:-1,age:1})
-
統(tǒng)計個數(shù):
- 方法count(): 用于統(tǒng)計結(jié)果集中文檔條數(shù)
- 語法:
db.集合名稱.find({條件}).count()
- 例子 :
- 統(tǒng)計男生人數(shù):
db.stu.find({gender:1}).count()
- 統(tǒng)計年齡大于20的男生人數(shù): ``db.stu.find({age{$gt:20}, gender:1})
- 統(tǒng)計男生人數(shù):
-
消除重復(fù):
- 方法distinct() : 對數(shù)據(jù)進行去重
- 語法 :
db.集合名稱.distinct('去重字段', {條件})
- 例子 : 查找年齡大于18的性別(去重) ->
db.stu.distinct('gender', {age:{$gt;20}})
-
高級操作
聚合, 主從復(fù)制, 分片, 備份與恢復(fù), MR
-
一) 聚合(aggregate)
聚合主要用于計算數(shù)據(jù), 類似sql中的sum(), avg()
語法:
db.集合名稱.aggregate([{管道: {表達(dá)式}}])
-
管道
- 管道在Unix和Linux中一般用于將當(dāng)前命令的輸出結(jié)果作為下一個命令的輸入 :
ps ajx | grep mongo
- 在mongodb中, 管道具有同樣的作用, 文檔處理完畢后, 通過管道進行下一次處理
- 常用管道
- $group : 將集合中的文檔分組, 可用于統(tǒng)計結(jié)果
- $match : 過濾數(shù)據(jù), 只輸出符合條件的文檔
- $project : 修改輸入文檔的結(jié)構(gòu), 如重命名, 增加, 刪除字段, 創(chuàng)建計算結(jié)果
- $sort : 將輸入文檔排序后輸出
- $limit : 限制聚合管道返回的文檔數(shù)
- $skip : 跳過制定數(shù)量的文檔, 并返回余下的文檔
- $unwind : 將數(shù)組類型的字段進行拆分
- 管道在Unix和Linux中一般用于將當(dāng)前命令的輸出結(jié)果作為下一個命令的輸入 :
-
表達(dá)式
- 處理輸入文檔并輸出
- 語法 :
表達(dá)式:'$列名'
- 常用表達(dá)式 :
- $sum : 計算綜合, $sum:1同count表示技術(shù)
- $avg : 計算平均值
- $max : 獲取最大值
- $push : 在結(jié)果文檔中插入值到一個數(shù)組中
- $first : 根據(jù)資源文檔的排序獲取第一個文檔數(shù)據(jù)
- $last : 根據(jù)資源文檔的排序獲取最后一個文檔數(shù)據(jù)
-
- $group:
-
1> group
- 將集合中的文檔分組, 可用于統(tǒng)計結(jié)果
- _id表示分組的依據(jù), 使用某個字段的格式為'$字段'
- 例子 : 統(tǒng)計男生, 女生的總?cè)藬?shù)
db.stu.aggregate({ {$group: { _id : '$gender', counter : {$sum:1} } } })
-
2> Group by null
- 將集合中所有文檔分為一組
- 例子 : 求學(xué)生總?cè)藬?shù), 平均年齡
db.stu.aggregate({ {$group: { _id : null, counter : {$sum:1} } } })
-
3> 透視數(shù)據(jù)($push)
- 例子 : 統(tǒng)計學(xué)生性別及學(xué)生姓名
db.stu.aggregate({ {$group: { _id : '$gender', name : {$push:'$name'} } } })
- 使用$$ROOT可以將文檔內(nèi)容加入到結(jié)果集的數(shù)組中, 代碼如下:
db.stu.aggregate({ {$group: { _id : '$gender', name : {$push:'$$ROOT'} } } })
- 例子 : 統(tǒng)計學(xué)生性別及學(xué)生姓名
-
- $match:
- 用于過濾數(shù)據(jù), 只輸出符合條件的文檔
- 使用MongoDB的標(biāo)準(zhǔn)查詢操作
- 例子:
- 查詢年齡大于20的學(xué)生
db.stu.aggregate([ {$match:{age:{$gt:20}}} ])
- 查詢年齡大于20的男生, 女生人數(shù)
db.stu.aggregate([ {$match:{age:{$gt:20}}}, {$group:{_id:'gender', counter:{$sum:1}}} ])
- 查詢年齡大于20的學(xué)生
-
- $project:
- 修改輸入文檔的結(jié)構(gòu), 如重命名, 增加, 刪除字段, 創(chuàng)建計算結(jié)果
- 例子:
- 查詢學(xué)生的年齡, 姓名
db.stu.aggregate([ {$project:{_id:0, name:1, age:1}} ])
- 查詢男生, 女生人數(shù), 輸出人數(shù)
db.stu.aggregate([ {$group:{_id:'$gender', counter:{$sum:1}}}, {$project:{_id:0, counter:1}} ])
- 查詢學(xué)生的年齡, 姓名
-
- $sort
- 將輸入文檔排序后輸出
- 例子:
- 查詢學(xué)生信息, 按年齡升序
db.stu.aggregate([ {$sort:{age:1}} ])
- 查詢男生, 女生人數(shù), 按人數(shù)降序
db.stu.aggregate([ {$group:{_id:'$gender', counter:{$sum:1}}}, {$sort:{counter:-1}} ])
- 查詢學(xué)生信息, 按年齡升序
-
- $limit
- 限制聚合管道返回的文檔數(shù)
- 例子: 查詢2條學(xué)生信息 ->
db.stu.aggregate([{$limit:2}])
-
- $skip
- 跳過制定數(shù)量的文檔, 并返回余下的文檔
- 例子:
- 查詢從第三條開始的學(xué)生信息 ->
db.stu.aggregate([{$skip:2}])
- 查詢男生, 女生人數(shù), 按人數(shù)升序, 取第二條數(shù)據(jù)(先寫skip, 后limit)
db.stu.aggregate([ {$group:{_id:'$gender', counter:{$sum:1}}}, {$sort:{counter:-1}}, {$skip:1} {$limit:1} ])
- 查詢從第三條開始的學(xué)生信息 ->
-
- $unwind
將文檔中的某一個數(shù)組類型字段拆分成多條, 每條包含數(shù)組中的一個值
-
語法1
- 對某字段值進行拆分 :
db.集合名稱.aggregate([{$unwind:'$字段名稱'}])
- 構(gòu)造數(shù)據(jù) :
db.t2.insert({_id:1, item:'t-shirt', size:['S', 'M', 'L']})
- 查詢 :
db.t2.aggregate([{$unwind:'$size'}])
- 對某字段值進行拆分 :
-
語法2
對某字段值進行拆分
-
處理空數(shù)組, 非數(shù)組, 無字段, null情況
db.inventory.aggregate([ {$unwind:{ path:'$字段名稱', preserveNullAndEmptyArrays:<boolean>#防止數(shù)據(jù)丟失 } ])
-
構(gòu)造數(shù)據(jù)
db.t3.insert([ {_id:1, item:'a', size:['S', 'M', 'L']}, {_id:2, item:'b', size:[]}, {_id:3, item:'c', size:'M'}, {_id:4, item:'d'}, {_id:5, item:'t', size:null} } ])
-
使用語法1查詢 :
db.t3.aggregate([{$unwind:'$size'}])
- 查看查詢結(jié)果, 發(fā)現(xiàn)對于空數(shù)組, 無字段, null的文檔, 都被丟棄了
- 如何防止數(shù)據(jù)不丟失 :
db.t3.aggregate([ {$unwind:{path:'$size', preserveNullAndEmptyArrays:true}} ])
-
二) 索引
-
1> 創(chuàng)建大量的數(shù)據(jù)
- 向集合中插入10萬條文檔
for(i=0;i<100000;i++){ db.t1.insert({name: 'test'+i,age:i}) }
-
2> 數(shù)據(jù)查找性能分析
- 查找姓名為'test10000'的文檔 :
db.t1.find({name:'test10000'})
- 使用explain()命令進行查詢性能分析 :
db.t1.find({name:'test10000'}).explain('executionStats')
- 其中的executionStats下的executionTimeMillis表示整體查詢時間, 單位是毫秒
- 查找姓名為'test10000'的文檔 :
-
3> 建立索引
- 創(chuàng)建索引 : 1->表示升序, -1->表示降序
# db.集合.ensureIndex({屬性:1}) db.t1.ensureIndex({name:1})
- 創(chuàng)建索引 : 1->表示升序, -1->表示降序
-
4> 對索引屬性查詢
- 執(zhí)行上面的同樣的查詢, 并進行查詢性能分析 :
db.t1.find({name:'test10000'}).explain('excutionStats')
- 執(zhí)行上面的同樣的查詢, 并進行查詢性能分析 :
-
索引的命令
- 建立唯一索引, 實現(xiàn)唯一約束的功能 : ``db.t1.ensureIndex({'name':1}, {'unique':true})
- 聯(lián)合索引, 對多個屬性建立一個索引, 按照find()出現(xiàn)的順序 :
db.t1.ensureIndex({name:1,age:1})
- 查看文檔所有索引 :
db.t1.getIndexes()
- 刪除索引 :
db.t1.dropIndexes('索引名稱')
-
-
三) 安全性
- 超級管理員
- 為了更安全的訪問mongodb, 需要訪問者提供用戶名和密碼, 于是需要在mongodb中創(chuàng)建用戶
- 采用了角色-用戶-數(shù)據(jù)庫的安全管理方式
- 常用系統(tǒng)角色如下:
- root : 只在admin數(shù)據(jù)庫中可用, 超級賬號, 超級權(quán)限
- Read : 允許用戶讀取制定數(shù)據(jù)庫
- readWrite : 允許用戶讀寫指定數(shù)據(jù)庫
- 創(chuàng)建超級管理用戶
use admin db.create({ user:'admin', pwd:'123', roles:[{role:'root', db:'admin'}] })
- 啟用安全認(rèn)證
- 修改配置文件 :
sudo vi /etc/mongod.conf
- 啟用身份驗證(注意: keys和values之間一定要加空格, 否則解析會報錯)
security: authorization: enabled
- 重啟服務(wù) :
sudo service mongod restart
- 終端連接 :
mongo -u admin -p 123 --authenticationDatabase admin
- 切換數(shù)據(jù)庫, 執(zhí)行命令查看結(jié)果
- 修改用戶 : 可以修改pwd, roles屬性 ->
db.updateUser('t1':[pwd:'456'])
- 修改配置文件 :
- 超級管理員
-
四) 復(fù)制(副本集)
-
什么是復(fù)制
- 復(fù)制提供了數(shù)據(jù)的冗余備份, 并在多個服務(wù)器上存儲數(shù)據(jù)副本, 提高了數(shù)據(jù)的可用性, 并可以保證數(shù)據(jù)的安全性
- 復(fù)制還允許從硬件故障和服務(wù)中斷中恢復(fù)數(shù)據(jù)
-
為什么要復(fù)制
- 數(shù)據(jù)備份
- 數(shù)據(jù)災(zāi)難恢復(fù)
- 讀寫分離
- 高(24*7)數(shù)據(jù)可用性
- 無宕(dang)機維修
- 副本集對應(yīng)用程序是透明
-
復(fù)制的工作原理
- 復(fù)制至少需要兩個節(jié)點A, B...
- A是主節(jié)點, 負(fù)責(zé)處理客戶端請求
- 其余的都是從節(jié)點, 負(fù)責(zé)復(fù)制主節(jié)點上的數(shù)據(jù)
- 節(jié)點常見的搭配方式為: 一主一從, 一主多從
- 主節(jié)點記錄在其上的所有操作, 從節(jié)點定期輪詢主節(jié)點獲取這些操作, 然后對自己的數(shù)據(jù)副本執(zhí)行這些操作, 從而保證從節(jié)點的數(shù)據(jù)與主節(jié)點一致
- 主節(jié)點與從節(jié)點進行數(shù)據(jù)交互保障數(shù)據(jù)的一致性
-
復(fù)制的特點
- N個節(jié)點在集群
- 任何節(jié)點可作為主節(jié)點
- 所有寫入操作都在主節(jié)點上
- 自動故障轉(zhuǎn)移
- 自動恢復(fù)
-
設(shè)置復(fù)制節(jié)點
- 接下來的操作需要打開多個終端窗口, 而且可能會連接多臺ubuntu主機, 會顯得有些亂, 建議在xshell中實現(xiàn)
- 1> 創(chuàng)建數(shù)據(jù)庫目錄t1, t2
mkdir t1 mkdir t2
- 2> 使用如下格式啟動mongod, 注意replSet的名稱是一致的
mongod --bind_ip 192.168.196.128 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0 mongod --bind_ip 192.168.196.128 --port 27018 --dbpath ~/Desktop/t1 --replSet rs0
- 3> 連接主服務(wù)器, 此處設(shè)置192.168.196.128:27017為主服務(wù)器 :
mongo --host 192.168.196.128 --port 27017
- 4> 初始化 :
rs.initiate()
- 5> 查看當(dāng)前狀態(tài) :
rs.status()
- 6> 添加復(fù)本集 :
rs.add('192.168.196.128:27018')
- 7> 連接第二個mongo服務(wù) :
- 8> 向主服務(wù)器中插入數(shù)據(jù)
use test1 for(i=0;i<10;i++){db.t1.insert({_id:i})}
- 9> 在從服務(wù)器中查詢(如果在從服務(wù)器上進行讀操作, 需要設(shè)置rs.slaveOk())
rs.slaveOk() db.t1.find()
-
其他說明
- 刪除從節(jié)點 :
rs.remove('192.168.196.128:27018')
- 關(guān)閉主服務(wù)器后, 再重新啟動, 會發(fā)現(xiàn)原來的主服務(wù)器變?yōu)榱藦姆?wù)器, 新啟動的服務(wù)器(原來的從服務(wù)器)變?yōu)榱藦姆?wù)器(主從自動切換)
- 刪除從節(jié)點 :
-
-
五) 備份與恢復(fù)
-
備份
- 語法:
mongodump -h - dbhost -d dbname -o dbdirectory
- h : 服務(wù)器地址, 也可以指定端口號
- d : 需要備份的數(shù)據(jù)庫名稱
- o : 備份的數(shù)據(jù)存放位置, 此目錄中存放著備份出來的數(shù)據(jù)
- 例子 :
sudo mkdir test1bak sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
- 語法:
-
恢復(fù)
- 語法:
mongorestore -h dbhost -d dbname --dir dbdirectory
- h : 服務(wù)器地址
- d : 需要恢復(fù)的數(shù)據(jù)庫實例
-
--dir
: 備份的數(shù)據(jù)所在位置 - 例子 :
mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1
- 語法:
-