ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MongoDB 数据备份与恢复

2020-08-20 20:00:18  阅读:379  来源: 互联网

标签:mongo -- MongoDB PRIMARY 数据备份 dba redis03 恢复 oplog


MongoDB 备份与恢复数据

备份恢复工具

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

导出工具 mongoexport

# 备份成 json 格式
[mongo@redis03 ~]$ mongoexport --port 27017 -d database -c table -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:指明导出数据的过滤条件

恢复工具 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:指明要导入那些列

生产案例:MySQL 数据迁移至 MongoDB

配置 MySQL 数据库

# 开启安全路径
[root@redis04 ~]# vim /etc/my.cnf

[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
# 为了使用 outfile 命令选项
secure-file-priv=/tmp

# 重启数据库
[root@redis04 ~]# systemctl restart mysql

导出 csv 格式文件

mysql> select * from world.city into outfile '/tmp/city1.csv' fields terminated by ',';

查看生成文件

[root@redis04 ~]# cat /tmp/city1.csv

手动处理文件

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

导入 MongoDB

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

验证数据

[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

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

模拟故障过程

每天凌晨 1 点进行全备

10 点进行误操作,删除了数据

恢复数据

模拟全备数据

# 连接副本集的主库(只有在副本集模式才能使用 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 }

执行全备

[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

模拟增量数据

[mongo@redis03 ~]$ mongo 10.0.0.121: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")
    ]
}

删除数据

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

Oplog 日志(类似 MySQL binlog)

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

查找删除动作的时间点

# 连接mongodb
[mongo@redis03 ~]$ mongo 10.0.0.121: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"
    }
}

1590690412

备份最新的 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 1380121 May 29 00:56 oplog.rs.bson
-rw-rw-r-- 1 mongo mongo    125 May 29 00:56 oplog.rs.metadata.json

把最新的 Oplog 替换全备的 Oplog

[mongo@redis03 ~]$ mv /data/local/oplog.rs.bson /data/oplog.bson

恢复数据

[mongo@redis03 data]$ rm -rf /data/local

[mongo@redis03 data]$ mongorestore --port 28018 --oplogReplay --oplogLimit "1590690412:1" --drop /data/

查看数据

[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()

MongoDB 升级

# 1.首先确保是副本集状态
# 2.先关闭1个副本节点
# 3.检测数据是否可以升级
# 4.升级副本节点的可执行文件
# 5.更新配置文件
# 6.启动升级后的副本节点
# 7.确保集群工作正常
# 8.滚动升级其他副本节点
# 9.最后主节点降级
# 10.确保集群 可用
# 11.关闭降级的老的主节点
# 12.升级老的主节点
# 13.重新加入集群

标签:mongo,--,MongoDB,PRIMARY,数据备份,dba,redis03,恢复,oplog
来源: https://www.cnblogs.com/zzzwqh/p/13537545.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有