MongoDB数据库了解与学习笔记

MongoDB数据库

一、MongoDB认识

MongoDB是一款C语言开源开发的,跨平台,面向文档的NoSQL数据库

什么是NoSQL?

存储数据不以关系模型为依据,不需要固定的表格式。非关系型数据库作为关系型数据库的一个补充,在日益快速发展的网站时代,发挥着高效与高性能,NoSQL用于超大规模数据的存储

常用的非关系型数据库:MongoDB、Memcache Redis、HBase

非关系型数据库的优点:1.数据库高并发读写的需求

                                        2.对海量数据高效率存储与访问

                                        3.数据库的高扩展性与高可用性的需求

MangoDB的定义

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的

为 Web 应用提供可扩展的高性能数据存储解决方案,主要适用于网站数据、数据缓存、分布式场景和JSON文档格式存储,适合大数据量高并发弱事务的互联网应用上

MongoDB的优缺点

优点:高可扩展性、分布式计算、低成本、架构的灵活性,半结构化数据、没有复杂的关系

MongoDB提供了复制、高可用性和自动分片功能,支持丰富的查询表达式,支持各种编程语言,比如RUBY,PYTHON,JAVA,C++,PHP,C#等

缺点:没有标准化、有限的查询功能

MongoDB运行的两大概念集合(collection)和文档(document)

在MongoDB中表的概念换成了集合,数据的概念换成了文档

二、MongoDBLinux下的安装

1.下载安装依赖包和MongoDB安装包

yum -y install openssl-devel

tar zxf mongodb-linux-x86_64-rhel62-3.2.10.tgz

mv mongodb-linux-x86_64-rhel62-3.2.10 /usr/local/mongodb

2.创建MongoDB的数据存储目录/data/mongodb1,日志目录/data/logs日志文件,并加权限

注意:大多类似UNIX的操作系统,包括Linux和OS X,都提供了限制每个进程和每个基本用户使用线程,文件和网络连接等系统资源的一些方法

mkdir -p /data/mongodb1

mkdir -p /data/logs/mongodb

touch /data/logs/mongodb/mongodb1.log

chmod -R 777 /data/logs/mongodb/mongodb1.log

当MongDB处于频繁访问状态,如果shell启动进程所占用的资源设置过低,将会产生错误导致无法连接MongoDB,需要设置

Linux系统默认一个进程最大文件打开数目为1024,有时,这些限制的默认值太小,这会导致正常MongoDB操作过程中出现一系列问题

ulimit -u 25000(单个进程文件打开数)

ulimit -n 25000(可打开的进程/线程)

3.创建MangoDB配置文件和设置启动参数

vim /usr/local/mongodb/bin/mongodb1.conf

port=27017      \\默认服务端口号 
dbpath=/data/mongodb1      \\数据存储目录
logpath=/data/logs/mongodb/mongodb1.log     \\日志文件
logappend=true       \\使用追加的方式写日志
fork=true      \\后台运行
maxConns=5000       \\最大同时连接数,默认是2000
storageEngine=mmapv1    \\指定存储引擎为内存映射文件

4.设置内核参数

 echo "0" > /proc/sys/vm/zone_reclaim_mode

sysctl -w vm.zone_reclaim_mode=0

echo "never" > /sys/kernel/mm/transparent_hugepage/enabled

echo "never" > /sys/kernel/mm/transparent_hugepage/defrag

5.启动和停止MongoDB

启动:/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb1.conf

停止:/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb1.conf --shutdown

MongoDB的多实例

创建MongoDB新的数据存储目录/data/mongodb2日志文件添加权限

mkdir /data/mongodb2

touch /data/logs/mongodb/mongodb2.log

chmod -R 777 /data/logs/mongodb/mongodb2.log

在存放主配置文件的目录创建新主配置文件,内容对比第一个实例的配置文件修改下面参数即可(需要创建几个实例就复制编辑几个,名字不同)

