一、資料的導入導出和備份恢複
資料導出: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>> db.stu.drop()</code>
<code>true</code>
<code>> 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>></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>> use </code><code>test</code><code>;</code>
<code>switched to db </code><code>test</code>
<code>> 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>> 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,如需轉載請自行聯系原作者