数据导入与导出可以借助mongoexport与mongoimport实现

数据导出:先查看数据:

导出命令:

  1. 2017-03-06T15:53:32.916+0800 connected to: localhost
  2. 2017-03-06T15:53:32.927+0800 exported 1 record

导出后的user.json数据:

  1. {"_id":{"$oid":"5895950a4aed6ad4d4a3fe5c"},"username":"linfenliang","password":"123456"}

导出CSV格式命令:

  1. D:\MongoDB\Server\3.2\bin>mongoexport.exe --db test --collection user --type=csv --fields username,password --out E:\user.csv
  2. 2017-03-06T16:04:00.231+0800 connected to: localhost
  3. 2017-03-06T16:04:00.242+0800 exported 1 record

查看csv格式数据:

  1. username password
  2. linfenliang 123456

注意:这种方式由于会强制数据库读取所有的要导出的数据到内存,会对正在运行的Mongod示例性能产生影响。

数据导入:

原始数据:

  1. {"username":"lisi","password":"654321"}

导入命令:

导入结果:

  1. > db.user.find()
  2. { "_id" : ObjectId("5895950a4aed6ad4d4a3fe5c"), "username" : "linfenliang", "password" : "123456" }
  3. { "_id" : ObjectId("58bd221fd6d41608a1a3f750"), "username" : "lisi", "password" : "654321" }

其中 —upsert表示如果有相同记录,则更新(默认的依据是_id相同)可以通过—upsertFields指定判断记录是否相同的字段。

MongoDB的这两个工具,适合用来将关系型数据库中的数据与MongoDB数据做互相转换,并不适合读数据库全量备份。

备份命令:

  1. D:\MongoDB\Server\3.2\bin>mongodump.exe --db test --out E:\test_bak
  2. 2017-03-06T18:20:05.565+0800 writing test.restaurants to
  3. 2017-03-06T18:20:05.577+0800 writing test.user to
  4. 2017-03-06T18:20:05.578+0800 writing test.fs.chunks to
  5. 2017-03-06T18:20:05.579+0800 writing test.fs.files to
  6. 2017-03-06T18:20:05.580+0800 done dumping test.restaurants (2 documents)
  7. 2017-03-06T18:20:05.581+0800 done dumping test.user (2 documents)
  8. 2017-03-06T18:20:05.582+0800 done dumping test.fs.chunks (1 document)
  9. 2017-03-06T18:20:05.582+0800 done dumping test.fs.files (1 document)

这是生成后的文件信息:

常用的命令参数还有:

—collection 指定具体的集合—query 按照查询条件备份

恢复命令:

  1. D:\MongoDB\Server\3.2\bin>mongorestore.exe --db user_restore E:\test_bak\test
  2. 2017-03-06T18:43:04.835+0800 building a list of collections to restore from E:\test_bak\test dir
  3. 2017-03-06T18:43:04.849+0800 reading metadata for user_restore.fs.chunks from E:\test_bak\test\fs.chunks.metadata.json
  4. 2017-03-06T18:43:04.960+0800 restoring user_restore.fs.chunks from E:\test_bak\test\fs.chunks.bson
  5. 2017-03-06T18:43:04.961+0800 reading metadata for user_restore.restaurants from E:\test_bak\test\restaurants.metadata.json
  6. 2017-03-06T18:43:04.967+0800 reading metadata for user_restore.fs.files from E:\test_bak\test\fs.files.metadata.json
  7. 2017-03-06T18:43:04.969+0800 reading metadata for user_restore.user from E:\test_bak\test\user.metadata.json
  8. 2017-03-06T18:43:05.019+0800 restoring user_restore.restaurants from E:\test_bak\test\restaurants.bson
  9. 2017-03-06T18:43:05.021+0800 restoring indexes for collection user_restore.fs.chunks from metadata
  10. 2017-03-06T18:43:05.133+0800 restoring user_restore.user from E:\test_bak\test\user.bson
  11. 2017-03-06T18:43:05.171+0800 finished restoring user_restore.restaurants (2 documents)
  12. 2017-03-06T18:43:05.172+0800 restoring indexes for collection user_restore.fs.files from metadata
  13. 2017-03-06T18:43:05.174+0800 restoring indexes for collection user_restore.user from metadata
  14. 2017-03-06T18:43:05.175+0800 finished restoring user_restore.fs.chunks (1 document)
  15. 2017-03-06T18:43:05.177+0800 finished restoring user_restore.fs.files (1 document)
  16. 2017-03-06T18:43:05.178+0800 finished restoring user_restore.user (2 documents)
  17. 2017-03-06T18:43:05.180+0800 done

