# mongodb 监控和数据备份恢复


<!--more-->


仅作了解即可.....

## 1. mongodb监控

### 1.1 mongodb ops manager简介

MongoDB Ops Manager(MMS)是用于监控和备份MongoDB的基础设施服务。MongoDB OPS Manager是一个Web应用程序，它需要1个mongodb数据库，这个数据库是用来支持本身的MongoDB OPS Manager来运行的。因此，如果我们想要MongoDB OPS Manager运行起来，最少也需要安装一个MongoDB数据库。

### 1.2 ops manager作用

- 简易的自动化数据库部署、扩展、升级和任务管理；
- 通过OPS平台提供的超过100项仪表、图表，可以对mongodb进行多种监控；
- 支持单节点、分片集群的备份和恢复；

### 1.3 安装 ops manager

- 下载ops manager

  ```https
  https://docs.opsmanager.mongodb.com/current/installation/
  
  https://downloads.mongodb.com/on-prem-mms/tar/mongodb-mms-4.4.21.100.20220217T0528Z-1.x86_64.tar.gz
  ```

- 解压

  ```
  tar -zxvf .....tar.gz
  ```

- 编辑配置文件

  ```
  vim conf-mms.properties  #根据自己的mongodb进行配置
  
  vim mms.conf # 改改端口,内存等
  ```

- 配置完成,启动ops manager

  `./bin/mongodb-mmsstart `

- 访问OPSManager的首页,进行相应配置

  http://ip:port

### 1.4 配置ops manager

- 登录界面
- 注册账号
- 使用创建的用户登录,进入到配置页面
- 按要求填写相应字段即可

### 1.5 配置ops manager agent

- 点击界面中 Manage your existing deployment

- Install agent

  根据我们目标数据库的操作系统，我们可以选择相应的Agent来安装。（PS：实际的操作系统版本可能更多，大致上一致即可，只要能装上）

- 根据提示安装即可

### 1.6 监控现有的sharding cluster服务

- 确保shard集群已启动
- 在安装好的agent界面继续
- 配置监控服务,单机/集群都可以
- 根据提示操作即可
- 查看监控页面

## 2. mongodb数据备份与恢复

### 2.1 备份的目的

- 防止硬件故障引起的数据丢失 

- 防止人为错误误删数据 

* 时间回溯 

- 监管要求

### 2.2 备份机制实现方式

- 全备份

  ```
  * 文件系统快照 
  * 复制数据文件 
  * mongodump
  ```

