MongoDB 备份与恢复综述

目录

一、基本概述

二、逻辑备份

1、全量备份

2、增量备份

3、恢复

三、物理备份

1、cp/tar/fsync

2、WiredTiger 热备份

3、恢复

四、快照备份


一、基本概述

        MongoDB 是一种流行的 NoSQL 数据库,它使用文档存储数据,支持丰富的查询语言和索引功能。MongoDB 的设计目标是提供高性能、高可用性和易扩展性,广泛应用于各种类型的应用程序中。然而,任何数据库系统都有可能面临数据丢失的风险,因此备份是确保数据安全和可恢复性的重要手段。

        备份的重要性不言而喻,它不仅可以保护数据免受硬件故障、软件错误或人为操作失误的影响,还可以在灾难发生时快速恢复业务运营。对于 MongoDB 来说,备份尤其重要,因为它通常用于处理大量数据和高并发访问,一旦出现问题,可能会导致严重的业务中断和数据丢失。

        关于 Mongodb 数据库备份,可从逻辑备份、物理备份和快照备份三个方面进行介绍。

Database Layermongodump逻辑备份
File System Layercp/tar、fsync物理备份
Volume/Block Layerlvm snapshot、第三方快照驱动快照备份

(1)逻辑备份是通过导出数据库中的数据到一个文件或一组文件中来实现的。在 MongoDB 中,可以使用 mongodump 工具来进行逻辑备份。mongodump 会将数据库中的每个集合导出为一个 BSON 文件,同时还会生成一个元数据文件,记录集合的名称和其他信息。

        逻辑备份的优点是可以跨平台使用,并且可以很容易地恢复到不同的 MongoDB 实例上。缺点是备份过程可能会影响数据库的性能,并且在大型数据集上可能需要较长的时间来完成备份,恢复时速度很慢,特别是回放 oplog 时,速度~非常~非常~非常~慢。

(2)物理备份则是直接复制数据库的文件系统,包括数据文件、日志文件和配置文件等。在 MongoDB 中,可直接拷贝文件系统内数据文件来实现物理备份的,但是不支持热备份。有第三方厂商基于 MongoDB 存储引擎 WiredTiger 原生热备份进行定制,支持热备份。

        物理备份的优点是速度快,因为它不需要遍历整个数据库来导出数据,而是直接复制文件。此外,物理备份通常可以在数据库运行时进行,对性能的影响较小。缺点是物理备份可能无法跨平台使用,因为不同操作系统的文件系统格式可能不同。另外,如果数据库在备份过程中发生了变化,那么备份的数据可能不是完全一致的,所以备份过程中需要对数据库加锁,避免数据写入。

(3)快照备份是一种结合了逻辑备份和物理备份特点的方法。它通过创建数据库的快照来实现备份,这个快照包含了数据库在某个时间点的状态。在 MongoDB 中,可以使用 LVM(Logical Volume Manager)或其他存储层的快照功能来实现快照备份。

        快照备份的优点是可以提供几乎实时的备份,因为快照的创建速度非常快。此外,快照备份可以在不中断数据库服务的情况下进行。缺点是快照备份依赖于底层存储系统的支持,不是所有的存储系统都支持快照功能。另外,如果数据库在快照之后发生了更改,那么这些更改不会反映在快照中。

二、逻辑备份

        mongodump 是 mongo 集成的备份与恢复工具,功能也是十分的强大,其与 mongorestore 配合可以完成大多数场景的数据备份。不过在使用之前需要仔细的阅读相关文档,并实际操作测试其功能特性。而且需要注意,随着不同数据库的版本迭代,该工具的一些功能也会随之变化,需要考虑一些参数的兼容性,和 json 版本的迭代。

       使用 mongodump 可以对数据库进行全量备份与增量备份,这个可以在网上搜到很多脚本例子。但其还是存在一些功能缺陷,不过好在其在 github 上开放了源码(golang),用户可以基于其源码根据自己的需求进行修改。

        该方案的一个不可忽略的缺点就是性能太低了,远远不如物理备份。虽然可以备份的时候可以集合为单位进行多进程并发,但对数据库的负载也随之增大。所以很多厂商在做灾备产品时都不会考虑它。

