0


MongoDB数据库的备份恢复

MongoDB数据库的备份恢复

文章目录

1.mongodb备份还原工具

定时备份/全量备份

​ 备份:mongodump

​ 还原:mongorestore

​ 备份格式: bson/gzip
分析数据/迁移数据

​ 备份:mongoexport

​ 还原:mongoimport

​ 备份格式:json csv

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

2.1.备份还原语法格式

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

2.2.创建备份目录

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

2.3.备份某个库的某张表

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

在这里插入图片描述

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

只备份user_info表的name和ad字段

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

在这里插入图片描述

2.5.将user_info表还原到user_db表

2.5.1.json格式还原

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

还原成功

在这里插入图片描述

2.5.2.csv格式还原

mongoimport还原csv格式表时要加上–headerline参数,否则会将字段名也作为一条数据插入

–headerline和-f不能同时使用

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

还原成功

在这里插入图片描述

还原指定的字段

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

3.mongodump备份还原某个数据库

3.1.备份单个库

  1. 1.创建一个表和数据
  2. > db.book_date.insertMany([
  3. { "name":"nginx", "price":25, "num":100, "status":"N" },
  4. { "name":"ansible", "price":50, "num":200 , "status":"A" },
  5. { "name":"tomcat", "price":100, "num":150, "status":"T" },
  6. { "name":"redis", "price":75, "num":320 , "status":"R" },
  7. { "name":"docker", "price":45, "num":270, "status":"D" }
  8. ]);
  9. 2.当前数据库有两张表
  10. mongo-rs:PRIMARY> show tables
  11. book_date
  12. user_info
  13. 3.备份数据库所有表
  14. [mongo@mongodb-1 ~]$ mongodump --port 26017 -d test -o /data/backup/test_db
  15. 2021-02-17T17:24:48.732+0800 writing test.book_date to
  16. 2021-02-17T17:24:48.732+0800 writing test.user_info to
  17. 2021-02-17T17:24:48.734+0800 done dumping test.book_date (5 documents)
  18. 2021-02-17T17:24:48.734+0800 done dumping test.user_info (5 documents)
  19. 4.查看备份文件
  20. [mongo@mongodb-1 ~]$ cd /data/backup/test_db/
  21. [mongo@mongodb-1 /data/backup/test_db]$ tree .
  22. .
  23. └── test
  24. ├── book_date.bson
  25. ├── book_date.metadata.json
  26. ├── user_info.bson
  27. └── user_info.metadata.json
  28. 1 directory, 4 files

在这里插入图片描述

3.2.备份全库

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

在这里插入图片描述

3.3.压缩格式备份

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

在这里插入图片描述

3.4.还原zabbix数据库

  1. 1.删除zabbix数据库
  2. mongo-rs:PRIMARY> use zabbix
  3. mongo-rs:PRIMARY> db.dropDatabase()
  4. 2.还原数据库
  5. [mongo@mongodb-1 ~]$ mongorestore --port 26017 -d zabbix /data/backup/all_db/ --drop

4.mongodump备份整个副本集

  1. 普通备份
  2. mongodump --host=mongo-rs/192.168.81.210:26017,192.168.81.210:28017,192.168.81.210:29017 -o /data/backup/mongo_rs
  3. 压缩备份
  4. 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

在这里插入图片描述

5.将mysql中的表导出还原到mongodb

5.1.导出mysql中的表为csv格式

  1. MariaDB [(none)]> select * from zabbix.users into outfile '/var/lib/mysql/users.csv' fields terminated by ',';
  2. [root@mongodb-1 ~]# cp /var/lib/mysql/users.csv /tmp/
  3. 命令导出的csv格式不包含字段名

可以用Navicat导出,Navicat导出的csv格式包含字段名,如果没有字段名,mongodb导入时会报错

在这里插入图片描述

备份全部字段

在这里插入图片描述

包含列标题

在这里插入图片描述

这样导出的csv格式的表,都是包含列标题的

