【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.重新加入集群
相关推荐
言之。30 分钟前
Django中的软删除
数据库·django·sqlite
阿里嘎多哈基米2 小时前
SQL 层面行转列
数据库·sql·状态模式·mapper·行转列
抠脚学代码2 小时前
Ubuntu Qt x64平台搭建 arm64 编译套件
数据库·qt·ubuntu
jakeswang2 小时前
全解MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析
数据库·mysql
Heliotrope_Sun3 小时前
Redis
数据库·redis·缓存
一成码农3 小时前
MySQL问题7
数据库·mysql
吃饭最爱3 小时前
JUnit技术的核心和用法
数据库·oracle·sqlserver
专注API从业者3 小时前
Python/Java 代码示例:手把手教程调用 1688 API 获取商品详情实时数据
java·linux·数据库·python
雨落Liy3 小时前
SQL 函数从入门到精通:原理、类型、窗口函数与实战指南
数据库·sql
Kt&Rs4 小时前
MySQL复制技术的发展历程
数据库·mysql