仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 726|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL网站制作之数据库的用户帐号办理基本常识

[复制链接]
再现理想 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:24:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
使用DBaaS能让收入损失从其他业务上得到弥补,如软件更新和硬件管理。也许决定走DBaaS之路的客户可能会跳过解决方案提供商,尽管这个决策看起来有点短视。MySQL办理员应当晓得如何经由过程指定哪些用户可毗连到服务器、从那里举行毗连,和在毗连时做甚么,来设置MySQL用户账号。MySQL3.22.11引进了两个更简单举行这项事情的语句:GRANT语句创立MySQL用户并指定其权限,REVOKE语句删除权限。这两个语句充任mysql数据库中的受权表的前端,并供应间接利用这些表内容的可选择的办法。GRANT和REVOKE语句影响以下四个表:  受权表内容
  user可毗连到服务器的用户和他们具有的任何全局特权
  db数据库级的特权
  tables_priv表级特权
  columns_priv列级特权
  另有第五个受权表(host),但它不受GRANT或REVOKE的影响。
  当您为某个用户公布GRANT语句时,应在user表中为该用户创立一个项。假如该语句指定了一切全局特权(办理权限或用于一切数据库的权限),则这些指定也被纪录在user表中。假如指定了数据库、表或列的权限,它们将纪录在db、tables_priv和columns_priv表中。
利用GRANT和REVOKE语句比间接修正受权表更简单。可是,倡议您最好经由过程浏览第12章来增补本章的内容,第12章中具体会商了受权表。这些表十分主要,作为一名办理员应当懂得这些表是如何在GRANT和REVOKE语句级上事情的。
本节上面的部分将会商怎样设置MySQL用户的账号和受权,还将先容怎样作废权限和从受权表中删除全体用户,而且将思索一个困扰很多新的MySQL办理员的困难。
您还要思索利用mysqlaccess和mysql_setpermission剧本,它们是MySQL分发包的构成部分。这些是Perl的剧本,它们供应了设置用户账号的GRANT语句的代用品。mysql_setpermission必要具有DBI的撑持情况。
  创立新用户和受权
  GRANT语句的语法以下:
  GRANTprivileges(columns)
  ONwhat
  TOuserIDENTIFIEDBY"password"
  WITHGRANTOPTION
  要利用该语句,必要填写以下部分:
  privileges分派给用户的权限。下表列出了可在GRANT语句中利用的权限申明符:
  权限申明符权限同意的操纵


上表显现的第一组权限申明符合用于数据库、表和列。第二组申明符是办理特权。一般,这些权限的授与相称守旧,由于它们会影响服务器的操纵(比方,SHUTDOWN特权不是按天天来分发的权限)。第三组申明符是特别的。ALL的意义是“一切的权限”,而USAGE的意义是“无权限”─即创立用户,但不授与任何的权限。

  columns权限合用的列。这是可选的,只来设置列专有的权限。假如定名多于一个列,则用逗号分隔。

  what权限使用的级别。权限能够是全局的(合用于一切数据库和一切的表)、数据库专有的(合用于某个数据库中的一切表),或表专有的。能够经由过程指定一个COLUMNS子句将权限授与特定的列。
user利用权限的用户。它由用户名和主机名构成。在MySQL中,不但指定谁举行毗连,还要指定从那里毗连。它同意您具有两个带有不异名字的、从分歧地位毗连的用户。MySQL同意在它们之间举行区分并互相自力地分派权限。

  MySQL的用户名就是您在毗连到服务器时指定的名字。该名字与您的UNIX注册名或Windows名的没有一定结合。缺省设置时,客户机程序将利用您注册的名字作为MySQL的用户名(假如您不明白指定一个名字的话),但这只是一个商定。有关将root作为能够操纵统统MySQL的超等用户名也是如许,就是一种商定。您也能够在受权表中将此名修正成nobody,然后作为nobody用户举行毗连,以实行必要超等用户特权的操纵。

  password分派给该用户的口令。这是可选的。假如您不给新用户指定IDENTIFIEDBY子句,该用户不分派口令(长短平安的)。关于已有的用户,任何指定的口令将替换旧口令。假如不指定新口令,用户的旧口令仍旧坚持稳定。当您的确要利用IDENTIFIEDBY时,该口令串应当是间接量,GRANT将对口令举行编码。当用SETPASSWORD语句时,不要利用PASSWORD()函数。

  WITHGRANTOPTION子句是可选的。假如包括该子句,该用户能够将GRANT语句授与的任何权限授与其他的用户。可使用该子句将受权的才能授与其他的用户。


  用户名、口令和数据库和表的称号在受权表项中是辨别巨细写的,而主机名和列名则不是。

  经由过程查询某些成绩,一般能够揣度出所需的GRANT语句的范例:
