MongoDB的備份與恢複

來源:互聯網
上載者:User

像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匯出的檔案比較小,速度比較快,而且格式較為靈活。至於使用場合,大家自己根據需求揣度吧。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.