MongoDB

mongodb相关文档地址

下载地址:

www.mongodb.com

http://www.mongoing.com/

文档地址:

docs.mongodb.com

mongoing.com

http://www.mongoing.com/docs/

http://www.mongodb.org.cn/manual/

MongoDB Compass可视化管理工具
https://www.mongodb.com/download-center/compass

1. MongoDB简介

DBMS

数据

程序:指令+数据

图片

https://db-engines.com/en/ranking

1. NoSQL是什么?

NoSQL=Not Only SQL

1998年Carlo Strozzi首次提出(不提供SQL功能的关系型数据库)

2009年Eric Evans再次提出NoSQL概念

NoSQL、Relational Database相铺相成

2. NoSQL数据库四大家族

  • 列存储:Hbase

  • 键值(Key-Value)存储:Redis

  • 图像存储:Neo4J

  • 文档存储:MongoDB

3. NoSQL的优势

  • 高可扩展性

  • 分布式计算

  • 没有复杂的关系

  • 低成本

  • 架构灵活

半结构化数据

4. MongoDB的哲学

图片

5. 关系与非关系模型

关系模型

图片

非关系模型

图片

6. MongoDB与RDBMS的区别

MongoDB与RDBMS最大的区别在于:没有固定的行列组织数据结构

图片

7. MongoDB数据存储格式

文档型

–JSON

MongoDB 使用JSON(JavaScript ObjectNotation)文档存储记录。

JSON数据库语句可以容易被解析

Web 应用大量使用

NAME-VALUE 配对,例如:

{

product: “car”, 

brand: “Benz”,

color: “blue” } 

8. BSON

二进制的JSON,JSON文档的二进制编码存储格式

BSON有JSON没有的Date和BinData

MongoDB中document以BSON形式存放

db.meeting.insert({meeting:“SHOUG June”,Date:“2015-06-15”});

图片

9. 灵活的数据格式

  1. **文档里嵌入了文档 **
{

_id: ObjectID("1"),

username: “Silence”,

regDate:10-10-2015,

scores: {

math: "80",

english: "200"

}

}
  1. ** 一个KEY对应一个数组 **
{

_id: ObjectID("1"),

username: “Silence”,

regDate:10-10-2015,

scores: {

math: "80",

english: "200"

}

Attr:[“a1”,”a2”]

}

10. MongoDB的优势

开源

MongoDB是开源产品

On GitHub

Licensed under the AGPL

起源& 赞助by MongoDB公司

提供商业版licenses 许可

11. 支持多种存储引擎

图片

12. 存储引擎比较

图片

13. MongoDB体系结构

跨平台

–Linux、Unix、Mac、Windows

–整体架构相同

MongoDB Server

–实例、数据库及其对应关系

数据逻辑结构

–文档、集合、数据库

数据存储

–元数据、实际数据

14. 数据逻辑结构

  1. ** 层次关系 **
  • 文档(document) ------ 行

  • 集合(collection) ---- 表

  • 数据库(database) — 库

  1. ** 层次关系图**

图片

15. MongoDB与RDBMS数据结构逻辑对比

图片

16. 应用场景

网站数据

缓存

大尺寸、低价值的数据

高伸缩性的场景

用于对象及JSON数据的存储

17. MongoDB用户案例

图片

18. 互联网典型应用

图片

19. MongoDB 商业价值

图片

安装配置

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-linux/

  1. ** 安装准备**

–准备Redhat或Centos6.2以上系统

–关闭iptables&Senlinux

–配置IP地址和hosts解析

–关闭hugepage大页内存

–创建mongodb所需用户

–创建所需目录,并授权

关闭大页内存

root用户下

在vi /etc/rc.local最后添加如下代码

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/

useradd mongod
echo 123456 |passwd --stdin mongod
mkdir /mongodb/{bin,data,log,conf} -p
cd /root/mongodb-linux-x86_64-rhel62-3.2.16/bin
cp * /mongodb/bin

(4)设置目录结构权限

chown -R mongod:mongod /mongodb

(5)设置用户环境变量

su - mongod

vi .bash_profile

export PATH=/mongodb/bin:$PATH

source .bash_profile

  1. ** 启动mongodb**
mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork
  1. ** 登录mongodb**

mongo

mongo 10.0.0.51/admin
  1. ** 配置文件**

vim /mongodb/conf/mongod.conf

dbpath=/mongodb/data
logpath=/mongodb/log/mongodb.log
port=27017
logappend=true
fork=true
  1. ** 带配置文件启动**
mongod -f /mongodb/conf/mongod.conf
  1. ** 关闭**
mongod -f /mongodb/conf/mongod.conf --shutdown

或者登陆到mongodb中,use到admin库下

use admin;
admin> db.shutdownServer()

admin> db.adminCommand({shutdown:1})

yml配置文件

https://docs.mongodb.com/manual/reference/configuration-options/

简易配置文件(yml)

/mongodb/conf/mongo.conf

systemLog:
   destination: file
   path: "/mongodb/log/mongodb.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "/mongodb/data/"
processManagement:
   fork: true
net:
   port: 27017
   bindIp: 10.0.0.51,127.0.0.1

mongodb 使用systemd管理

cat > /etc/systemd/system/mongod.service <<EOF
[Unit]
Description=mongodb 
After=network.target remote-fs.target nss-lookup.target
[Service]
User=mongod
Type=forking
ExecStart=/mongodb/bin/mongod --config /mongodb/conf/mongo.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/mongodb/bin/mongod --config /mongodb/conf/mongo.conf --shutdown
PrivateTmp=true  
[Install]
WantedBy=multi-user.target
EOF
  1. ** 数据操作语言crud**

https://docs.mongodb.com/v3.2/tutorial/getting-started/

  1. ** help**

help

 db.help()                    help on db methods
 db.mycoll.help()             help on collection methods
 sh.help()                    sharding helpers
 rs.help()                    replica set helpers
 help admin                   administrative help
 help connect                 connecting to a db help
 help keys                    key shortcuts
 help misc                    misc things to know
 help mr                      mapreduce
 show dbs                     show database names
 show collections             show collections in current database
 show users                   show users in current database
 show profile                 show most recent system.profile entries with time >= 1ms
 show logs                    show the accessible logger names
 show log [name]              prints out the last segment of log in memory, 'global' is default
 use <db_name>                set current database
 db.foo.find()                list objects in collection foo
 db.foo.find( { a : 1 } )     list objects in foo where a == 1
 it                           result of the last line evaluated; use to further iterate
 DBQuery.shellBatchSize = x   set default number of items to display on shell
 exit                         quit the mongo shell
  1. ** 查看版本**
db.version()

db. 数据库和数据库对象管理

rs. 复制集有关

sh. 集群有关

show

  1. ** 库**
db.help();
  1. ** 查看所有库**
show dbs;
  1. ** 进入库**
use 库名;

可以use 不存在的库

  1. ** 查看当前所在库**

db

db.getName();
  1. ** 删除test数据库**
test> show dbs
local 0.000GB
test 0.000GB
test> use test
switched to db test
test> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
  1. ** 查看当前数据库状态**
db.stats();
  1. ** 查看当前连接**
db.getMongo();
  1. ** 集合(表)**
  2. ** 查看集合**
show tables;
show collections;
  1. 创建集合
db.createCollection('t1');
  1. ** 查看集合**
db.t2.find();
{ "_id" : ObjectId("5ad69dd609c480f14ec7243c"), "name" : "xiaoming" }
{ "_id" : ObjectId("5ad69e0609c480f14ec7243d"), "name" : "xiaohong" }
{ "_id" : ObjectId("5ad69e0b09c480f14ec7243e"), "name" : "xiaolan" }
  1. ** 修改集合名**
db.t2.renameCollection('table2')
  1. ** 查看集合行数**
db.t3.find().count();
  1. ** 查询集合信息**
db.log.stats()
db.log.dataSize()   //集合中数据的原始大小
db.log.totalIndexSize()   //集合中索引数据的原始大小
db.log.totalSize()     //集合中索引+数据压缩存储之后的大小
db.log.storageSize()   //集合中数据压缩存储的大小
  1. ** 删除集合**
db.t1.drop()
  1. ** 文档**
  2. ** 插入文档**