在这里插入图片描述

5.2.mongodb导入mysql备份的数据

  1. 1.Navicat导出包含列标题的csv传到Linux
  2. 2.导入mysql数据
  3. [mongo@mongodb-1 ~]$ mongoimport --port 26017 -d zabbix -c users --type=csv --headerline /tmp/users.csv
  4. 2021-02-17T18:23:35.717+0800 connected to: localhost:26017
  5. 2021-02-17T18:23:35.748+0800 imported 6 documents

5.3.查看数据是否导入成功

  1. [mongo@mongodb-1 ~]$ mongo --port 26017
  2. mongo-rs:PRIMARY> show dbs
  3. admin 0.000GB
  4. config 0.000GB
  5. local 0.000GB
  6. test 0.000GB
  7. user_db 0.000GB
  8. zabbix 0.000GB
  9. mongo-rs:PRIMARY> use zabbix
  10. switched to db zabbix
  11. mongo-rs:PRIMARY> show tables
  12. users
  13. mongo-rs:PRIMARY> db.users.find()

在这里插入图片描述

Navicat查看数据
在这里插入图片描述

6.模拟误删除恢复数据

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

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

具体实现思路:

​ 1.插入测试数据

​ 2.删除之前所有的备份,保证目录干净

​ 3.全备数据库

​ 4.插入新的数据,使数据记录在oplog中

​ 5.删除新插入的数据

​ 6.备份现有的oplog.rs表,也就是存储所有操作的表,可以从里面恢复没有备份的数据

​ 7.截取oplog.rs表中删除数据的操作位置,记录时间戳

​ 8.使用oplog还原删除的数据

6.1.插入测试数据

  1. [mongo@mongodb-1 ~]$ mongo --port 26017
  2. mongo-rs:PRIMARY> use my_testdb
  3. mongo-rs:PRIMARY> for (var i = 1 ;i < 20; i++){
  4. db.ci.insert({a:i});
  5. }
  6. mongo-rs:PRIMARY> show tables
  7. ci

