NoSQL: MongoDB (文檔存儲)

簡介

  • 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)化
      • 有限的查詢功能
      • 最終一致是不直觀的程序

Mongo DB

基本操作
  • 一) 簡介:

    • MongoDB是一個基于分布式文件存儲的NoSQL數(shù)據(jù)庫
    • 由C++語言編寫, 運行穩(wěn)定, 性能高
    • 旨在為WEB應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案
    • Mongo DB特點:
        1. 模式自由: 可以把不同結(jié)構(gòu)的文件存儲在同一個數(shù)據(jù)庫里
        1. 面向集合的存儲: 適合存儲JSON風(fēng)格文件的形式
        1. 完整的索引支持: 對任何屬性可索引
        1. 復(fù)制和高可用性: 支持服務(wù)器之間的數(shù)據(jù)復(fù)制, 支持主-從模式及服務(wù)器之間的相互復(fù)制. 復(fù)制的只要目的是提供用于及自動故障轉(zhuǎn)移
        1. 自動分片: 支持云級別的伸縮性: 自動分片功能支持水平的數(shù)據(jù)庫集群, 可動態(tài)添加額外的機器
        1. 豐富的查詢: 支持豐富的查詢表達(dá)方式, 查詢指令使用JSON形式的標(biāo)記, 可輕易查詢文檔中的內(nèi)嵌的對象及數(shù)組
        1. 快速就地更新: 查詢優(yōu)化器會分析查詢表達(dá)式, 并生成一個高效的查詢計劃
        1. 高效的傳統(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ù)庫
  • 三) 環(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()
  • 六) 數(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})
  • 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()
    • 比較運算符

      • 小于 : $lt
      • 小于或等于 : $lte
      • 大于 : $gt
      • 大于或等于 : $gte
      • 不等于 : $ne
      • 例子 :
        • 查詢name等于old的學(xué)生 : db.stu.find({name: 'old'})
        • 查詢年齡大于或等于18的學(xué)生 : db.stu.find({age: {$gte:18}})
    • 邏輯運算符

      • 邏輯與 : 默認(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})
    • 消除重復(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ù)組類型的字段進行拆分
    • 表達(dá)式

      • 處理輸入文檔并輸出
      • 語法 : 表達(dá)式:'$列名'
      • 常用表達(dá)式 :
        • $sum : 計算綜合, $sum:1同count表示技術(shù)
        • $avg : 計算平均值
        • $max : 獲取最大值
        • $push : 在結(jié)果文檔中插入值到一個數(shù)組中
        • $first : 根據(jù)資源文檔的排序獲取第一個文檔數(shù)據(jù)
        • $last : 根據(jù)資源文檔的排序獲取最后一個文檔數(shù)據(jù)
    1. $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'}
            }
          }
        })
        
    1. $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}}}
          ])
        
    1. $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}}
          ])
        
    1. $sort
    • 將輸入文檔排序后輸出
    • 例子:
      • 查詢學(xué)生信息, 按年齡升序
          db.stu.aggregate([
            {$sort:{age:1}}
          ])
        
      • 查詢男生, 女生人數(shù), 按人數(shù)降序
          db.stu.aggregate([
            {$group:{_id:'$gender', counter:{$sum:1}}},
            {$sort:{counter:-1}}
          ])
        
    1. $limit
    • 限制聚合管道返回的文檔數(shù)
    • 例子: 查詢2條學(xué)生信息 -> db.stu.aggregate([{$limit:2}])
    1. $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}
          ])
        
    1. $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表示整體查詢時間, 單位是毫秒
    • 3> 建立索引

      • 創(chuàng)建索引 : 1->表示升序, -1->表示降序
          # db.集合.ensureIndex({屬性:1})
          db.t1.ensureIndex({name:1})
        
    • 4> 對索引屬性查詢

      • 執(zhí)行上面的同樣的查詢, 并進行查詢性能分析 : db.t1.find({name:'test10000'}).explain('excutionStats')
    • 索引的命令
      • 建立唯一索引, 實現(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ù)器(主從自動切換)
  • 五) 備份與恢復(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
          
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內(nèi)容