• 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.重新加入集群
    
  • 相关阅读:
    hdu 5115 区间dp ***
    CF 149D Coloring Brackets 区间dp ****
    区间dp总结
    hdu 5284 BestCoder Round #48 ($) 1001 水题 *
    vijos 1038 括号+路径 ***
    vijos 1037 ***
    vijos 1028 LIS *
    使用alpine 构建 golang 运行容器
    Go Http包解析:为什么需要response.Body.Close()
    如果open的file不close , 会有什么样的影响
  • 原文地址:https://www.cnblogs.com/tcy1/p/13542346.html
Copyright © 2020-2023  润新知