民工哥 MongoDB 教程:MD 数据库备份与恢复

2023年 7月 10日 29.7k 0

备份还原工具

定时备份/全量备份

  • 备份:mongodump
  • 还原:mongorestore
  • 备份格式:bson/gzip

分析数据/迁移数据

  • 备份:mongoexport
  • 还原:mongoimport
  • 备份格式:json csv

mongoexport备份还原某个库的某张表

备份还原语法格式

mongoexport备份

mongoexport备份某个表语法格式:

mongoexport --port 端口号 -d 库名 -c 表名 -o 备份文件路径.json

mongoexport备份某个表csv格式:

mongoexport --port 端口号 -d 库名 -c 表名 --type=csv -f 备份的字段 -o 备份文件路径.json
mongoimport还原

mongoimport还原某个表json格式:

mongoimport --port 26017 -d 要还原的库名-c 表名 备份文件路径.json

mongoimport还原某个表csv格式:

mongoimport --port 26017 -d 库名 -c 表名–type=csv --headerline 备份文件路径.csv
mongodump备份

mongodump备份库:mongodump --port 26017 -d 库名 -o 备份文件路径

mongorestore还原

mongorestore还原:mongorestore --port 26017 -d 库名 备份文件路径 --drop

创建备份目录

[root@mongodb-1 ~]# mkdir /data/backup
[root@mongodb-1 ~]# chown -R mongo.mongo /data/backup

备份某个库的某张表

[mongo@mongodb-1 ~]$ mongoexport --port 26017 -d test -c user_info  -o  /data/backup/user_info.json 
2021-02-17T17:17:30.810+0800 connected to: localhost:26017
2021-02-17T17:17:30.903+0800 exported 5 records

民工哥 MongoDB 教程:MD 数据库备份与恢复

将某张表指定的字段备份成csv格式

只备份user_info表的name和ad字段

[mongo@mongodb-1 ~]$ mongoexport --port 26017 -d test -c user_info --type=csv -f name,age,ad,sex -o /data/backup/user_info.csv
2021-02-17T17:30:18.998+0800 connected to: localhost:26017
2021-02-17T17:30:18.999+0800 exported 5 records

民工哥 MongoDB 教程:MD 数据库备份与恢复

将user_info表还原到user_db表

json格式还原
[mongo@mongodb-1 ~]$ mongoimport --port 26017 -d user_db -c user_json /data/backup/user_info.json 
2021-02-17T17:39:14.395+0800 connected to: localhost:26017
2021-02-17T17:39:14.418+0800 imported 5 documents

还原成功民工哥 MongoDB 教程:MD 数据库备份与恢复

csv格式还原

mongoimport还原csv格式表时要加上–headerline参数,否则会将字段名也作为一条数据插入。更多关于 MongoDB 数据库的学习文章,请参阅:NoSQL 数据库之 MongoDB ,本系列持续更新中。

–headerline和-f不能同时使用

[mongo@mongodb-1 ~]$ mongoimport --port 26017 -d user_db -c user_csv --type=csv --headerline /data/backup/user_info.csv 
2021-02-17T17:46:45.187+0800 connected to: localhost:26017
2021-02-17T17:46:45.209+0800 imported 5 documents

还原成功民工哥 MongoDB 教程:MD 数据库备份与恢复还原指定的字段

[mongo@mongodb-1 ~]$ mongoimport --port 26017 -d user_db -c user_csv2 --type=csv -f name,age  /data/backup/user_info.csv 

mongodump备份还原某个数据库

备份单个库

#创建一个表和数据
> db.book_date.insertMany([
    { "name":"nginx", "price":25, "num":100, "status":"N" },
    { "name":"ansible", "price":50, "num":200 , "status":"A" },
    { "name":"tomcat", "price":100, "num":150, "status":"T" },
    { "name":"redis", "price":75, "num":320  , "status":"R" },
    { "name":"docker", "price":45, "num":270, "status":"D" }
]);

#当前数据库有两张表
mongo-rs:PRIMARY> show tables
book_date
user_info

#备份数据库所有表
[mongo@mongodb-1 ~]$ mongodump --port 26017 -d test -o /data/backup/test_db
2021-02-17T17:24:48.732+0800 writing test.book_date to 
2021-02-17T17:24:48.732+0800 writing test.user_info to 
2021-02-17T17:24:48.734+0800 done dumping test.book_date (5 documents)
2021-02-17T17:24:48.734+0800 done dumping test.user_info (5 documents)

