MongoDB 数据文件备份与恢复

备份与恢复数据对于管理任何数据存储系统来说都是非常重要的。

1、冷备份与恢复——创建数据文件的副本(前提是要停止MongoDB服务器),也就是直接copy

MongoDB将所有数据都存储在数据目录下,默认是/data/db/(Windows下是C:\data\db\),启动MongoDB时也可以用--dbpath指定我们自己设置的数据存储目录。 
备份MongoDB数据:只要简单的创建数据存储目录的副本就可以了,直接copy一份。 
恢复MongoDB数据:在MongoDB启动时用--dbpath指定数据存储目录副本位置。

在服务器运行的情况下直接copy是有风险的,可能copy出来时,数据已经遭到破坏,这种方式下创建数据目录的副本需要在关闭MongoDB服务器的前提下,数据目录中存储的就是关闭那一刻数据的快照,在服务器重新启动之前可以复制目录作为备份。

2、热备份与恢复——MongoDB bin目录下自带的mongodump和mongorestore工具

mongodump是一种能在运行时备份的方法。该命令详细参数如下: 

mongorestore获取mongodump的输出结果,并将备份的数据插入到运行的MongoDB实例中实现数据恢复。该命令详细参数如下: 

mongodump(备份)与mongorestore(恢复)示例: 
1、创建mongodb数据库: 

2、mongodump备份mongodb数据库: 
 
-d指定需要备份的数据库,-o指定备份位置,上述表示备份mongodb数据库到与当前mongodump命令同一位置backup目录下 

3、mongorestore恢复mongodb数据库,并重命名为mongodb2数据库: 
 
-d指定要恢复为的数据库,可以将备份的数据库恢复到与原来不同名的数据库中,这里为mongodb2,--drop表示在恢复前删除集合(若存在)。否则,数据就会与现有集合数据合并,可能会覆盖一些文档。

恢复之后数据存储目录中的数据: 

此时在MongoDB shell下可以查看到mongodb2数据库,及其中的mongodb集合和数据文档。 

3、fsync和锁方式备份

上面的1,2两点都不能保证备份时获取数据的实时性,因为我们在备份的时候可能还有数据在内存缓冲区中没有写入到磁盘,MongoDB给我们提供了fsync+lock机制就能满足我们的需求。

fsync(注意,只支持1.3+版本):该命令会强制服务器将所有缓冲区中的内容写入磁盘,
                                                  让我们可以实时性获取数据。 
lock(写入锁):通过lock给数据库一个写入锁,阻止对数据库的进一步写入操作,其他实例的写入操作全部被阻
                         塞,直到释放锁为止。写入锁是让fsync在备份时发挥作用的关键。

1、在shell中强制执行fsync并获得lock(写入锁),在备份之前fsync并加锁: 
fsync并加锁: db.runCommand({"fsync":1,"lock":1}),该命令用于admin db。 
 
该操作强制服务器将所有缓冲区中的内容写入磁盘并对数据库上锁,不允许执行写数据操作,一般在执行数据库备份时有用。

2、db.$cmd.sys.unlock.findOne():释放锁,备份好了就要解锁,该命令用于admin db。 

3、db.currentOp():查看当前锁状态

已经解锁状态: 

上锁状态: 
 
其中,fsyncLock为1表示MongoDB的fsync进程(负责将写入改变同步到磁盘)不允许其他进程执行写数据操作

fsync命令能非常灵活的备份,不用停掉服务器,也不用牺牲备份的实时特性。要付出的代价就是一些写入操作被暂时阻塞了。 唯一不耽误读写还能保证实时快照的备份方式就是通过“从服务器”备份。

4、从属备份

在从服务器上备份是MongoDB推荐的备份方式

come from:http://www.open-open.com/lib/view/open1340532912749.html

MongoDB 数据文件备份与恢复

时间: 2024-10-05 09:58:49

MongoDB 数据文件备份与恢复的相关文章

MongoDB数据文件内部结构

