mongodb 备份、还原、导入、导出
mongodump备份数据库
从 MongoDB 4.2 开始,不能再使用 mongodump 或 mongorestore 作为分片集群的备份策略了。这些工具无法维护跨分片事务的原子性保证。
如果开启了用户认证,要加上 --authenticationDatabase admin
##################### mongo 导出数据 #####################
测试数据:
mongo --host 10.2.30.28 --port 27017 -umongo_rw -p"afsd23#zUNQbbO7oF" --authenticationDatabase=admin
use testdb;
db.testcol.insertMany([
{"_id":1,"name":"zhangsan1","timestamp": ISODate("2021-01-01T00:00:00Z")},
{"_id":2,"name":"zhangsan2","timestamp": ISODate("2021-02-01T00:00:00Z")},
{"_id":3,"name":"zhangsan3","timestamp": ISODate("2021-03-01T00:00:00Z")},
{"_id":4,"name":"zhangsan4","timestamp": ISODate("2021-04-01T00:00:00Z")},
{"_id":5,"name":"zhangsan5","timestamp": ISODate("2021-05-01T00:00:00Z")},
{"_id":6,"name":"zhangsan6","timestamp": ISODate("2022-01-01T00:00:00Z")},
{"_id":7,"name":"zhangsan7","timestamp": ISODate("2022-02-01T00:00:00Z")},
{"_id":8,"name":"zhangsan8","timestamp": ISODate("2022-03-01T00:00:00Z")},
{"_id":9,"name":"zhangsan9","timestamp": ISODate("2022-04-01T00:00:00Z")},
{"_id":10,"name":"zhangsan10","timestamp": ISODate("2022-05-01T00:00:00Z")}
])
##################### mongodump 导数据 #####################
压缩
mongodump --host 10.2.30.28 --port 27017 -umongo_rw -p"afsd23#zUNQbbO7oF" --authenticationDatabase=admin --gzip -d testdb -o /data/tmp_backup/
不压缩
mongodump --host 10.2.30.28 --port 27017 -umongo_rw -p"afsd23#zUNQbbO7oF" --authenticationDatabase=admin -d testdb -o /data/tmp_backup/
# -c testcol --query
mongodump --host 10.2.30.28 --port 27017 -umongo_rw -p"afsd23#zUNQbbO7oF" --authenticationDatabase=admin -d testdb -c testcol --query '{"name": "zhangsan1"}' -o /data/tmp_backup
# 时间类型
mongodump --host 10.2.30.28 --port 27017 -umongo_rw -p"afsd23#zUNQbbO7oF" --authenticationDatabase=admin -d testdb -c testcol --query '{"timestamp": {"$lte":{"$date":"2021-05-01T00:00:00Z"}}}' -o /data/tmp_backup
##################### mongorestore 导数据 #####################
# 压缩
mongorestore --host 10.2.30.28 --port 27017 -umongo_rw -p"afsd23#zUNQbbO7oF" --authenticationDatabase=admin --gzip -d testdb /data/tmp_backup/testdb/
# 不压缩
mongorestore --host 10.2.30.28 --port 27017 -umongo_rw -p"afsd23#zUNQbbO7oF" --authenticationDatabase=admin -d testdb /data/tmp_backup/testdb/
# 导出 testcol 表,导入表名为 testcol_01
mongorestore --host 10.2.30.28 --port 27017 -umongo_rw -p"afsd23#zUNQbbO7oF" --authenticationDatabase=admin --db=testdb --collection=testcol_01 /data/tmp_backup/testdb/testcol.bson
常用的备份命令格式
mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表 -o 文件存在路径
如果想导出所有数据库,可以去掉-d
参数说明:
-h 数据库宿主机的IP
--port 数据库的端口
-u 数据库的用户名
-p 数据库的密码
-d 数据库的名字
-c collection的名字
-o 到要导出的文件名
-q 导出数据的过滤条件
导出某个数据库实例
mongodump -h 192.168.144.25 --port 33988 -d liangdb -o /data/backup/
mongodump在mongo关闭时,也是可以备份的,不过需要指定数据目录,命令为:
mongodump --dbpath /data/db
导出某个数据库实例
mongodump -h 192.168.144.25 --port 33988 -d liangdb -o /data/backup/
mongorestore还原数据库
如果开启了用户认证,要加上 --authenticationDatabase admin
常用命令格式
mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件存在路径
--host <:port>, -h <:port>:
MongoDB所在服务器地址,默认为: localhost:27017
--db , -d :
需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
--drop:
如果某个集合在目标库中存在,不加此参数则不会覆盖,加此参数先删除所有的记录,然后恢复。恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除!此参数要慎用。
<path>:
mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。
你不能同时指定 <path> 和 --dir 选项,--dir也可以设置备份目录。
--dir:
指定备份的目录
不能同时指定 <path> 和 --dir 选项。
导入某个库实例
mongorestore -h192.168.114.25 --port 33988 -d liangdb /data/backup/liangdb
mongoexport导出表,或者表中部分字段
如果开启了用户认证,要加上 --authenticationDatabase admin
mongoexport -h 10.0.67.8 --port 20001 -u root -p Taimei198.., --authenticationDatabase=admin -d report -c edc_subject_item -q '{ "subject_id" : "8a81c0486efedd52016f1c28288a57f9" }' -o /data/backup/edc_subject_item.dat
mongoimport -h 10.3.128.8 --port 20001 -u root -p 123456 --authenticationDatabase=admin -d report -c edc_subject_item --upsert /data/backup/edc_subject_item.dat
常用命令格式
mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 集合名 -f 字段
-q 条件导出 --csv -o 文件名 上面的参数好理解,重点说一下:
-f 导出指字段,以字号分割,-f name,email,age导出name,email,age这三个字段
-q 可以根查询条件导出,-q '{ "_id" : "10001" }' 导出uid为100的数据
--csv 导出的文件格式是csv的。
导出整张表
mongoexport -d test -c users -o /home/mongodb/test/users.dat
导出表中部分字段
mongoexport -d test -c users --csv -f uid,name,sex -o test/users.csv
根据条件到出数据
mongoexport -d test -c users -q '{uid:{$gt:1}}' -o test/users.json
mongoimport导入表,或者表中部分字段
如果开启了用户认证,要加上 --authenticationDatabase admin
mongoexport -h 10.0.0.8 --port 20001 -u root -p 123456.., --authenticationDatabase=admin -d report -c edc_subject_item -q '{ "subject_id" : "8a81c0486efedd52016f1c28288a57f9" }' -o /data/backup/edc_subject_item.dat
mongoimport -h 10.3.3.9 --port 20001 -u root -p 123456 --authenticationDatabase=admin -d report -c edc_subject_item --upsert /data/backup/edc_subject_item.dat
还原整表导出的非csv文件
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsert --drop 文件名
重点说一下--upsert,其他参数上面的命令已有提到,--upsert 插入或者更新现有数据
还原部分字段的导出文件
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsertFields 字段 --drop 文件名
--upsertFields根--upsert一样
还原导出的csv文件
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --type 类型 --headerline --upsert --drop 文件名
上面三种情况,还可以有其他排列组合的。
还原导出的表数据
mongoimport -d test -c users --upsert test/users.dat
部分字段的表数据导入
mongoimport -d test -c users --upsertFields uid,name,sex test/users.dat
还原csv文件
mongoimport -d test -c users --type csv --headerline test/users.csv