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.rhkb.cn/news/7654.html

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

相关文章

StarRocks BE源码编译、CLion高亮跳转方法

阅读SR BE源码时&#xff0c;很多类的引用位置爆红找不到&#xff0c;或无法跳转过去&#xff0c;而自己的Linux机器往往缺乏各种C依赖库&#xff0c;配置安装比较麻烦&#xff0c;因此总体的思路是通过CLion远程连接SR社区已经安装完各种依赖库的Docker容器&#xff0c;进行编…

[RoarCTF 2019]Easy Calc1

题目 查看页面源代码 <script>$(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#content").val()),type:GET,success:function(data){$("#result").html(<div class"alert alert-success">…

C++异常处理

目录 一、C语言的异常处理方式 二、C异常处理基本概念 三、异常处理的使用 1.异常抛出和捕获的匹配原则 2.异常的重新抛出 3.不建议抛出异常的情况 4.抛出异常规范 四、抛出派生类对象&#xff0c;使用基类捕获 一、C语言的异常处理方式 C语言对于异常处理方式通常为直…

VScode 开发 Springboot 程序

1. 通过maven创建springboot程序 输入 mvn archetype:generate 选择模板&#xff0c;一般默认选择为第 7 种方式&#xff1b; 选择之后&#xff0c;一般要你填写如下内容&#xff1a; groupId: 组织名称&#xff1b;artifactId: 项目名称&#xff1b;version: 版本&#xff0…

12Express简易实战项目(编写api)

12Express简易实战项目 1.初始化1.1 创建项目1.2 配置 cors 跨域1.3配置解析表单数据的中间件1.4 初始化路由相关的文件夹1.5 初始化用户路由模块1.6 抽离用户路由模块中的处理函数 2.登录注册2.1 新建 ev_users 表2.2 安装并配置 mysql 模块2.3 注册(1)实现步骤(2)检测表单数据…

Windows系统Tai时长统计工具的使用体验

Windows系统Tai时长统计工具的使用体验 一、Tai介绍1.1 Tai简介1.2 安装环境要求 二、下载及安装Tai2.1 下载Tai2.2 运行Tai工具 三、Tai的使用体验3.1 系统设置3.2 时长统计3.3 分类管理 四、总结 一、Tai介绍 1.1 Tai简介 Tai是一款专为Windows系统设计的开源软件&#xff…

数据结构——二叉树——堆(1)

今天&#xff0c;我们来写一篇关于数据结构的二叉树的知识。 在学习真正的二叉树之前&#xff0c;我们必不可少的先了解一下二叉树的相关概念。 一&#xff1a;树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层…

Vue入门(Vue基本语法、axios、组件、事件分发)

Vue入门 Vue概述 Vue (读音/vju/&#xff0c;类似于view)是一套用于构建用户界面的渐进式框架&#xff0c;发布于2014年2月。与其它大型框架不同的是&#xff0c;Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三…

数据结构:二叉树—面试题(二)

1、二叉树的最近公共祖先 习题链接https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/ 描述&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点…

使用python-docx包进行多文件word文字、字符批量替换

1、首先下载pycharm。 2、改为中文。 3、安装python-docx包。 搜索包名字&#xff0c;安装。 4、新建py文件&#xff0c;写程序。 from docx import Documentdef replace1(array1):# 替换词典&#xff08;标签值按实际情况修改&#xff09;dic {替换词1: array1[0], 替换…

[操作系统] 进程地址空间管理

虚拟地址空间的初始化 缺页中断 缺页中断的概念 缺页中断&#xff08;Page Fault Interrupt&#xff09; 是指当程序访问的虚拟地址在页表中不存在有效映射&#xff08;即该页未加载到内存中&#xff09;时&#xff0c;CPU 会发出一个中断信号&#xff0c;请求操作系统加载所…

万字长文总结前端开发知识---JavaScriptVue3Axios

JavaScript学习目录 一、JavaScript1. 引入方式1.1 内部脚本 (Inline Script)1.2 外部脚本 (External Script) 2. 基础语法2.1 声明变量2.2 声明常量2.3 输出信息 3. 数据类型3.1 基本数据类型3.2 模板字符串 4. 函数4.1 具名函数 (Named Function)4.2 匿名函数 (Anonymous Fun…

【Linux】21.基础IO(3)

文章目录 3. 动态库和静态库3.1 静态库与动态库3.2 静态库的制作和使用原理3.3 动态库的制作和使用原理3.3.1 动态库是怎么被加载的 3.4 关于地址 3. 动态库和静态库 3.1 静态库与动态库 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可…

Linux系统之gzip命令的基本使用

Linux系统之gzip命令的基本使用 一、gzip命令简介二、gzip命令使用帮助2.1 help帮助信息2.2 选项解释 三、gzip命令的基本使用3.1 压缩文件3.2 保留原始文件3.3 解压文件3.4 查看压缩信息3.5 标准输出/输入3.6 批量处理文件3.7 递归解压缩目录3.8测试压缩文件完整性 四、注意事…

【Matlab高端绘图SCI绘图模板】第05期 绘制高阶折线图

1.折线图简介 折线图是一个由点和线组成的统计图表&#xff0c;常用来表示数值随连续时间间隔或有序类别的变化。在折线图中&#xff0c;x 轴通常用作连续时间间隔或有序类别&#xff08;比如阶段1&#xff0c;阶段2&#xff0c;阶段3&#xff09;。y 轴用于量化的数据&#x…

免费SSL证书申请,springboot 部署证书

申请免费域名证书,SSL证书(一共有两个有用&#xff0c;一个是私钥private.key 另一个是certificate.crt) 1、打开网址 申请免费域名证书,SSL证书 2、选择生成CSR 3、生成以后点击下一步&#xff08;private key 有用 ) ​​​​​​​ 4、这里选择 Cname域名解析验证 5、…

Java 大视界 -- Java 大数据中的隐私增强技术全景解析(64)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

深度学习项目--基于LSTM的糖尿病预测探究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;一般用于序列数据预测&#xff0c;这个可以很好的挖掘数据上下文信息&#xff0c;本文将使用LSTM进行糖尿病…

js/ts数值计算精度丢失问题及解决方案

文章目录 概念及问题问题分析解决方案方案一方案二方案其它——用成熟的库 概念及问题 js中处理浮点数运算时会出现精度丢失。js中整数和浮点数都属于Number数据类型&#xff0c;所有的数字都是以64位浮点数形式存储&#xff0c;整数也是如此。所以打印x.00这样的浮点数的结果…

vite环境变量处理

环境变量: 会根据当前代码环境产生值的变化的变量就叫做环境变量 代码环境: 开发环境测试环境预发布环境灰度环境生产环境 举例: 百度地图 SDK,小程序的SDK APP_KEY: 测试环境和生产环境还有开发环境是不一样的key 开发环境: 110 生产环境:111 测试环境: 112 我们去请求第三…