热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mongodb进阶三之mongodb管理

http:blog.csdn.netstronglyharticledetails46827141平时的开发环境win比较多啊,但生产环境要放到unix环境上一:命令

http://blog.csdn.net/stronglyh/article/details/46827141

平时的开发环境win比较多啊,但生产环境要放到unix环境上

一:命令

安装就不少了,网上有很多资料下面列一些参数
quiet 安静输出
port arg 指定服务端口号,默认端口27017
bind_ip arg 绑定服务IP,绑定127.0.0.1,只本机访问,默认本地所有IP
logpath arg 指定MongoDB日志文件,注意是指定文件不是目录
logappend 使用追加的方式写日志
pidfilepath arg PID File 的完整路径,如果没有设置,则没有PID文件
keyFile arg 集群的私钥的完整路径,只对于Replica Set 架构有效
unixSocketPrefix arg UNIX域套接字替代目录,(默认为 /tmp)
fork 以守护进程的方式运行MongoDB,创建服务器进程
auth 启用验证
cpu 定期显示CPU的CPU利用率和iowait
dbpath arg 指定数据库路径
diaglog arg diaglog选项 0=off 1=W 2=R 3=both 7=W+some reads
directoryperdb 设置每个数据库将被保存在一个单独的目录
journal 启用日志选项,的数据操作将会写到journal文件夹文件里
journalOptions arg 启用日志诊断选项
ipv6 启用IPv6选项
jsonp 允许JSONP形式通过HTTP访问(有安全影响)
maxConns arg 最大同时连接数 默认2000
noauth 不启用验证
nohttpinterface 关闭http接口,默认关闭27018端口访问
noprealloc 禁用数据文件预分配(往往影响性能)
noscripting 禁用脚本引擎
notablescan 不允许表扫描
nounixsocket 禁用Unix套接字监听
nssize arg (=16) 设置信数据库.ns文件大小(MB)
objcheck 在收到客户数据,检查的有效性。
profile arg 档案参数 0=off 1=slow, 2=all
quota 限制每个数据库的文件数,设置默认为8
quotaFiles arg number of files allower per db, requires quota
rest 开启简单的rest API
repair 修复所有数据库run repair on all dbs
repairpath arg 修复库生成的文件的目录,默认为目录名称dbpath
slowms arg (=100) value of slow for profile and console log
smallfiles 使用较小的默认文件
syncdelay arg (=60) 数据写入磁盘的时间秒数(0=never,不推荐)
sysinfo 打印一些诊断系统信息
upgrade 如果需要升级数据库 * Replicaton 参数
fastsync 启用从库复制服务,该数据库是主库快照,可快速启用同步
autoresync 如果从库与主库同步数据差得多,自动重新同步,
oplogSize arg 设置oplog的大小(MB) * 主/从参数
master 主库模式
slave 从库模式
source arg 从库 端口号
only arg 指定单一的数据库复制
slavedelay arg 设置从库同步主库的延迟时间 * Replica set(副本集)选项:
replSet arg 设置副本集名称 * Sharding(分片)选项
configsvr 声明这是一个集群的config服务,默认端口27019,默认目录/data/configdb
shardsvr 声明这是一个集群的分片,默认端口27018
noMoveParanoia 关闭偏执为moveChunk数据保存


命令:

mongodb帮助命令  help

数据库级帮助命令  db.help()

集合级帮助命令 db.users.help()

查看哪些数据库 show dbs

创建和切换数据库  use  aaa

查当前数据库状态  db.stats()

获取当前数据库集合 db.getCollectionNames()

获取当前数据库名字  db.getName()

删除数据库  db.dropDatebase()