db.t2.insert({name:"xiaoming"})
db.t3.insert({id:1,name:"zhangsan",age:20});
for(i=0;i<10000;i++){ db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()}); }
  1. ** 查看文档**
db.t2.find({name:"xiaoming"});
db.t2.find({"_id" : ObjectId("5ad69e0b09c480f14ec7243e")})
{ "_id" : ObjectId("5ad69e0b09c480f14ec7243e"), "name" : "xiaolan" }
db.t3.insert({id:1,name:"zhangsan",age:20});

WriteResult({ "nInserted" : 1 })

db.t3.insert({id:2,name:"lisi",age:30});

WriteResult({ "nInserted" : 1 })

db.t3.find({id:2});

{ "_id" : ObjectId("5ad69fe309c480f14ec72440"), "id" : 2, "name" : "lisi", "age" : 30 }

db.t3.find({name:"lisi"});

{ "_id" : ObjectId("5ad69fe309c480f14ec72440"), "id" : 2, "name" : "lisi", "age" : 30 }

db.t3.find({age:30});

{ "_id" : ObjectId("5ad69fe309c480f14ec72440"), "id" : 2, "name" : "lisi", "age" : 30 }
  1. ** 删除行**
db.log.remove({uid:1})

删除所有行

db.log.remove({})
  1. ** 去重**
db.log.distinct("name")

mongdb执行js脚本

repSetTest:PRIMARY> use tempdb
switched to db tempdb
repSetTest:PRIMARY> load("find.js")

用户管理

创建超级管理员

管理所有数据库

  • 1、先use admin;
  • 2,roles中的db必须是admin;
  • 3、创建完用户后必须在登录时就指定验证数据库为admin
  • 4、配置完成用户后要在配置文件中打开验证功能

**role:root, readWrite,read **

配置文件

security:
  authorization: enabled

或者

auth=1

创建用户

db.createUser
{
    user: "<name>",
    pwd: "<cleartext password>",
    roles: [
       { role: "<role>",
     db: "<database>" } | "<role>",
    ...
    ]
}
use admin
db.createUser(
{
  user: "root",
  pwd: "root123",
  roles: [ { role: "root", db: "admin" } ]
}
)

验证用户

db.auth('root','root123')

用户认证登录

mongo -uroot -proot123 10.0.0.51/admin
  1. ** 自定义数据库用户**

创建app数据库的管理员:先登录到admin数据库

use app
db.createUser(
  {
    user: "admin",
    pwd: "admin",
    roles: [ { role: "dbAdmin", db: "app" } ]
  }
)

验证用户

db.auth('admin','admin')
  1. ** 查看用户**
db.system.users.find().pretty()
  1. ** 创建数据库读、写权限的用户**
  2. ** 创建一个管理zabbix库的开发用户(rw)**
use zabbix
db.createUser(
  {
    user: "zabbix",
    pwd: "zabbix",
    roles: [ "readWrite" ]
  }
)
  1. ** 创建一个针对zabbix库只读的用户**
use zabbix
db.createUser(
  {
    user: "zabbix1",
    pwd: "zabbix1",
    roles: [ "read" ]
  }
)
  1. ** 删除用户**
mongo -uroot -proot123 10.0.0.51/admin
use oldboy1
db.createUser({user: "app02",pwd: "app02",roles: [ { role: "readWrite" , db: "oldboy1" } ]})
mongo -uroot -proot123 10.0.0.51/admin
use oldboy1
db.dropUser("app02")

复制集技术

  1. ** 配置文件**

conf/mongod.conf

systemLog:
  destination: file
  path: /mongodb/28017/log/mongodb.log
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /mongodb/28017/data
  directoryPerDB: true
  #engine: wiredTiger
  wiredTiger:
    engineConfig:
      #cacheSizeGB: 0.5
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
processManagement:
  fork: true
net:
  port: 28017
replication:
  oplogSizeMB: 2048
  replSetName: my_repl
  1. ** 配置复制集**

(1)1主2从,从库普通从库