查看恢复情况:

  1. > use user_restore
  2. switched to db user_restore
  3. > show collections
  4. > show collections
  5. fs.chunks
  6. fs.files
  7. restaurants
  8. user

常用的命令参数还有:

—collection 指定具体的集合—drop 恢复数据前删除此数据库下的所有集合

在MongoDB集群上备份,实质上是对MongoDB的复制集进行备份操作,具体流程如下:

  1. 禁用平衡器:sh.stopBalancer()因为分片集群上会有一个balancer进程在后台维护各个分片上的数据块数量的均衡,如果不禁用平衡器就可能导致设备护具的重复或缺失。
  2. 停止每个片上的某一个secondary节点,利用此节点进行备份,停止其中某一个配置服务器,保证备份时配置服务器上的源数据不会改变,备份secondary节点数据与及备份完全相同
  3. 重启所有停掉的复制集成员(他会自动从primary节点同步恢复数据,达到最终数据一致性)
  4. 重启分片集群上的平衡器命令为:
  1. use config
  2. sh.startBalancer()

集群数据恢复流程:

  1. 停止集群中所有的mongod实例以及mongos实例
  2. 利用dump文件依次回复每一个片中的每个复制集
  3. 恢复配置服务器
  4. 重启所有mongod实例以及Mongos实例
  5. 通过mongo连接Mongos,执行命令 db.printShardingStatus()确保集群可用
  1. mongostat命令:
  1. 另一个命令:mongotop
  1. D:\MongoDB\Server\3.2\bin>mongotop.exe
  2. 2017-03-07T16:01:04.063+0800 connected to: 127.0.0.1
  3. ns total read write 2017-03-07T16:01:05+08:00
  4. admin.system.roles 0ms 0ms 0ms
  5. admin.system.version 0ms 0ms 0ms
  6. local.startup_log 0ms 0ms 0ms
  7. local.system.replset 0ms 0ms 0ms
  8. test.fs.chunks 0ms 0ms 0ms
  9. test.restaurants 0ms 0ms 0ms
  10. test.user 0ms 0ms 0ms
  11. user_restore.fs.chunks 0ms 0ms 0ms
  12. user_restore.fs.files 0ms 0ms 0ms
  1. serverStatus命令:
  1. D:\MongoDB\Server\3.2\bin>mongo.exe
  2. MongoDB shell version: 3.2.9
  3. connecting to: test
  4. > db.serverStatus()

信息量打印太多,不再贴出来了。

  1. stats命令:
  1. D:\MongoDB\Server\3.2\bin>mongo.exe
  2. 2017-03-07T16:02:49.399+0800 I CONTROL [main] Hotfix KB2731284 or later update is not installed, will zero-out data files
  3. MongoDB shell version: 3.2.9
  4. connecting to: test
  5. > db.stats()
  6. {
  7. "db" : "test",
  8. "collections" : 4,
  9. "objects" : 6,
  10. "avgObjSize" : 663.6666666666666,
  11. "dataSize" : 3982,
  12. "storageSize" : 14036992,
  13. "numExtents" : 0,
  14. "indexes" : 5,
  15. "indexSize" : 176128,
  16. "ok" : 1
  17. }

影响数据库性能的几个主要参数:

锁,可以通过serverStatus中globalLock数据查看currentQueue中的total值,该值反应了是否存在并发问题严重程度

内存,可通过serverStatus查看

  1. "mem" : { "bits" : 64,
  2. "resident" : 45,
  3. "virtual" : 169,
  4. "supported" : true,
  5. "mapped" : 0,
  6. "mappedWithJournal" : 0 },

注意 mapped如果过大,会引起缺页错误,resident过大,表示系统内存过小

缺页错误,page_faults

  1. "extra_info" : { "note" : "fields vary by platform",
  2. "page_faults" : 51143,
  3. "usagePageFileMB" : 72,
  4. "totalPageFileMB" : 16133,
  5. "availPageFileMB" : 10188,

这个会导致大量的内存置换,解决的办法是部署分片集群

连接数,activeClients 表示连接数,

对于读操作大的应用,可以增加复制集成员数,将读操作分发到secondary节点上,对写操作大的应用,通过部署分片集群分发写操作。

topfreeiostat

基本的常用命令,非mongod独有,不再赘述。

启动mongod时,添加参数:>mongod —httpinterface —rest前一个参数表示打开Web控制台,后一个参数能够获取更为详细的数据,不建议在生产环境打开。