zoukankan      html  css  js  c++  java
  • 【MongoDB详细使用教程】五、MongoDB的数据库管理

    【MongoDB详细使用教程】一、Mac安装MongoDB
    【MongoDB详细使用教程】二、MongoDB基本操作
    【MongoDB详细使用教程】三、高级查询
    【MongoDB详细使用教程】四、python操作MongoDB
    【MongoDB详细使用教程】五、MongoDB的数据库管理

    1、数据库安全

    为数据库添加用户和密码

    1.1、创建管理员账号和密码

    1. 登陆无密码的数据库
    2. 创建(或切换到)admin库
    3. 创建管理员账号和密码
    4. 验证管理员账号和密码

    示例:

    # 1
    cbowendeMacBook-Pro:~ cbowen$ mongo
    MongoDB shell version v4.0.9
    connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
    ...
    >
    
    # 2
    > use admin
    switched to db admin
    
    # 3
    > db.createUser({user:'admin',pwd:'123',roles:["root"]})
    Successfully added user: { "user" : "admin", "roles" : [ "root" ] }
    
    # 4
    > db.auth('admin','123')
    1
    

    "roles" : [ "root" ] 意为分配超级管理员权限

    1.2、设置服务状态为需要验证用户

    正常开启服务时是不需要验证用户信息的,即使已经创建了用户。
    这里我们要先关闭数据库服务,并以需要验证用户的模式启动服务。

    1. 关闭服务
    2. 重启新启动服务,并设定为需要验证
    # 终端中输入:
     mongod --dbpath data --logpath log/mongod.g --logappend --auth
    

    正常开启语句后面加上--auth。

    (对于windows系统,如果已经将加入服务中,需要将服务卸载后重新以需验证模式加入)

    1.3、创建用户账户和密码

    1. 以管理员身份连接数据库
    2. 切换到要创建账号的数据库,并创建用户账户和密码
    3. 登录时先切换到该库,再登陆

    示例:

    # 1、以管理员身份连接数据库
    cbowendeMacBook-Pro:~ cbowen$ mongo
    MongoDB shell version v4.0.9
    connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
    Implicit session: session { "id" : UUID("5316d74a-2148-43e9-a9e8-f501cc1d9781") }
    MongoDB server version: 4.0.9
    > use admin         # 验证账号前要先切换到admin库
    switched to db admin
    > db.auth('admin','123')
    1
    
    # 2、切换到要创建账号的库,并创建账号和密码,以及设置权限roles
    > use mymongo
    switched to db mymongo
    > db.createUser({user:'mymongo',pwd:'123',roles:[{role:'dbOwner',db:'mymongo'}]})
    Successfully added user: {
    	"user" : "mymongo",
    	"roles" : [
    		{
    			"role" : "dbOwner",
    			"db" : "mymongo"
    		}
    	]
    }
    
    # 3、退出管理员账号,用刚创建的用户登陆
    > exit
    bye
    cbowendeMacBook-Pro:~ cbowen$ mongo
    MongoDB shell version v4.0.9
    connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
    Implicit session: session { "id" : UUID("47cb777a-d000-41be-a61c-1041faa31dc0") }
    MongoDB server version: 4.0.9
    > use mymongobu                 # 先切换数据库
    switched to db mymongobu
    > db.auth('mymongobu','123')    # 再验证账号
    1
    

    注:
    1、roles:[{role:'dbOwner',db:'mymongo'}] 意为该账号仅对数据库mymongo有效。
    2、用户的信息会作为数据保存在数据库中,在创建用户信息前切换到哪个数据库,创建的用户信息就会保存在哪个库中,那么在登陆的时候也要先切换到该库,才可验证成功。如果创建mymongo用户时,是在admin库中,那么验证时就要先切换到admin库,验证后效果一样,mymongo账号依然只对mymongo库有效。

    1.4、忘记密码/修改密码

    以超级管理员连接数据库 或 以无需验证用户的模式登陆 后,
    使用以下命令更改用户名:

    db.changeUserPassword('用户名','新密码');
    

    2、主从服务器

    从服务器作为主服务器的冗余备份,提高了数据的可用性,并保证数据的安全性,可以用于在硬件故障和服务中断时恢复数据。
    主服务器负责写入,从服务器负责读取,主服务器宕机后, 从服务器自动切换为主服务器。

    2.1、创建服务器目录,用于分别存放主从服务器数据

    在MongoDB目录下创建了LordSlave文件夹,并在LordSlave中创建了lord和slave文件夹。
    (进入MongoDB目录需要在finder中按shift + command + G来查询/usr/local并前往。)

    2.2、启动服务

    语法

    # 终端中输入 (IP地址、集群名称要一致):
    mongod --bind_ip IP地址 --port 端口1 --dbpath 主服务器目录 --replSet 集群名称
    mongod --bind_ip IP地址 --port 端口2 --dbpath 从服务器目录 --replSet 集群名称
    

    示例

    mongod --bind_ip 127.0.0.1 --port 27017 --dbpath /usr/local/MongoDB/LordSlave/lord --replSet rps
    mongod --bind_ip 127.0.0.1 --port 27018 --dbpath /usr/local/MongoDB/LordSlave/slave --replSet rps
    

    开启服务的终端窗口不要退出。

    2.3、连接其中一台服务器并设置为主服务器

    在新的终端窗口中输入如下命令,登陆27017端口

    mongo --host 127.0.0.1 --port 27017
    

    使用 "rs.initiate()" 命令进行初始化,显示结果:

    > rs.initiate()
    {
    	"info2" : "no configuration specified. Using a default configuration for the set",
    	"me" : "127.0.0.1:27017",
    	"ok" : 1,
    	"operationTime" : Timestamp(1572401660, 1),
    	"$clusterTime" : {
    		"clusterTime" : Timestamp(1572401660, 1),
    		"signature" : {
    			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    			"keyId" : NumberLong(0)
    		}
    	}
    }
    

    2.4、在主服务器上添加/删除另一台为从服务器

    继续在当前设置完的主服务器终端中输入:

    rs.add('127.0.0.1:27018')
    

    显示结果:

    rps:PRIMARY> rs.add('127.0.0.1:27018')
    {
    	"ok" : 1,
    	"operationTime" : Timestamp(1572402066, 1),
    	"$clusterTime" : {
    		"clusterTime" : Timestamp(1572402066, 1),
    		"signature" : {
    			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    			"keyId" : NumberLong(0)
    		}
    	}
    }
    

    使用 "rs.status()" 查询服务器状态:

    如需删除从服务器则使用

    rs.remove('127.0.0.1:27018')
    

    2.5、登陆并激活从服务器

    在新终端中登陆另一台服务器:

    mongo --host 127.0.0.01 --port 27018
    

    使用 "rs.slaveOk()" 激活从服务器

    rps:SECONDARY> rs.slaveOk()
    

    至此,主从服务器配置完成,可以配置多台从服务器。

    3、备份与还原

    3.1、库备份

    语法:

    mongodump -h dbhost -d dbname -o dbdirectory
    
    # 如果账号有密码的话加上 -u 和 -p 属性
    mongodump -h dbhost -u user -p pass -d dbdirectory
    
    • -h:服务器地址,也可以指定端口号
    • -d:需要备份的数据库名称
    • -o:备份的数据存放位置,此目录中存放着备份出来的数据
    • -u:用户名,要加引号
    • -p:密码,要加引号

    示例:

    • 先开启数据库服务
    • 创建备份目录夹/usr/local/MongoDB/bu
    • 终端中输入:
    mongodump -h 127.0.0.1:27017 -d mymongo -o /usr/local/MongoDB/bu
    
    • 出现如下信息则备份成功
    cbowendeMacBook-Pro:~ cbowen$ mongodump -h 127.0.0.1:27017 -d mymongo -o /usr/local/MongoDB/bu
    2019-10-29T15:43:55.109+0800	writing mymongo.singer to 
    2019-10-29T15:43:55.109+0800	writing mymongo.students to 
    2019-10-29T15:43:55.114+0800	done dumping mymongo.singer (15 documents)
    2019-10-29T15:43:55.115+0800	done dumping mymongo.students (9 documents)
    
    • 备份文件如下,系统自动创建了与数据库同名的文件夹mymongo

    3.2、库还原

    语法:

    mongorestore -h dbhost -d dbname --dir dbdirectory
    
    # 如果账号有密码的话加上 -u 和 -p 属性
    mongorestore -h dbhost -d dbname  -u user -p pass --dir dbdirectory
    
    • -h:服务器地址
    • -d:需要恢复的数据库实例(如果使用新名字,就会再重新创建一个库)
    • --dir:备份数据所在位置,可省略--dir关键字,直接写地址即可。
      (备份时会在指定备份目录下自动创建一个与备份库同名的文件夹,还原时要在路径中加上这个文件夹,具体请看下面示例。)

    示例:

    • 开启数据库服务

    • 在终端中输入

      mongorestore -h 127.0.0.1 -d mymongobu --dir /usr/local/MongoDB/bu/mymongo
      

      注:
      备份的地址是/usr/local/MongoDB/bu
      mymongo是备份时自动创建的与库名相同的文件夹,还原时需要加上后面的/mymongo

    • 出现如下信息则还原成功

    cbowendeMacBook-Pro:~ cbowen$ mongorestore -h 127.0.0.1 -d mymongobu --dir /usr/local/MongoDB/bu/mymongo
    2019-10-29T16:03:32.386+0800	the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead
    2019-10-29T16:03:32.386+0800	building a list of collections to restore from /usr/local/MongoDB/bu/mymongo dir
    2019-10-29T16:03:32.390+0800	reading metadata for mymongobu.singer from /usr/local/MongoDB/bu/mymongo/singer.metadata.json
    2019-10-29T16:03:32.390+0800	reading metadata for mymongobu.students from /usr/local/MongoDB/bu/mymongo/students.metadata.json
    2019-10-29T16:03:32.440+0800	restoring mymongobu.singer from /usr/local/MongoDB/bu/mymongo/singer.bson
    2019-10-29T16:03:32.498+0800	no indexes to restore
    2019-10-29T16:03:32.498+0800	finished restoring mymongobu.singer (15 documents)
    2019-10-29T16:03:32.498+0800	restoring mymongobu.students from /usr/local/MongoDB/bu/mymongo/students.bson
    2019-10-29T16:03:32.500+0800	restoring indexes for collection mymongobu.students from metadata
    2019-10-29T16:03:32.538+0800	finished restoring mymongobu.students (9 documents)
    2019-10-29T16:03:32.538+0800	done
    

    3.3、集合的备份与还原

    # 备份单个集合
    mongodump -h dbhost -d dbname -c collectionname -o dbdirectory
    
    # 还原单个集合
    mongorestore -h dbhost -d dbname --dir dbdirectory
    

    这里还是要注意,备份时的dbdirectory为目录,而还原时的dbdirectory要指定到具体的.bson文件。

    示例:

    # 备份集合
    mongodump -h 127.0.0.1:27017 -d mymongo -c singer -o /usr/local/MongoDB/bu/collection
    
    #还原集合
    mongorestore -h 127.0.0.1:27017 -d mymongobu --dir /usr/local/MongoDB/bu/collection/mymongo/singer.bson
    
  • 相关阅读:
    我的知识库(4) java获取页面编码(Z)
    知识库(3)JAVA 正则表达式 (超详细)
    The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts
    某人总结的《英语听力的技巧 》,挺搞的
    我的知识库(5)java单例模式详解
    构建可扩展程序
    SerialPort (RS232 Serial COM Port) in C# .NET
    Python学习笔记——String、Sequences
    UI题目我的答案
    jQuery学习系列学会操纵Form表单元素(1)
  • 原文地址:https://www.cnblogs.com/cbowen/p/11763463.html
Copyright © 2011-2022 走看看