#查看备份文件
[mongo@mongodb-1 ~]$ cd /data/backup/test_db/
[mongo@mongodb-1 /data/backup/test_db]$ tree .
.
└── test
    ├── book_date.bson
    ├── book_date.metadata.json
    ├── user_info.bson
    └── user_info.metadata.json

1 directory, 4 files

民工哥 MongoDB 教程:MD 数据库备份与恢复

备份全库

[mongo@mongodb-1 ~]$ mongodump --port 26017 -o /data/backup/all_db
2021-02-17T18:35:38.770+0800 writing admin.system.version to 
2021-02-17T18:35:38.773+0800 done dumping admin.system.version (1 document)
2021-02-17T18:35:38.773+0800 writing user_db.user_csv2 to 
2021-02-17T18:35:38.773+0800 writing zabbix.users to 
2021-02-17T18:35:38.774+0800 writing test.book_date to 
2021-02-17T18:35:38.774+0800 writing test.user_info to 
2021-02-17T18:35:38.779+0800 done dumping zabbix.users (6 documents)
2021-02-17T18:35:38.779+0800 writing user_db.user_json to 
2021-02-17T18:35:38.779+0800 done dumping test.book_date (5 documents)
2021-02-17T18:35:38.779+0800 writing user_db.user_csv to 
2021-02-17T18:35:38.780+0800 done dumping test.user_info (5 documents)
2021-02-17T18:35:38.780+0800 done dumping user_db.user_csv2 (6 documents)
2021-02-17T18:35:38.781+0800 done dumping user_db.user_json (5 documents)
2021-02-17T18:35:38.781+0800 done dumping user_db.user_csv (5 documents)
[mongo@mongodb-1 ~]$ tree /data/backup/all_db

民工哥 MongoDB 教程:MD 数据库备份与恢复

压缩格式备份

[mongo@mongodb-1 ~]$ mongodump --port 26017 -d zabbix -o /data/backup/zabbix_db --gzip
2021-02-17T18:36:48.908+0800 writing zabbix.users to 
2021-02-17T18:36:48.909+0800 done dumping zabbix.users (6 documents)
[mongo@mongodb-1 ~]$ tree /data/backup/zabbix_db/

民工哥 MongoDB 教程:MD 数据库备份与恢复

还原zabbix数据库

#删除zabbix数据库
mongo-rs:PRIMARY> use zabbix
mongo-rs:PRIMARY> db.dropDatabase()

#还原数据库
[mongo@mongodb-1 ~]$ mongorestore --port 26017 -d zabbix /data/backup/all_db/ --drop

mongodump备份整个副本集

#普通备份
mongodump --host=mongo-rs/192.168.81.210:26017,192.168.81.210:28017,192.168.81.210:29017 -o /data/backup/mongo_rs

#压缩备份
mongodump --host=mongo-rs/192.168.81.210:26017,192.168.81.210:28017,192.168.81.210:29017 -o /data/backup/mongo_rs --gzip

民工哥 MongoDB 教程:MD 数据库备份与恢复

将mysql中的表导出还原到mongodb

导出mysql中的表为csv格式

MariaDB [(none)]> select * from zabbix.users into outfile '/var/lib/mysql/users.csv' fields terminated by ',';

[root@mongodb-1 ~]# cp /var/lib/mysql/users.csv /tmp/

命令导出的csv格式不包含字段名

可以用Navicat导出,Navicat导出的csv格式包含字段名,如果没有字段名,mongodb导入时会报错。更多关于 MongoDB 数据库的学习文章,请参阅:NoSQL 数据库之 MongoDB ,本系列持续更新中。民工哥 MongoDB 教程:MD 数据库备份与恢复备份全部字段民工哥 MongoDB 教程:MD 数据库备份与恢复包含列标题民工哥 MongoDB 教程:MD 数据库备份与恢复这样导出的csv格式的表,都是包含列标题的民工哥 MongoDB 教程:MD 数据库备份与恢复

mongodb导入mysql备份的数据

#将Navicat导出包含列标题的csv传到Linux中

#导入mysql数据
[mongo@mongodb-1 ~]$ mongoimport --port 26017 -d zabbix -c users --type=csv --headerline /tmp/users.csv 
2021-02-17T18:23:35.717+0800 connected to: localhost:26017
2021-02-17T18:23:35.748+0800 imported 6 documents

