天天看點

MongoDB實戰(5)資料管理和控制

一、資料的導入導出和備份恢複

資料導出:mongoexport

常用導出方法

1

2

3

<code>mongoexport -d </code><code>test</code> <code>-c stu -o stu.dat</code>

<code>connected to: 127.0.0.1</code>

<code>exported 10 records</code>

導出資料的導出的方式使用的是JSON的樣式

4

5

6

7

8

9

10

11

<code>cat</code> <code>stu.dat</code>

<code>{ </code><code>"_id"</code> <code>: 1, </code><code>"classid"</code> <code>: 1, </code><code>"age"</code> <code>: 14, </code><code>"name"</code> <code>: </code><code>"Tom"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: 2, </code><code>"classid"</code> <code>: 1, </code><code>"age"</code> <code>: 12, </code><code>"name"</code> <code>: </code><code>"Jacky"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: 3, </code><code>"classid"</code> <code>: 2, </code><code>"age"</code> <code>: 16, </code><code>"name"</code> <code>: </code><code>"Lily"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: 4, </code><code>"classid"</code> <code>: 2, </code><code>"age"</code> <code>: 9, </code><code>"name"</code> <code>: </code><code>"Tony"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: 5, </code><code>"classid"</code> <code>: 2, </code><code>"age"</code> <code>: 19, </code><code>"name"</code> <code>: </code><code>"Harry"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: 6, </code><code>"classid"</code> <code>: 2, </code><code>"age"</code> <code>: 13, </code><code>"name"</code> <code>: </code><code>"Vincent"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: 7, </code><code>"classid"</code> <code>: 1, </code><code>"age"</code> <code>: 14, </code><code>"name"</code> <code>: </code><code>"Bill"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: 8, </code><code>"classid"</code> <code>: 2, </code><code>"age"</code> <code>: 17, </code><code>"name"</code> <code>: </code><code>"Bruce"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: 9, </code><code>"classid"</code> <code>: 3, </code><code>"age"</code> <code>: 18, </code><code>"name"</code> <code>: </code><code>"Gaici"</code> <code>}</code>

<code>{ </code><code>"_id"</code> <code>: 10, </code><code>"classid"</code> <code>: 3, </code><code>"age"</code> <code>: 38, </code><code>"name"</code> <code>: </code><code>"Leader"</code> <code>}</code>

參數說明:

-d指明使用的庫,本例中為”test”

-c指明要導出的表,本例中為”stu”

-o指明要導出的檔案名,本例中為”stu.dat”

導出CSV格式的檔案

<code>mongoexport -d </code><code>test</code> <code>-c stu --csv -f classid,age,name -o stu_csv.dat</code>

格式如下:

12

<code>cat</code> <code>stu_csv.dat</code>

<code>classid,age,name</code>

<code>1.0,14.0,</code><code>"Tom"</code>

<code>1.0,12.0,</code><code>"Jacky"</code>

<code>2.0,16.0,</code><code>"Lily"</code>

<code>2.0,9.0,</code><code>"Tony"</code>

<code>2.0,19.0,</code><code>"Harry"</code>

<code>2.0,13.0,</code><code>"Vincent"</code>

<code>1.0,14.0,</code><code>"Bill"</code>

<code>2.0,17.0,</code><code>"Bruce"</code>

<code>3.0,18.0,</code><code>"Gaici"</code>

<code>3.0,38.0,</code><code>"Leader"</code>

-csv指要要導出為csv格式

-f指明需要導出哪些例

資料導入:mongoimport

先将表删除

<code>&gt; db.stu.drop()</code>

<code>true</code>

<code>&gt; show tables;</code>

<code>fs.chunks</code>

<code>fs.files</code>

<code>mycappc1</code>

<code>mycappc2</code>

<code>stu_res</code>

<code>system.indexes</code>

然後導入資料

<code>mongoimport -d </code><code>test</code> <code>-c stu stu.dat</code>

<code>Tue Nov 12 17:43:16.532 imported 10 objects</code>

<a href="http://blog.51cto.com/attachment/201311/174600130.png" target="_blank"></a>

導入CSV資料

<code>mongoimport -d </code><code>test</code> <code>-c stu -</code><code>type</code> <code>csv --headerline --</code><code>file</code> <code>stu_csv.dat</code>

-type指明要導入的檔案格式

-headerline批明不導入第一行,因為第一行是列名

-file指明要導入的檔案路徑

注意:

CSV格式良好,主流資料庫都支援導出為CSV的格式,是以這種格式非常利于異構資料遷移

資料備份mongodump

可以用mongodump來做MongoDB的庫或表級别的備份,下面舉例說明:

備份test資料庫

<code>mongodump -d </code><code>test</code>

此時會在目前目錄下建立一個dump目錄,用于存放備份出來的檔案

<a href="http://blog.51cto.com/attachment/201311/175358587.png" target="_blank"></a>

也可以指定備份存放的目錄

<code>mongodump -d </code><code>test</code> <code>-o my_test</code>

這個例子中将備份的檔案存在了目前目錄下的my_test目錄下

資料恢複mongorestore

由于剛剛已經做了備份,是以我們先将庫test删除掉

<code>db.dropDatabase()</code>

<code>{ </code><code>"dropped"</code> <code>: </code><code>"test"</code><code>, </code><code>"ok"</code> <code>: 1 }</code>

接下來我們進行資料庫恢複