谁能够举行毗连,从那里毗连?
用户应具有甚么级其余权限,这些权限合用于甚么?
同意用户办理权限吗?


让我们来发问这些成绩,同时看一些使用GRANT语句设置MySQL用户账号的例子。

  1.谁能够举行毗连,从那里毗连

  您能够同意用户在特定的主机或触及局限很宽的一组主机中举行毗连。在一个极度,假如晓得用户将仅从谁人主机中举行毗连,则可限制对单个主机的会见:

  GRANTALLONsamp_db.*TOboris@localhostIDENTFIEDBY"ruby"

  GRANTALLONsamp_db.*TOfred@ares.mars.netIDENTFIEDBY"quartz"

  (标记samp_db.*寄义是“在samp_db数据库中的一切表”)在另外一个极度,您大概会有一个用户max,他漫游天下并必要可以从天下各地的主机中举行毗连。在这类情形下,不管他从那里毗连您都将同意:

  GRANTALLONsamp_db.*TOmax@%IDENTFIEDBY"diamond"

 ‘%’字符起通配符的感化,与LIKE形式婚配的寄义不异,在上个语句中,它的意义是“任何主机”。假如您基本不给出主机名部分,则它与指定“%”的寄义不异。因而,max和max@%是等价的。这是设置一个用户最简单的办法,但平安性最小。

  要想接纳让步的举措,可同意用户在一组无限的主机中举行毗连。比方,要使mary从snake.net域的任何主机中举行毗连,可以使用%.snake.net主机申明符:

  GRANTALLONsamp_db.*TOmary@%.snake.netIDENTFIEDBY"topaz"

  该用户标识符的主机部分可用IP地点而不是主机名给出(假如乐意的话)。能够指定一个间接的IP地点或包括形式字符的地点。一样,自MySQL3.23起,能够用一个收集掩码来指定IP号,收集掩码标明了用于该收集号的二进制位数:

  GRANTALLONsamp_db.*TOjoe@192.168.0.3IDENTIFIEDBY"water"

  GRANTALLONsamp_db.*TOardis@192.168.128.%IDENTIFIEDBY"snow"

  GRANTALLONsamp_db.*TOrex@192.168.128.0/17IDENTIFIEDBY"ice"

  第一条语句指明用户可举行毗连的特定的主机。第二条语句指定129.168.128ClassC子网的IP形式。在第三条语句中,192.168.128.0/17指定一个17位二进制的收集号,并将任何主机与其IP地点的前17个二进制位中的192.168.128.0/17举行婚配。

  假如MySQL埋怨您指定的用户值,则大概必要利用引号(但对用户名和主机名分离加引号):

  GRANTALLONsamp_db.presidentTO"myfriend"@"boa.snake.net"


