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
网友评论