config = {_id: 'my_repl', members: [

                          {_id: 0, host: '10.0.0.52:28017 

'},

                          {_id: 1, host: '10.0.0.52:28018 

'},

                          {_id: 2, host: '10.0.0.52:28019 

'}]

          }
rs.initiate(config)
  1. ** 复制集测试**
my_repl:PRIMARY> db.movies.insert([ { "title" : "Jaws", "year" : 1975, "imdb_rating" : 8.1 },

... { "title" : "Batman", "year" : 1989, "imdb_rating" : 7.6 },

... ] );

BulkWriteResult({

"writeErrors" : [ ],

"writeConcernErrors" : [ ],

"nInserted" : 2,

"nUpserted" : 0,

"nMatched" : 0,

"nModified" : 0,

"nRemoved" : 0,

"upserted" : [ ]

})
my_repl:SECONDARY> db.movies.find().pretty();
 rs.slaveOk();
  1. 查看复制集状态

rs.status(); //查看整体复制集状态

rs.isMaster(); // 查看当前是否是主节点

rs.add(“ip:port”); // 新增从节点

rs.addArb(“ip:port”); // 新增仲裁节点

rs.remove(“ip:port”); // 删除一个节点

添加特殊节点时

1>可以在搭建过程中设置特殊节点

2>可以通过修改配置的方式将普通从节点设置为特殊节点

/找到需要改为延迟性同步的数组号/;

cfg=rs.conf()

cfg.members[N].priority=0

cfg.members[N].slaveDelay=120

cfg.members[N].hidden=true

rs.reconfig(cfg)

[2] 索引下标


cfg.members[N].arbiterOnly=true

分片集群

图片

mongos 路由

  • 提供对外应用访问,所有操作均通过mongos执行。一般有多个mongos节点。数据迁移和数据自动平衡

config server

  • 存储集群所有节点、分片数据路由信息。默认需要配置3个ConfigServer节点

mongod

存储应用数据记录。一般有多个Mongod节点,达到数据分片目的

数据分布

初始1个chunk

缺省chunk 大小:64MB

MongoDB:自动拆分& 迁移chunks

图片

  1. mongos的chunk自动迁移

图片

  1. ** 分片键shard key**

必须为分片collection 定义分片键

基于一个或多个列(类似一个索引)

分片键定义数据空间

想象key space 类似一条线上一个点数据

一个key range 是一条线上一段数据

我们可以按照分片键进行Range和Hash分片

  1. ** 分片方式**

范围(range)分片

hash分片

  1. ** 分片注意事项**

分片键是不可变

分片键必须有索引

分片键大小限制512bytes

分片键用于路由查询

MongoDB不接受已进行collection级分片的collection上插入无分片键的文档(也不支持空值插入)

  1. ** 分片集群搭建**
  2. ** 规划**
  3. ** mongos**

port 29017

dir:/mongodb/29017/conf /mongodb/29017/log /mongod/29017/data

  1. ** confdb**

port:29018,29019,29020

replSetName: configReplSet

clusterRole: configsvr

dir:

/mongodb/29018/conf /mongodb/29018/log /mongod/29018/data

/mongodb/29019/conf /mongodb/29019/log /mongod/29019/data

/mongodb/29020/conf /mongodb/29020/log /mongod/29020/data

  1. ** shard1**

port:29021,29022,29023

replSetName: sh1

clusterRole: shardsvr

dir:

/mongodb/29021/conf /mongodb/29021/log /mongod/29021/data

/mongodb/29022/conf /mongodb/29022/log /mongod/29022/data

/mongodb/29023/conf /mongodb/29023/log /mongod/29023/data

  1. ** shard2**

port:29024,29025,29026

replSetName: sh2

clusterRole: shardsvr

dir:

/mongodb/29024/conf /mongodb/29024/log /mongod/29024/data

/mongodb/29025/conf /mongodb/29025/log /mongod/29025/data

/mongodb/29026/conf /mongodb/29026/log /mongod/29026/data

  1. ** 配置节点**
mkdir -p /mongodb/2902{1..6}/{bin,conf,log,data}
  1. ** 配置文件**
  • 29021 29022 29023

cat /mongodb/29021/conf/mongodb.conf

systemLog:

  destination: file

  path: /mongodb/29021/log/mongodb.log   

  logAppend: true

storage:

  journal:

    enabled: true

  dbPath: /mongod/29021/data

  directoryPerDB: true

  #engine: wiredTiger

  wiredTiger:

    engineConfig:

      cacheSizeGB: 1

      directoryForIndexes: true

    collectionConfig:

      blockCompressor: zlib

    indexConfig:

      prefixCompression: true

net:

  bindIp: 10.0.0.52

  port: 29021

replication:

  oplogSizeMB: 2048

  replSetName: sh1

sharding:

  clusterRole: shardsvr

processManagement: 

  fork: true
  • 29024 29025 29026

cat /mongodb/29024/conf/mongodb.conf

systemLog:

  destination: file

  path: /mongodb/29024/log/mongodb.log   

  logAppend: true

storage:

  journal:

    enabled: true

  dbPath: /mongod/29024/data

  directoryPerDB: true

  #engine: wiredTiger

  wiredTiger:

    engineConfig:

      cacheSizeGB: 1

      directoryForIndexes: true

    collectionConfig:

      blockCompressor: zlib

    indexConfig:

      prefixCompression: true

net:

  bindIp: 10.0.0.52

  port: 29024

replication:

  oplogSizeMB: 2048

  replSetName: sh2

sharding:

  clusterRole: shardsvr

processManagement: 

  fork: true
  1. ** 创建数据目录**
mkdir -p /mongod/2902{1..6}/data
  1. ** 拷贝配置文件**
cp /mongodb/29021/conf/mongodb.conf /mongodb/29022/conf/

cp /mongodb/29021/conf/mongodb.conf /mongodb/29023/conf/

cp /mongodb/29021/conf/mongodb.conf /mongodb/29024/conf/

cp /mongodb/29021/conf/mongodb.conf /mongodb/29025/conf/

cp /mongodb/29021/conf/mongodb.conf /mongodb/29026/conf/
  1. ** 修改配置文件**
sed 's#29021#29022#g' /mongodb/29022/conf/mongodb.conf -i

sed 's#29021#29023#g' /mongodb/29023/conf/mongodb.conf -i

sed 's#29021#29024#g' /mongodb/29024/conf/mongodb.conf -i

sed 's#29021#29025#g' /mongodb/29025/conf/mongodb.conf -i

sed 's#29021#29026#g' /mongodb/29026/conf/mongodb.conf -i
  1. ** 启动所有节点**
mongod -f /mongodb/29021/conf/mongodb.conf

mongod -f /mongodb/29022/conf/mongodb.conf

mongod -f /mongodb/29023/conf/mongodb.conf

mongod -f /mongodb/29024/conf/mongodb.conf

mongod -f /mongodb/29025/conf/mongodb.conf

mongod -f /mongodb/29026/conf/mongodb.conf

#停止

mongod -f /mongodb/29024/conf/mongodb.conf --shutdown
  1. ** shard配置复制集**
  2. ** sh1**

29021操作

mongo --host 10.0.0.52 --port 29021
config = {_id: 'sh1', members: [

                          {_id: 0, host: '10.0.0.52:29021'},

                          {_id: 1, host: '10.0.0.52:29022'},

                          {_id: 2, host: '10.0.0.52:29023',"arbiterOnly":true}]

           }

rs.initiate(config)
  1. ** sh2**

29024操作

mongo --host 10.0.0.52 --port 29024
config = {_id: 'sh2', members: [

                          {_id: 0, host: '10.0.0.52:29024'},

                          {_id: 1, host: '10.0.0.52:29025'},

                          {_id: 2, host: '10.0.0.52:29026',"arbiterOnly":true}]

           }

rs.initiate(config)
  1. ** config节点配置**
mkdir -p /mongodb/290{18..20}/{conf,log,data}
  1. ** 配置文件 (29018 29019 29020)**

/mongodb/29018/conf/mongodb.conf

systemLog:

  destination: file

  path: /mongodb/29018/log/mongodb.conf

  logAppend: true

storage:

  journal:

    enabled: true

  dbPath: /mongodb/29018/data

  directoryPerDB: true

  #engine: wiredTiger

  wiredTiger:

    engineConfig:

      cacheSizeGB: 1

      directoryForIndexes: true

    collectionConfig:

      blockCompressor: zlib

    indexConfig:

      prefixCompression: true

net:

  bindIp: 10.0.0.52

  port: 29018

replication:

  oplogSizeMB: 2048

  replSetName: configReplSet

sharding:

  clusterRole: configsvr

processManagement: 

  fork: true
cp /mongodb/29018/conf/mongodb.conf /mongodb/29019/conf/

cp /mongodb/29018/conf/mongodb.conf /mongodb/29020/conf/

sed 's#29018#29019#g' /mongodb/29019/conf/mongodb.conf -i

sed 's#29018#29020#g' /mongodb/29020/conf/mongodb.conf -i
  1. ** 启动config节点,并配置复制集**

启动

mongod -f /mongodb/29018/conf/mongodb.conf

mongod -f /mongodb/29019/conf/mongodb.conf

mongod -f /mongodb/29020/conf/mongodb.conf

登录

mongo --host 10.0.0.52 --port 29018

配置复制集

config = {_id: 'configReplSet', members: [

                          {_id: 0, host: '10.0.0.52:29018'},

                          {_id: 1, host: '10.0.0.52:29019'},

                          {_id: 2, host: '10.0.0.52:29020'}]

           }

rs.initiate(config)
  1. ** mongos节点配置**

图片

mkdir -p /mongodb/29017/{conf,log,data}
  1. ** 配置文件**

cat /mongodb/29017/conf/mongos.conf

systemLog:

  destination: file

  path: /mongodb/29017/log/mongos.log

  logAppend: true

net:

  bindIp: 10.0.0.52

  port: 29017

sharding:

  configDB: configReplSet/10.0.0.52:29018,10.0.0.52:29019,10.0.0.52:29020

processManagement: 

  fork: true
  1. ** 启动mongos**
mongos -f /mongodb/29017/conf/mongos.conf
  1. 分片集群操作
  2. 连接到mongs的admin数据库
mongo 10.0.0.52:29017/admin
  1. ** 添加分片**
db.runCommand( { addshard : "sh1/10.0.0.52:29021,10.0.0.52:29022,10.0.0.52:29023",name:"shard1"} )

db.runCommand( { addshard : "sh2/10.0.0.52:29024,10.0.0.52:29025,10.0.0.52:29026",name:"shard2"} )
  1. ** 列出分片**
db.runCommand( { listshards : 1 } )
  1. ** 整体状态查看**
sh.status();
  1. ** +++++++++++++++扩展**

1、激活数据库分片功能

admin>  ( { enablesharding : "数据库名称" } )

eg:

admin> db.runCommand( { enablesharding : "test" } )

2、指定分片建对集合分片

eg:范围片键

–创建索引

admin> db.vast.ensureIndex( { id: 1 } )

admin> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )

3、集合分片验证

admin> use test

test> for(i=0;i<2000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }

test> db.vast.stats()

3、分片键

–范围片键

admin> sh.shardCollection("数据库名称.集合名称",key : {分片键: 1}  )

admin> db.runCommand( { shardcollection : "数据库名称.集合名称",key : {分片键: 1} } )

eg:

admin > sh.shardCollection("test.vast",key : {id: 1}  )

admin> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )

–哈希片键

admin > sh.shardCollection( "数据库名.集合名", { 片键: "hashed" } )

eg:

创建哈希索引

admin> db.vast.ensureIndex( { a: "hashed" } )

admin > sh.shardCollection( "test.vast", { a: "hashed" } )

4、判断是否Shard集群

admin> db.runCommand({ isdbgrid : 1})

5、列出所有分片信息

admin> db.runCommand({ listshards : 1})

6、列出开启分片的数据库

admin> use config

config> db.databases.find( { "partitioned": true } )

config> db.databases.find() //列出所有数据库分片情况

7、查看分片的片键

config> db.collections.find()

{

 "_id" : "test.vast",

 "lastmodEpoch" : ObjectId("58a599f19c898bbfb818b63c"),

 "lastmod" : ISODate("1970-02-19T17:02:47.296Z"),

 "dropped" : false,

 "key" : {

  "id" : 1

 },

 "unique" : false

}

8、查看分片的详细信息

admin> db.printShardingStatus()

admin> sh.status()

9、删除分片节点

sh.getBalancerState()

mongos> db.runCommand( { removeShard: "shard2" } )

10、blancer操作

mongos> sh.stopBalancer()

mongos> sh.startBalancer()

自定义 自动平衡进行的时间段

// connect to mongos

db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "00:00", stop : "5:00" } } }, true )

