【mongodb】mongodb数据备份与恢复

本站以分享各种运维经验和运维所需要的技能为主

《python零基础入门》:python零基础入门学习

《python运维脚本》: python运维脚本实践

《shell》:shell学习

《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战

《k8》暂未更新

《docker学习》暂未更新

《ceph学习》ceph日常问题解决分享

《日志收集》ELK+各种中间件

《运维日常》运维日常

《linux》运维面试100问

《DBA》db的介绍使用(mysql、redis、mongodb...)

Mongodb 数据备份与恢复

一、备份与恢复数据

1.备份恢复工具

复制代码
1.mongoexport/mongoimport       #数据分析时使用
2.mongodump/mongorestore        #单纯备份时使用

2.导出工具mongoexport

复制代码
#备份成json格式
[mongo@redis03 ~]$ mongoexport --port 28018 -d test -c testtable -o ~/table.json
​
[mongo@redis03 ~]$ mongoexport -uadmin -p123456 --port 27017 --authenticationDatabase admin -d database -c table -o ~/table.json
​
#备份成csv格式
[mongo@redis03 ~]$ mongoexport --port 27017 -d database -c table --type=csv -f name,age -o ~/table.csv
​
[mongo@redis03 ~]$ mongoexport -uadmin -p123456 --port 27017 --authenticationDatabase admin -d database -c table --type=csv -f name,age -o ~/table.csv
​
​
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明集合的名字
-f:指明要导出那些列
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
--type:指明导出数据的类型

3.恢复工具mongoimport

复制代码
#删除集合
> use database
switched to db database
> show tables
table
> db.table.drop()
true
​
#恢复数据
[mongo@redis03 ~]$ mongoimport --port 27017 -d database -c table ~/table.json
​
[mongo@redis03 ~]$ mongoimport --port 27017 -d database -c table --type=csv --headerline --file ~/table.csv
​
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明集合的名字
-f:指明要导入那些列

4.生产案例:MySQL数据迁移至mongodb

1)搭建数据库

2)导入数据

3)配置数据库

复制代码
#开启安全路径
[root@redis04 ~]# vim /etc/my.cnf
​
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
secure-file-priv=/tmp
​
#重启数据库
[root@redis04 ~]# systemctl restart mysql

4)将数据库导出成csv

复制代码
#使用第三方工具导出csv表格
mysql> select * from world.city into outfile '/tmp/city1.csv' fields terminated by ',';

5)查看文件

复制代码
[root@redis04 ~]# cat /tmp/city1.csv

6)手动处理文件

复制代码
#将数据库字段加到文件的第一行
[root@redis04 ~]# vim /tmp/city.csv
ID,Name,CountryCode,District,Population
1,Kabul,AFG,Kabol,1780000
2,Qandahar,AFG,Qandahar,237500

7)将数据导入mongodb

复制代码
[root@redis04 ~]# scp /tmp/city1.csv 172.16.1.93:/tmp/
​
[mongo@redis03 ~]$ mongoimport -uadmin -p123456 --port 27017 --authenticationDatabase admin -d world -c city --type=csv --headerline --file /tmp/city1.csv

8)查看数据

复制代码
[mongo@redis03 ~]$ mongo -uadmin -p123456 --authenticationDatabase admin
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
read    0.000GB
world   0.000GB
write   0.000GB
> use world
switched to db world
> show tables
city
> db.city.find()
......
> it

5.生产案例:数据误删除恢复

1)过程

复制代码
每天凌晨1点进行全备
10点进行误操作,删除了数据
恢复数据

2)模拟全备数据

复制代码
#连接副本集的主库(只有在副本集模式才能使用mongodump)
[mongo@redis03 ~]$ mongo localhost:28018
dba:PRIMARY> use backup
dba:PRIMARY> db.backuptable.insertMany([{id:1},{id:2},{id:3}])
{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("5ecfe698e99e372e2e4fe1fd"),
        ObjectId("5ecfe698e99e372e2e4fe1fe"),
        ObjectId("5ecfe698e99e372e2e4fe1ff")
    ]
}
dba:PRIMARY> db.backuptable.find()
{ "_id" : ObjectId("5ecfe698e99e372e2e4fe1fd"), "id" : 1 }
{ "_id" : ObjectId("5ecfe698e99e372e2e4fe1fe"), "id" : 2 }
{ "_id" : ObjectId("5ecfe698e99e372e2e4fe1ff"), "id" : 3 }

3)执行全备

复制代码
[mongo@redis03 ~]$ mongodump --port 28018 --oplog -o /data

[mongo@redis03 ~]$ ll /data/oplog.bson 
-rw-rw-r-- 1 mongo mongo 110 May 29 02:01 /data/oplog.bson

4)模拟增量数据

复制代码
[mongo@redis03 ~]$ mongo 10.0.0.93:28018
dba:PRIMARY> use backup
switched to db backup
dba:PRIMARY> db.backuptable.insertMany([{id:4},{id:5},{id:6}])
{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("5ecfe86f5c1085fcf692a3cb"),
        ObjectId("5ecfe86f5c1085fcf692a3cc"),
        ObjectId("5ecfe86f5c1085fcf692a3cd")
    ]
}

5)删除数据

复制代码
dba:PRIMARY> use backup
switched to db backup
dba:PRIMARY> db.backuptable.drop()
true
dba:PRIMARY> show tables