查看数据是否导入成功

[mongo@mongodb-1 ~]$ mongo --port 26017
mongo-rs:PRIMARY> show dbs
admin    0.000GB
config   0.000GB
local    0.000GB
test     0.000GB
user_db  0.000GB
zabbix   0.000GB

mongo-rs:PRIMARY> use zabbix
switched to db zabbix
mongo-rs:PRIMARY> show tables
users
mongo-rs:PRIMARY> db.users.find()

民工哥 MongoDB 教程:MD 数据库备份与恢复Navicat查看数据 民工哥 MongoDB 教程:MD 数据库备份与恢复

模拟误删除恢复数据

oplog:在replica set中oplog是一个定容集合,它的大小默认是磁盘空间的5%,可以通过–oplogSizeMB参数修改。

oplog相当于mysql的binlog,可以从里面恢复没有备份且删除的数据。

具体实现思路:

  • 插入测试数据
  • 删除之前所有的备份,保证目录干净
  • 全备数据库
  • 插入新的数据,使数据记录在oplog中
  • 删除新插入的数据
  • 备份现有的oplog.rs表,也就是存储所有操作的表,可以从里面恢复没有备份的数据
  • 截取oplog.rs表中删除数据的操作位置,记录时间戳
  • 使用oplog还原删除的数据

插入测试数据

[mongo@mongodb-1 ~]$ mongo --port 26017

mongo-rs:PRIMARY> use my_testdb

