Mongo应用场景-数据迁移

Mongo应用场景-数据迁移.1.复制与克隆

1. 克隆数据库

使用cloneDatabase()方法克隆远程到本地同名数据库.

语法如下, 克隆远程的mydb数据库到本地.

> use mydb
> db.dropDatabase();
> db.cloneDatabase("192.168.11.52")

注意:

  1. cloneDatabase()方法只能从远程拉取数据, 不能推送到远程.
  2. 首先要在本地使用use命令选择数据库
  3. 本地数据库中不能存在与远程数据库同名的集合, 否则克隆会失败, 所以可以使用dropDatabase()方法清除当前数据库.
  4. cloneDatabase()方法的参数为远程主机名, 可以加端口, 如192.168.11.5:27017.

如下是本地当前数据库中存在与远程数据库同名的collections时的结果, 远程集合无法覆盖本地集合, 而其他集合部分会成功, 也有可能失败导致克隆不完全, 所以dropDatabase()方法还是很有必要的.

> db.cloneDatabase('192.168.173.43')
{
	"clonedColls" : [ ],
	"ok" : 0,
	"errmsg" : "collection already exists",
	"code" : 48
}

2. 克隆集合

使用cloneCollection()方法克隆远程指定集合到本地, 并且可以使用过滤条件排队不需要的文档.

语法如下, 克隆远程的mydb数据库中名为bar的集合指定文档到本地.

> use mydb
> db.cloneCollection("192.168.11.52", "bar", {"name" : "tiger"})
> db.bar.find();
{ "_id" : ObjectId("53687ff4f433cf04b788c6d3"), "name" : "tiger" }

cloneCollection()方法参数:

  • from: 远程主机地址, 可加端口
  • collection: 目标集合名称.
  • query: 过滤条件, 可以过滤掉不想要的文档, 与普通查询语句的过滤语法相同.

注意:

  1. cloneDatabase()方法只能从远程拉取数据, 不能推送到远程.
  2. 同样首先需要在本地使用use选择数据库, 从远程主机克隆时也是从这个数据库中克隆.
  3. 本地不可以存在同名集合, 否则克隆会失败

3. 拉取/推送数据

copyDatabase()方法可以从远程主机复制数据库到本地.

参数:

  • from: 源数据库名称
  • to: 目标数据库名称
  • srchost: 可选项, 源数据库的主机地址. 如果就是当前主机, 可以忽略该选项
  • username: 可选项, 源主机名用户名
  • password: 可选项, 源主机名用户名对应密码

复制本地mydb库到newmydb:

db.copyDatabase("mydb", "newmydb", "192.168.11.52");

注意:

  1. 无需使用use预告选择数据库, 如果本地不存在指定数据库, 会自行创建.
  2. 并不会产生目标数据库的即时快照. 如果在复制过程中在源或目标库发生读写操作, 会导致数据库不一致(未实验).
  3. 在操作过程中并不会锁住目标主机, 所以复制过程中可能出现暂时的中断来完成其他操作.

Mongo应用场景-数据迁移.2.备份与还原

1. mongodump备份数据库

命令语法

mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径 

如果没有用户,可以去掉-u和-p

如果导出本机的数据库,可以去掉-h

如果是默认端口,可以去掉–port

如果想导出所有数据库,可以去掉-d

需要注意的是: 导出的数据不是以单文件形式存在, 所以-o参数指定的路径需要是一个目录, 目标mongo实例中的数据库将以目录的形式存放在这里面.

1.1 导出所有数据库

[mongo@192-168-169-75 ~]$ mongodump  -h 127.0.0.1 -o ./mongodatas/
2017-02-06T12:43:57.559+0000	writing log.HCLog to 
...
2017-02-06T12:43:57.569+0000	done dumping guilds.guild_data (1 document)
2017-02-06T12:43:57.584+0000	done dumping upload_data.fs.chunks (62 documents)
[mongo@192-168-169-75 ~]$ ls mongodatas
bs  cheat_history  ew4login  guilds  iap  log  upload_data  user_identify

1.2 导出指定数据库

[mongo@192-168-169-75 ~]$ mongodump  -h 127.0.0.1  -d guilds  -o ./mongodatas/
2017-02-06T12:43:57.568+0000	writing guilds.guild_data to
2017-02-06T12:43:57.569+0000	done dumping guilds.guild_data (1 document)

2. mongorestore还原数据库

命令语法

mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件存在路径 

--drop的意思是,先删除所有的记录,然后恢复

2.1 恢复所有数据库到mongodb中

[root@localhost mongodb]# mongorestore mongodatas/  #这里的路径是所有库的备份路径 

2.2 还原指定的数据库

[root@localhost mongodb]# mongorestore -d guild mongodatas/guild/  
 
#将guild还原到目标mongo实例的guild_new数据库中
[root@localhost mongodb]# mongorestore -d guild_new mongodatas/guild/  

Mongo基本应用

1. 数据库操作