有人在Quora上提问:MongoDB数据文件内部的组织结构是什么样的.随后10gen的工程师Jared Rosoff出来做了简短的回答. 每一个数据库都有自己独立的文件.如果你开启了directoryperdb选项,那你每个库的文件会单独放在一个文件夹里. 数据库文件在内部会被切分成单个的块,每个块只保存一个名字空间的数据.在MongoDB中,名字空间用于区分不同的存储类别.比如每个collection有一个独立的名字空间,每个索引也有自己的名字空间. 在一个块中,会保存多条记录,每条记录是B

oracle 普通数据文件备份与恢复

普通数据文件指:非system表空间.undo_tablespace表空间.临时表空间和只读表空间的数据文件.它们损坏导致用户数据不能访问,不会导致db自身异常.实例崩溃.数据库不恢复就无法启动的情况. 恢复这样的数据文件可以采用高可用策略,在数据库OPEN状态下进行 10.1 普通数据文件损坏的后果 普通数据文件损坏后,只是用户的业务数据不同程度上无法访问(查询与修改),报错 ORA-01578,执行命令的会话不会被中断,即使是数据文件头部损坏检查点发生时实例也不会崩溃 --1 实例启动时,若

mongodb预先分配数据文件

mongodb预先分配数据文件,避免出现客户端超时 #!/bin/bash for i in {1..5} do echo $i head -c 120000000 /dev/zero > test.$i done

压缩 MongoDB 的数据文件

MongoDB采用了磁盘空间预分配的机制,为了避免磁盘碎片以及使用mmap后造成的近一步的内存碎片,但是随着数据的增删除改操作,数据文件不可避免的会产生空洞,造成磁盘空间和内存的浪费.本文说的是这方面的压缩,数据使用某些压缩算法进行压缩的讨论不在此范围. 在MongoDB 中,大概有两种方法可以解决这种问题,但是都不是无痛方式,所以并不推荐使用. 1.通过 repairDatabase 整理数据文件 repairDatabase 是MongoDB 内置的一个db 上的方法,调用这个方法,Mong

MongoDB数据库文件损坏恢复数据全过程

一.故障描述 客户设备环境为一台操作系统为Windows Server 2008的服务器,部署MongoDB数据库.由于业务需要,客户在未关闭MongoDB数据库服务的情况下,对数据库文件进行了拷贝.将数据库文件拷贝到其他分区后,客户对原数据库分区进行了格式化操作,后将数据库文件拷回原分区,重新启动MongoDB服务,这时,客户发现服务无法启动.报错如下:图一: 二.故障检测 一般来说,在服务没有关闭的情况下,直接对MongoDB数据库文件进行拷贝,由于服务还在运行,会导致mongod.lock

RMAN备份与恢复之数据文件

备份数据文件,模拟磁盘损坏时,还原恢复数据文件. 首先,查询数据文件序号,备份数据文件,可根据数据文件序号指定备份的数据文件. SQL> set linesize 1000 SQL> select file_name,file_id from dba_data_files; FILE_NAME FILE_ID ------------------------------------------------------------------------------------------ /d

MongoDB 数据迁移和同步

MongoDB 数据迁移和同步 MongoDB的数据同步 复制 mongodb的复制至少需要两个实例.其中一个是主节点master,负责处理客户端请求,其余的都是slave,负责从master上复制数据. master写处理:master负责接收写请求,具体的流程为: 如果开启journal功能,则先将写请求记录到journal中,然后批量执行,同时将操作记录到oplog中: 如果未开启journal功能,则对每个写请求进行单独操作,然后写入oplog. 注:oplog是幂等的,当有累加操作in

ORACLE RMAN备份及还原 RMAN可以进行增量备份:数据库,表空间,数据文件

ORACLE RMAN备份及还原 RMAN可以进行增量备份:数据库,表空间,数据文件 只有使用过的block可以被备份成backup set 表空间与数据文件对应关系:dba_data_files / v$datafile_header 在noarchivelog模式下,可以使用RMAN备份read-only和offline的表空间 ORACLE RMAN停机备份: 备份 RMAN连接上ORACLE,WINDOWS下在命令模式下 RMAN TARGET / 连接本地数据库用的是本地认证模式.RM

MongoDB数据表基本操作

MongoDB数据表基本操作 查看全部数据表 > use ChatRoom switched to db ChatRoom > show collections Account Chat system.indexes system.users 创建数据表 > db.createCollection("Account") {"ok":1} > db.createCollection("Test",{capped:true,