mongo-rs:PRIMARY> for (var i = 1 ;i  show tables
ci

民工哥 MongoDB 教程:MD 数据库备份与恢复

删除原来的所有备份数据

[mongo@mongodb-1 ~]$ rm -rf /data/backup/*

全备数据库

–oplog:在备份同时,将备份过程中产生的日志进行备份,文件放在/data/backup下,会生成一个oplog.bson的文件存放最新数据。

[mongo@mongodb-1 ~]$ mongodump --port 26017 --oplog -o /data/backup/
2021-02-17T19:39:09.272+0800 writing admin.system.version to 
2021-02-17T19:39:09.273+0800 done dumping admin.system.version (1 document)
2021-02-17T19:39:09.282+0800 writing my_testdb.ci to 
2021-02-17T19:39:09.282+0800 writing test_db.ci to 
2021-02-17T19:39:09.282+0800 writing user_db.user_csv2 to 
2021-02-17T19:39:09.282+0800 writing test.book_date to 
2021-02-17T19:39:09.287+0800 done dumping my_testdb.ci (19 documents)
2021-02-17T19:39:09.287+0800 writing test.user_info to 
2021-02-17T19:39:09.287+0800 done dumping test_db.ci (19 documents)
2021-02-17T19:39:09.287+0800 writing user_db.user_json to 
2021-02-17T19:39:09.287+0800 done dumping user_db.user_csv2 (6 documents)
2021-02-17T19:39:09.287+0800 writing user_db.user_csv to 
2021-02-17T19:39:09.287+0800 done dumping test.book_date (5 documents)
2021-02-17T19:39:09.287+0800 writing test_db.test1 to 
2021-02-17T19:39:09.295+0800 done dumping test.user_info (5 documents)
2021-02-17T19:39:09.296+0800 done dumping user_db.user_csv (5 documents)
2021-02-17T19:39:09.296+0800 done dumping test_db.test1 (3 documents)
2021-02-17T19:39:09.296+0800 done dumping user_db.user_json (5 documents)
2021-02-17T19:39:09.297+0800 writing captured oplog to 
2021-02-17T19:39:09.577+0800  dumped 1 oplog entry

民工哥 MongoDB 教程:MD 数据库备份与恢复

再次插入新的数据

mongo-rs:PRIMARY> use my_testdb

mongo-rs:PRIMARY> db.ci_new1.insertMany( [
    { "id": 1},
    { "id": 2},
    { "id": 3},
]);

mongo-rs:PRIMARY> db.ci_new2.insertMany( [
    { "id": 1},
    { "id": 2},
    { "id": 3},
]);

民工哥 MongoDB 教程:MD 数据库备份与恢复

开始误删除数据表

mongo-rs:PRIMARY> db.ci.drop()
true
mongo-rs:PRIMARY> show tables
ci_new1
ci_new2

备份先有的oplog.rs表

[mongo@mongodb-1 ~]$ mongodump --port 26017 -d local -c oplog.rs -o /data/backup/
2021-02-17T19:46:50.590+0800 writing local.oplog.rs to 
2021-02-17T19:46:50.598+0800 done dumping local.oplog.rs (3406 documents)

民工哥 MongoDB 教程:MD 数据库备份与恢复

截取oplog并恢复到drop之前的位置

mongo-rs:PRIMARY> db.oplog.rs.find({ns:"my_testdb.$cmd"}).pretty()
{
 "ts" : Timestamp(1613561789, 1),
 "t" : NumberLong(5),
 "h" : NumberLong("1313438378401925148"),
 "v" : 2,
 "op" : "c",
 "ns" : "my_testdb.$cmd",
 "ui" : UUID("24f4c7aa-7ae0-4767-adea-0a3cb0b7709e"),
 "wall" : ISODate("2021-02-17T11:36:29.834Z"),
 "o" : {
  "create" : "ci",
  "idIndex" : {
   "v" : 2,
   "key" : {
    "_id" : 1
   },
   "name" : "_id_",
   "ns" : "my_testdb.ci"
  }
 }
}
{
 "ts" : Timestamp(1613562107, 1),
 "t" : NumberLong(5),
 "h" : NumberLong("1204714198446601217"),
 "v" : 2,
 "op" : "c",
 "ns" : "my_testdb.$cmd",
 "ui" : UUID("8e38f17b-a2ad-436d-989c-9cf12da216fc"),
 "wall" : ISODate("2021-02-17T11:41:47.233Z"),
 "o" : {
  "create" : "ci_new1",
  "idIndex" : {
   "v" : 2,
   "key" : {
    "_id" : 1
   },
   "name" : "_id_",
   "ns" : "my_testdb.ci_new1"
  }
 }
}
{
 "ts" : Timestamp(1613562113, 1),
 "t" : NumberLong(5),
 "h" : NumberLong("-8601733323753055448"),
 "v" : 2,
 "op" : "c",
 "ns" : "my_testdb.$cmd",
 "ui" : UUID("f0988675-e4aa-43aa-84ca-35cb3c9795fb"),
 "wall" : ISODate("2021-02-17T11:41:53.652Z"),
 "o" : {
  "create" : "ci_new2",
  "idIndex" : {
   "v" : 2,
   "key" : {
    "_id" : 1
   },
   "name" : "_id_",
   "ns" : "my_testdb.ci_new2"
  }
 }
}
{
 "ts" : Timestamp(1613562226, 1),
 "t" : NumberLong(5),
 "h" : NumberLong("503106244595267657"),
 "v" : 2,
 "op" : "c",
 "ns" : "my_testdb.$cmd",
 "ui" : UUID("24f4c7aa-7ae0-4767-adea-0a3cb0b7709e"),
 "wall" : ISODate("2021-02-17T11:43:46.345Z"),
 "o" : { 
  "drop" : "ci"    #删除ci的位置,记录ts的时间戳
 }
}

民工哥 MongoDB 教程:MD 数据库备份与恢复

使用oplog还原误删除的数据

#将备份路径local下面的oplog.rs.bson替换到全库备份路径下,成为最新备份
[mongo@mongodb-1 ~]$ cd /data/backup/local/
[mongo@mongodb-1 /data/backup/local]$ cp oplog.rs.bson ../oplog.bson 

#将oplog.rs.bson替换成最新后,需要将local目录删除,否则还原会失败
[mongo@mongodb-1 /data/backup]$ rm -rf local/

#利用oplog还原误删除的数据
[mongo@mongodb-1 /data/backup]$ mongorestore --port 26017 --oplogReplay --oplogLimit "1613562226:1" --drop /data/backup/

民工哥 MongoDB 教程:MD 数据库备份与恢复

验证数据是否还原成功

[mongo@mongodb-1 /data/backup]$ mongo --port 26017

mongo-rs:PRIMARY> show dbs
admin      0.000GB
config     0.000GB
local      0.000GB
my_testdb  0.000GB
test       0.000GB
test_db    0.000GB
user_db    0.000GB

mongo-rs:PRIMARY> use my_testdb
switched to db my_testdb

mongo-rs:PRIMARY> show tables
ci
ci_new1
ci_new2

mongo-rs:PRIMARY> db.ci.find()

民工哥 MongoDB 教程:MD 数据库备份与恢复

来源:https://jiangxl.blog.csdn.net/article/details/122408232

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论