vim /usr/local/mongodb/bin/mongodb2.conf

port=27018

dbpath=/data/mongodb2

logpath=/data/logs/mongodb/mongodb2.log

启动实例(启动方式跟第一个实例一样)

三、MongoDB基础

MongoDB的存储结构

逻辑结构主要由集合(collection)文档(Document)数据库(database)三个部分组成,其中文档是核心概念,它是MongoDB逻辑存储最小的存储单元

★集合:

合法的集合名:1.集合名不能是空字符串""。

                          2.集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。

                          3.集合名不能以"system."开头,这是为系统集合保留的前缀。

                          4.用户创建的集合名字不能含有保留字符,有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的 集合中包含该字符,除非你要访问这种系统创建的集合,否则千万不要在名字里出现$

★文档:

文档是一组键值(key-value)对(即BSON),MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点

需要注意的是:1.文档中的键/值对是有序的

                         2.文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)

                         3.MongoDB区分类型和大小写

                         4.MongoDB的文档不能有重复的键

                         5.文档的键是字符串,除了少数例外情况,键可以使用任意UTF-8字符

物理存储结构:

数据存储结构:命名空间文件(.ns结尾文件) 数据文件(.0,1,2,3...)

日志存储结构:journal日志文件:用于MongDB崩溃恢复的保障

                         oplog复制操作日志文件:只有在主从复制开启之后才会出现

                         慢查询日志:需要开启后才可以

★数据库:

初始内建数据库:admin:admin库主要存放有数据库帐号相关信息。

                             local:local数据库永远不会被复制到从节点,可以用来存储限于本地单台服务器的任意集合

                             config:config数据库用于分片集群环境,存放了分片相关的元数据信息。

                             test:MongoDB默认创建的一个测试库

MongoDB数据类型

String:字符串,存储数据常用的数据类型,在 MongoDB 中,UTF-8 编码的字符串才是合法的
Integer:整型数值,用于存储数值,根据你所采用的服务器,可分为 32 位或 64 位
Boolean:布尔值,用于存储布尔值(真/假)
Double:双精度浮点值,用于存储浮点值
Min/Max keys:将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比
Array:用于将数组或列表或多个值存储为一个键
Timestamp:时间戳,记录文档修改或添加的具体时间
Object:用于内嵌文档
Null:用于创建空值
Symbol:符号,该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言
Date:日期时间,用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息
Object ID:对象 ID,用于创建文档的 ID
Binary Date:二进制数据,用于存储二进制数据
Code:代码类型,用于在文档中存储 JavaScript 代码
Regular expression:正则表达式类型。用于存储正则表达式

MongoDB的基础操作

本地登录:/usr/local/mongodb/bin/mongo(默认登录27017端口,数据库test,默认无密码登录)

远程登录:mongodb://zhangsan:[email protected]:27017

查看数据库:>show dbs

显示用户:>show users

切换数据库:>use 数据库名(如果数据库不存在,则创建数据库,否则切换到指定数据库)

显示数据库操作命令:>db.help()

查看集合:>show collections

显示集合操作命令:>db.集合名.help()

查找文档:>db.集合名.find()

创建集合:>db.createCollection(name,options)

options参数:
capped(布尔):(可选)如果为 true,则创建固定集合,固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档,当该值为 true 时,必须指定 size 参数
autoIndexId(布尔):(可选)如为 true,自动在 _id 字段创建索引,默认为 false
size(数值):(可选)为固定集合指定一个最大值(以字节计),如果 capped 为 true,也需要指定该字段
max(数值):(可选)指定固定集合中包含文档的最大数量

创建固定集合 test,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个

>db.createCollection("test", { capped : true, autoIndexId : true, size : 6142800, max : 10000})

集合被设置成了固定集合 ,固定集合的数据不能被修改只能查找-删除-再插入,也就是创建集合的时候设置了capped参数为true