7)oplog

复制代码
oplog是local库下的一个固定集合,从库就是通过查看主库的oplog这个集合来进行复制的。每个节点都有oplog,记录这从主节点复制过来的信息,这样每个成员都可以保证切换主库时的数据同步

6)查找删除动作的时间点

复制代码
#连接mongodb
[mongo@redis03 ~]$ mongo 10.0.0.93:28018
#切换到local库
dba:PRIMARY> use local
#查看oplog信息
dba:PRIMARY> db.oplog.rs.find()
dba:PRIMARY> db.oplog.rs.find().pretty()
{   
    #同步的时间点,选举时会选择最新的时间戳提升为主库
    "ts" : Timestamp(1590640219, 1),
    "t" : NumberLong(1),
    "h" : NumberLong("-8962736529514397515"),
    "v" : 2,
    #操作类型 i代表insert u代表update d代表delete n代表没有操作只是保持连接发送消息
    "op" : "n",
    #当前数据库的库、表
    "ns" : "",
    "wall" : ISODate("2020-05-28T04:30:19.080Z"),
    #操作的内容
    "o" : {
        "msg" : "periodic noop"
    }
}

#oplog信息
dba:PRIMARY> rs.printReplicationInfo()
configured oplog size:   1024MB                                 #oplog文件大小
log length start to end: 1543secs (0.43hrs)                     #oplog日志的启用时间段
oplog first event time:  Wed May 27 2020 23:26:46 GMT+0800 (CST)    #第一个事务日志的产生时间
oplog last event time:   Wed May 27 2020 23:52:29 GMT+0800 (CST)    #最后一个事务日志的产生时间
now:                     Wed May 27 2020 23:52:38 GMT+0800 (CST)    #现在的时间

#查找到删除的时间点
dba:PRIMARY> db.oplog.rs.find({ns:"backup.$cmd"}).pretty()
{
    "ts" : Timestamp(1590683811, 1),
    "t" : NumberLong(2),
    "h" : NumberLong("3968458855036608631"),
    "v" : 2,
    "op" : "c",
    "ns" : "backup.$cmd",
    "ui" : UUID("bec471f5-cd2a-44fe-8056-4c5c2de5de03"),
    "wall" : ISODate("2020-05-28T16:36:51.227Z"),
    "o" : {
        "drop" : "backuptable"
    }
}

1590683811

7)备份最新的oplog

复制代码
[mongo@redis03 ~]$ mongodump --port 28018 -d local -c oplog.rs -o /data/

[mongo@redis03 ~]$ ll /data/local/
total 140
-rw-rw-r-- 1 mongo mongo 138093 May 29 00:56 oplog.rs.bson
-rw-rw-r-- 1 mongo mongo    125 May 29 00:56 oplog.rs.metadata.json

8)把原来的全备备份

复制代码
[mongo@redis03 data]$ mv oplog.bson oplog.bson.bak
[mongo@redis03 ~]$ mv /data/local/oplog.rs.bson /data/oplog.bson

9)恢复数据

复制代码
#删掉新备份的库数据,否则会覆盖
[mongo@redis03 data]$ rm -rf /data/local
#恢复到指定时间点的数据
[mongo@redis03 data]$ mongorestore --port 28018 --oplogReplay --oplogLimit "1590690412:1" --drop /data/

10)查看数据

复制代码
[mongo@redis03 ~]$ mongo localhost:28018
dba:PRIMARY> show databases
dba:PRIMARY> use backup
switched to db backup
dba:PRIMARY> show tables;
dba:PRIMARY> db.backuptable.find()

6.mongo升级

复制代码
1.首先确保是副本集状态
2.先关闭1个副本节点
3.检测数据是否可以升级
4.升级副本节点的可执行文件
5.更新配置文件
6.启动升级后的副本节点
7.确保集群工作正常
8.滚动升级其他副本节点
9.最后主节点降级
10.确保集群 可用
11.关闭降级的老的主节点
12.升级老的主节点
13.重新加入集群
相关推荐
Data analyse45612 分钟前
Session超时与浏览器休眠的计时校验
大数据·前端·数据库·数据分析
NineData14 分钟前
Oracle 实时同步到 Doris 怎么做?全量迁移、CDC 增量复制与数据校验指南
数据库·oracle
码流子35 分钟前
高速场景视频接入:GB/T 28181 级联与 RTSP 取流,一条链路讲清楚
大数据·数据库·人工智能·物联网·音视频
m0_7520356341 分钟前
Redis 数据结构总结
数据结构·数据库·redis
iCxhust1 小时前
51单片机电力载波应用开发(九)51产品化
c语言·数据库·嵌入式硬件·mysql·51单片机·软件工程·c51
tryxr1 小时前
如何分析一个慢sql
数据库·sql·mysql·慢sql
泡海椒1 小时前
JQuickExcel 大文件排障与调优:从实际路径定位 OOM、临时盘和慢任务
开发语言·数据库·缓存·oracle·excel
java_logo2 小时前
Docker 部署 MariaDB:轻松搭建开源关系型数据库
数据库·docker·容器·开源·mariadb·轩辕镜像·docker部署教程
tryxr2 小时前
什么情况下索引会失效
数据库·mysql·索引失效·索引
guo_wen_qiang2 小时前
redis持久化
数据库·redis·分布式