<code>mongorestore -d </code><code>test</code> <code>dump/*</code>

經驗證資料庫又回來了,其實要是想恢複庫,也大可不必先删除test庫,隻要指

明–drop參數,就可以在恢複的時候先删除表然後再向表中插入資料的

二、通路控制

官方手冊中啟動MongoDB服務時沒有任何參數,一旦用戶端連接配接後可以對資料庫任意操

作,而且可以遠端通路資料庫,是以推薦開發階段可以不設定任何參數,但對于生産環境還

是要仔細考慮一下安全方面的因素,而提高MongoDB資料庫安全有幾個方面:

1、綁定IP内網位址通路MongoDB服務

MongoDB可以限制隻允許某一特定IP來通路,隻要在啟動時加一個參數bind_ip即可,如

下:

服務端限制隻有192.168.1.103這個IP可以通路MongoDB服務

<code>.</code><code>/mongod</code> <code>--bind_ip 192.168.1.103</code>

則隻有IP為<code>192.168.1.103的用戶端可以通路</code>

2、設定監聽端口

官方預設的監聽端口是27017,為了安全起見,一般都會修改這個監聽端口,避免惡意的連

接嘗試,具體如下:将服務端監聽端口修改為28018

<code>.</code><code>/mongod</code> <code>--bind_ip 192.168.1.103 --port 28018</code>

端戶通路時不指定端口,會連接配接到預設端口27017,對于本例會報錯

是以當服務端指定了端口後,用戶端必須要明确指定端口才可以正常通路

<code>.</code><code>/mongo</code> <code>192.168.1.103:28018</code>

3、使用使用者名和密碼登入

MongoDB預設的啟動是不驗證使用者名和密碼的,啟動MongoDB後,可以直接用MongoDB連接配接

上來,對所有的庫具有root權限。是以啟動的時候指定參數,可以阻止用戶端的通路和連接配接。

先啟用系統的登入驗證子產品,隻需在啟動時指定auth參數即可,如:

<code>.</code><code>/mongod</code> <code>--auth</code>

連接配接一下試試

<code>.</code><code>/mongo</code>

<code>MongoDB shell version: 2.4.7</code>

<code>connecting to: </code><code>test</code>

<code>&gt;</code>

很奇怪,為什麼我們啟用了登入驗證子產品,但我們登入時沒有指定使用者,為什麼還可以登入

呢?在最初始的時候MongoDB都預設有一個admin資料庫(預設是空的),

而admin.system.users中将會儲存比在其它資料庫中設定的使用者權限更大的使用者資訊。

注意:當admin.system.users中沒有添加任何使用者時,

即使MongoDB啟動時添加了--auth參數,此時不進行任何認證依然可以使用任何操作,

直到你在admin.system.users中添加了一個使用者。

<code>use admin</code>

<code>db.addUser(</code><code>'root'</code><code>,</code><code>'123'</code><code>)</code>

<code>{</code>

<code>"user"</code> <code>: </code><code>"root"</code><code>,</code>

<code>"readOnly"</code> <code>: </code><code>false</code><code>,</code>

<code>"pwd"</code> <code>: </code><code>"c2eb464922307de3bc3aaf9593f1d49b"</code><code>,</code>

<code>"_id"</code> <code>: ObjectId(</code><code>"5282086396b7a4a6e3cb17ed"</code><code>)</code>

<code>}</code>

用戶端連接配接試試:

<a href="http://blog.51cto.com/attachment/201311/185611308.png" target="_blank"></a>

連上test庫了,但進一步操作時有異常,看來MongoDB允許未授權連接配接,不能進行任何操作。

本地用戶端連接配接,指定使用者,結果如下:

因為root是admin庫的,是以隻能連接配接admin,連接配接其他庫是不能進入的。

<code>.</code><code>/mongo</code> <code>-uroot -p123 </code><code>test</code>

<code>Tue Nov 12 19:07:41.870 Error: 18 { code: 18, ok: 0.0, errmsg: </code><code>"auth fails"</code> <code>} at src</code><code>/mongo/shell/db</code><code>.js:228</code>

<code>exception: login failed</code>

隻能進入admin然後再進行操作:

<a href="http://blog.51cto.com/attachment/201311/191315329.png" target="_blank"></a>

MongoDB也支援為某個特定的資料庫來設定使用者,如我們為test庫設一個隻讀的使用者

<code>&gt; use </code><code>test</code><code>;</code>

<code>switched to db </code><code>test</code>

<code>&gt; db.addUser(</code><code>'test'</code><code>,</code><code>'123'</code><code>,</code><code>true</code><code>)</code>

<code>"user"</code> <code>: </code><code>"test"</code><code>,</code>

<code>"readOnly"</code> <code>: </code><code>true</code><code>,</code>

<code>"pwd"</code> <code>: </code><code>"e78333b96cbdc20a67432095f4741222"</code><code>,</code>

<code>"_id"</code> <code>: ObjectId(</code><code>"52820d76bca929d60ae67b5c"</code><code>)</code>

<code>&gt; db.auth(</code><code>'test'</code><code>,</code><code>'123'</code><code>)</code>

<code>1</code>

用戶端用此使用者來通路test,隻能進行讀操作,隻針對test庫

<a href="http://blog.51cto.com/attachment/201311/191812144.png" target="_blank"></a>

本文轉自shayang8851CTO部落格,原文連結:http://blog.51cto.com/janephp/1324110,如需轉載請自行聯系原作者