mongodb备份与恢复(上)

数据按期备份是很是有必要的,数据的重要性不言而喻,地球上的猪都会知道。
mongodb备份方式有三种,下面分别说到:
1. 文件快照方式
2. 复制数据文件方式
3. 使用mongodump方式 html

一. 备份单台mongodb

1. 文件快照方式

这是最简单的备份方法。可是,须要系统文件支持快照和mongod必须启用journal。若是都符合这两条要求,能够在任什么时候刻建立快照。

恢复时,确保没有运行mongod,执行快照恢复操做命令,而后启动mongod进程,mongod将重放journal日志。 mongodb

2. 复制数据文件方式

直接拷贝数据目录下的一切文件。可是在拷贝过程当中必须阻止数据文件发生更改。所以须要对数据库加锁,以防止数据写入。

> db.fsyncLock()

上面的命令将阻塞写入操做,并将脏数据刷新到磁盘上,确保数据一致。
而后,拷贝数据文件到备份目录下 shell

# cp -R /data/db/* /backup

文件复制完成后,对数据库进行解锁,容许写操做 数据库

> db.fsyncUnlock()

注意: 在执行db.fsyncLock()和db.fsyncUnlock()时,不能关闭当前的shell窗口,不然可能没法链接而须要从新启动mongod服务。 json

恢复时,确保mongod没有运行,清空数据目录,将备份的数据拷贝到数据目录下,而后启动mongod 服务器

# cp -R /backup/* /data/db/
# mongod -f mongod.conf

3. 使用mongodump方式

千万不要fsyncLock与mongodump配合使用,若是数据库被锁定了,mongodump将永远挂起。
使用mongodump备份比较慢,在备份复制集时还有些问题,后续会说到。可是,用来备份单个数据库、集合、子集合仍是比较好的方法。

# ./mongodump --help
options:
  --help                                显示帮助信息
  -v [ --verbose ]                      打印出更多信息,如时间等等 -vvvvv
  --version                             打印版本信息
  -h [ --host ] arg                     指定链接的mongodb主机,复制集时设置为<set name>/s1,s2
  --port arg                            指定mongodb端口号,也能够这么指定--host hostname:port
  --ipv6                                启用支持IPv6 support
  -u [ --username ] arg                 用户名
  -p [ --password ] arg                 密码
  --authenticationDatabase arg          user source (defaults to dbname)
  --authenticationMechanism arg (=MONGODB-CR)
                                        authentication mechanism
  --dbpath arg                          直接访问mongod的数据库文件,而不是链接到mongodb服务器。须要锁定数据目录,若是mongod当前在访问相同路径将不能使用。也就是说,mongod运行的状况下不能使用--dbpath,mongod未运行的状况下能够直接指定--dbpath
  --directoryperdb                      每一个db一个单独的目录,须要指定dbpath 
  --journal                             启用journaling,须要指定dbpath
  -d [ --db ] arg                       指定数据库
  -c [ --collection ] arg               指定集合
  -o [ --out ] arg (=dump)              指定输出目录,"-"表示标准输出
  -q [ --query ] arg                    json查询
  --oplog                               使用oplog来生产时间点快照
  --repair                              尝试恢复崩溃的数据库
  --forceTableScan                      强制表扫描,不使用$snapshot
# mongodump -p 27017

将在当前目录下建立dump目录,备份全部的数据库,全部的数据存储在.bson文件中,可使用mongodb提供的bsondump工具来检索它。
mongod未运行状况下: 架构

# mongodump --dbpath /data/db

恢复时,使用mongorestore工具恢复 app

# ./mongorestore --help   //相同部分参数意义参加上面的mongodump
  -v [ --verbose ]                      
  --version                             
  -h [ --host ] arg                     
  --port arg                            
  --ipv6                                
  -u [ --username ] arg                 
  -p [ --password ] arg                 
  --authenticationDatabase arg          
  --authenticationMechanism arg (=MONGODB-CR)
  --dbpath arg                         
  --directoryperdb                      
  --journal 
  -d [ --db ] arg  
  -c [ --collection ] arg  
  --objcheck                            在插入前验证对象,默认启用
  --noobjcheck                          不在插入前验证对象
  --filter arg                          插入前过滤
  --drop                                在插入前删除全部文档
  --oplogReplay                         在恢复时应用oplog
  --oplogLimit arg                      include oplog entries before the 
                                        provided Timestamp (seconds[:ordinal]) 
                                        during the oplog replay; the ordinal 
                                        value is optional
  --keepIndexVersion                    don't upgrade indexes to newest version
  --noOptionsRestore                    don't restore collection options
  --noIndexRestore                      don't restore indexes
  --w arg (=0)                          minimum number of replicas per write

