MongoDB的备份与恢复

来源:互联网 发布:淘宝推广渠道有哪些 编辑:程序博客网 时间:2024/04/25 19:30

像MongoDB这样强大的数据库,自然提供了完善,丰富而且好用的备份与恢复机制,且看。

1、整库备份与恢复

1.1 工具说明

mongodb中有工具mongodump和mongorestore提供了非常方便的对整个数据库备份与恢复功能。对于如何使用,可以采用命令后面加--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在一个单独的目录”。)

如果没有指定-d和--directorydb则会默认将指定host上的所有数据库备份到当前目录下的dump目录下。

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导出的文件比较小,速度比较快,而且格式较为灵活。至于使用场合,大家自己根据需求揣度吧。

大笑

原创粉丝点击