准備
在學習本教程之前,請確保完成以下先決條件:
- Ubuntu 14.04 騰訊雲CVM。
- 一台已經設置好可以使用
sudo
命令的非root賬號的Ubuntu服務器,並且已開啟防火牆。沒有服務器的同學可以在這里購買,不過我個人更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝后再購買服務器。 - 在Ubuntu 14.04上安裝和配置MongoDB
除非另有說明,否則本教程中需要root權限的所有命令都應作為具有sudo權限的非root用戶運行。
了解基礎知識
在繼續本文之前,需要對此問題有一些基本的了解。如果您有使用MySQL等流行的關系數據庫系統的經驗,那么在使用MongoDB時可能會發現一些相似之處。
您應該知道的第一件事是MongoDB使用json和bson(二進制json)格式來存儲其信息。Json是人類可讀的格式,非常適合導出並最終導入數據。您可以使用任何支持json的工具進一步管理導出的數據,包括簡單的文本編輯器。
一個示例json文檔如下所示:
{"address":[ {"building":"1007", "street":"Park Ave"}, {"building":"1008", "street":"New Ave"}, ]}
Json使用非常方便,但它不支持bson中可用的所有數據類型。這意味着如果使用json,將會出現所謂的“保真度丟失”。這就是備份/恢復的原因,最好使用能夠更好地恢復MongoDB數據庫的二進制bson。
其次,您不必擔心顯式創建MongoDB數據庫。如果您指定用於導入的數據庫尚不存在,則會自動創建該數據庫。集合'(數據庫表)結構的情況更好。與其他數據庫引擎相比,在MongoDB中,再次在第一個文檔(數據庫行)插入時自動創建結構。
第三,在MongoDB中讀取或插入大量數據(例如本文的任務)可能會占用大量資源並占用大量CPU,內存和磁盤空間。考慮到MongoDB經常用於大型數據庫和大數據,這是至關重要的。解決此問題的最簡單方法是在夜間運行導出/備份。
第四,如果您有一個繁忙的MongoDB服務器,其信息在數據庫導出過程中發生變化,則信息一致性可能會有問題。這個問題沒有簡單的解決方案,但在本文的最后,您將看到有關進一步閱讀有關復制的建議。
將信息導入MongoDB
要了解如何將信息導入MongoDB,我們可以使用一個關於餐館的流行示例MongoDB數據庫。它是.json格式,可以使用wget
以下方式下載:
wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json
下載完成后,您應該在當前目錄中有一個名為primer-dataset.json
(12 MB大小)的文件。讓我們將這個文件中的數據導入一個名為newdb
的新數據庫,並進入一個名為restaurants
的集合。對於導入,我們將使用如下命令mongoimport
:
sudo mongoimport --db newdb --collection restaurants --file primer-dataset.json
mongoimport -d expedia -c hotel_info --file 文件名.json
-d 指哪個database
-c 哪個table/collection
結果應如下所示:
2016-01-17T14:27:04.806-0500 connected to: localhost 2016-01-17T14:27:07.315-0500 imported 25359 documents
如上面的命令所示,已導入25359個文檔。因為我們沒有調用newdb
數據庫,所以MongoDB會自動創建它。
讓我們通過連接到這樣調用的新創建的名為newdb
的MongoDB數據庫來驗證導入:
sudo mongo newdb
您現在已連接到新創建的newdb
數據庫實例。請注意,您的提示已更改,表明您已連接到數據庫。
使用以下命令計算restaurants集合中的文檔:
db.restaurants.count()
結果應該顯示25359
,正好是導入文檔的數量。為了更好的檢查,您可以從餐館集合中選擇第一個文檔,如下所示:
db.restaurants.findOne()
結果應如下所示:
{ "_id" : ObjectId("569beb098106480d3ed99926"), "address" : { "building" : "1007", "coord" : [ -73.856077, 40.848447 ], "street" : "Morris Park Ave", "zipcode" : "10462" }, "borough" : "Bronx", "cuisine" : "Bakery", "grades" : [ { "date" : ISODate("2014-03-03T00:00:00Z"), "grade" : "A", "score" : 2 }, ... ], "name" : "Morris Park Bake Shop", "restaurant_id" : "30075445" }
這樣詳細的檢查可以揭示文檔的問題,例如它們的內容,編碼等.json格式使用UTF-8
編碼,您的導出和導入應該在該編碼中。如果您手動編輯json文件,請記住這一點。否則,MongoDB會自動為您處理。
要退出MongoDB提示,請在提示符處鍵入exit
:
exit
您將以非root用戶身份返回到正常的命令行提示符。
從MongoDB導出信息
正如我們之前提到的,通過導出MongoDB信息,您可以獲取包含數據的人類可讀文本文件。默認情況下,信息以json格式導出,但您也可以導出到csv(逗號分隔值)。
要從MongoDB導出信息,請使用該命令mongoexport
。它允許您導出非常精細的導出,以便您可以指定數據庫,集合,字段,甚至可以使用查詢進行導出。
一個簡單的mongoexport
例子是從我們之前導入的newdb
數據庫中導出餐館集合。它可以這樣做:
sudo mongoexport --db newdb -c restaurants --out newdbexport.json
在上面的命令中,我們用--db
來指定數據庫,-c
集合以及--out
文件里的數據將被保存。
成功的輸出mongoexport
應如下所示:
2016-01-20T03:39:00.143-0500 connected to: localhost 2016-01-20T03:39:03.145-0500 exported 25359 records
上面的輸出顯示已導入25359個文檔 - 與導入的文檔數相同。
在某些情況下,您可能只需要導出集合的一部分。考慮到餐館json文件的結構和內容,讓我們出口所有符合標准的餐廳,位於布朗克斯區,並有中國菜。如果我們想在連接到MongoDB時直接獲取此信息,請再次連接到數據庫:
sudo mongo newdb
然后,使用此查詢:
db.restaurants.find( { borough: "Bronx", cuisine: "Chinese" } )
結果顯示在終端上。要退出MongoDB提示,請exit
在提示符處鍵入:
exit
如果要從sudo命令行而不是在連接到數據庫時導出數據,請mongoexport
通過為-q
參數指定前面的查詢部分,如下所示:
導出數據命令(導出的文件有兩種格式:json/csv,此處導出的是json文件,對於導出CSV文件是需要額外指定一個變量 -field ‘對於的字段名稱’):
mongoexport -h 數據庫所在主機地址(若是本地則為127.0.0.1,若是遠程則寫為遠程地址IP)-d 要導 出的數據庫名稱 -c 集合名稱 -o 輸出多的json文件路徑
導出csv文件示例 :mongoexport -h 主機地址 -d 數據庫名稱 -c 集合名稱 --csv --field 字段列表 -o 輸出地址
實際示例:mongoexport -h 127.0.0.1 -d test_new -c mycolle -o D:\Database\temp\mycolle.json
如果導出成功,結果應如下所示:
2016-01-20T04:16:28.381-0500 connected to: localhost 2016-01-20T04:16:28.461-0500 exported 323 records
以上顯示已導出323條記錄,您可以在我們指定的Bronx_Chinese_retaurants.json
文件中找到它們。
結論
本文向您介紹了從MongoDB數據庫導入和導出信息的基本要素。
復制不僅對可伸縮性有用,而且對當前主題也很重要。復制允許您在從故障恢復主服務器時從MongoDB服務器中不間斷地繼續運行MongoDB服務。復制的一部分也是操作日志(oplog),它記錄了修改數據的所有操作。就像在MySQL中使用二進制日志一樣,您可以使用此日志在上次備份完成后恢復數據。回想一下,備份通常在夜間進行,如果您決定在晚上恢復備份,則會丟失自上次備份以來的所有更新。
更多Ubuntu教程請前往騰訊雲+社區學習更多知識。
參考文獻:《How To Import and Export a MongoDB Database on Ubuntu 14.04》