show dbs可以查看数据库列表, 类似于mysql中的show databases;

1.1 新建

use 数据库名

选择一个存在的数据库, 如果指定的数据库不存在, 则创建一个新的数据库.

需要注意的是, use命令创建一个新的数据库后, 使用show dbs还无法看到, 你需要至少其中插入一个文档才行.

> use general
switched to db general
> show dbs
local    0.000GB

> db.general.insert({'name':'general'})
WriteResult({ "nInserted" : 1 })
> show dbs
general  0.000GB
local    0.000GB

1.2 删除

use 数据库名  
db.dropDatabase()

将删除当前选中的数据库, 如果未选中任何数据库, 则删除默认的test库.

> show dbs
general  0.000GB
local    0.000GB
> use general
switched to db general
> db.dropDatabase()
{ "dropped" : "general", "ok" : 1 }
> show dbs
local  0.000GB

2. 集合(Collection)操作

2.1 创建

可以在不显式创建Collection的情况下插入数据, 但其实mongodb还是隐式地创建了一个Collection的.

> use general
switched to db general
> show collections
> db.post.insert({'title':'first post'})
WriteResult({ "nInserted" : 1 })
> show collections
post
> db.post.find()
{ "_id" : ObjectId("5844fc0f8430b77f4b8084e0"), "title" : "first post" }

新创建的数据库默认为空, 使用db.post.insert()方法可以在当前数据库创建一个名为post的collection, 并向其中插入一条数据.

还可以创建general.post这种带有点号.的集合.

2.2 删除

与清空不同, 删除是指删除整个collection, 而不是单纯清空collection中的数据而保留collection.

collection的删除操作是对于当前数据库而言的, 所以需要先选中一个数据库.

> db.post.drop()

3. 文档数据操作

2.1 查询

2.1.1 键值查询
## 查询所有
db.post.find()

## 精确过滤查询
db.post.find({'title': 'first post'})

## 正则过滤, `/pattern/`正好是js中的正则对象, 可以使用各种正则手段.
db.post.find({title:/first/});
{ "_id" : ObjectId("5844fc0f8430b77f4b8084e0"), "title" : "first post" }

## 数值比较逻辑, 可用选项为`$gt`, `$lt`, `$gte`, `$lte`
db.userInfo.find({age: {$gt: 25}});

## 多条件并列查询. 如下示例, 查询年龄大于25, 姓名以ge开头的user.
db.userInfo.find({age:{$gt: 25}, name: /^ge/})

## 查询指定列. 如下示例第一个大括号代表过滤条件, 空代表查询所有. 第二个大括号代表查询的字段, 1表示true, 0表示false. 
## 注意, 如果没有name或age属性也会返回对象, 只是这种对象的name或age字段为空, 又不会显示它的其他字段而已.
db.userInfo.find({}, {name: 1, age: 1})

## 如下示例表示查询所有name字段不为空的对象, 并返回这些对象的name字段.
db.userInfo.find({name:/.+/},{name:1})
{ "_id" : ObjectId("584518fb737718c346c9e755"), "name" : "general" }

2.1.2 位置查询

下面两条命令都可以查看当前所在库

db
db.getName()

2.2 删除

## 删除指定
db.userInfo.remove({name: 'general'})
## 删除所有, 相当于清空当前collection, 这并不会删除collection本身
db.userInfo.remove({})

系统数据库操作

查看数据库及数据表大小

参考文章

mongodb 查看数据库和表大小

查看指定数据库大小时, 首先要选择一个数据库即use 指定数据库, 然后执行db.stats(). 示例如下.

> use test
> db.stats(); 
{ 
  "db" : "test",        //当前数据库 
  "collections" : 3,      //当前数据库多少表 
  "objects" : 4,        //当前数据库所有表多少条数据 
  "avgObjSize" : 51,      //每条数据的平均大小 
  "dataSize" : 204,      //所有数据的总大小 
  "storageSize" : 16384,    //所有数据占的磁盘大小(单位为字节)
  "numExtents" : 3, 
  "indexes" : 1,        //索引数 
  "indexSize" : 8176,     //索引大小 
  "fileSize" : 201326592,   //预分配给数据库的文件大小 
  "nsSizeMB" : 16, 
  "dataFileVersion" : { 
    "major" : 4, 
    "minor" : 5 
  }, 
  "ok" : 1 
} 

查看数据表信息类似

> use test
> db.posts.stats(); 
{ 
  "ns" : "test.posts", 
  "count" : 1, 
  "size" : 56, 
  "avgObjSize" : 56, 
  "storageSize" : 8192, 
  "numExtents" : 1, 
  "nindexes" : 1, 
  "lastExtentSize" : 8192, 
  "paddingFactor" : 1, 
  "systemFlags" : 1, 
  "userFlags" : 0, 
  "totalIndexSize" : 8176, 
  "indexSizes" : { 
    "_id_" : 8176 
  }, 
  "ok" : 1 
} 
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨烦信息

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值