1、全量备份

1. 导出数据库 db1 中的集合 t1 至同目录下的dump文件夹下./mongodump --host 10.10.50.210 -u test -p testpw --authenticationDatabase admin -d db1 -c t12. 导出至指定同目录下自定义的文件夹./mongodump --host 10.10.50.210 -u test -p testpw --authenticationDatabase admin -d db1 -c t1 -o selfdir3。 以集合为单位将备份数据输出到 stdout,实现流式备份./mongodump --host 10.10.50.210 -u test -p testpw --authenticationDatabase admin -d db1 -c t1 -o -

2、增量备份

需要数据库开启 oplog,通过按时间导出 local.oplog.rs 中的 oplog 数据实现增量备份。

可以配合 query 进行数据过滤,比如 时间戳、操作或数据空间的过滤。

./mongodump --host 10.10.50.210 -u test -p testpw --authenticationDatabase admin -d local -c oplog.rs --query '{ts:{$gte:Timestamp(1660014692, 1)}, op:{$ne:"n"}}'

3、恢复

        恢复时需要使用 mongorestore 工具,恢复增量数据时,需要回放 oplog 日志。

# 恢复集合数据
mongorestore --host 10.10.50.210 -u test -p testpw --authenticationDatabase admin ./13-34/db1/t1.bson
# 回放日志
mongorestore --host 127.0.0.1:27017 --oplogReplay --dir deltaBK/ --oplogFile deltaBK/oplog.rs.bson

三、物理备份

        物理备份目前看只支持全量备份。在物理备份期间需要加锁,防止数据库数据写入。

1、cp/tar/fsync

# 1、加锁
db.fsyncLock();
# 2、执行备份操作
cp /usr/local/mongodb/data /backupdir/full
# 3、解锁
db.fsyncUnlock();

2、WiredTiger 热备份

        Mongodb 原生数据库不支持物理热备份,但是 WiredTiger 存储引擎是支持热备份的,但是该存储引擎存在一个问题,在热备份过程中,若有数据写入,磁盘空间会快速增长。MongoDB 的保守做法是不支持热备份。

        很多第三方厂商(例如 Percona MongoDB、阿里云 MongoDB)基于 WiredTiger 存储引擎(开源)热备份进行了定制,直接支持物理热备份。

3、恢复

        恢复时就很简单了,将原生文件拷贝到目标路径下,重新编辑数据库配置文件,重新拉起数据库。

         若灾备环境是副本集群,则需要进行如下设置。

# 副本集群下要调整数据库,删除 local 数据库后重启并初始化副本集群
mongod --dbpath /data/db
rs1:PRIMARY> use local
rs1:PRIMARY> db.dropDatabase()
rs1:PRIMARY> use admin
rs1:PRIMARY> db.shutdownServer({force: true})mongod --dbpath /data/db --replSet <replName>
mongo
# 初始化副本集群
rs.initiate( {_id : <replName>,members: [ { _id : 0, host : <host:port> } ]
})
# 若还需要添加从节点,则继续执行
rs.add( "10.90.9.101 : 27018" )
rs.add( "10.90.9.103 : 27018" )

四、快照备份

        使用快照工具对数据库数据文件所在卷进行快照操作。下面以 LVM Snapshot 为例。除了本博客介绍的流程以外,还可参考官方教程:

使用文件系统Atlas 备份快照备份和恢复自管理部署 - MongoDB手册 v 8.0https://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#back-up-and-restore-using-lvm-on-linuxhttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#back-up-and-restore-using-lvm-on-linuxhttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#back-up-and-restore-using-lvm-on-linuxhttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#back-up-and-restore-using-lvm-on-linuxhttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#back-up-and-restore-using-lvm-on-linux        LVM 快照是 Linux 系统中的一种数据备份技术,用于在特定时间点对逻辑卷进行“瞬间影像”保存。它通过写时复制(COW)技术实现,初始时几乎不占用额外空间,仅记录少量元数据,并与源逻辑卷共享数据块。当源逻辑卷中的数据发生变化时,LVM会将原始数据块的内容复制到快照区域,确保快照始终反映创建时刻的数据状态。这种机制使得快照能够高效利用存储空间,同时保证数据的一致性和可追溯性。在实际应用中,LVM快照常用于数据备份、恢复以及系统测试等场景。     

        关于快照的详细知识点,可以参考之前写的博客。