插入文档自动创建集合:

>db.test.insert({"name":"zhangsan"}

创建文档:

自动产生_id:>db.集合名.insert({"key":"value"})

可以手动指定_id:>db.集合名.save(document)

四、MongoDB日常维护

MongoDB备份与恢复管理

数据导出工具:mongoexport

MongoDB中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件

mongoexport -d dbname -c collectionname -o file  --type json/csv -f field

数据导入工具:mongoimport

mongoimport -d dbname -c collectionname --file filename  --type json/csv -f field

-d:指定数据库名

-c:指定collection集合名

-f:指定导出哪些列

-o:指定要导出的文件名

-q:指定导出数据的过滤条件

注意:MySQL导入的时候,之前MySQL导出的时候加个database的选项,导入的时候就可以不用创建

MongoDB数据库备份与恢复:mongodump

备份:mongodump  -h dbhost -d dbname -o dir

恢复:mongorestore -h dbhost -d dbname -dir dir

-h:MongoDB所在的服务器IP地址(可以在后面加指定端口号)

-d:指定需要备份的数据库实例

-o:指定备份的数据库存放的位置(该目录要提前创建好,备份数据会存放在该目录下自动创建的test目录下)

在MongoDB数据库中复制数据库

>db.copyDatabase("db1","db2","localhost")

克隆集合(从远程MongoDB实例中复制集合到当前MongoDB实例,集合名称是一致的)

>db.runCommand({"cloneCollection":"abc.test","from":"192.168.100.7:27017"})

MongoDB安全管理

限制监听的IP地址和端口(在配置文件中设置)

vim /usr/local/mongodb/conf/mongodb.conf

bind_ip=192.168.0.111  \\只允许这个IP地址进行访问

port = 27017  \\只允许这个端口号进行访问

授权启动登录userAdminAnyDatabase(MongoDB第一次默认不需要密码,也没有任何用户)

1.登录进入数据库,切换到admin库

> use admin

2.创建管理用户

> db.createUser({user:"admin",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})

roles:指定用户的角色,可以用一个空数组给新用户设定空角色,在roles字段,可以指定内置角色和用户定义的角色

Built-In Roles(内置角色):

数据库用户角色:read、readWrite;
数据库管理角色:dbAdmin、dbOwner、userAdmin
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
备份恢复角色:backup、restore
所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色:root  
补充:这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
内部角色:__system

dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile

userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户

clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限

3.启动用户验证功能

/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/mongodb.conf --auth

或者编辑配置文件:vim /usr/local/mongodb/conf/mongodb.conf

添加auth = true

查看已有用户:> show users或> db.system.users.find()

4.登录MongoDB,使用admin用户对admin库进行验证登录

> use admin

> db.auth("admin","123456")

使用管理用户的用户admin 来创建其他数据库的用户名和密码

> use test

> db.createUser({user:"testuser",pwd:"123456",roles:[{role:"readWrite",db:"test"}]})

更新用户:> db.updateUser('testuser',{pwd:"111111",roles:[{role:"readWrite",db:"test"}]})

删除用户:> db.dropUser("testuser")

注意:使用有管理用户的权限的用户admin登陆之后才能删除用户

进程管理

查询正在执行的操作进程:> db.currentOp()

终止进程:> db.killOp("shard3:466404288")

MongoDB监控

1.数据库命令查看

查看数据库实例状态信息:> db.serverStatus()

查看当前数据库的统计信息:> db.stats()

查看集合统计信息:> db.users.stats()

查看集合大小:> db.users.dataSize()

2.通过网页来进行监控(编辑配置文件):vim /usr/local/mongodb/conf/mongodb.conf

添加httpinterface=true

通过http://localhost:28017进行网页访问

3.三方监控工具:Nagios

补充:Windows下安装MongoDB

mongo.exe启动

MongoDB可视化软件安装

发布了37 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/feili12138/article/details/104789298