美文网首页
Mongodb基本的备份和恢复

Mongodb基本的备份和恢复

作者: Odven | 来源:发表于2020-06-15 15:10 被阅读0次

1) 备份恢复工具介绍:

(1)**   mongoexport/mongoimport  导入/导出的是JSON格式或者CSV格式

(2)***** mongodump/mongorestore  导入/导出的是BSON格式

2) JSON和BSON比较

2.1 JSON可读性强但体积较大,BSON则是二进制文件,体积小但对人类几乎没有可读性

2.2 在一些mongodb版本之间,BSON格式可能会随版本不同而有所不同,所以不同版本之间用mongodump/mongorestore可能不会成功,具体要看版本之间的兼容性。当无法使用BSON进行跨版本的数据迁移的时候,使用JSON格式即mongoexport/mongoimport是一个可选项。跨版本的mongodump/mongorestore个人并不推荐,实在要做请先检查文档看两个版本是否兼容(大部分时候是的)   

2.3 JSON虽然具有较好的跨版本通用性,但其只保留了数据部分,不保留索引,账户等其他基础信息。使用时应该注意。

3) 介绍mongoexport/mongoimport

1. 应用场景总结:
mongoexport/mongoimport    :  json csv 
(1) 异构平台迁移  mysql  <---> mongodb
(2) 同平台,跨大版本:mongodb 2  ----> mongodb 3

2. Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。

3. mongoexport --help  
参数说明:
-h : 指明数据库宿主机的IP
--port : 指明数据库宿主机的端口
-u : 指明数据库的用户名
-p : 指明数据库的密码
--authenticationDatabase : 存放用户凭证的数据库
-d : 指明数据库的名字
-c : 指明collection的名字
-f : 指明要导出那些列
-q : 查询过滤器,像JSON字符串,例如'{"x":{"$gt":1}}'
--skip : 要跳过的文档数
--limit : 限制要导出的文档数
--sort : 排序顺序,像JSON字符串,例如 '{x:1}'
--type : 输出格式为json或csv(默认为'json')
-o : 指明到要导出的文件名

4. 示例
进入mongod
use gy  # 进入数据库
for(i=1;i<100;i++){db.t1.insert({"name": "gy", age:i})}  # 插入数据

(1) mongoexport -h 192.168.137.50 --port 27080 -uroot -p123 --authenticationDatabase=admin -d gy -c t1 -o t1.json  # 使用默认的json格式备份gy库中的t1集合到文件t1.json中
head t1.json 
{"_id":{"$oid":"5ee6e155b8e40f016222950a"},"name":"gy","age":1.0}
{"_id":{"$oid":"5ee6e155b8e40f016222950b"},"name":"gy","age":2.0}
{"_id":{"$oid":"5ee6e155b8e40f016222950c"},"name":"gy","age":3.0}

(2) mongoexport -h 192.168.137.50 --port 27080 -uroot -p123 --authenticationDatabase=admin -d gy -c t1 -f _id,name,age --type=csv -o t1.csv  # 使用默认的jcsv格式备份gy库中的t1集合到文件t1.csv中
head t1.csv 
_id,name,age
ObjectId(5ee6e155b8e40f016222950a),gy,1
ObjectId(5ee6e155b8e40f016222950b),gy,2
ObjectId(5ee6e155b8e40f016222950c),gy,3

(3) mongoexport -h 192.168.137.50 --port 27080 -uroot -p123 --authenticationDatabase=admin -d gy -c t1 -q '{"age": {"$gt": 50}}'  -o t2.json
head t2.json 
{"_id":{"$oid":"5ee6e155b8e40f016222953c"},"name":"gy","age":51.0}
{"_id":{"$oid":"5ee6e155b8e40f016222953d"},"name":"gy","age":52.0}
{"_id":{"$oid":"5ee6e155b8e40f016222953e"},"name":"gy","age":53.0}
{"_id":{"$oid":"5ee6e155b8e40f016222953f"},"name":"gy","age":54.0}

(4) mongoexport -h 192.168.137.50 --port 27080 -uroot -p123 --authenticationDatabase=admin -d gy -c t1 -q '{"age": {"$gt": 50}}' -f "name,age" --type=csv  -o t2.csv  
head t2.csv 
name,age
gy,51
gy,52
gy,53

5. mongoimport --help
参数说明:
-h : 指明数据库宿主机的IP
--port : 指明数据库宿主机的端口
-u : 指明数据库的用户名
-p : 指明数据库的密码
--authenticationDatabase : 存放用户凭证的数据库
-d : 指明数据库的名字
-c : 指明collection的名字
-f : 指明要导出那些列
--type : 输出格式为json或csv(默认为'json')
--headerline : 使用输入源中的第一行作为字段列表(仅CSV和TSV)
-j,--numInsertionWorkers = <number> : 要同时运行的插入操作数(默认为1)(默认为1)(并发数)
--drop : 插入文档之前的drop collection
--file = <文件名> : 要导入的文件;如果未指定,则使用stdin

