本站以分享各种运维经验和运维所需要的技能为主
《python零基础入门》:python零基础入门学习
《python运维脚本》: python运维脚本实践
《shell》:shell学习
《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战
《k8》暂未更新
《docker学习》暂未更新
《ceph学习》ceph日常问题解决分享
《日志收集》ELK+各种中间件
《运维日常》运维日常
《linux》运维面试100问
《DBA》db的介绍使用(mysql、redis、mongodb...)
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.重新加入集群