MongoDB学习笔记7——数据库管理
数据库管理主要学习的内容:
1、备份和还原MongoDB系统
2、使用MongoDB shell执行常见的任务
3、使用身份验证控制服务器的访问权限
4、监控数据库
1)备份MongoDB服务器:
需要满足的假设构想:
MongoDB服务器运行在目前登录的机器上;硬盘空间足以容纳转储文件,该文件的大小至多与数据库相同;备份文件将保存在个人主目录中。
MongoDB的备份工具被称为mongodump。
例子:将文件保存在指定的磁盘目录中:
cd~
mkdir testmongobackup
cd testmongobackup
mongodump
将数据库恢复到之前备份时的状态:
cd ~/testmongobackup
mongorestore --drop (如果不使用--drop选项,被恢复的数据将追加到每个集合的尾部,这将导致出现重复的数据)
mongodump默认创建的文件夹结构形式为:
./dump/[databasename]/[collectionname].bson
2)备份单个数据库:
mongodump -d database_name
mongodump工具将为她创建./dump文件夹
3)备份单个集合:
数据中快速变化的内容保存在posts和tagcloud集合中。mongodump工具不会清空目标目录。
mkdir ~/backuptemp
cd ~/backuptemp
mongodump -d blog -c posts
mongodump -d blog -c tagcloud
将转储目录~/backuptemp归档为tar文件:
cd ~
rm ~rf backuptemp
4)恢复单个数据库或集合
恢复单个数据库
cd ~/testmongobackup
mongorestore -d blog --drop
恢复单个集合
cd ~/testmongobackup
mongorestore -d bolg -c posts --drop
5)自动备份
5-1)使用本地数据存储
如果系统中具有大的备份驱动器或者可以通过NFS或SMB挂载一个外部文件系统,那么可以使用一个简单脚本在指定的目录中创建归档文件。
本地数据存储备份脚本中使用的变量:
MONGO_DBS:保持该变量为空,本地服务器上的所有数据库都将被备份。也可以在该变量中设置一个数据库的列表,用于备份指定的数据库("db1 db2 db3")
BACKUP_TMP:将该变量设置为保存备份文件的临时目录。归档完成后,删除该目录中的临时数据。要选择一个与脚本相关的合适目录
BACKUP_DEST:该变量保存了备份文件的目标目录,所有其他文件夹都将在该文件夹下创建,例如Database Name/database-YYYYMMDD-HHMM.tgz
MONGODUMP_BIN:由于运行备份脚本的账户可能并不拥有完整的路径设置,最好使用该变量指定二进制文件的全路径
TAR_BIN:使用该变量设置tar二进制文件的全路径;在终端窗口中输入which tar可获取此路径
用以下脚本显示test数据库的备份文件名:
Backups:$ tree
5-2)使用远端数据存储(基于云)
方法1:使用rsync/ftp/tftp或scp将文件传输到另一台服务器
方法2:S3存储
配置脚本时需要注意的变量:
BACKUP_S3_CONFIG:运行s3cmd -configure时创建的配置文件路径,包含S3账户的详细信息
BACKUP_S3_BUCKET:设置希望用于存储备份文件的bucket
S3CMD_BIN:s3cmd可执行程序的路径,同样,可使用which s3cmd在系统中找到它
6)备份大数据库
数据库备份系统有一个必杀技,就是时间点快照,它的速度非常快。快照完成的速度越快,数据库服务器需要被冻结的时间就越短。
执行大数据备份的一种技术是:从隐藏的辅助服务器备份数据,在备份期间可以冻结该服务器。备份完成后,重启该辅助服务器,让它从应用的其他服务器获得最新数据。
为了创建备份的方式高效,必须将MongoDB日志文件保存在同一设备上,或者使MongoDB将所有未完成的磁盘写入输出到磁盘,这样才可以创建快照。创建MongoDB完成刷新的特性成为fsync;阻塞写入的函数成为lock。通过将日志保存在同一设备上或者同时执行fsync和lock,可以保证磁盘上数据库的镜像处于一致状态,并保证在完成快照之前它们仍然保持一致的状态。
使MongoDB进入fsync和lock状态:
#mongo
use admin
db.fsyncLock()
检查锁的当前状态:
db.currentOp()
状态"fsyncLock":true表示MongoDB的fsync进程(负责将修改写入磁盘)正在阻塞写入操作。
一旦快照完成,就可以使用下面的命令释放锁(不要忘记在备份完成之后释放快照):
db.fsyncUnlocl()
7)将数据导入MongoDB
使用批量加载器mongoimport,可以加载CSV,TSV和JSON格式的数据。
mongoimport工具的详解:
--headerline:使用文件的第一行作为字段名称列表。该选项只可用于CSV和TSV格式。
--ignoreblanks:不导入任何空字段。如果字段为空,文档中将不会创建该元素;如果不使用该选项,那么文档中将创建一个使用了该列名的空元素。
--drop:删除集合,并使用导入的数据重新创建该集合;否则,导入的数据将被追加到集合中。
--numInsertionWorkers:要创建的插入操作的数量,用于插入文档。该数字越大,吞吐量就越大,耗费的资源就越多。
--jsonArray:允许导入/导出的数据有多个MongoDB文档,且在一个JSON数组中表示。
语句举例:
$mongoimport -d bolg -c tagcloud --type csv --headerline < csvimportfile.csv (-d表示数据库,-c表示集合名)
8)从MongoDB导出数据
使用mongoexport工具,用于从现有的MongoDB集合将数据导出到文件中。
需要注意的选项有:
-q:指定用于选择输出记录的查询。
-f:导出需要导出的数据库元素名。
语句举例:
$mongoexport -d blog -c posts -q {} -f _id,Title,Message,Author --csv > blogposts.csv
9)通过限制对MongoDB服务器的访问保护数据安全
MongoDB支持简单的基于角色的身份验证系统,通过该系统可以控制用户对数据库的访问以及他们被授予的访问级别。大多数修改配置数据或者对MongoDB服务器结构进行大幅调整的命令都被限制在专门的admin数据库中执行,还数据库将在每个新的MongoDB安装时自动创建。
10)使用身份验证保护服务器
MongDB支持基于角色的访问控制身份验证模型,其中包含预定义的系统角色和用户定义的定制角色。
任何添加到admin数据库中的用户,在所有数据库中都拥有相同的访问权限,不需要为这样的用户单独赋予权限。
10-1)添加admin用户
$mongo
use admin
db.createUser({user:"admin",pwd:"pass",roles:[{role:"readWrite",db:"admin"},{role:"userAdminAnyDatabase",db:"admin"}]})
只需要添加单个admin用户即可:一旦该用户定义成功,就可以使用该账户在admin数据库中添加其他admin用户,或在任何其他数据库中添加普通用户。
10-2)启用身份认证
停止服务器并在启动参数中添加 --auth
重启服务器并启用身份验证:
$sudo service mongodb restart
除了身份认证,还可以使用keyfile,它是一个包含了预分享秘钥的文件,通过它可以确认MongoDB节点之前的通信。
10-3)在mongoDB控制台中执行身份验证
在admin数据库中运行受限的命令之前,首先需要验证自己的身份,证实为admin用户:
$mongo
use admin
show collections
db.auth("admin","pass") (结果显示为1表示身份验证成功,为0表示身份验证失败)
show collections
system.users
system.version
使用下面的命令列出admin数据库的system.users集合中的所有内容:
$mongo
use admin
db.getllsers()
10-4)MongoDB用户角色
目前在MongoDB的权限框架中,用户可以使用的角色有:
read:允许用户读取指定的数据库
readWrite:授予用户对指定数据库的读写权限
dbAdmin:允许用户在指定的数据库中执行管理功能,例如创建或删除索引、查看统计或访问system.profile集合。
userAdmin:允许用户向system.users集合中写入内容。具有该权限的用户可在该数据库创建、删除和管理用户。
dbOwner:readWrite dbAdmin 和 userAdmin角色的组合。
clusterManager:只在admin数据库中可用。为用户赋予针对整个集群的管理功能,不能访问数据功能。
clusterMonitor:只在admin数据库可用。访问统计信息和收集统计信息的命令。
hostManager:只在admin数据库中可用。管理和监控主机级别的服务。
clusterAdmin:只在admin数据库中可用。为用户赋予所有分片和复制集相关函数的完全管理权限。也可以与clusterManager、clusterMonitor和hostManager一起使用。
backup:只在admin数据库中可用。授予备份整个系统所需的最低访问权限。
restore:只在admin数据库中可用。授予恢复整个系统所需的最低访问权限。
readAnyDatabase:只在admin数据库中可用。为用户赋予所有数据库的读权限。
readWriteAnyDatabase:只在admin数据库中可用。为用户赋予所有数据库的读写权限。
userAdminAnyDatabase:只在admin数据库中可用。为用户赋予所有数据库的userAdmin权限。
dbAdminAnyDatabase:只在admin数据库中可用。为用户赋予所有数据库的adAdmin权限。
10-5)修改用户凭据
$mongo
use admin
db.auth("admin","pass")
use blog
db.createUser({user:"foo",pwd:"foo",roles:[{role:"read",db:"blog"}]})
db.updateUser("foo",{roles:[{role:"dbAdmin",db:"blog"}]})
db.getUsers()
10-6)添加只读用户
$mongo
use admin
db.auth("admin","pass")
use blog
db.createUser({user:"shadycharacter",pwd:"shadypassword",roles:[{role:"read",db:"bolg"}]})
10-7)删除用户
$mongo
use admin
db.auth("admin","pass")
use blog
sb.removeUser("shadycharacter")
11)管理服务器
必须熟悉用于管理和控制服务器的大量函数。
11-1)启动服务器
启动
$sudo service mongodb start
停止
$sudo service mongodb stop
重启
$sudo service mongodb restart
如果未提供任何配置文件,MongoDB将使用默认的数据库路径/data/db启动,并使用默认端口27017(mongodb)连接到所有网络IP,如下所示:
$ mkdir -p /data/db
$ mongod
^C(以手动模式终止服务器)
MongoDB提供了3中主要的方式用于配置服务器。首先,可以结合mongod服务器守护进行使用命令选项。其次,可以加载一个配置文件。最后,可以使用setParameter命令修改其中大多数设置。例如,通过下面的命令可以将logLevel修改为默认的0:
db.adminCommand({setParameter:1,logLevel:0})
大多数情况下还是使用第二种方式,通过修改配置文件并重启服务器,可以修改服务器的配置。
#mongodb.conf
其中的选项值:
dbpath:表示MongoDB存储数据的位置。
logpath:表示MongoDB存储日志的文件。
logappend:将该选项设置为false,MongoDB在每次启动时都将清空日志文件。将该选项设置为true,所有的日志将被追加到现有日志文件的尾部。
auth:启用或禁止MongoDB服务器的身份验证模式。
rest:启用或禁止MongoDB的rest接口。如果希望使用基于Web的状态显示链接来显示一些额外信息,就必须启用该接口,但在生产环境中不建议这么做。
11-2)获取服务器版本
使用db.version()函数可以获得服务器的版本信息。
$mongo
use admin
db.version()
11-3)获得服务器状态
$mongo
db.serverStatus()
其中最重要的两个部分是:opcounters和asserts
opcounters部分显示了数据库服务器上已经执行的每种操作数目。
asserts部分显示了服务器和客户端抛出异常或警告的数目。
11-4)关闭服务器
$mongo
use admin
db.shutdownServer()
12)使用MongoDB日志文件
MongoDB转换日志,开始编写一个新的日志文件,用转换它时的时间戳重命名现有的文件,之后这些旧文件可以安全地删除。
$mongo
db.adminCommand({logRotate:1})
13)验证和修复数据
13-1)修复 服务器
$ mongo --dbpath /data/db --repair
13-2)验证单个集合
使用MongoDB提供的工具判断目标服务器是否损坏。通过validate选项可以验证数据库中集合的内容。
$mongo
use blog
db.posts.ensureIndex({Author:1})
db.posts.validate()
在不扫描数据文件的情况下,报告一些与集合相关的信息使用:
db.runcommand({validate:"posts",scandate:false})
13-3)修复集合验证错误
使用reIndex()函数
db.posts.reIndex()
13-4)修复集合的数据文件
db.repairDatabase()
13-5)压缩集合的数据文件
db.runCommand({compact:"posts"})