关于集合的balance

关闭某个集合的balance

sh.disableBalancing("students.grades")

打开某个集合的balance

sh.enableBalancing("students.grades")

确定某个集合的balance是开启或者关闭

db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;

备份恢复

https://www.mongodb.com/try/download/database-tools

备份工具

  • mongoexport / mongoimport json 或 csv

1、异构平台迁移 mysql <—> mongodb

2、同平台,跨大版本:mongodb 2 ----> mongodb 3

  • mongodump / mongorestore bson

日常备份恢复

mongoexport / mongoimport

mongoexport --help  
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导出那些列
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
--authenticationDatabase admin

创建数据

use oldguo
for(i=0;i<200;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
db.vast.find()
  1. ** 导出**
mongoexport -h 10.0.0.51:29021 -uroot -proot123 --authenticationDatabase admin -d app -c vast -o /backup/mongodb/vast.json
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo -c vast -o /mongodb/vast.json
  1. ** json格式**
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo -c vast -o /backup/mongodb/vast.json
  1. ** csv格式**
mongoexport -uroot -proot123 --port 27017  --authenticationDatabase admin -d oldguo -c vast --type=csv -f id,name -o /backup/mongodb/vast.csv
  1. ** 导入**
  2. ** json格式**
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin  -d oldguo -c vast --drop /backup/mongodb/vast.json
  1. ** csv格式**
mongoimport -uroot -proot123 --port 27017  -uroot -proot123 --authenticationDatabase admin -d app -c vast --drop -f id,name --type=csv --headerline  --file=/backup/mongodb/vast.csv

mysql导出csv

select * from world.city into outfile '/tmp/city1.csv' fields terminated by ',';
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d world  -c city --type=csv -f ID,Name,CountryCode,District,Population --file  /tmp/city1.csv
#备份单表
mongoexport --host x.x.x.x --port 27017 -uadmin -pxxx  --authenticationDatabase admin -d-c-o 指定备份文件名


#恢复单表
mongoimport --host x.x.x.x --port 27017 -uadmin -pxxx  --authenticationDatabase admin -d-c--file 指定备份文件名

mongodump和mongorestore

介绍

  • mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档写入磁盘。

  • 但是存在的问题时使用mongodump产生的备份不一定是数据库的实时快照,如果我们在备份时对数据库进行了写入操作,

  • 则备份出来的文件可能不完全和Mongodb实时数据相等。另外在备份时可能会对其它客户端性能产生不利的影响。

mongodump用法

$ mongodump --help
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
-j, --numParallelCollections=  number of collections to dump in parallel (4 by default)
--oplog  备份的同时备份oplog

全库备份

mkdir /mongodb/backup
mongodump  -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup

备份oldguo库

mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo -o /mongodb/backup/

备份oldguo库下的vast集合

mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c vast -o /mongodb/backup/

压缩备份

mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo -o /mongodb/backup/ --gzip
mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup/ --gzip
mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d app -c vast -o /mongodb/backup/ --gzip

恢复world库

mongorestore   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world   /mongodb/backup/world

恢复oldguo库下的vast集合

[mongod@db03 oldboy]$ mongorestore   -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo -c vast  --gzip  /mongodb/backup.bak/oldboy/log1.bson.gz 

drop表示恢复的时候把之前的集合drop掉(危险)

$ mongorestore  -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy --drop  /mongodb/backup/oldboy

mongodump和mongorestore高级企业应用(–oplog)

注意:这是replica set或者master/slave模式专用

–oplog

use oplog for taking a point-in-time snapshot

oplog介绍

在replica set中oplog是一个定容集合(capped collection),它的默认大小是磁盘空间的5%(可以通过–oplogSizeMB参数修改).

位于local库的db.oplog.rs,有兴趣可以看看里面到底有些什么内容。

其中记录的是整个mongod实例一段时间内数据库的所有变更(插入/更新/删除)操作。

当空间用完时新记录自动覆盖最老的记录。

其覆盖范围被称作oplog时间窗口。需要注意的是,因为oplog是一个定容集合,

所以时间窗口能覆盖的范围会因为你单位时间内的更新次数不同而变化。

想要查看当前的oplog时间窗口预计值,可以使用以下命令:

 mongod -f /mongodb/28017/conf/mongod.conf 
 mongod -f /mongodb/28018/conf/mongod.conf 
 mongod -f /mongodb/28019/conf/mongod.conf 
 mongod -f /mongodb/28020/conf/mongod.conf 
 use local 
 db.oplog.rs.find().pretty()
"ts" : Timestamp(1553597844, 1),

"op" : "n"

"o"  :

"i": insert

"u": update

"d": delete

"c": db cmd

test:PRIMARY> rs.printReplicationInfo()
configured oplog size:   1561.5615234375MB <--集合大小
log length start to end: 423849secs (117.74hrs) <--预计窗口覆盖时间
oplog first event time:  Wed Sep 09 2015 17:39:50 GMT+0800 (CST)
oplog last event time:   Mon Sep 14 2015 15:23:59 GMT+0800 (CST)
now:                     Mon Sep 14 2015 16:37:30 GMT+0800 (CST)

oplog企业级应用

(1)实现热备,在备份时使用–oplog选项

注:为了演示效果我们在备份过程,模拟数据插入

(2)准备测试数据

use oldboy
for(var i = 1 ;i < 100; i++) {
    db.foo.insert({a:i});
}
my_repl:PRIMARY> db.oplog.rs.find({"op":"i"}).pretty()

oplog 配合mongodump实现热备

mongodump --port 28017 --oplog -o /mongodb/backup

作用介绍:–oplog 会记录备份过程中的数据变化。会以oplog.bson保存下来

恢复

mongorestore  --port 28017 --oplogReplay /mongodb/backup

oplog高级应用

背景:每天0点全备,oplog恢复窗口为48小时

某天,上午10点world.city 业务表被误删除。

恢复思路:

0、停应用

2、找测试库

3、恢复昨天晚上全备

4、截取全备之后到world.city误删除时间点的oplog,并恢复到测试库

5、将误删除表导出,恢复到生产库

恢复步骤:

模拟故障环境:

1、全备数据库

模拟原始数据

mongo --port 28017
use wo
for(var i = 1 ;i < 20; i++) {
    db.ci.insert({a: i});
}

全备:

mongodump --port 28017 --oplog -o /mongodb/backup

–oplog功能:在备份同时,将备份过程中产生的日志进行备份

文件必须存放在/mongodb/backup下,自动命令为oplog.bson

再次模拟数据

db.ci1.insert({id:1})
db.ci2.insert({id:2})

2、上午10点:删除wo库下的ci表

10:00时刻,误删除

db.ci1.drop()
show tables;

3、备份现有的oplog.rs表

mongodump --port 28017 -d local -c oplog.rs  -o /mongodb/backup

4、截取oplog并恢复到drop之前的位置

更合理的方法:登陆到原数据库

mongo --port 28017
my_repl:PRIMARY> use local
db.oplog.rs.find({op:"c"}).pretty();
{
    "ts" : Timestamp(1553659908, 1),
    "t" : NumberLong(2),
    "h" : NumberLong("-7439981700218302504"),
    "v" : 2,
    "op" : "c",
    "ns" : "wo.$cmd",
    "ui" : UUID("db70fa45-edde-4945-ade3-747224745725"),
    "wall" : ISODate("2019-03-27T04:11:48.890Z"),
    "o" : {
        "drop" : "ci"
    }
}

获取到oplog误删除时间点位置:

“ts” : Timestamp(1553659908, 1)

5、恢复备份+应用oplog

[mongod@db03 backup]$ cd /mongodb/backup/local/
[mongod@db03 local]$ ls
oplog.rs.bson  oplog.rs.metadata.json
[mongod@db03 local]$ cp oplog.rs.bson ../oplog.bson 
rm -rf /mongodb/backup/local/
mongorestore --port 28017  --oplogReplay --oplogLimit "1553659908:1"  --drop   /mongodb/backup/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wuxingge

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

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

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

打赏作者

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

抵扣说明:

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

余额充值