6. 示例
(1) mongoimport -h 192.168.137.50 --port 27080 -uroot -p123 --authenticationDatabase=admin -d gy_test -c t1 --file=t1.json  # 把t1.json文件导入gy_test库的t1表中
(2) mongoimport -h 192.168.137.50 --port 27080 -uroot -p123 --authenticationDatabase=admin -d gy_test -c t1 --drop --file=t1.json  # 先删除gy_test中的t1表,再把t1.json文件导入gy_test库的t1表中
(3) mongoimport -h 192.168.137.50 --port 27080 -uroot -p123 --authenticationDatabase=admin -d gy_test -c t11 --headerline --type=csv --file=t1.csv  # 导入csv文件(使用--headerline选项 指明第一行是列名,不需要导入)
(4) 先去掉t2.csv中的第一行
mongoimport -h 192.168.137.50 --port 27080 -uroot -p123 --authenticationDatabase=admin -d gy_test -c t2 -f "name,age" --type=csv --file=t2.csv  # 导入时要指明字段名

7.  异构平台迁移案例
mysql   -----> mongodb
test数据库下users表进行导出,导入到mongodb
(1) 准备数据
vim /etc/my.cnf   --->添加以下配置
secure-file-priv=/tmp

create database test default charset utf8mb4;  # 创建数据库

create table users(
username varchar(50),
password varchar(100),
uid smallint unsigned,
pid smallint unsigned,
description varchar(255),
home varchar(100),
shell varchar(50));  # 创建表

load data infile "/tmp/passwd" into table users fields terminated by ":" lines terminated by "\n";  # 导入数据

(2) 从mysql中导出csv格式的数据
select * from users into outfile "/tmp/users.csv" fields terminated by "," lines terminated by "\n";

(3) mongodb导入csv格式的数据
先在/tmp/users.csv文件中的首行加入列名
head /tmp/users.csv
username,password,uid,pid,description,home,shell
root,x,0,0,root,/root,/bin/bash
bin,x,1,1,bin,/bin,/sbin/nologin

mongoimport -h 192.168.137.50 --port 27080 -uroot -p123 --authenticationDatabase=admin -d gy -c users --headerline --type=csv --file=/tmp/users.csv

7. 批量迁移
select concat("select * from ", table_schema, ".", table_name, " into outfile '/tmp/", table_schema, '_',  table_name, ".csv fields terminated by ',' lines terminated by '\\n';") from information_schema.tables where table_schema='zabbix';  # 可以用这条拼接语句写成一个脚本,把一个数据库中的所有表批量导出

4) 介绍mongodump/mongorestore

mongodump/mongorestore  : 日常备份恢复时使用.
mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档写入磁盘。但是存在的问题时使用mongodump产生的备份不一定是数据库的实时快照,如果我们在备份时对数据库进行了写入操作,则备份出来的文件可能不完全和Mongodb实时数据相等。另外在备份时可能会对其它客户端性能产生不利的影响。

1. mongodump --help
参数说明:
-h : 指明数据库宿主机的IP
--port : 指明数据库宿主机的端口
-u : 指明数据库的用户名
-p : 指明数据库的密码
--authenticationDatabase : 存放用户凭证的数据库
-d : 指明数据库的名字
-c : 指明collection的名字
--excludeCollection = <集合名称> :集合以从转储中排除(可以多次指定以排除)
-q : 指明导出数据的过滤条件
-j,--numInsertionWorkers = <number> : 要同时运行的插入操作数(默认为1)(默认为1)(并发数)
--oplog  备份的同时备份oplog  使用oplog拍摄时间点快照(会把备份开始到备份结束这段时间里的数据变化备份,当数据导入时使用--oplogReplay重做日志)  这是replica set或者master/slave模式专用
--gzip : 使用Gzip压缩存档我们的收藏集输出
-o : 指明到要导出的文件名

2. 示例
(1) mongodump -h 192.168.137.50 --port 27080 -uroot -p123 --authenticationDatabase=admin --oplog -o /root/mongodb_dir/all_back  # 全备(如果是副本集可以加上--oplog参数)

(2) mongodump -h 192.168.137.50 --port 27080 -uroot -p123 --authenticationDatabase=admin  -d gy -o /root/mongodb_dir/  # 备份gy库(如果是副本集,如果不是全备 也不可以加上--oplog参数)

(3) mongodump -h 192.168.137.50 --port 27080 -uroot -p123 --authenticationDatabase=admin  -d gy -c users  -o /root/mongodb_dir/gy_users  # 备份单表

(4) mongodump -h 192.168.137.50 --port 27080 -uroot -p123 --authenticationDatabase=admin  -d gy --excludeCollection="users" -o /root/mongodb_dir/gy_exclude  # 备份时不备份users表

3. mongorestore --help
参数说明:
-h : 指明数据库宿主机的IP
--port : 指明数据库宿主机的端口
-u : 指明数据库的用户名
-p : 指明数据库的密码
--authenticationDatabase : 存放用户凭证的数据库
-d : 指明数据库的名字
-c : 指明collection的名字
--oplogReplay : 重播oplog以进行时间点还原(重做日志)  这是replica set或者master/slave模式专用
--gzip : 解压缩压缩的输入
-j,--numInsertionWorkers = <number> : 要同时运行的插入操作数(默认为1)(默认为1)(并发数)

4. 示例
(1) 恢复单库
use gy_test
db.dropDatabase()
mongorestore -h 192.168.137.50 --port 27080 -uroot -p123 --authenticationDatabase=admin  -d gy_test  /root/mongodb_dir/all_back/gy_test/

(2) 恢复单表
use gy
db.users.drop()
mongorestore -h 192.168.137.50 --port 27080 -uroot -p123 --authenticationDatabase=admin  -d gy -c users  /root/mongodb_dir/all_back/gy/users.bson

相关文章

网友评论

      本文标题:Mongodb基本的备份和恢复

      本文链接:https://www.haomeiwen.com/subject/wgxcxktx.html