zoukankan      html  css  js  c++  java
  • 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.重新加入集群
    
  • 相关阅读:
    C#
    C#
    ssh学习笔记
    (已解决)Could not open '/var/lib/nova/mnt/*/volume-*': Permission denied
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    如何在linux下安装idea
    The system has no LUN copy license
    调整mysql数据库最大连接数
    mysql数据库编码问题
    cinder支持nfs快照
  • 原文地址:https://www.cnblogs.com/tcy1/p/13542346.html
Copyright © 2011-2022 走看看