恢复整个数据库: ide

# mongorestore -p 27017 dump/

恢复到特定的库和集合: 工具

# mongorestore --db ttlsa_com --collection posts dump/old_ttlsa_com/old_posts.bson

注意: mongodump和mongorestore版本最好相匹配。

二. 备份复制集

一般状况下,在secondary进行备份,下降primary负载,只在secondary上锁定,以避免影响业务(假设没有发送读请求到secondary)。 可使用上面的任意方式进行备份,不过推荐使用文件快照方式和复制数据文件方式。
使用mongodump备份,上面提到了一个问题,那就是在mongodump备份过程当中,发生写操做。在复制集架构环境下,要避免这种状况发生,mongodump须要加上--oplog参数,来跟踪备份时服务器上发生的全部操做,获取一个pointin-time快照,不然备份的状态将与集群中其余节点不匹配。在恢复时,还必须建立oplog,并指定--oplogReplay参数来应用这些操做,不然恢复的成员将不知道从何处开始同步,从而在某个时间点上与源服务器保持一致。

在备份复制集时,能够设置mongodump链接"setName/s1,s2,s3", 它会自动选择一个可用的secondary进行备份。

备份复制集:

# mongodump -h "ttlsa/10.1.1.155,10.1.1.156,10.1.1.157" --oplog -o /backup/mongodbbackup/

恢复复制集步骤:

1. 将复制集中要恢复的成员移除集群

2. 运行mongorestore --oplogReplay命令

# mongorestore --oplogReplay dump/

3. 建立oplog

> use local
> db.createCollection("oplog.rs", {"capped" : true, "size" : 10000000})

4. 恢复oplog

# mongorestore -d local -c oplog.rs dump/oplog.bson

注意:oplog.bson不位于dump/local/oplog.rs.bson, oplog.bson记录mongodump过程当中发生的操做。

5. 将该节点添加到复制集集群中

复制集的相关操做参见 http://www.ttlsa.com/html/1679.html

三. 备份分片

在分片集群下,不可能在一个时间点上获得一个完整集群状态的快照。当集群愈来愈大时,从备份恢复整个架构的概率愈来愈小的。 所以,对于分片集群的备份,只需独自备份config server和复制集。
在对分片集群进行备份与恢复操做前,要关闭balancer。

对于比较小的分片集群,能够直接从mongos来备份与恢复。

在大多数状况下,咱们只须要恢复集群中的某个节点。 若是须要恢复整个集群,那你够倒霉的了,整个集群数据丢失可能性比较小的。备份时,直接链接分片集群的mongod而不是经过mongos。

对于比较小型的分片集群,能够直接经过mongodump链接到mongos进行备份,备份的文件将包含config服务器的元数据信息和实际数据。

对于大型的分片集群,备份步骤以下:

1. 关闭balancer

注意:链接到mongos而不是config server实例。

> sh.setBalancerState(false) 或
> sh.stopBalancer() 或
> use config
> db.settings.update( { _id: "balancer" }, { $set : { stopped: true } } , true );

2. 备份集群元数据

使用mongodump备份任意一台config server。

能够直接链接任意一台的config mongod实例,也能够经过mongos链接。

# mongodump --db config

3. 备份shard集群内各个replica set

可并行执行。

4. 启用balancer

注意:链接到mongos而不是config server实例。

> sh.setBalancerState(true) 或
> sh.startBalancer() 或
> use config
> db.settings.update( { _id: "balancer" }, { $set : { stopped: false } } , true );

下篇《mongodb备份与恢复(下)》将提供一个线上的备份脚本(适用于mongodb任何架构)以及增量备份的实现方法。

如需转载请注明出处:mongodb备份与恢复(上)  http://www.ttlsa.com/html/1938.html

相关文章
相关标签/搜索