2.用户应具有甚么级其余权限,这些权限合用于甚么
  您可授与分歧级其余权限。全局权限的功效最强,由于它们合用于任何数据库。为了使ethel成为能够举行统统操纵的超等用户(个中包含能够对其他用户受权),公布以下语句:
  GRANTALLON*.*TOethel@localhostIDENTIFIEDBY"coffee"
  WITHGRANTOPTION
  ON子句中*.*申明符的意义是“一切数据库,一切的表”,为保险起见,我们已指定ethel只能从当地主机中毗连。限定超等用户从哪些主机长进行毗连一般是明智的做法,由于它限定住了其他用户对口令举行探索。
  有些权限(FILE、PROCESS、RELOAD和SHUTDOWN)是办理权限,只能用NO*.*全局权限申明符来授与。假如但愿的话,也能够不必授与数据库级的权限来授与这些权限。比方,以下语句创建了一个flush用户,它除公布FLUSH语句外不做其他任何事变。在办理剧本中这多是有效的,由于必要在这些剧本中实行诸如在日记文件轮回时代革新日记的操纵:
  GRANTRELOADON*.*TOflush@localhostIDENTIFIEDBY"flushpass"
  一般授与办理权限应当是守旧的,由于具有这些权限的用户大概影响服务器的操纵。
  数据库级的权限合用于特定命据库中的一切表。这些权限利用ONdb_name.*子句举行授与:
  GRANTALLONsamp_db.*TObill@racer.snake.netIDENTIFIEDBY"rock"
  GRANTSELECTONmenagerie.*TOro_user@%IDENTIFIEDBY"dirt"
  第一条语句将bill的一切权限授与samp_db数据库的任何表。第二条语句创立一个限定会见的用户ro_user(只读用户),它能够会见menagerie数据库的一切表,但只能读取。也就是说,该用户只能公布SELECT语句。

如何在受权表项中指定当地主机名
  假如您利用服务器的主机名而非localhost,一般存在从该服务器主机毗连的成绩。这多是因为在受权表中指命名字的办法和名字分化器例程(nameresloverroutine)向程序呈报名字的办法之间的毛病婚配。假如分化器呈报了一个非限制的名字(如pit-viper),但受权表包括了具有全限制的名字的项(如pit-viper.snake.net,反之亦然),则产生毛病婚配。
  为了断定这类情形是不是正在体系中产生,可试着用-h选项毗连到当地服务器,该选项指定了主机的名字。然后检察服务器的惯例日记文件。它是如何呈报主机名的?是以非限制情势仍是限制情势?不管它是哪一种情势,都将告知您在公布GRANT语句时必要如何指定用户申明符的主机名部分。
  能够同时列出很多被授与的单个权限。比方,假如想让用户能读取和修正已有表的内容,但又不同意创立新表或删除表,可按以下受权:
  GRANTSELECT,INSERT,DELETE,UPDATEONsamp_db.*TOjennie@%
  IDENTIFIEDBY"boron"
  关于更小粒度(fine-grained)的会见把持,能够在单个表上受权,乃至在表的单个列上受权。当存在要对用户埋没的表时,大概,当只同意用户修正特定列时,列专有的权限是有效的。假定汗青联盟会中有一些意愿者使用您作为联盟会秘书应实行的职责来匡助您事情。这是一个好动静,但您决意起首给新的助手授与对member表只读的权限(该表中包括了会员资历的信息),然后再对他们增添授与该表的expiration列的列专有UPDATE权限。也就是说,您的助手能够在人们更新其会员资历时举行变动

第一条语句授与对全部member表的读会见权并设置口令。第二条语句增添UPDATE权限,但只是对expiration列。此时不用要再指定口令,由于在第一条语句中已完成了。
停止日期的事情。设置此MySQL用户的语句以下:

 假如想要为多个列授与列专有的权限,可指定一个列清单,并用逗号将这些列分开。比方,为了给assistant用户增添对member表地点列的UPDATE权限,可使用以下语句。新的权限将被增添到对该用户来讲已存在的一切列上:

  GRANTUPDATE(street,city,state,zip)ONsamp_db.member

  TOassistant@localhost

  一般,不要给用户授与比实践必要更年夜的权限。可是,当您想要利用户可以创立存储两头了局的一时表,而又不同意用户在包括有他们不克不及修正的数据的数据库中如许做时,就有了要在数据库上授与相称多的允许权限的来由。您能够创建一个独自的数据库(笔者称它为tmp)并授与用户该数据库的一切权限。比方,假如想要mars.net域的主机中的任何用户都可以利用tmp数据库,可公布以下GRANT语句:

  GRANTALLONtmp.*TO""@%.mars.net

  在完成这些以后,用户可以使用tmp.tbl_name格局的名字创立和援用tmp数据库中的表(用户申明符中的“”创立一个匿名用户项,任何用户都与空缺用户名相婚配)。

  3.同意用户办理权限吗

  经由过程授与数据库一切者数据库的一切权限并在操纵时指定WITHGRANTOPTION,能够同意数据库一切者把持对该数据库的会见。比方,假如要让alicia能在big.corp.com域的一切主机中举行毗连并办理sales数据库中一切表的权限,应利用以下GRANT语句:


实践上,WITHGRANTOPTION子句同意将会见的权力授与给另外一个用户。要晓得,具有GRANT权限的两个用户能够互相授与本人的权限。假如只给一个用户授与SELECT权限而给另外一个用户除SELECT外还授与了GRANT和其他的权限,则第二个用户可使第一个用户“壮大”起来。
  作废权限和删除用户
  为了发出某个用户的权限,可以使用REVOKE语句。除要用FROM交换TO而且没有IDENTIFIEDBY或WITHGRANTOPTION子句外,REVOKE的语法与GRANT语句十分类似:
  REVOKEprivileges(columns)ONwhatFROMuser
  user部分必需与您想要作废其权限的用户的原始GRANT语句的user部分相婚配。privileges部分不必要婚配,您可用GRANT语句受权,然后用REVOKE语句作废个中的一部分。REVOKE语句只删除权限,不删除用户。用户的项仍旧保存在user表中,即便您作废了该用户的一切权限也是云云。这意味着该用户仍旧可毗连到服务器上。要想删除全部用户,必需用DELETE语句将该用户的纪录从user表中间接删除:

 DELETE语句删除该用户的项,FLUSH语句告知服务重视新加载受权表(当利用GRANT或REVOKE语句,而不是间接修正受权表时,这些表将主动从头加载)。

一个权限困难,第一部分

  上面是一个在MySQL邮件清单中重复呈现的情形:一名新的MySQL办理员给某用户增添一个项,利用了主机名部分,该部分是用一个形式来指定的。比方:

  GRANTALLONsamp_db.*TOfred@%.snake.netIDENTIFIEDBY"cocoa"

  这里的企图是同意用户fred从snake.net域的一切主机中举行毗连,而且具有对samp_db数据库的一切权限。现实上,fred可以从那些主机中毗连(除服务器主机自己外)。当fred试着从服务器主机中举行毗连时,该妄图以“会见被回绝”的动静而告失利。即便用户指定了准确的口令也是云云。

  假如受权表中包括了由mysql_install_db安装剧本安装的缺省项,这类情形也会产生。其缘故原由是,当服务器考证fred毗连的妄图时,一个匿名用户项(anonymous-userentry)比fred项优先。匿名用户项请求该用户不必口令来毗连,而且一个口令毛病婚配产生。

  该成绩的另外一个背景将在第12章“权限困难,第二部分”中给出。今朝,只需说修改此成绩的办法是从user表中删除匿名用户项就充足了,我们不克不及用REVOKE,由于该命令只删除权限。要想完整挣脱这些匿名项,实行以下操纵:

  %mysql-urootmysqlmysql>DELETEFROMuserwhereUser="";

  mysql>FLUSHPRIVILEGES;

  如今,当fred试图从当地主机毗连时乐成了。
再现理想 该用户已被删除
沙发
 楼主| 发表于 2015-1-19 11:00:44 | 只看该作者
分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。
admin 该用户已被删除
板凳
发表于 2015-1-27 05:47:32 | 只看该作者
比如日志传送、比如集群。。。
深爱那片海 该用户已被删除
地板
发表于 2015-2-5 03:11:09 | 只看该作者
作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题!
愤怒的大鸟 该用户已被删除
5#
发表于 2015-2-11 03:15:03 | 只看该作者
两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
小妖女 该用户已被删除
6#
发表于 2015-3-1 20:25:06 | 只看该作者
作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题!
精灵巫婆 该用户已被删除
7#
发表于 2015-3-10 23:39:57 | 只看该作者
原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!
灵魂腐蚀 该用户已被删除
8#
发表于 2015-3-17 16:10:31 | 只看该作者
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
只想知道 该用户已被删除
9#
发表于 2015-3-24 12:12:52 | 只看该作者
这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-6 11:30

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表