添加用户 db.addUser("用户名","密码“)

删除用户名 db.dropUser("用户名")

终止数据库服务进程 db.shutdownServer()


二:用户角色管理

2.1:创建管理员

用户管理员用来创建的用户,也用来创建和分配角色。用户管理员可以拥有数据库中的任何特权,可以创建新的用户或者管理员。正常情况下在一个MongoDB的部署中,应该创建用户管理员作为第一个用户,然后使用这个用户创建的所有其他用户。 为了能够创建第一个用户管理员,MongoDB提供userAdmin和userAdminAnyDatabase角色,两个角色支持用户和角色管理操作的各种访问。使用最小权限userAdmin或者使用userAdminAnyDatabase赋予所有有关的特权。 拥有这两个角色的用户可以授予自己无限的特权。具体地,拥有userAdmin角色的用户可以授予本身数据库中的任何特权。一个用户拥有userAdminAnyDatabase角色的用户管理员可以授予本身在系统中的任何特权。 使用以下步骤创建用户管理员,首先连接admin数据库:

mongo --port 27017 --authenticationDatabase admin
然后创建系统用户:

db.createUser({user: "siteUserAdmin",pwd: "password",roles:
    [{role: "userAdminAnyDatabase",db: "admin"}]}
最后可以验证一下:

db.runCommand({usersInfo:"manager",showPrivileges:true})


2.2:将用户添加到数据库

使用createUser命令将用户添加到你希望这个用户拥有相应权限的数据库中。下面的例子是赋予testUser数据库test的读权限,密码是12345678。

use test
db.createUser({
      user: "testUser",
      pwd: "12345678",
      roles: [
         { role: "read", db: "test" },
      ]
    }
)


2.3:设置超级用户

建立一个超级用户需要有何创建用户管理员一样的权限。

use admin
db.createUser(
    {
      user: "superuser",
      pwd: "12345678",
      roles: [ "root" ]
    }
)


2.4:创建角色

建立一个用户角色使用createRole这个命令。每一个角色可以通过privileges授予一些系统特权,通过roles来授予一些数据库管理权限。writeConcern参数是保障写操作的可靠性。

use admin
db.createRole(
  {
    role: "myClusterwideAdmin",
    privileges:
    [
      { resource: { cluster: true }, actions: [ "addShard" ] },
      { resource: { db: "config", collection: "" }, actions: [ "find", "update", "insert" ] },
      { resource: { db: "users", collection: "usersCollection" }, actions: [ "update" ] },
      { resource: { db: "", collection: "" }, actions: [ "find" ] }
    ],
    roles:
    [
      { role: "read", db: "admin" }
    ],
    writeConcern: { w: "majority" , wtimeout: 5000 }
  }
)
)


2.5:分配角色

用户分配角色使用grantRolesToUser命令。可以给用户分配各个数据库的各种管理权限。

use admin
db.grantRolesToUser(
  "accountAdmin01",
  [
    {
      role: "readWrite", db: "products"
    },
    {
      role: "readAnyDatabase", db:"admin"
    }
  ]
)


2.6:验证用户权限

验证用户的角色使用getRole命令。

use admin
db.getUser("accountUser01")
db.getRole( "siteRole01", { showPrivileges: true } )


2.7:修改用户访问权限

修改用户的访问权限revokeRolesFromUser命令。

use admin
db.grantRolesToUser(
    "accountUser01",
    [
      { role: "read", db: "records" }
    ]
)
db.revokeRolesFromUser(
    "accountUser01",
    [
      { role: "readWrite", db: "accounts" }
    ]
)


2.8:更改用户名密码

修改用户的密码changeUserPassword命令。

db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")


三:访问控制安全

3.1:mongodb为每个数据库提供了授权和认证。Mongodb认证,授权用户,是在数据库级别上,Mongodb把用户的凭据放在system.users collection中,认证默认是关闭的,可以通过auth,keyFile配置选项设置。对于Mongodb企业版可以使用kerberos来认证。

在一个数据库上,你只能认证一个用户,如果认证了第二个,第一个就会被放弃。

Mongodb规定授权是以role为基础的。每个授权的用户都保存在system.users中,要给用户分配角色,必须要有一个管理角色的用户在数据库中,如果没有就必须创建一个。

默认的,MongoDB会认为所运行的环境是安全的,没有进行数据库的安全性和身份验证。在这样的配置环境下,唯一要确保的是只有信任的机器才能连接到MongoDB端口。如果使用数据库专用服务器,最简单的方法是让它完全的无法从外部访问,将MongDB服务绑定--bind_ip到指定ip上。更进一步的可以在指定一个端口--port。

如果在一个不信任的环境中使用MongoDB就涉及到如何让MongoDB运行在安全模式上。MongoDB通过--auth和--keyfile参数的使用来启动安全模式用以支持身份验证和简单的粗粒度访问控制。

3.2:使用密钥文件
如果要使用key文件,那么在mongod启动的时候指定keyfile选项。 一般使用openssl生成keyfile文件:

openssl rand -base64 741 -out /var/lib/mongodb/keyfile0
chmod 600  /var/lib/mongodb/keyfile0
特别说明:如果指定keyfile内容的话,MongoDB会跳过keyfile里面的空格。 如:echo "test sets" > /var/lib/mongodb/keyfile0

mongod --keyfile /var/lib/mongodb/keyfile0 --fork      

3.3:如何使用管理员认证
采用管理员认证的方式认证,首先要创建一个管理员用户,上节我们讲过如何创建管理员以及如何管理权限和密码。有了管理员用户或者启动用户,即可通过--auth参数来启动MongoDB。

mongod --auth                      
如果通过配置文件启用管理员认证,只需要把auth的设置改为true即可。

mongod /etc/mongod.conf --fork   


四:复制数据文件

如何进行复制
通过复制数据文件即可完成数据库的备份和恢复,这种方式简单明了。


一般经过以下步骤:


1.锁定数据库或关闭数据库。


2.复制数据文件到相应的目录。


3.解锁数据库或重启数据库。


特别说明:如果只需要复制名为test的数据库,则可以复制全部的test.*来完成。


4.1:如何锁定数据库
进行备份时为了防止数据文件发生变化引起问题,可以使用以下命令将数据库锁定:

db.fsyncLock()
这个命令禁止所有写入,并将脏页写入磁盘保证数据不再变化。这个时候的写操作都会在内存中排队等待了,直到数据库解锁。


4.2:复制数据文件
新建一个复制数据文件的目标目录:

mkdir /usr/backup
完成数据文件复制的命令使我们很熟悉的cp命令,必须输入以下命令才能进行到下一节:

cp -R /var/lib/mongodb/*  /usr/backup  #你需要做备份的目录,确保目录已经存在。
确保备份目录容量够大,漏掉文件可能备份会失效。如果是备份到其他介质,可以直接指定目录。linux下/mnt目录一般是设备目录,外置设备一般在该目录下。


4.3:如何解锁数据库
完成数据文件的复制后,就可以使用以下命令将数据库解锁,恢复数据库的正常运行状态:

db.fsyncUnlock()
调用db.fsyncUnlock()和db.fsyncLock()命令是不要关闭shell,因为如果你启用了身份验证或者断开了链接,可能连不上,需要重新启动mongod,这些命令就都失效了。


4.4:如何恢复数据库
数据库发生问题时需要进行恢复,使用复制的文件进行恢复时可以使用以下命令:

cp -R /usr/backup/* /var/lib/mongodb/
注意:恢复前应该确保mongod没有运行,且/var/lib/mongodb/为空。linux使用rm -rf删除目录。删除前一定确认cp命令成功执行。恢复完成后,再启动mongod。启动mongod使用一下命令:

mongod -f /etc/mongod.conf --fork --nojournal


五:工具方式

5.1:mongodump的基本操作
通过mongodump进行备份可以使用以下选项:
–help 查看帮助信息。
-v [ --verbose ] 显示更多调试信息。
–version 显示该命令版本。
-h [ --host ] arg mongodb数据库所在主机IP地址。
–port arg mongodb启动时所使用的端口。也可以使用 –host:port格式直接指定主机和端口。
–ipv6 是否支持ipv6 。
-u [ --username ] arg 指定登陆用户名。
-p [ --password ] arg 指定登陆密码。
–dbpath arg 越过mongod服务器,直接访问给定路径的mongod数据库文件。使用该参数需要锁定给定的数据目录,所以需要先关闭使用该目录的mongod服务。
–directoryperdb 如果指定了dbpath目录,那么每个db都会保存到一个单独的文件夹中。
–journal enable journaling
-d [ --db ] arg 准备备份的数据库。
-c [ --collection ] arg 准备备份的集合。
-o [ --out ] arg 导出数据将要保存在的目录,如参数为“-”,则直接在控制台显示。
-q [ --query ] arg json query
–oplog Use oplog for point-in-time snapshotting
–repair 尝试修复损坏的数据库。
–forceTableScan 强制表扫描。


5.2:mongorestore的基本操作
与mongodump相对应通过mongorestore进行恢复使用以下选项:
–help 查看帮助信息。
-v [ --verbose ] 显示更多调试信息。
–version 显示该命令版本。
-h [ --host ] arg mongodb数据库所在主机IP地址。
–port arg mongodb启动时所使用的端口。也可以使用 –host hostname:port格式直接指定主机和端口。
–ipv6 是否支持ipv6 。
-u [ --username ] arg 指定登陆用户名。
-p [ --password ] arg 指定登陆密码。
–dbpath arg 越过mongod服务器,直接访问给定路径的mongod数据库文件。使用该参数需要锁定给定的数据目录,所以无法使用当前mongod服务正在使用的目录。
–directoryperdb 如果指定了dbpath目录,那么每个db都会在一个单独的文件夹中。
–journal enable journaling
-d [ --db ] arg 准备恢复的数据库。
-c [ --collection ] arg 准备恢复的集合。
-objcheck 恢复前验证一下数据对象。
-filter arg 有选择的进行恢复。
–oplogReplay replay oplog for point-in-time restore。
–drop 修复前删除所有集合。
–keepIndexVersion 强制表扫描。
这里我们需要了解两个命令,首先是验证写入是否成功的命令:

db.runCommand({"getLastError":1,"j":true})
这个命令主要用来解决一些重要数据需要了解是否已经写入磁盘中。

另外一个是设置数据库提交数据到日志的时间间隔命令:

db.adminCommand({"setParameter":1,"journalCommitInterval":30})
其中setParameter可以设置的间隔为2毫秒到500毫秒,时间间隔月底系统开销越大。


5.3:数据库未运行时的备份
数据库未运行时对数据库进行备份,通过使用mongodump十分方便。例如使用以下命令:

mongodump --dbpath /var/lib/mongodb/ --out /usr/backup


5.4:数据库未运行时的恢复
数据库未运行时的恢复也很简单,通过使用mongorestore进行恢复。不仅可以进行整体恢复,还可以进行某一个数据库的恢复,例如使用以下命令恢复test数据库到运行系统中。

mongorestore --dbpath /usr/backup/ --journal /var/lib/mongodb/test


5.5:如何通过远程链接进行备份
网络允许的情况下,mongodump工具可以进行远程链接数据库,进行备份。例如以下备份就是通过指定主机地址、端口、用户名、密码和备份目录而进行的备份操作。

mongodump --host www.***.com --port 3017 --username user --password pass --out /usr/backup/mongodump-2013-10-24


5.6:如何通过远程链接进行恢复
对应的通过mongodump工具进行远程链接备份的数据库,也可以通过mongorestore来进行恢复。例如以下恢复就是通过指定主机地址、端口、用户名、密码和备份目录而进行的恢复操作。

mongorestore --host www.***.com --port 3017 --username user --password pass /usr/backup/mongodump-2013-10-24


5.7:如何使用oplog进行备份
通过设置操作日志oplog的实时备份点,可以完成快照式的数据库备份。这样做的好处就是如果我们在使用mongodump进行备份的操作时,如有操作正进行数据库删除之类的操作时,我们的mongodump备份已经将这个数据库备份完,那么我们获得的备份就会和实际的数据库不同,而且这个数据库在事实上未成存在过。


mongodump不是快照备份,备份过程中系统可能会继续进行操作。oplog的设置就是避免这种情况发生的,不过使用oplog的前提是mongod启动时使用了--replSet选项。本质是使用了复制的功能,以后讲到复制大家就更清楚了。


5.8:如何使用oplog恢复
与mongodump使用oplog进行备份对应,mongorestore也可以使用oplog对数据库进行恢复。


六:意外关机修复

6.1:一般的处理程序
MongoDB意外关机后,通常有两种选择进行恢复:

1.直接在源文件上进行恢复。
2.保留关机前的原始文件,检查以后再进行恢复。
按照第二种情况的恢复流程是:

1.修复数据库
2.确认数据库情况
3.删除锁文件
4.修复数据库
5.正常启动运行
如果按照第一种方式那么就忽略以上1、2两个步骤。


6.2:修复并保留原始数据库
通过下面的命令,我们来对数据库进行修复,并将原始数据库备份到修复目录/usr/backup下。 这样做的目的是不破坏原始的数据库文件。

mongod --dbpath /var/lib/mongodb --repair --repairpath /usr/backup


6.3:如何确认数据库情况
通过运行下面的命令我们可以将进行修复以后的数据库运行起来。然后通过检查数据库的状态,意外发生前进行的操作执行情况,例如插入数据是否完成,目前表内数据情况等,来判断数据库是否已经完全修复了。

mongod --dbpath /usr/backup


6.4:删除锁文件
根据修复数据库运行的情况,判断如果数据库基本是正常的,我们就可以删除锁文件了。如果数据库不正常,那么就需要做相应的处理。如使用了日志,根据日志进行恢复,如使用了复制那么进行恢复等等情况,具体问题需要具体分析。

rm /var/lib/mongodb/mongod.lock


6.5:修复数据库
修复数据库使用以下的命令,这时修复数据库会使用新文件代替原有的旧文件。

mongod --dbpath /usr/backup --repair


6.6:正常启动数据库
通过以上的几个步骤以后,我们就可以正常启动数据库了。

mongod --dbpath /var/lib/mongodb










感谢huizhi网:http://hubwiz.com/





推荐阅读
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
author-avatar
心若繁花花满地
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有