像MongoDB這樣強大的資料庫,自然提供了完善,豐富而且好用的備份與恢複機制,且看。
1、整庫備份與恢複
1.1 工具說明
mongodb中有工具mongodump和mongorestore提供了非常方便的對整個Database Backup與恢複功能。對於如何使用,可以採用命令後面加--help選項查看兩個工具的協助文檔。如下:
$ mongodump --helpExport MongoDB data to BSON files.options: --help produce help message -v [ --verbose ] be more verbose (include multiple times for more verbosity e.g. -vvvvv) --version print the program's version and exit -h [ --host ] arg mongo host to connect to ( <set name>/s1,s2 for sets) --port arg server port. Can also use --host hostname:port --ipv6 enable IPv6 support (disabled by default) -u [ --username ] arg username -p [ --password ] arg password --dbpath arg directly access mongod database files in the given path, instead of connecting to a mongod server - needs to lock the data directory, so cannot be used if a mongod is currently accessing the same path --directoryperdb if dbpath specified, each db is in a separate directory --journal enable journaling -d [ --db ] arg database to use -c [ --collection ] arg collection to use (some commands) -o [ --out ] arg (=dump) output directory or "-" for stdout -q [ --query ] arg json query --oplog Use oplog for point-in-time snapshotting --repair try to recover a crashed database --forceTableScan force a table scan (do not use $snapshot)$ mongorestore --helpusage: mongorestore [options] [directory or filename to restore from]options: --help produce help message -v [ --verbose ] be more verbose (include multiple times for more verbosity e.g. -vvvvv) --version print the program's version and exit -h [ --host ] arg mongo host to connect to ( <set name>/s1,s2 for sets) --port arg server port. Can also use --host hostname:port --ipv6 enable IPv6 support (disabled by default) -u [ --username ] arg username -p [ --password ] arg password --dbpath arg directly access mongod database files in the given path, instead of connecting to a mongod server - needs to lock the data directory, so cannot be used if a mongod is currently accessing the same path --directoryperdb if dbpath specified, each db is in a separate directory --journal enable journaling -d [ --db ] arg database to use -c [ --collection ] arg collection to use (some commands) --objcheck validate object before inserting --filter arg filter to apply before inserting --drop drop each collection before import --oplogReplay replay oplog for point-in-time restore --keepIndexVersion don't upgrade indexes to newest version
常用的選項如下:
mongodump -h host -d dbname -o directory
-h:MongDB所在伺服器位址,如:127.0.0.1,也可以指定連接埠號碼:127.0.0.1:27017
-d:需要備份的資料庫名稱,如:db_test
-o:備份的資料存放位置,如:~\dump,當然該目錄需要提前建立,在備份完成後,系統自動在dump目錄下建立一個db_test目錄,這個目錄裡面存放該資料庫執行個體的備份資料。
mongorestore -h host -d dbname --directoryperdb dbdirectory
-h:MongoDB所在伺服器位址
-d:需要恢複的資料庫名稱,如:db_test,當然這個名稱可以不同於備份的時候,比如new_db
--directoryperdb:備份資料檔案所在位置,如:~\dump\db_test(這裡之所以要加db_test子目錄,從mongoretore的help中的--directoryperdb,可以讀出“每一個db在一個單獨的目錄”。)
1.2 工具使用執行個體
現在在一個遠端mongo資料庫伺服器上,有一個test資料庫,其中,建立了兩個collection(book和user)供測試,其中的內容通過簡單的mongo命令列可以查看,如下:
book collection:{ _id: ObjectId("52441b86d8947f5302000000"), name: "C++ Primer", author: "Not Known", type: "good book"}{ _id: ObjectId("52441bd0d8947fb601000000"), name: "C++ Model Exploration", author: "A Foreigner", type: "Should Be Read Before Interview"}user collection:{ _id: ObjectId("52442736d8947fb501000001"), name: "lfqy", gender: "male"}
下面用mongodump工具對該資料庫進行備份:
$ mongodump -h 10.77.20.xx -d test -o ~/dumpconnected to: 10.77.20.xxDATABASE: test to /home/lfqy/dump/testtest.system.indexes to /home/lfqy/dump/test/system.indexes.bson 2 objectstest.book to /home/lfqy/dump/test/book.bson 2 objectstest.user to /home/lfqy/dump/test/user.bson 1 objects
下面我們將伺服器上的test資料庫刪除(可以用各種方式,命令,工具。。。這裡採用的是一個mongo的可視化管理工具。),然後用命令對該庫進行恢複。
$ mongorestore -h 10.77.20.xx -d test --directoryperdb ~/dump/testconnected to: 10.77.20.xxThu Sep 26 20:37:14 /home/lfqy/dump/test/book.bsonThu Sep 26 20:37:14 going into namespace [test.book]2 objects foundThu Sep 26 20:37:14 /home/lfqy/dump/test/user.bsonThu Sep 26 20:37:14 going into namespace [test.user]1 objects foundThu Sep 26 20:37:14 /home/lfqy/dump/test/system.indexes.bsonThu Sep 26 20:37:14 going into namespace [test.system.indexes]Thu Sep 26 20:37:14 { key: { _id: 1 }, ns: "test.book", name: "_id_" }Thu Sep 26 20:37:14 { key: { _id: 1 }, ns: "test.user", name: "_id_" }2 objects found
這樣便完成了對test資料庫的恢複。
另外,這裡利用mongorestore工具恢複資料庫對在備份之後新插入資料庫的記錄並不會影響。具體地說,假裝置份前,test資料庫的book集合中有兩條記錄A和B,備份之後,book集合中又新插入了記錄C。這樣,利用mongorestore工具恢複資料庫之後,備份資料將會覆蓋掉其中的記錄A和B,而不會對C產生影響,最終,book集合中還是會有A、B和C三條記錄。當然,也可以指定--drop選項,顯示說明在恢複之前先將原來的資料庫drop掉。
2、匯出單個collection的資料
除了整庫的備份和恢複,mongo還提供了方便的單個collection資料的匯出和匯入工具mongoexport和mongoimport,可以用來在對資料進行有風險的操作時對資料進行備份和災後恢複。
2.1 工具說明
mongoexport工具可以把一個collection匯出成JSON格式或CSV格式的檔案;mongoimport工具可以把一個特定格式檔案中的內容匯入到指定的collection中(可以匯入JSON格式資料,也可以匯入CSV格式資料)。同樣也可以使用命令加--help選項來查看兩個工具的協助,如下:
$ mongoexport --helpExport MongoDB data to CSV, TSV or JSON files.options: --help produce help message -v [ --verbose ] be more verbose (include multiple times for more verbosity e.g. -vvvvv) --version print the program's version and exit -h [ --host ] arg mongo host to connect to ( <set name>/s1,s2 for sets) --port arg server port. Can also use --host hostname:port --ipv6 enable IPv6 support (disabled by default) -u [ --username ] arg username -p [ --password ] arg password --dbpath arg directly access mongod database files in the given path, instead of connecting to a mongod server - needs to lock the data directory, so cannot be used if a mongod is currently accessing the same path --directoryperdb if dbpath specified, each db is in a separate directory --journal enable journaling -d [ --db ] arg database to use -c [ --collection ] arg collection to use (some commands) -f [ --fields ] arg comma separated list of field names e.g. -f name,age --fieldFile arg file with fields names - 1 per line -q [ --query ] arg query filter, as a JSON string --csv export to csv instead of json -o [ --out ] arg output file; if not specified, stdout is used --jsonArray output to a json array rather than one object per line -k [ --slaveOk ] arg (=1) use secondaries for export if available, default true$ mongoimport --helpoptions: --help produce help message -v [ --verbose ] be more verbose (include multiple times for more verbosity e.g. -vvvvv) --version print the program's version and exit -h [ --host ] arg mongo host to connect to ( <set name>/s1,s2 for sets) --port arg server port. Can also use --host hostname:port --ipv6 enable IPv6 support (disabled by default) -u [ --username ] arg username -p [ --password ] arg password --dbpath arg directly access mongod database files in the given path, instead of connecting to a mongod server - needs to lock the data directory, so cannot be used if a mongod is currently accessing the same path --directoryperdb if dbpath specified, each db is in a separate directory --journal enable journaling -d [ --db ] arg database to use -c [ --collection ] arg collection to use (some commands) -f [ --fields ] arg comma separated list of field names e.g. -f name,age --fieldFile arg file with fields names - 1 per line --ignoreBlanks if given, empty fields in csv and tsv will be ignored --type arg type of file to import. default: json (json,csv,tsv) --file arg file to import from; if not specified stdin is used --drop drop collection first --headerline CSV,TSV only - use first line as headers --upsert insert or update objects that already exist --upsertFields arg comma-separated fields for the query part of the upsert. You should make sure this is indexed --stopOnError stop importing at first error rather than continuing --jsonArray load a json array, not one item per line. Currently limited to 4MB.
其中常用選項如下:
mongoexport -h host -d dbname -c collection_name -o filename(將host資料庫伺服器上dbname資料庫中的名為collection_name的集合中的資料匯出到名為filename的檔案。)
-h:指明資料庫伺服器IP
-u:指明資料庫的使用者名稱
-p:指明資料庫的密碼
-d:指明資料庫的名字
-c:指明collection的名字
-f:指明要匯出那些列
-o:指明到要匯出的檔案名稱
-q:指明匯出資料的過濾條件
mongoimport -h host -d dbname -c collection_name filename(把名為filename的檔案中的資料恢複到地址為host的資料庫伺服器上的名為dbname的資料庫中的collection_name集合中。)
-h:指明資料庫伺服器IP
-u:指明資料庫的使用者名稱
-p:指明資料庫的密碼
-d:指明資料庫的名字
-c:指明collection的名字
-f:指明要匯入那些列
2.2 工具使用執行個體
這裡也採用上面提到的test資料庫作為例子,首先匯出其中的book集合。
$ mongoexport -h 10.77.20.xx -d test -c book -o book.jsonconnected to: 10.77.20.xxexported 2 records
下面將book集合刪除(這裡也是採用前面的方法),然後從檔案對其進行恢複(也就是將檔案中的資料匯入資料庫)。
$ mongoimport -h 10.77.20.xx -d test -c book book.jsonconnected to: 10.77.20.xximported 2 objects
這樣,便將book.json中的資料匯入了test中的book集合中。
同樣地,這裡book.json匯入資料庫之後並不會影響,備份之後新加入資料庫中的記錄。具體地說,假裝置份前,book集合中有兩條記錄A和B,備份之後,book集合中又新插入了記錄C。這樣,將備份資料匯入book集合之後將會覆蓋掉其中的記錄AB,而不會對C產生影響,最終,book集合中還是會有A、B和C三條記錄。類似與mongorestore,也可以指定--drop選項,顯示說明在恢複之前先將原來的集合drop掉。
3、兩者的區別
這個瞭解不深。首先,從上面不難看出,mongorestore和mongodump提供的是對mongo資料庫的整個資料庫的恢複和備份,而mongoimport和mongoexport則是提供更細粒度的collection層級的資料匯入和匯出。兩者的粒度不同,mongoimport和mongoexport粒度更細,相對來說,更加靈活。其次,mongoimport和mongoexport只是將集合中的資料匯出和匯入,但是沒有對資料庫中的其它成分進行備份(比如索引),而mongorestore和mongodump則是對資料庫中的所有成分(包括索引等其它)進行恢複和備份。然而,這也導致了mongorestore和mongodump匯出的檔案比較大耗時較長,而mongoimport和mongoexport匯出的檔案比較小,速度比較快,而且格式較為靈活。至於使用場合,大家自己根據需求揣度吧。