![]](https://img-blog.csdnimg.cn/2aca363cc6d541cc9e80d2206bfcf4be.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmlhbmd4bH4=,size_20,color_FFFFFF,t_70,g_se,x_16)

6.2.删除原来的所有备份数据

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

6.3.全备数据库

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

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

在这里插入图片描述

6.4.再次插入新的数据

  1. mongo-rs:PRIMARY> use my_testdb
  2. mongo-rs:PRIMARY> db.ci_new1.insertMany( [
  3. { "id": 1},
  4. { "id": 2},
  5. { "id": 3},
  6. ]);
  7. mongo-rs:PRIMARY> db.ci_new2.insertMany( [
  8. { "id": 1},
  9. { "id": 2},
  10. { "id": 3},
  11. ]);

在这里插入图片描述

6.5.开始误删除数据表

  1. mongo-rs:PRIMARY> db.ci.drop()
  2. true
  3. mongo-rs:PRIMARY> show tables
  4. ci_new1
  5. ci_new2

6.6.备份先有的oplog.rs表

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

在这里插入图片描述

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

  1. mongo-rs:PRIMARY> db.oplog.rs.find({ns:"my_testdb.$cmd"}).pretty()
  2. {
  3. "ts" : Timestamp(1613561789, 1),
  4. "t" : NumberLong(5),
  5. "h" : NumberLong("1313438378401925148"),
  6. "v" : 2,
  7. "op" : "c",
  8. "ns" : "my_testdb.$cmd",
  9. "ui" : UUID("24f4c7aa-7ae0-4767-adea-0a3cb0b7709e"),
  10. "wall" : ISODate("2021-02-17T11:36:29.834Z"),
  11. "o" : {
  12. "create" : "ci",
  13. "idIndex" : {
  14. "v" : 2,
  15. "key" : {
  16. "_id" : 1
  17. },
  18. "name" : "_id_",
  19. "ns" : "my_testdb.ci"
  20. }
  21. }
  22. }
  23. {
  24. "ts" : Timestamp(1613562107, 1),
  25. "t" : NumberLong(5),
  26. "h" : NumberLong("1204714198446601217"),
  27. "v" : 2,
  28. "op" : "c",
  29. "ns" : "my_testdb.$cmd",
  30. "ui" : UUID("8e38f17b-a2ad-436d-989c-9cf12da216fc"),
  31. "wall" : ISODate("2021-02-17T11:41:47.233Z"),
  32. "o" : {
  33. "create" : "ci_new1",
  34. "idIndex" : {
  35. "v" : 2,
  36. "key" : {
  37. "_id" : 1
  38. },
  39. "name" : "_id_",
  40. "ns" : "my_testdb.ci_new1"
  41. }
  42. }
  43. }
  44. {
  45. "ts" : Timestamp(1613562113, 1),
  46. "t" : NumberLong(5),
  47. "h" : NumberLong("-8601733323753055448"),
  48. "v" : 2,
  49. "op" : "c",
  50. "ns" : "my_testdb.$cmd",
  51. "ui" : UUID("f0988675-e4aa-43aa-84ca-35cb3c9795fb"),
  52. "wall" : ISODate("2021-02-17T11:41:53.652Z"),
  53. "o" : {
  54. "create" : "ci_new2",
  55. "idIndex" : {
  56. "v" : 2,
  57. "key" : {
  58. "_id" : 1
  59. },
  60. "name" : "_id_",
  61. "ns" : "my_testdb.ci_new2"
  62. }
  63. }
  64. }
  65. {
  66. "ts" : Timestamp(1613562226, 1),
  67. "t" : NumberLong(5),
  68. "h" : NumberLong("503106244595267657"),
  69. "v" : 2,
  70. "op" : "c",
  71. "ns" : "my_testdb.$cmd",
  72. "ui" : UUID("24f4c7aa-7ae0-4767-adea-0a3cb0b7709e"),
  73. "wall" : ISODate("2021-02-17T11:43:46.345Z"),
  74. "o" : {
  75. "drop" : "ci" #删除ci的位置,记录ts的时间戳
  76. }
  77. }

在这里插入图片描述

6.8.使用oplog还原误删除的数据

  1. 1.将备份路径local下面的oplog.rs.bson替换到全库备份路径下,成为最新备份
  2. [mongo@mongodb-1 ~]$ cd /data/backup/local/
  3. [mongo@mongodb-1 /data/backup/local]$ cp oplog.rs.bson ../oplog.bson
  4. 2.oplog.rs.bson替换成最新后,需要将local目录删除,否则还原会失败
  5. [mongo@mongodb-1 /data/backup]$ rm -rf local/
  6. 3.利用oplog还原误删除的数据
  7. [mongo@mongodb-1 /data/backup]$ mongorestore --port 26017 --oplogReplay --oplogLimit "1613562226:1" --drop /data/backup/

在这里插入图片描述

6.9.验证数据是否还原成功

  1. [mongo@mongodb-1 /data/backup]$ mongo --port 26017
  2. mongo-rs:PRIMARY> show dbs
  3. admin 0.000GB
  4. config 0.000GB
  5. local 0.000GB
  6. my_testdb 0.000GB
  7. test 0.000GB
  8. test_db 0.000GB
  9. user_db 0.000GB
  10. mongo-rs:PRIMARY> use my_testdb
  11. switched to db my_testdb
  12. mongo-rs:PRIMARY> show tables
  13. ci
  14. ci_new1
  15. ci_new2
  16. mongo-rs:PRIMARY> db.ci.find()

在这里插入图片描述


本文转载自: https://blog.csdn.net/weixin_44953658/article/details/122408232
版权归原作者 Jiangxl~ 所有, 如有侵权,请联系我们删除。

“MongoDB数据库的备份恢复”的评论:

还没有评论