快照技术的基本介绍-CSDN博客https://blog.csdn.net/qq_37437983/article/details/137657669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ce3dcb6c36e2f15652965d3136d5a96f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=ce3dcb6c36e2f15652965d3136d5a96f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137657669-null-null.nonecase&utm_term=%E5%BF%AB%E7%85%A7&spm=1018.2226.3001.4450https://blog.csdn.net/qq_37437983/article/details/137657669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ce3dcb6c36e2f15652965d3136d5a96f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=ce3dcb6c36e2f15652965d3136d5a96f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137657669-null-null.nonecase&utm_term=%E5%BF%AB%E7%85%A7&spm=1018.2226.3001.4450https://blog.csdn.net/qq_37437983/article/details/137657669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ce3dcb6c36e2f15652965d3136d5a96f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=ce3dcb6c36e2f15652965d3136d5a96f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137657669-null-null.nonecase&utm_term=%E5%BF%AB%E7%85%A7&spm=1018.2226.3001.4450https://blog.csdn.net/qq_37437983/article/details/137657669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ce3dcb6c36e2f15652965d3136d5a96f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=ce3dcb6c36e2f15652965d3136d5a96f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137657669-null-null.nonecase&utm_term=%E5%BF%AB%E7%85%A7&spm=1018.2226.3001.4450https://blog.csdn.net/qq_37437983/article/details/137657669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ce3dcb6c36e2f15652965d3136d5a96f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=ce3dcb6c36e2f15652965d3136d5a96f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137657669-null-null.nonecase&utm_term=%E5%BF%AB%E7%85%A7&spm=1018.2226.3001.4450        我需要备份的数据存放在 /usr/local/mongodb 目录下,需要使用快照对其所在卷进行备份。

        详细步骤如下所示,需要注意,目标目录空间需要充足,需要可以完全存放数据库数据所在卷。做快照时 VG 需要有足够的剩余空间。

# 1、查看挂载目录分布,可执行 df -f 或 mount 命令,数据库数据存放在 /usr/local 下,所以我们需要备份 /dev/mapper/centos-root 卷
[root@localhost ~] df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   50G  6.1G   44G  13% /
devtmpfs                 3.8G     0  3.8G   0% /dev
tmpfs                    3.9G     0  3.9G   0% /dev/shm
tmpfs                    3.9G   13M  3.8G   1% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda1               1014M  170M  845M  17% /boot
/dev/mapper/centos-home   42G   37M   42G   1% /home
tmpfs                    781M   12K  781M   1% /run/user/42
tmpfs                    781M     0  781M   0% /run/user/0# 2、创建数据库数据所在 lv 的快照,该快照随着数据库的写入会持续增长
[root@localhost ~] lvcreate --size 10GB --snapshot --name root-snap01 /dev/mapper/centos-rootLogical volume "root-snap01" created.
# 查看 lv 列表
[root@localhost ~] lvsLV          VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Converthome        centos -wi-ao---- <41.12groot        centos owi-aos---  50.00groot-snap01 centos swi-aos---  10.00g      root   7.76swap        centos -wi-ao----  <7.88g# 3、备份卷数据,快照关联的 lv 卷的全部数据,不是快照数据本身,是快照关联的卷的全部数据,所以备份集占用的空间是该卷的大小
# 可压缩快照数据
[root@localhost ~] dd if=/dev/mapper/centos-root--snap01 | gzip > /home/mongodb_snap01.gz
# 或者 dd 将数据重定向到别的路径下
[root@localhost ~] dd if=/dev/mapper/centos-root--snap01 of=/root/bkdir/mongodb_snap01# 4、查看备份数据
[root@localhost mongo-dir] du -h /root/bkdir/mongodb_snap01
51G     /root/bkdir/mongodb_snap01

        恢复过程可参考官方流程。大致是先在目标机上创建 lv 卷,注意不需要格式化,直接将备份的数据卷文件写入创建的 lv 卷,之后挂载到文件系统中访问,重新配置数据库即可,配置数据库的过程可参考上一章“物理备份”的恢复流程。

