参考官方文档:
https://docs.mongodb.com/manual/core/backups/
使用文件系统快照进行备份和重建
本文档介绍了使用系统级工具(如LVM或存储设备)创建MongoDB系统备份的过程,以及相应的还原策略。
这些文件系统快照或“块级”备份方法使用系统级工具来创建包含MongoDB数据文件的设备的副本。 这些方法可以快速完成并可靠地工作,但需要在MongoDB之外进行额外的系统配置。
版本3.2中更改:当MongoDB实例的数据文件和日志文件驻留在不同的卷上时,MongoDB 3.2使用WiredTiger存储引擎添加了对MongoDB实例的卷级备份的支持。 但是,要创建一致的备份,必须锁定数据库,并且必须在备份过程中暂停对数据库的所有写入。
在MongoDB 3.2之前,使用WiredTiger创建MongoDB实例的卷级备份要求数据文件和日志驻留在同一卷上。
快照概述
快照通过在实时数据和特殊快照卷之间创建指针来工作。 这些指针在理论上等同于“硬链接”。由于工作数据与快照不同,快照过程使用写时复制策略。 因此,快照仅存储已修改的数据。
制作快照后,将快照映像挂载到文件系统上并从快照复制数据。 生成的备份包含所有数据的完整副本。
注意事项
在快照时验证数据库
快照发生时,数据库必须有效。 这意味着数据库接受的所有写入都需要完全写入磁盘:日志或数据文件。
如果在备份发生时有不在磁盘上的写入,则备份不会反映这些更改。
对于MMAPv1存储引擎,如果在进行备份时正在进行写入,则数据文件将反映不一致的状态。 使用日记功能,可以恢复由正在进行的写入产生的所有数据文件状态; 如果没有日记功能,则必须在运行备份操作之前将所有挂起的写入刷入磁盘,并且必须确保在整个备份过程中不会发生写入操作。 如果使用日记功能,则日记必须与数据位于同一个卷上。
对于WiredTiger存储引擎,数据文件反映了上一个检查点的一致状态。 检查点每2 GB数据或每分钟发生一次。
整个磁盘映像
快照会创建整个磁盘映像的映像。 除非您需要备份整个系统,否则请考虑在一个不包含任何其他数据的逻辑磁盘上隔离MongoDB数据文件,日志(如果适用)和配置。
或者,将所有MongoDB数据文件存储在专门的设备上,以便您可以进行备份而无需复制无关数据。
现场故障预防措施
确保将数据从快照复制到其他系统。 这可确保数据免受站点故障的影响。
非增量备份
本教程不包括增量备份的过程。 虽然不同的快照方法提供不同的功能,但下面概述的LVM方法不提供捕获增量备份的能力。
使用日记功能的快照
如果您的mongod实例启用了日记功能,则可以使用任何类型的文件系统或卷/块级别快照工具来创建备份。
如果在基于Linux的系统上管理自己的基础结构,请使用LVM配置系统以提供磁盘包并提供快照功能。 您还可以在云/虚拟化环境中使用基于LVM的设置。
注意:
运行LVM提供了额外的灵活性,并允许使用快照备份MongoDB。
在linux 上使用lvm创建备份和恢复
本节概述了在Linux系统上使用LVM的简单备份过程。
注意:仅使用以下过程作为备份系统和基础结构的准则。 生产备份系统必须考虑特定环境特有的许多特定要求和因素。
创建一个快照
在3.2版中更改:从MongoDB 3.2开始,为了使用WiredTiger对MongoDB实例进行卷级备份,不再需要将数据文件和日志驻留在单个卷上。
要使用LVM创建快照,请按以下格式以root身份发出命令:
lvcreate --size 100M --snapshot --name mdb-snap01 /dev/vg0/mongodb
此命令在vg0卷组中为mongodb卷创建名为mdb-snap01的LVM快照(使用--snapshot选项)。
此示例创建位于/dev/vg0/mdb-snap01的名为mdb-snap01的快照。 根据操作系统的LVM配置,系统卷组和设备的位置和路径可能略有不同。
快照的上限为100兆字节,因为参数大小为100M。 此大小不反映磁盘上数据的总量,而是反映/dev/vg0/mongodb当前状态与快照创建(即/dev/vg0/mdb-snap01)之间的差异数量。
警告:
确保创建具有足够空间的快照以考虑数据增长,特别是在将数据复制出系统或临时映像所需的时间段内。
如果快照空间不足,则快照映像将变为不可用。 丢弃此逻辑卷并创建另一个。
命令返回时,快照将存在。 您可以随时直接从快照还原,也可以创建新的逻辑卷并从此快照还原到备用映像。
虽然快照非常适合快速创建高质量的备份,但它们并不适合用作存储备份数据的格式。 快照通常依赖并驻留在与原始磁盘映像相同的存储基础结构上。 因此,将这些快照存档并将其存储在其他位置至关重要。
归档一个快照
创建快照后,挂载快照并将数据复制到单独的存储中。 您的系统可能会尝试在离线移动时压缩备份映像。 或者,进行块级别的快照镜像拷贝,例如使用以下过程:
umount /dev/vg0/mdb-snap01
dd if=/dev/vg0/mdb-snap01 | gzip > mdb-snap01.gz
上面的命令序列执行以下操作:
确保未安装/dev/vg0/mdb-snap01设备。 切勿采用已挂载的文件系统或文件系统快照的块级副本。
使用dd命令执行整个快照映像的块级副本,并将结果压缩到当前工作目录中的gzip压缩文件中。
重建快照
要还原使用LVM创建的快照,请发出以下命令序列:
lvcreate --size 1G --name mdb-new vg0
gzip -d -c mdb-snap01.gz | dd of=/dev/vg0/mdb-new
mount /dev/vg0/mdb-new /srv/mongodb
以上序列执行以下操作:在/dev/vg0卷组中创建名为mdb-new的新逻辑卷。 新设备的路径为/dev/vg0/mdb-new。
将mdb-snap01.gz解压缩并反归档到mdb-new磁盘映像中。
将mdb-new磁盘映像挂载到/srv/mongodb目录。 根据需要修改挂载点以对应MongoDB数据文件位置或其他位置。
注意:
还原的快照将具有陈旧的mongod.lock文件。 如果不从快照中删除此文件,MongoDB可能会认为过时的锁定文件指示不正常关闭。 如果您在启用storage.journal.enabled的情况下运行,并且不使用db.fsyncLock(),则无需删除mongod.lock文件。 如果使用db.fsyncLock(),则需要删除锁。
从快照中直接重建
要在不写入压缩gz文件的情况下还原备份,请使用以下命令序列:
umount /dev/vg0/mdb-snap01
lvcreate --size 1G --name mdb-new vg0
dd if=/dev/vg0/mdb-snap01 of=/dev/vg0/mdb-new
mount /dev/vg0/mdb-new /srv/mongodb
远程备份存储
您可以使用组合流程和SSH实施系统外备份。
此序列与上述过程相同,只是它使用SSH在远程系统上归档和压缩备份。
请考虑以下过程:
umount /dev/vg0/mdb-snap01
dd if=/dev/vg0/mdb-snap01 | ssh username@example.com gzip > /opt/backup/mdb-snap01.gz
lvcreate --size 1G --name mdb-new vg0
ssh username@example.com gzip -d -c /opt/backup/mdb-snap01.gz | dd of=/dev/vg0/mdb-new
mount /dev/vg0/mdb-new /srv/mongodb
使用 MongoDB工具 备份和重建
本教程描述了使用MongoDB提供的实用程序创建备份和恢复数据的过程。 mongodump和mongorestore实用程序与BSON数据转储一起使用,对于创建小型部署的备份非常有用。 对于弹性和非中断备份,请使用文件系统或块级磁盘快照功能,例如MongoDB备份方法文档中描述的方法。
因为mongodump和mongorestore通过与正在运行的mongod实例进行交互来运行,所以它们会影响正在运行的数据库的性能。 这些工具不仅在运行的数据库实例上产生流量,还强制数据库通过内存读取所有数据。 当MongoDB读取不常使用的数据时,它可以驱逐更频繁访问的数据,从而导致数据库常规工作负载的性能下降。
使用MongoDB工具备份数据时,请考虑以下准则:标记文件,以便您可以识别备份的内容以及备份反映的时间点。
如果mongodump和mongorestore的性能影响对于您的用例是不可接受的,请使用备用备份策略,例如Filesystem Snapshots或MongoDB Cloud Manager。
使用--oplog在mongodump操作期间捕获传入的写入操作,以确保备份反映一致的数据状态。
通过将备份还原到测试MongoDB环境,确保备份可用
二进制BSON dump
mongorestore和mongodump实用程序与BSON数据转储一起使用,对于创建小型部署的备份非常有用。 对于弹性和非中断备份,请使用文件系统或块级磁盘快照功能
如果其他备份方法(如MongoDB Cloud Manager或文件系统快照)不可用,请使用这些工具进行备份。
过程
使用mongodump 备份数据库
排除local 数据库
mongodump在其输出中排除本地数据库的内容。
访问需求
要针对启用了访问控制的MongoDB部署运行mongodump,您必须具有为每个要备份的数据库授予查找操作的权限。 内置backup角色提供执行任何和所有数据库备份所需的权限。
在3.2.1版中更改:backup角色提供了备份使用数据库分析运行时存在的system.profile集合的其他权限。 以前,用户需要对此集合的读访问。
基于mongodump 操作
mongodump实用程序通过连接到正在运行的mongod或mongos实例来备份数据。
该实用程序可以为整个服务器,数据库或集合创建备份,也可以使用查询仅备份集合的一部分。
在没有任何参数的情况下运行mongodump时,该命令将连接到端口27017上本地系统上的MongoDB实例(例如localhost),并在当前目录中创建名为dump/的数据库备份。
要从在同一台计算机上运行的mongod或mongos实例以及默认端口27017上备份数据,请使用以下命令:
mongodump
mongodump从2.2或更高版本使用的数据格式与早期版本的mongod不兼容。 请勿使用最新版本的mongodump来备份旧数据存储。
您还可以指定mongodump应连接到的MongoDB实例的--host和--port。 例如:
mongodump --host http://mongodb.example.net --port 27017
mongodump将写入BSON文件,其中包含可通过监听http://mongodb.example.net主机端口27017的mongod访问的数据副本。
要指定其他输出目录,可以使用--out或-o选项:
mongodump --out /data/backup/
要限制数据库转储中包含的数据量,可以指定--db和--collection作为mongodump的选项。 例如:
mongodump --collection myCollection --db test
此操作从当前工作目录的dump/子目录中的test数据库创建名为myCollection的集合的转储。
如果输出文件存在于备份数据目录中,mongodump将覆盖它们。 在多次运行mongodump命令之前,要么确保不再需要输出文件夹中的文件(默认为dump/目录),要么重命名文件夹或文件。
使用Oplogs的基于时间点的操作
将--oplog选项与mongodump一起使用以收集oplog条目,以构建副本集中数据库的时间点快照。 使用--oplog,mongodump会复制源数据库中的所有数据以及从备份过程开始到结束的所有oplog条目。 此操作与mongorestore --oplogReplay一起使用,可以还原一个备份,该备份反映了与mongodump完成创建转储文件时相对应的特定时刻。
从非本地mongod实例创建备份
mongodump的--host和--port选项允许您连接到远程主机并从远程主机备份。 请考虑以下示例:
mongodump --host mongodb1.example.net --port 3017 --username user --password "pass" --out /opt/backup/mongodump-2013-10-24
在任何mongodump命令上,您可以如上所述指定用户名和密码凭据以指定数据库身份验证。
使用mongorestore 重建数据库
基于 mongorestore 操作
mongorestore实用程序恢复由mongodump创建的二进制备份。 默认情况下,mongorestore在dump /目录中查找数据库备份。
mongorestore实用程序通过直接连接到正在运行的mongod或mongos来恢复数据。
mongorestore可以还原整个数据库备份或备份的子集。
要使用mongorestore连接到活动的mongod或mongos,请使用具有以下原型形式的命令:
mongorestore --port
考虑下列例子:
mongorestore dump-2013-10-25/
这里,mongorestore将dump-2013-10-25目录中的数据库备份导入到默认端口27017上localhost接口上运行的mongod实例。
恢复时间点Oplog备份
如果使用--oplog选项创建数据库转储以确保时间点快照,请使用--oplogReplay选项调用mongorestore,如以下示例所示:
mongorestore --oplogReplay
您还可以考虑使用mongorestore --objcheck选项在对象插入数据库时检查对象的完整性,或者您可以考虑使用mongorestore --drop选项从备份恢复之前从数据库中删除每个集合。
将备份还原到非本地mongod实例
默认情况下,mongorestore连接到在localhost接口和默认端口(27017)上运行的MongoDB实例。 如果要还原到其他主机或端口,请使用--host和--port选项。
请考虑以下示例:
mongorestore --host mongodb1.example.net --port 3017 --username user --password 'pass' /opt/backup/mongodump-2013-10-24
如上所述,如果您的mongod需要身份验证,您可以指定用户名和密码连接。
从MongoDB 备份中重建副本集
您还可以使用mongorestore使用mongodump创建的数据来恢复数据库文件。 有关详细信息,请参阅使用MongoDB工具备份和还原。
重建数据库到单个节点副本集
1.获取备份MongoDB数据库文件。
2.删除local数据库,如果其存在于备份中。
如果要从文件系统备份(或使用本地数据库的任何备份)进行还原,请删除local数据库。
使用备份中的数据文件作为数据路径启动独立的mongod
mongod --dbpath /data/db
删除local数据库
连接到mongod 实例的mongo shell 删除local 数据库
use local
db.dropDatabase()
3.启动单节点副本集
将mongod实例作为新的单节点副本集启动。 使用--dbpath选项指定备份数据文件的路径,使用--replSet选项指定副本集名称。 对于配置服务器副本集(CSRS),请包含--configsvr选项。 包括适合您的部署的任何其他选项。
注意:
从MongoDB 3.6开始,如果您的副本集成员在不同的主机上运行,或者您希望远程客户端连接到您的实例,则必须指定net.bindIp设置(或--bind_ip)。
mongod --dbpath /data/db --replSet
注意:
版本3.6中的新功能:
默认情况下,所有MongoDB集合都具有UUID。 当MongoDB恢复集合时,恢复的集合将保留其原始UUID。 在还原没有UUID的集合时,MongoDB会为还原的集合生成UUID。
4.连接到mongod实例的mongo shell
mongo
5.初始化新副本集
在副本集的一个且仅一个成员上使用rs.initiate():
rs.initiate( {
_id : ,
members: [ { _id : 0, host : } ]
})
MongoDB启动一个由当前成员组成的集合,该集合使用默认的副本集配置。
增加成员到副本集
MongoDB提供了两个用于还原副本集的辅助成员的选项:
手动将数据库文件复制到每个数据目录。
允许initial sync自动分发数据。
注意:
如果您的数据库很大,初始同步可能需要很长时间才能完成。 对于大型数据库,最好将数据库文件复制到每个主机上。
拷贝数据库文件和重启mongod 实例
1.关闭你重建的mongod 实例
使用 --shutdown 或者 db.shutdownServer() 来确保干净的关闭
2.将主数据目录复制到每个辅助节点
将主数据目录复制到副本集的其他成员的dbPath中。 dbPath默认为/data/db。
3.启用你重建的mongod 实例
4.增加辅助节点到副本集
在连接到主服务器的mongo shell中,使用rs.add()将辅助服务器添加到副本集。
使用 Initial Sync 更新辅助节点
1.清空每个预期副本集成员的数据目录
例如,如果副本集成员具有storage.dbPath或 --dbpath为/data/db,则必须确保该目录存在且为空。
2.启动副本集成员
3.将每个预期成员添加到副本集
使用mongo shell连接到主服务器,并使用rs.add()将每个辅助服务器添加到副本集。
将成员添加到副本集时,Initial Sync会将数据从主成员复制到新成员。