- 解决方案

  ![示意图](https://img.zhaojq.top/20260727091723416.png "示意图")

### 2.3 mongodump

在MongoDB中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中。mongodump命令可以通过参数指定导出的数据库或者集合。

```
mongodump -h dbhost -d dbname -o dbdirectory
```

mongodump 命令可选参数列表如下所示：![示意图](https://img.zhaojq.top/20260727091723598.png "示意图")

### 2.4 mongorestore

mongodb使用 mongorestore 命令来恢复备份的数据。

```
>mongorestore -h <hostname><:port> -d dbname <path>

--db 或者 -d :需要恢复的数据库实例,例如：test，当然这个名称也可以和备份时候的不一样，比如test2
--drop：恢复的时候，先删除当前数据，然后恢复备份的数据。就是说，恢复后，备份后添加修改的数据都
会被删除，慎用哦！
mongorestore 最后的一个参数，设置备份数据所在位置，例如：/root/bdatas/lg,你不能同时指定 和 --dir 选项，
--dir也可以设置备份目录
```

### 2.5 备份和恢复的重要选项

mongodump有一个值得一提的选项是 **--oplog**，注意这是replica set或者master/slave模式专用，standalone模式运行mongodb并不推荐

mongodump的选项：

- --oplog选项只对全库导出有效，所以不能指定-d选项

- --oplog的作用：oplog的幂等性：已存在的数据，重做oplog不会重复；不存在的数据重做oplog就可以进入数据库。

看mongorestore的选项:

- --oplogReplay：可以重放oplog.bson中的操作内容

- --oplogLimit：回放的时间节点，即此时间之前的数据恢复，假设你后面有误操作，误操作的不恢复

> mongorestore -h localhost:37017 --oplogReplay  /root/dump
>
> 通过 oplog 查询误操作的最后时间
>
> /root/mongodb/bin/bsondump  oplog.rs.bson | grep ""op":"d"" | head
>
> 或者 使用
>
> db.oplog.rs.fifind({"op" : "d"}).sort({"ts":-1})
>
> 举例:
>
> mongorestore -h localhost:37017 --oplogReplay --oplogLimit "1443024507:1" /root/dump/local

### 2.6 全量+增量备份

例

- 插入两条数据

  ```
  use lg 
  db.lg_resume.insert({name:"test1",salary:18000.5}) 
  db.lg_resume.insert({name:"test2",salary:15000.5})
  ```

- 全量备份

  ```
  ./bin/mongodump --host=192.168.211.136 --port=37017 --out=/root/fullbackup
  ```

- 继续插入

  ...

- 增量备份 

  ```
  ./bin/mongodump --host=192.168.211.136 --port=37017 -d local -c oplog.rs - o=/root/oplog_bak
  ```

- 删除所有数据

- 先恢复全量数据

  ```sh
  ./bin/mongorestore --host=192.168.211.136 --port=37017 --dir=/root/fullbackup
  # 查看数据恢复 
  db.lg_resume.find()
  ```

- 恢复数据到指定的时间点

  ```sh
  #改变oplog.rs.bson 为 oplog.bson 删除oplog.rs.metadata.bson
   mv /root/oplog_bak/local/oplog.rs.bson /root/oplog_bak/local/oplog.bson
   rm /root/oplog_bak/local/oplog.rs.metadata.json -rf
   
  # 找出第一次更新的时间 
  use local db.oplog.rs.find({"op" : "u"}).sort({"ts":1}) 
  # 恢复到指定的时间点的数据 
  ./bin/mongorestore --host=192.168.211.136 --port=37017 --oplogReplay -- oplogLimit "1606651336" /root/oplog_bak/local  
  ./bin/mongorestore --host=192.168.211.136 --port=37017 --oplogReplay -- oplogLimit "1606651336:4" /root/oplog_bak/local 
  
  #查看数据恢复 
  use lg 
  db.lg_resume.find()
  ```

- 恢复所有增量数据

  ```sh
  ./bin/mongorestore --host=192.168.211.136 --port=37017 --oplogReplay /root/oplog_bak/local 
  
  # 查看数据恢复 
  db.lg_resume.find()
  ```

### 2.7 定时备份 

- 准备备份目录

  ```sh
  # 自已定义,如
  mkdir -p /root/backup/mongod_bak/mongod_bak_now 
  /root/backup/mongod_bak/mongod_bak_list
  ```

- 编写备份脚本

  shell 脚本

  ```shell
  #!/bin/sh 
  # dump 命令执行路径，根据mongodb安装路径而定 
  DUMP=/root/mongodb/bin/mongodump 
  # 临时备份路径 
  OUT_DIR=/root/backup/mongod_bak/mongod_bak_now 
  # 压缩后的备份存放路径 
  TAR_DIR=/root/backup/mongod_bak/mongod_bak_list 
  # 当前系统时间 
  DATE=`date +%Y_%m_%d%H%M%S` 
  # 数据库账号 
  #DB_USER=user 
  # 数据库密码 
  #DB_PASS=password 
  # 代表删除7天前的备份，即只保留近 7 天的备份 
  DAYS=7 
  # 最终保存的数据库备份文件 
  TAR_BAK="mongod_bak_$DATE.tar.gz" 
  cd $OUT_DIR 
  rm -rf $OUT_DIR/* 
  mkdir -p $OUT_DIR/$DATE 
  $DUMP -h 127.0.0.1 --port 37017 -o $OUT_DIR/$DATE 
  # 压缩格式为 .tar.gz 格式 
  tar -zPcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE
  # 删除 7 天前的备份文件 
  find $TAR_DIR/ -mtime +$DAYS -delete 
  exit
  ```

- 修改脚本权限

  ```sh
  chmod +x /root/backup/mongobk.sh
  ```

- 添加到crontab

  ```sh
  crontab -e
  
  #表示每天凌晨2点30执行备份 
  30 2 * * * /root/backup/mongobk.sh
  ```

- 查看crontab状态

  ```sh
  service crond status
  ```

- 查看定时任务和删除定时任务

  ```sh
  crontab -l 
  crontab -r 
  crontab -e
  ```

  