使用文件系统Atlas 备份快照备份和恢复自管理部署 - MongoDB手册 v 8.0https://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshothttps://www.mongodb.com/zh-cn/docs/manual/tutorial/backup-with-filesystem-snapshots/#restore-a-snapshot

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5. 马科维茨资产组合模型+AI金融智能体(qwen-max)+政策信息优化方案(理论+Python实战)

目录 0. 承前1. AI金融智能体1.1 What is AI金融智能体1.2 Why is AI金融智能体1.3 How to AI金融智能体 2. 数据要素&计算流程2.1 参数集设置2.2 数据获取&预处理2.3 收益率计算2.4 因子构建与预期收益率计算2.5 协方差矩阵计算2.6 投资组合优化2.7 持仓筛选2.8 AI金融…

后端开发基础——JavaWeb(Servlet)

Servlet 关于系统架构 系统架构包括什么形式&#xff1f; C/S架构 B/S架构 C/S架构&#xff1f; Client / Server&#xff08;客户端 / 服务器&#xff09; C/S架构的软件或者说系统有哪些呢&#xff1f; QQ&#xff08;先去腾讯官网下载一个QQ软件&#xff0c;几十MB&…

Hanlp的学习

参考&#xff1a;HanLP 自然语言处理使用总结-CSDN博客 参考&#xff1a;Sprint Boot 工程中HanLP配置相对路径&#xff0c;始终有问题的解决方案_springboot hanlp-CSDN博客 <!--hanlp 依赖--><dependency><groupId>com.hankcs</groupId><artifa…

LLMs(大型语言模型)的多智能体:Auto-GPT

LLMs(大型语言模型)的多智能体:Auto-GPT 是指在一个系统中集成多个具有不同能力、角色和任务的智能体,这些智能体能够相互协作、沟通和交互,以共同完成复杂的任务或解决复杂的问题。每个智能体都可以被视为一个独立的实体,具有自己的策略、目标和知识库,通过相互之间的…

JSON全解析:语法、转换与FastJson应用指南

大家好&#xff0c;我是袁庭新。JSON是一种轻量级、基于文本、开放式的数据交换格式。在数据交换的世界里&#xff0c;JSON 扮演着重要角色。它究竟为何备受青睐&#xff1f;下面就为您详细解读其奥秘与应用。 1.JSON简述 JSON&#xff08;JavaScript Object Notation&#…

Java模拟路由协议-rip(路由器仿真实验)

前言&#xff1a; 好久不见&#xff0c;有段时间没有写文章了&#xff0c;本篇文章&#xff0c;由Blue我带大家来复现rip协议。我们以 b站湖南教师匠所讲rip的视频中的例子为我这篇文章所模拟的路由路径 如图&#xff1a; 模拟路径 视频&#xff1a;http://【深入浅出计算机网络…

吴恩达深度学习——神经网络介绍

文章内容来自BV11H4y1F7uH&#xff0c;仅为个人学习所用。 文章目录 什么是神经网络引入神经网络神经元激活函数ReLU隐藏单元 用神经网络进行监督学习监督学习与无监督学习举例 什么是神经网络 引入 已经有六个房子的数据集&#xff0c;横轴为房子大小&#xff0c;纵轴为房子…

ChatGPT 摘要,以 ESS 作为你的私有数据存储

作者&#xff1a;来自 Elastic Ryan_Earle 本教程介绍如何设置 Elasticsearch 网络爬虫&#xff0c;将网站索引到 Elasticsearch 中&#xff0c;然后利用 ChatGPT 使用我们的私人数据来总结对其提出的问题。 Python 脚本的 Github Repo&#xff1a;https://github.com/Gunner…

