参考官方文档:

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会将数据从主成员复制到新成员。