Mongo应用场景-数据迁移.1.复制与克隆
1. 克隆数据库
使用cloneDatabase()
方法克隆远程到本地同名数据库.
语法如下, 克隆远程的mydb
数据库到本地.
> use mydb
> ();
> ("192.168.11.52")
注意:
-
cloneDatabase()
方法只能从远程拉取数据, 不能推送到远程. - 首先要在本地使用
use
命令选择数据库 - 本地数据库中不能存在与远程数据库同名的集合, 否则克隆会失败, 所以可以使用
dropDatabase()
方法清除当前数据库. -
cloneDatabase()
方法的参数为远程主机名, 可以加端口, 如192.168.11.5:27017
.
如下是本地当前数据库中存在与远程数据库同名的collections时的结果, 远程集合无法覆盖本地集合, 而其他集合部分会成功, 也有可能失败导致克隆不完全, 所以dropDatabase()
方法还是很有必要的.
> ('192.168.173.43')
{
"clonedColls" : [ ],
"ok" : 0,
"errmsg" : "collection already exists",
"code" : 48
}
2. 克隆集合
使用cloneCollection()
方法克隆远程指定集合到本地, 并且可以使用过滤条件排队不需要的文档.
语法如下, 克隆远程的mydb
数据库中名为bar
的集合指定文档到本地.
> use mydb
> ("192.168.11.52", "bar", {"name" : "tiger"})
> ();
{ "_id" : ObjectId("53687ff4f433cf04b788c6d3"), "name" : "tiger" }
cloneCollection()
方法参数:
- from: 远程主机地址, 可加端口
- collection: 目标集合名称.
- query: 过滤条件, 可以过滤掉不想要的文档, 与普通查询语句的过滤语法相同.
注意:
-
cloneDatabase()
方法只能从远程拉取数据, 不能推送到远程. - 同样首先需要在本地使用
use
选择数据库, 从远程主机克隆时也是从这个数据库中克隆. - 本地不可以存在同名集合, 否则克隆会失败
3. 拉取/推送数据
copyDatabase()
方法可以从远程主机复制数据库到本地.
参数:
- from: 源数据库名称
- to: 目标数据库名称
- srchost: 可选项, 源数据库的主机地址. 如果就是当前主机, 可以忽略该选项
- username: 可选项, 源主机名用户名
- password: 可选项, 源主机名用户名对应密码
复制本地mydb库到newmydb:
("mydb", "newmydb", "192.168.11.52");
注意:
- 无需使用
use
预告选择数据库, 如果本地不存在指定数据库, 会自行创建. - 并不会产生目标数据库的即时快照. 如果在复制过程中在源或目标库发生读写操作, 会导致数据库不一致(未实验).
- 在操作过程中并不会锁住目标主机, 所以复制过程中可能出现暂时的中断来完成其他操作.
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 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. (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
> ({'name':'general'})
WriteResult({ "nInserted" : 1 })
> show dbs
general 0.000GB
local 0.000GB
1.2 删除
use 数据库名
()
将删除当前选中的数据库, 如果未选中任何数据库, 则删除默认的test
库.
> show dbs
general 0.000GB
local 0.000GB
> use general
switched to db general
> ()
{ "dropped" : "general", "ok" : 1 }
> show dbs
local 0.000GB
2. 集合(Collection)操作
2.1 创建
可以在不显式创建Collection
的情况下插入数据, 但其实mongodb还是隐式地创建了一个Collection
的.
> use general
switched to db general
> show collections
> ({'title':'first post'})
WriteResult({ "nInserted" : 1 })
> show collections
post
> ()
{ "_id" : ObjectId("5844fc0f8430b77f4b8084e0"), "title" : "first post" }
新创建的数据库默认为空, 使用()
方法可以在当前数据库创建一个名为post
的collection, 并向其中插入一条数据.
还可以创建
这种带有点号
.
的集合.
2.2 删除
与清空不同, 删除是指删除整个collection, 而不是单纯清空collection中的数据而保留collection.
collection的删除操作是对于当前数据库而言的, 所以需要先选中一个数据库.
> ()
3. 文档数据操作
2.1 查询
2.1.1 键值查询
## 查询所有
()
## 精确过滤查询
({'title': 'first post'})
## 正则过滤, `/pattern/`正好是js中的正则对象, 可以使用各种正则手段.
({title:/first/});
{ "_id" : ObjectId("5844fc0f8430b77f4b8084e0"), "title" : "first post" }
## 数值比较逻辑, 可用选项为`$gt`, `$lt`, `$gte`, `$lte`
({age: {$gt: 25}});
## 多条件并列查询. 如下示例, 查询年龄大于25, 姓名以ge开头的user.
({age:{$gt: 25}, name: /^ge/})
## 查询指定列. 如下示例第一个大括号代表过滤条件, 空代表查询所有. 第二个大括号代表查询的字段, 1表示true, 0表示false.
## 注意, 如果没有name或age属性也会返回对象, 只是这种对象的name或age字段为空, 又不会显示它的其他字段而已.
({}, {name: 1, age: 1})
## 如下示例表示查询所有name字段不为空的对象, 并返回这些对象的name字段.
({name:/.+/},{name:1})
{ "_id" : ObjectId("584518fb737718c346c9e755"), "name" : "general" }
2.1.2 位置查询
下面两条命令都可以查看当前所在库
db
()
2.2 删除
## 删除指定
({name: 'general'})
## 删除所有, 相当于清空当前collection, 这并不会删除collection本身
({})
系统数据库操作
查看数据库及数据表大小
参考文章
mongodb 查看数据库和表大小
查看指定数据库大小时, 首先要选择一个数据库即use 指定数据库
, 然后执行()
. 示例如下.
> use test
> ();
{
"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
> ();
{
"ns" : "",
"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
}