数智化转型 | 星环科技Defensor 助力某银行数据分类分级

在数据驱动的金融时代&#xff0c;数据安全和隐私保护的重要性日益凸显。某银行作为数字化转型的先行者&#xff0c;面临着一项艰巨的任务&#xff1a;如何高效、准确地对分布在多个业务系统、业务库与数仓数湖中的约80万个字段进行数据分类和分级。该银行借助星环科技数据安全…

【JDBC】数据库连接的艺术:深入解析数据库连接池、Apache-DBUtils与BasicDAO

文章目录 前言&#x1f30d; 一.连接池❄️1. 传统获取Conntion问题分析❄️2. 数据库连接池❄️3.连接池之C3P0技术&#x1f341;3.1关键特性&#x1f341;3.2配置选项&#x1f341;3.3使用示例 ❄️4. 连接池之Druid技术&#x1f341; 4.1主要特性&#x1f341; 4.2 配置选项…

Linux Bash 中使用重定向运算符的 5 种方法

注&#xff1a;机翻&#xff0c;未校。 Five ways to use redirect operators in Bash Posted: January 22, 2021 | by Damon Garn Redirect operators are a basic but essential part of working at the Bash command line. See how to safely redirect input and output t…

C语言内存之旅:从静态到动态的跨越

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一 动态内存管理的必要性二 动态…

AI时代:弯道超车的新思维与实践路径

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

【Spring】定义的Bean缺少隐式依赖

问题描述 初学 Spring 时&#xff0c;我们往往不能快速转化思维。例如&#xff0c;在程序开发过程中&#xff0c;有时候&#xff0c;一方面我们把一个类定义成 Bean&#xff0c;同时又觉得这个 Bean 的定义除了加了一些 Spring 注解外&#xff0c;并没有什么不同。所以在后续使…

『 实战项目 』Cloud Backup System - 云备份

文章目录 云备份项目服务端功能服务端功能模块划分客户端功能客户端模块划分 项目条件Jsoncpp第三方库Bundle第三方库httplib第三方库Request类Response类Server类Client类搭建简单服务器搭建简单客户端 服务端工具类实现 - 文件实用工具类服务器配置信息模块实现- 系统配置信息…

网络编程 | UDP组播通信

1、什么是组播 在上一篇博客中&#xff0c;对UDP的广播通信进行了由浅入深的总结梳理&#xff0c;本文继续对UDP的知识体系进行探讨&#xff0c;旨在将UDP的组播通信由浅入深的讲解清楚。 组播是介于单播与广播之间&#xff0c;在一个局域网内&#xff0c;将某些主机添加到组中…

【无标题】微调是迁移学习吗?

是的&#xff0c;微调&#xff08;Fine-Tuning&#xff09;可以被视为一种迁移学习&#xff08;Transfer Learning&#xff09;的形式。迁移学习是一种机器学习方法&#xff0c;其核心思想是利用在一个任务上学到的知识来改进另一个相关任务的性能。微调正是通过在预训练模型的…

【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块

【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块 在本篇文章中&#xff0c;我们将一步步走过如何创建一个简单的 HarmonyOS NAPI 模块。通过这个模块&#xff0c;你将能够更好地理解 NAPI 的工作原理&#xff0c;并在你的应用中开始使用 C 与 JavaScript 的…

【电视盒子】HI3798MV300刷机教程笔记/备份遥控码修复遥控器/ADB/线刷卡刷/电视盒子安装第三方应用软件

心血来潮&#xff0c;看到电视机顶盒满天飞的广告&#xff0c;想改造一下家里的电视盒子&#xff0c;学一下网上的人刷机&#xff0c;但是一切都不知道怎么开始&#xff0c;虽然折腾了一天&#xff0c;以失败告终&#xff0c;还是做点刷机笔记。 0.我的机器 年少不会甄别&…

Python基于OpenCV和PyQt5的人脸识别上课签到系统【附源码】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…