mongodb备份与恢复(上)
时间:2015-04-28 23:09 来源:linux.it.net.cn 作者:IT
数据定期备份是非常有必要的,数据的重要性不言而喻,地球上的猪都会知道。
mongodb备份方式有三种,下面分别说到:
1. 文件快照方式
2. 复制数据文件方式
3. 使用mongodump方式
一. 备份单台mongodb
1. 文件快照方式
这是最简单的备份方法。但是,需要系统文件支持快照和mongod必须启用journal。如果都符合这两条要求,可以在任何时刻创建快照。
恢复时,确保没有运行mongod,执行快照恢复操作命令,然后启动mongod进程,mongod将重放journal日志。
2. 复制数据文件方式
直接拷贝数据目录下的一切文件。但是在拷贝过程中必须阻止数据文件发生更改。因此需要对数据库加锁,以防止数据写入。
> db.fsyncLock()
上面的命令将阻塞写入操作,并将脏数据刷新到磁盘上,确保数据一致。
然后,拷贝数据文件到备份目录下
# cp -R /data/db/* /backup
文件复制完成后,对数据库进行解锁,允许写操作
> db.fsyncUnlock()
注意: 在执行db.fsyncLock()和db.fsyncUnlock()时,不能关闭当前的shell窗口,否则可能无法连接而需要重新启动mongod服务。
恢复时,确保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工具恢复
# ./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
恢复整个数据库:
# 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 );
(责任编辑:IT)
数据定期备份是非常有必要的,数据的重要性不言而喻,地球上的猪都会知道。 mongodb备份方式有三种,下面分别说到: 1. 文件快照方式 2. 复制数据文件方式 3. 使用mongodump方式 一. 备份单台mongodb 1. 文件快照方式 这是最简单的备份方法。但是,需要系统文件支持快照和mongod必须启用journal。如果都符合这两条要求,可以在任何时刻创建快照。 恢复时,确保没有运行mongod,执行快照恢复操作命令,然后启动mongod进程,mongod将重放journal日志。 2. 复制数据文件方式 直接拷贝数据目录下的一切文件。但是在拷贝过程中必须阻止数据文件发生更改。因此需要对数据库加锁,以防止数据写入。 > db.fsyncLock() 上面的命令将阻塞写入操作,并将脏数据刷新到磁盘上,确保数据一致。 然后,拷贝数据文件到备份目录下 # cp -R /data/db/* /backup 文件复制完成后,对数据库进行解锁,允许写操作 > db.fsyncUnlock() 注意: 在执行db.fsyncLock()和db.fsyncUnlock()时,不能关闭当前的shell窗口,否则可能无法连接而需要重新启动mongod服务。 恢复时,确保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工具恢复 # ./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 恢复整个数据库: # 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 ); (责任编辑:IT) |