兰色精灵 发表于 2015-1-16 22:45:20

MYSQL网页编程之MySQL中文参考手册7(MySQL 存取权限体系...

MySQL数据库归MySQLAB公司所有,但是这个软件是开源的,有一个MySQL学习教程可以免费下载。稍俱常识的新入门者都可以轻松实现在一个常见硬件上安装和配置MySQL。mysql|word|参考|参考手册|中文
MySQL中文参考手册7(MySQL存取权限体系)
转载译者:晏子

〖前往〗〖转发〗


译者:晏子(clyan@sohu.com)主页:http://linuxdb.yeah.net
6MySQL存取权限体系
MySQL有一个先辈但非尺度的平安/权限体系。本节形貌它的事情道理。

6.1权限体系做甚么
MySQL权限体系的次要功效是证明毗连到一台给定主机的一个用户,而且付与该用户在一个数据库上select、insert、update和delete的权限。

附加的功效包含有一个匿名的用户和关于MySQL特定的功效比方LOADDATAINFILE举行受权及办理操纵的才能。

6.2MySQL用户名和口令
由MySQL利用用户名和口令的办法与Unix或Windows利用的体例有良多分歧的地方:

MySQL利用于认证目标的用户名,与Unix用户名(登录名字)或Windows用户名有关。缺省地,年夜多半MySQL客户实验利用以后Unix用户名作为MySQL用户名登录,可是这仅仅为了便利。客户程序同意用-u或--user选项指定一个分歧的名字,这意味着不管怎样你不克不及使得一个数据库更平安,除非一切的MySQL用户名都有口令。任何人能够试图用任何名字毗连服务器,并且假如他们指定了没有口令的任何名字,他们将乐成。
MySQL用户名最长能够是16各字符;典范地,Unix用户名限定为8个字符。
MySQL口令与Unix口令不妨。在你利用登录到一台Unix呆板口令和你利用在那台呆板上存取一个数据库的口令之间没有需要有联系关系。
MySQL加密口令利用了一个Unix登录时代所用的分歧算法,见7.4.12杂项函数一节中形貌PASSWORD()和ENCRYPT()函数部分。

6.3与MySQL服务器毗连
当你想要存取一个MySQL服务器时,MySQL客户程序一样平常请求你指定毗连参数:你想要连接的主机、你的用户名和你的口令。比方,mysql客户能够象如许启动(可选的参数被包含在“[”和“]”之间):

shell>mysql[-hhost_name][-uuser_name][-pyour_pass]
-h,-u和-p选项的另外一种情势是--host=host_name、--user=user_name和--password=your_pass。注重在-p或--password=与跟从它前面的口令之间没有空格。

注重:在命令行上指定一个口令是不平安的!随后在你体系上的任何用户能够经由过程打相似如许的命令发明你的口令:psauxww。见4.15.4选项文件。

关于命令行没有的连接参数,mysql利用缺省值:

缺省主机名是localhost。
缺省用户名是你的Unix登录名。
假如没有-p,则没有供应口令。

如许,对一个Unix用户joe,以下命令是等价的:

shell>mysql-hlocalhost-ujoe
shell>mysql-hlocalhost
shell>mysql-ujoe
shell>mysql

别的MySQL客户程序有一样体现。

在Unix体系上,当你举行一个毗连时,你能够指定要利用的分歧的缺省值,如许你不用每次在你挪用一个客户程序是在命令行上输出他们。这能够有良多办法做到:

你能在你的主目次下“.my.cnf”的设置文件的大节里指定毗连参数。文件的相干大节看上往大概像如许:

host=host_name
user=user_name
password=your_pass

见4.15.4选项文件。

你能够用情况变量指定毗连参数。主机可用MYSQL_HOST指定,MySQL用户名字可用USER指定(仅对Windows),口令可用MYSQL_PWD指定(可是这不平安,见下一节)。
假如毗连参数以多种办法被指定,在命令行上被指定的值优先于在设置文件和情况变量中指定的值,而在设置文件指定的值优先于在情况变量指定的值。

6.4使你的口令平安
以一种表露的可被其他用户发明的体例指定你的口令是不当当的。当你运转客户程序时,你可使用以下办法指定你的口令,另有每一个办法的风险评价:

利用一个在命令行上-pyour_pass或--password=your_pass的选项。这很便利可是不平安,由于你的口令对体系形态程序(比方ps)变得可见,它能够被其他的用户挪用来显现命令行。(一样平常MySQL客户在他们的初始化按次时代用零掩盖命令行参数,可是仍旧有一个长久距离工夫内参数值可见的。)
利用一个-p或--password选项(没有指定your_pass值)。在这类情形下,客户程序哀求来自终真个口令:
shell>mysql-uuser_name-p
Enterpassword:********

客户回应“*”字符到作为输出你的口令的终端使得傍观者不克不及瞥见它。由于它对其他用户不成见,与在命令行上指定它比拟,如许进进你的口令更平安。但是,这个输出一个口令的办法仅仅为你交互式运转程序是符合的。假如你想要从非交互式运转的一个剧本挪用一个客户,就没有从终端输出出口令的时机。


在一个设置文件中存储你的口令。比方,你可你的主目次的“.my.cnf”文件中的节列出你的口令:

password=your_pass

假如你在“.my.cnf”内里存储口令,文件应当不是组或天下可读或可写的。包管文件的存取形式是400或600。见4.15.4选项文件。



你可在MYSQL_PWD情况变量中存储口令,可是这个办法必需想到是极不平安的且应当不利用。ps的某些版本包含显现运转历程的情况的选项;假如你设定MYSQL_PWD,你的口令将对一切人是不言而喻的,乃至在没有如许一个版本的ps体系上,假定没有其他办法察看到历程情况是不明智的。
总之,最平安的办法是让客户程序提醒口令或在一个得当回护的“.my.cnf”文件中指定口令。

6.5MySQL供应的权限
权限信息用user、db、host、tables_priv和columns_priv表被存储在mysql数据库中(即在名为mysql的数据库中)。在MySQL启动时和在6.9权限修正什么时候失效所说的情形时,服务器读进这些数据库表内容。

本手册所用的触及由MySQL供应的权限称号显现鄙人表,另有在受权表中每一个权限的表列称号和每一个权限有关的高低文:

权限列高低文
selectSelect_priv表
insertInsert_priv表
updateUpdate_priv表
deleteDelete_priv表
indexIndex_priv表
alterAlter_priv表
createCreate_priv数据库、表或索引
dropDrop_priv数据库或表
grantGrant_priv数据库或表
referencesReferences_priv数据库或表
reloadReload_priv服务器办理
shutdownShutdown_priv服务器办理
processProcess_priv服务器办理
fileFile_priv在服务器上的文件存取

select、insert、update和delete权限同意你在一个数据库现有的表上实行操纵。

SELECT语句只要在他们真正从一个表中检索行是才必要select权限,你能够实行某个SELECT语句,乃至没有任何到服务器上的数据库里的存取任何器材的允许。比方,你可以使用mysql客户作为一个复杂的盘算器:

mysql>SELECT1+1;
mysql>SELECTPI()*2;

index权限同意你创立或丢弃(删除)索引。

alter权限同意你利用ALTERTABLE。

create和drop权限同意你创立新的数据库和表,或丢弃(删除)现存的数据库和表。

注重:假如你将mysql数据库的drop权限授与一个用户,该用户能丢弃存储了MySQL存取权限的数据库!

grant权限同意你把你本人具有的那些权限授给其他的用户。

file权限赐与你用LOADDATAINFILE和SELECT...INTOOUTFILE语句读和写服务器上的文件,任何被授与这个权限的用户都能读或写MySQL服务器能读或写的任何文件。

其他的权限用于办理性操纵,它利用mysqladmin程序实行。下表显现mysqladmin安排每一个办理性权限同意你实行的命令:

优惠权限具有者同意实行的命令
reloadreload,refresh,flush-privileges,flush-hosts,flush-logs,flush-tables
shutdownshutdown
precessprocesslist,kill

reload命令告知服务器再读进受权表,refresh命令洗濯一切表并翻开和封闭纪录文件,flush-privileges是reload的一个同义词,别的flush-*命令实行相似refresh的功效,可是局限更无限,而且在某些情形下大概更好用。比方,假如你只是想洗濯纪录文件,flush-logs比refresh是更好的选择。

shutdown命令关失落服务器。

processlist命令显现在服务器内实行的线程的信息。kill命令杀逝世服务器线程。你老是能显现或杀逝世你本人的线程,可是你必要process权限来显现或杀逝世其他用户启动的线程。

总的说来,只授与权限给必要他们的那些用户是一个好主张,可是你应当在授与某个权限时实验特定的告诫:

grant权限同意用户保持他们的权限给其他用户。2个有分歧的权限并有grant权限的用户能够兼并权限。
alter权限能够用于经由过程从头定名表来颠覆权限体系。
file权限能够被滥用在服务器上读取任何天下可读(world-readable,即任何人可读)的文件到一张数据库表,然后其内容能用SELECT被存取。
shutdown权限经由过程停止服务器能够被滥用完整回绝为其他用户服务,。
precess权限能被用来观察以后实行的查询的一般文本,包含设定或改动口令查询。
在mysql数据库上的权限能被用来改动口令和其他存取权限信息。(口令被加密存储,以是一个歹意的用户不克不及复杂地读取他们。但是,有充足的权限,统一个用户能用分歧的一个取代一个口令。)
有一些事变你不克不及用MySQL权限体系做到:

你不克不及分明地指定一个给定用户应当被回绝存取。即,你不克不及分明地婚配一个用户而且然后回绝毗连。
你不克不及指定一个用户有权创立立或丢弃一个数据库中的表,也不克不及创立或丢弃数据库自己。

6.6权限体系事情道理
MySQL权限体系包管一切的用户能够严厉地做他们假定被同意做的事变。当你毗连一个MySQL服务器时,你的身份由你从那毗连的主机和你指定的用户名来决意,体系依据你的身份和你想做甚么来授与权限。

MySQL在认定身份中思索你的主机名和用户名字,是由于有很小的缘故原由假定一个给定的用户在因特网上属于统一团体。比方,用户从whitehouse.gov毗连的bill不用和从mosoft.com毗连bill是统一团体。MySQL经由过程同意你辨别在分歧的主机上可巧有一样名字用户来处置它:你能够对从whitehouse.gov毗连授予bill一个权限集,而为从microsoft.com的毗连授与一个分歧的权限集。

MySQL存取把持包括2个阶段:

阶段1:服务器反省你是不是同意毗连。
阶段2:假定你能毗连,服务器反省你收回的每一个哀求。看你是不是有充足的权限实行它。比方,假如你从数据库中一个表精选(select)行或从数据库丢弃一个表,服务器断定你对表有select权限或对数据库有drop权限。

服务器在存取把持的两个阶段利用在mysql的数据库中的user、db和host表,在这些受权表中字段以下:

表称号userdbhost
局限字段HostHostHost
UserDbDb
PasswordUser
权限字段Select_privSelect_privSelect_priv
Insert_privInsert_privInsert_priv
Update_privUpdate_privUpdate_priv
Delete_privDelete_privDelete_priv
Index_privIndex_privIndex_priv
Alter_privAlter_privAlter_priv
Create_privCreate_privCreate_priv
Drop_privDrop_privDrop_priv
Grant_privGrant_privGrant_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv

对存取把持的第二阶段(哀求证明),假如哀求触及表,服务器能够别的参考tables_priv和columns_priv表。这些表的字段以下:

表称号tables_privcolumns_priv
局限字段HostHost
DbDb
UserUser
Table_nameTable_name
Column_name
权限字段Table_privColumn_priv
Column_priv
其他字段TimestampTimestamp
Grantor

每一个受权表包括局限字段和权限字段。

局限字段决意表中每一个条目标局限,即,条目合用的高低文。比方,一个user表条目标Host和User值为thomas.loc.gov和bob将被用于证明来自立机thomas.loc.gov的bob对服务器的毗连。一样,一个db表条目标Host、User和Db字段的值是thomas.loc.gov、bob和reports将用在bob从主机连接thomas.loc.gov存取reports数据库的时分。tables_priv和columns_priv表包括局限字段,指出每一个条目合用的表或表/列的组合。

关于反省存取的用处,对照Host值是疏忽巨细写的。User、Password、Db和Table_name值是辨别巨细写的。Column_name值在MySQL3.22.12或今后版本是疏忽巨细写的。

权限字段指出由一个表条目授与的权限,即,可实行甚么操纵。服务器组合各类的受权表的信息构成一个用户权限的完全形貌。为此利用的划定规矩在6.8存取把持,阶段2:哀求证明形貌。

局限字段是字符串,以下所述;每一个字段的缺省值是空字符串:

字段名范例
HostCHAR(60)
UserCHAR(16)
PasswordCHAR(16)
DbCHAR(64)(tables_priv和columns_priv表为CHAR(60))

在user、db和host表中,一切权限字段被声明为ENUM(N,Y)--每个都可有值N或Y,而且缺省值是N.

在tables_priv和columns_priv表中,权限字段被声明为SET字段:

表名字段名大概的汇合成员
tables_privTable_privSelect,Insert,Update,Delete,Create,Drop,Grant,References,Index,Alter
tables_privColumn_privSelect,Insert,Update,References
columns_privColumn_privSelect,Insert,Update,References

复杂地说,服务器利用如许的受权表:

user表局限字段决意是不是同意或回绝到来的毗连。关于同意的毗连,权限字段指出用户的全局(超等用户)权限。
db和host表一同利用:

db表局限字段决意用户能从哪一个主机存取哪一个数据库。权限字段决意同意哪一个操纵。

当你想要一个给定的db条目使用于多少主机时,host表作为db表的扩大被利用。比方,假如你想要一个用户能在你的收集从多少主机利用一个数据库,在用户的db表的Host条目设为空值,然后将那些主机的每个移进host表。这个机制具体形貌在6.8存取把持,阶段2:哀求证明。

tables_priv和columns_priv表相似于db表,可是更精巧:他们在表和列级使用而非在数据库级。
注重办理权限(reload,shutdown,等等)仅在user表中被指定。这是由于办理性操纵是服务器自己的操纵而且不是特定命据库,因而没有来由在其他受权表中列出如许的权限。现实上,只必要就教user表来决意你是不是实行一个办理操纵。

file权限也仅在user表中指定。它不是办理性权限,但你读或谢在服务器主机上的文件的的才能自力于你正在存取的数据库。

当mysqld服务器启动时,读取一次受权表内容。对受权表的变动失效在6.9权限变动什么时候失效形貌。

当你修正受权表的内容时,确保你按你想要的体例变动权限设置是一个好主张。为匡助诊断成绩,见6.13“存取回绝引发”毛病的缘故原由。关于平安成绩上的忠言,见6.14怎样对使MySQL平安匹敌解密妙手。

一个有效的诊断工具是mysqlaccess剧本,由CarlierYves供应给MySQL分发。利用--help选项挪用mysqlaccess查明它如何事情。注重:mysqlaccess仅用user、db和host表仅反省存取。它不反省表或列级权限。

6.7存取把持,阶段1:毗连证明
当你试图连接一个MySQL服务器时,服务器基于你的身份和你是不是能经由过程供给准确的口令考证身份来承受或回绝毗连。假如不是,服务器完整具结你的存取,不然,服务器承受毗连,然落后进阶段2而且守候哀求。

你的身份基于2个信息:

你从谁人主机毗连
你的MySQL用户名

身份反省利用3个user表(Host,User和Password)局限字段实行。服务器只要在一个user表条目婚配你的主机名和用户名而且你供应了准确的口令时才承受毗连。

在user表局限字段能够以下被指定:

一个Host值能够是主机名或一个IP数字,或localhost指出当地主机。
你能够在Host字段里利用通配符字符“%”和“_”。
一个Host值%婚配任何主机名,一个空缺Host值等价于%。注重这些值婚配能创立一个毗连到你的服务器的任何主机!
通配符字符在User字段中不同意,可是你能指定空缺的值,它婚配任何名字。假如user表婚配到来的毗连的条目有一个空缺的用户名,用户被以为是匿名用户(没着名字的用户),而非客户实践指定的名字。这意味着一个空缺的用户名被用于在毗连时代的进一步的存取反省(即,在阶段2时代)。
Password字段能够是空缺的。这不料味着婚配任何口令,它意味着用户必需不指定一个口令举行毗连。
非空缺Password值代表加密的口令。MySQL不以任何人能够看的纯文本格局存储口令,相反,正在试图连接的一个用户供应的口令被加密(利用PASSWORD()函数),而且与存储了user表中的已加密的版本对照。假如他们婚配,口令是准确的。

上面的例子显现出各类user表中Host和User条目标值的组合怎样使用于到来的毗连:

Host值User值被条目婚配的毗连
thomas.loc.govfredfred,从thomas.loc.gov毗连
thomas.loc.gov任何用户,从thomas.loc.gov毗连
%fredfred,从任何主机毗连
%任何用户,从任何主机毗连
%.loc.govfredfred,从在loc.gov域的任何主机毗连
x.y.%fredfred,从x.y.net、x.y.com,x.y.edu等连接。(这也许无用)
144.155.166.177fredfred,从有144.155.166.177IP地点的主机毗连
144.155.166.%fredfred,从144.155.166C类子网的任何主机毗连

既然你能在Host字段利用IP通配符值(比方,144.155.166.%婚配在一个子网上的每台主机),有大概或人大概妄图探求这类才能,经由过程定名一台主机为144.155.166.somewhere.com。为了制止如许的妄图,MySQL不同意婚配以数字和一个点肇端的主机名,如许,假如你用一个定名为相似1.2.foo.com的主机,它的名字决不会婚配受权表中Host列。只要一个IP数字能婚配IP通配符值。

一个到来的毗连能够被在user表中的凌驾一个条目婚配。比方,一个由fred从thomas.loc.gov的毗连婚配多个条目如上所述。假如凌驾一个婚配,服务器怎样选择利用哪一个条目呢?服务器在启动时读进user表后经由过程排序来办理这个成绩,然后当一个用户试图毗连时,以排序的按次扫瞄条目,第一个婚配的条目被利用。

user表排序事情以下,假定user表看起来像如许:

+-----------+----------+-
|Host|User|...
+-----------+----------+-
|%|root|...
|%|jeffrey|...
|localhost|root|...
|localhost||...
+-----------+----------+-

当服务器在表中读取时,它以最特定的Host值为先的序次分列(%在Host列里意味着“任何主机”而且是最不特定的)。有不异Host值的条目以最特定的User值为先的序次分列(一个空缺User值意味着“任何用户”而且是最不特定的)。终极排序的user表看起来像如许:

+-----------+----------+-
|Host|User|...
+-----------+----------+-
|localhost|root|...
|localhost||...
|%|jeffrey|...
|%|root|...
+-----------+----------+-

当一个毗连被实验时,服务器扫瞄排序的条目并利用找到的第一个婚配。关于由jeffrey从localhost的一个毗连,在Host列的localhost条目起首婚配。那些有空缺用户名的条目婚配毗连的主机名和用户名。(%/jeffrey条目也将婚配,可是它不是在表中的第一婚配。)

这是别的一个例子。假定user表看起来像如许:

+----------------+----------+-
|Host|User|...
+----------------+----------+-
|%|jeffrey|...
|thomas.loc.gov||...
+----------------+----------+-

排序后的表看起来像如许:

+----------------+----------+-
|Host|User|...
+----------------+----------+-
|thomas.loc.gov||...
|%|jeffrey|...
+----------------+----------+-

一个由jeffrey从thomas.loc.gov的毗连被第一个条目婚配,而一个由jeffrey从whitehouse.gov的毗连被第二个婚配。

广泛的曲解是以为,对一个给定的用户名,当服务器试图对毗连寻觅婚配时,明白定名谁人用户的一切条目将起首被利用。这分明不是现实。先前的例子申明了这点,在那边一个由jeffrey从thomas.loc.gov的毗连没被包括jeffrey作为User字段值的条目婚配,可是由没有效户名的标题婚配!

假如你有服务器毗连的成绩,打印出user表而且手工排序它看看第一个婚配在哪儿举行。

6.8存取把持,阶段2:哀求证明
一旦你创建了一个毗连,服务器进进阶段2。对在此毗连长进来的每一个哀求,服务器反省你是不是有充足的权限来实行它,它基于你但愿实行的操纵范例。这恰是在受权表中的权限字段发扬感化的中央。这些权限能够来子user、db、host、tables_priv或columns_priv表的任何一个。受权表用GRANT和REVOKE命令操纵。见7.26GRANT和REVOKE句法。(你能够觉察参考6.6权限体系如何事情很有匡助,它列出了在每一个权限表中出现的字段。)

user表在一个全局基本上授与付与你的权限,该权限不论以后的数据库是甚么均合用。比方,假如user表授与你delete权限,你能够删除在服务器主机上从任何数据库删除行!换句话说,user表权限是超等用户权限。只把user表的权限授与超等用户如服务器或数据库主管是明智的。对其他用户,你应当把在user表中的权限设成N而且仅在一个特定命据库的基本上受权,利用db和host表。

db和host表授与数据库特定的权限。在局限字段的值能够以下被指定:

通配符字符“%”和“_”可被用于两个表的Host和Db字段。
在db表的%Host值意味着“任何主机”,在db表中一个空缺Host值意味着“对进一步的信息征询host表”。
在host表的一个%或空缺Host值意味着“任何主机”。
在两个表中的一个%或空缺Db值意味着“任何数据库”。
在两个表中的一个空缺User值婚配匿名用户。

db和host表在服务器启动时被读取和排序(同时它读user表)。db表在Host、Db和User局限字段上排序,而且host表在Host和Db局限字段上排序。关于user表,排序起首安排最特定的值然后最初最不特定的值,而且当服务器寻觅婚配进条目时,它利用它找到的第一个婚配。

tables_priv和columns_priv表授与表和列特定的权限。在局限字段的值能够以下被指定:

通配符“%”和“_”可用在利用在两个表的Host字段。
在两个表中的一个%或空缺Host意味着“任何主机”。
在两个表中的Db、Table_name和Column_name字段不克不及包括通配符或空缺。

tables_priv和columns_priv表在Host、Db和User字段上被排序。这相似于db表的排序,只管由于只要Host字段能够包括通配符,但排序更复杂。

哀求证明历程鄙人面形貌。(假如你熟习存取反省的源代码,你会注重到这里的形貌与在代码利用的算法略有分歧。形貌等价于代码实践做的器材;它只是分歧于使注释更复杂。)

对办理哀求(shutdown、reload等等),服务器仅反省user表条目,由于那是独一指定办理权限的表。假如条目允许哀求的操纵,存取被受权了,不然回绝。比方,假如你想要实行mysqladminshutdown,可是你的user表条目没无为你授与shutdown权限,存取乃至不必反省db或host表就被回绝。(由于他们不包括Shutdown_priv行列,没有如许做的需要。)

对数据库有关的哀求(insert、update等等),服务器起首经由过程查找user表条目来反省用户的全局(超等用户)权限。假如条目同意哀求的操纵,存取被受权。假如在user表中全局权限不敷,服务器经由过程反省db和host表断定特定的用户数据库权限:

服务器在db表的Host、Db和User字段上查找一个婚配。Host和User对应毗连用户的主机名和MySQL用户名。Db字段对使用户想要存取的数据库。假如没有Host和User的条目,存取被回绝。
假如db表中的条目有一个婚配并且它的Host字段不是空缺的,该条目界说用户的数据库特定的权限。
假如婚配的db表的条目标Host字段是空缺的,它暗示host表枚举主机应当被同意存取数据库的主机。在这类情形下,在host表中作进一步查找以发明Host和Db字段上的婚配。假如没有host表条目婚配,存取被回绝。假如有婚配,用户数据库特定的权限以在db和host表的条目标权限,即在两个条目都是Y的权限的交集(而不是并集!)盘算。(如许你能够授与在db表条目中的一样平常权限,然后用host表条目按一个主机一个主机为基本地有选择地限定它们。)

在断定了由db和host表条目授与的数据库特定的权限后,服务器把他们加到由user表授与的全局权限中。假如了局同意哀求的操纵,存取被受权。不然,服务器反省在tables_priv和columns_priv表中的用户的表和列权限并把它们加到用户权限中。基于此了局同意或回绝存取。

用布尔术语暗示,后面关于一个用户权限怎样盘算的形貌能够如许总结:

globalprivileges
OR(databaseprivilegesANDhostprivileges)
ORtableprivileges
ORcolumnprivileges

它大概不分明,为何呢,假如全局user条目标权限最后发明对哀求的操纵不敷,服务器今后把这些权限加到数据库、表和列的特定权限。缘故原由是一个哀求大概请求凌驾一品种型的权限。比方,假如你实行一个INSERT...SELECT语句,你就都要insert和select权限。你的权限必需云云以便user表条目授与一个权限而db表条目授与另外一个。在这类情形下,你有需要的权限实行哀求,可是服务器不克不及本人把两个表区分开来;两个条目授与的权限必需组合起来。

host表能被用来保护一个“平安”服务器列表。在TcX,host表包括一个在当地的收集上一切的呆板的表,这些被授与一切的权限。

你也能够利用host表指定不平安的主机。假定你有一台呆板public.your.domain,它位于你不以为是平安的一个大众地区,你能够用以下的host表条目子同意除那台呆板外的收集上一切主机的存取:

+--------------------+----+-
|Host|Db|...
+--------------------+----+-
|public.your.domain|%|...(一切权限设为N)
|%.your.domain|%|...(一切权限设为Y)
+--------------------+----+-

固然,你应当老是测试你在受权表中的条目(比方,利用mysqlaccess)让你确保你的存取权限实践上以你以为的体例被设置。

6.9权限变动什么时候失效
当mysqld启动时,一切的受权表内容被读进存储器而且从那点失效。

用GRANT、REVOKE或SETPASSWORD对受权表实施的修正会当即被服务器注重到。

假如你手工地修正受权表(利用INSERT、UPDATE等等),你应当实行一个FLUSHPRIVILEGES语句或运转mysqladminflush-privileges告知服务器再装载受权表,不然你的改动将不失效,除非你重启服务器。

当服务器注重到受权表被改动了时,现存的客户毗连有以下影响:

表和列权限在客户的下一次哀求时失效。
数据库权限改动鄙人一个USEdb_name命令失效。
全局权限的改动和口令改动鄙人一次客户毗连时失效。


6.10创建初始的MySQL权限
在安装MySQL后,你经由过程运转scripts/mysql_install_db安装初始的存取权限。见4.7.1疾速安装概述。scripts/mysql_install_db剧本启动mysqld服务器,然后初始化受权表,包括以下权限汇合:

MySQLroot用户作为可做任何事变的一个超等用户被制造。毗连必需由当地主机收回。注重:出生的root口令是空的,因而任何人能以root而没有一个口令举行毗连而且被授与一切权限。
一个匿名用户被制造,他可对有一个test或以test_入手下手的名字的数据库做任什么时候期事变,毗连必需由当地主机收回。这意味着任何当地用户能毗连而且视为匿名用户。
其他权限被回绝。比方,一样平常用户不克不及利用mysqladminshutdown或mysqladminprocesslist。
注重:对Win32的初始权限是分歧的。见4.12.4在Win32上运转MySQL。

既然你的安装初始时广开年夜门,你起首应当做的事变之一是为MySQLroot用户指定一个口令。你能够做以下(注重,你利用PASSWORD()函数指定口令):

shell>mysql-urootmysql
mysql>UPDATEuserSETPassword=PASSWORD(new_password)
WHEREuser=root;
mysql>FLUSHPRIVILEGES;

在MySQL3.22和以上版本中,你可使用SETPASSWORD语句:

shell>mysql-urootmysql
mysql>SETPASSWORDFORroot=PASSWORD(new_password);

设置口令的另外一种办法是利用mysqladmin命令:

shell>mysqladmin-urootpasswordnew_password

注重:假如你利用第一种办法在user内外间接更新口令,你必需告知服务器再次读进受权表(用FLUSHPRIVILEGES),由于不然改动将不被注重到。

一旦root口令被设置,今后当你作为root与服务器毗连时,你必需供给谁人口令。

你大概但愿让root口令为空缺以便利你实施附加的安装时,你不必要指定它或测试,可是包管在任何实在的临盆事情中利用你的安装之前,设置它。

看看scripts/mysql_install_db剧本,看它怎样安装缺省的权限。你可用它作为一个研讨怎样增添其他用户的基本。

假如你想要初始的权限分歧于下面形貌的那些,在你运转mysql_install_db之前,你能够修正它。

为了完整重修权限表,删除在包括mysql数据库的目次下一切“*.frm”,“*.MYI”和“*.MYD”文件。(这是在数据库目次上面定名为“mysql”的目次,当你运转mysqld--help时,它被列出。)然后运转mysql_install_db剧本,大概在起首编纂它具有你想要的权限以后。

注重:关于比MySQL3.22.10旧的版本,你不该该删除“*.frm”文件。假如你偶尔做了,你应当在运转mysql_install_db之前你的MySQL分发中拷回它们。

6.11向MySQL增添新用户权限
你能够有2个分歧的办法增添用户:经由过程利用GRANT语句或经由过程间接操纵MySQL受权表。对照好的办法是利用GRANT语句,由于他们是更简明而且仿佛毛病少些。

上面的例子显现出怎样利用mysql客户安装新用户。这些例子假定权限依据之前的章节形貌的缺省被安装。这意味着为了改动,你必需在mysqld正在运转统一台呆板上,你必需作为MySQLroot用户毗连,而且root用户必需对mysql数据库有insert权限和reload办理权限。别的,假如你改动了root用户口令,你必需以下的mysql命令指定它。

你能够经由过程收回GRANT语句增添新用户:

shell>mysql--user=rootmysql
mysql>GRANTALLPRIVILEGESON*.*TOmonty@localhost
IDENTIFIEDBYsomethingWITHGRANTOPTION;
mysql>GRANTALLPRIVILEGESON*.*TOmonty@"%"
IDENTIFIEDBYsomethingWITHGRANTOPTION;
mysql>GRANTRELOAD,PROCESSON*.*TOadmin@localhost;
mysql>GRANTUSAGEON*.*TOdummy@localhost;

这些GRANT语句安装3个新用户:

monty
能够从任何中央毗连服务器的一个完整的超等用户,可是必需利用一个口令(something做这个。注重,我们必需对monty@localhost和monty@"%"收回GRANT语句。假如我们增添localhost条目,对localhost的匿名用户条目在我们从当地主机毗连接时由mysql_install_db创立的条目将优先思索,由于它有更特定的Host字段值,以是以user表分列按次看更早到来。
admin
能够从localhost没有一个口令举行毗连而且被授与reload和process办理权限的用户。这同意用户实行mysqladminreload、mysqladminrefresh和mysqladminflush-*命令,另有mysqladminprocesslist。没有授与数据库有关的权限。他们能在今后经由过程收回另外一个GRANT语句受权。
dummy
能够不必一个口令毗连的一个用户,可是只能从当地主机。全局权限被设置为N--USAGE权限范例同意你无需权限便可设置一个用户。它假定你将在今后授与数据库相干的权限。
你也能够间接经由过程收回INSERT语句增添一样的用户存失信息,然后告知服务器再次装进受权表:

shell>mysql--user=rootmysql
mysql>INSERTINTOuserVALUES(localhost,monty,PASSWORD(something),
Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y)
mysql>INSERTINTOuserVALUES(%,monty,PASSWORD(something),
Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y)
mysql>INSERTINTOuserSETHost=localhost,User=admin,
Reload_priv=Y,Process_priv=Y;
mysql>INSERTINTOuser(Host,User,Password)
VALUES(localhost,dummy,);
mysql>FLUSHPRIVILEGES;

取决于你的MySQL版本,对上述,你大概必需利用一个分歧数量Y值(在3.22.11之前的版本有更少的权限列)。对admin用户,只用在3.22.11入手下手的版本具有的加倍可读的INSERT扩大的语法。

注重,为了设置一个超等用户,你只需制造一个user表条目,其权限字段设为Y。不必要db或host表的条目。

在user表中的权限列不是由最初一个INSERT语句明白设置的(对dummy用户),因而那些列被付与缺省值N。这是GRANTUSAGE做的一样的事变。

以下例子增添一个用户custom,他能从主机localhost、server.domain和whitehouse.gov毗连。他只想要从localhost存取bankaccount数据库,从whitehouse.gov存取expenses数据库和从一切3台主机存取customer数据库。他想要从一切3台主机上利用口令stupid。

为了利用GRANT语句设置个用户的权限,运转这些命令:

shell>mysql--user=rootmysql
mysql>GRANTSELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ONbankaccount.*
TOcustom@localhost
IDENTIFIEDBYstupid;
mysql>GRANTSELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ONexpenses.*
TOcustom@whitehouse.gov
IDENTIFIEDBYstupid;
mysql>GRANTSELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ONcustomer.*
TOcustom@%
IDENTIFIEDBYstupid;

经由过程间接修正受权表设置用户权限,运转这些命令(注重,在停止时FLUSHPRIVILEGES):

shell>mysql--user=rootmysql
mysql>INSERTINTOuser(Host,User,Password)
VALUES(localhost,custom,PASSWORD(stupid));
mysql>INSERTINTOuser(Host,User,Password)
VALUES(server.domain,custom,PASSWORD(stupid));
mysql>INSERTINTOuser(Host,User,Password)
VALUES(whitehouse.gov,custom,PASSWORD(stupid));
mysql>INSERTINTOdb
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
VALUES
(localhost,bankaccount,custom,Y,Y,Y,Y,Y,Y);
mysql>INSERTINTOdb
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
VALUES
(whitehouse.gov,expenses,custom,Y,Y,Y,Y,Y,Y);
mysql>INSERTINTOdb
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
VALUES(%,customer,custom,Y,Y,Y,Y,Y,Y);
mysql>FLUSHPRIVILEGES;

头3个INSERT语句增添user表条目,同意用户custom用给定口令从分歧的主机举行毗连,可是没有授与任何允许(一切权限被设置为缺省值N)。后3个INSERT语句增添db表条目,授与custom以bankaccount、expenses和customer数据库权限,可是只能在从准确的主机存取时。一般,在受权表间接被修正时,服务器必需原告知再次装进他们(用FLUSHPRIVILEGES)以便使权限修正失效。

假如你想要给特定的用户从一个给定的域上的任何呆板上存取权限,你能够收回一个以下的GRANT语句:

mysql>GRANT...
ON*.*
TOmyusername@"%.mydomainname.com"
IDENTIFIEDBYmypassword;

为了经由过程间接修正受权表做一样的事变,如许做:

mysql>INSERTINTOuserVALUES(%.mydomainname.com,myusername,
PASSWORD(mypassword),...);
mysql>FLUSHPRIVILEGES;

你也能够利用xmysqladmin、mysql_webadmin乃至xmysql在受权表中拔出、改动和更新值。你能够在MySQL的Contrib目次找到这些有用程序。

6.12如何设置口令
在后面大节的例子里申明了一个主要的准绳:当你利用INSERT或UPDATE语句存储一个非空的口令时,你必需利用PASSWORD()函数加密它。这是由于在user表中以加密情势存储口令,而不是作为纯文本。假如你健忘这个现实,你大概像如许试图设置口令:

shell>mysql-urootmysql
mysql>INSERTINTOuser(Host,User,Password)VALUES(%,jeffrey,biscuit);
mysql>FLUSHPRIVILEGES

了局是纯文本值biscuit作为口令被存储在user表中。在用户jeffrey试图用这个口令毗连服务器时,mysql客户用PASSWORD()加密它而且将了局送给服务器,服务器对照在user表中的值(它是纯文本值biscuit)和加密的口令(而不是biscuit),对照失利而且服务器回绝毗连:

shell>mysql-ujeffrey-pbiscuittest
Accessdenied

由于当他们被拔出user表时,口令必需被加密,相反,INSERT语句应当象如许被指定:

mysql>INSERTINTOuser(Host,User,Password)
VALUES(%,jeffrey,PASSWORD(biscuit));

当你利用SETPASSWORD语句时,你也必需利用PASSWORD()函数:

mysql>SETPASSWORDFORjeffrey@"%"=PASSWORD(biscuit);

假如你利用GRANT...IDENTIFIEDBY语句或mysqladminpassword命令设置口令,PASSWORD()函数是不用要的。他们都思索到为你加密口令,多以你可像如许指定一个口令biscuit:

mysql>GRANTUSAGEON*.*TOjeffrey@"%"IDENTIFIEDBYbiscuit;



shell>mysqladmin-ujeffreypasswordbiscuit

注重:PASSWORD()不是以在Unix口令加密的一样办法实施口令加密。你不该该假定假如你的Unix口令和你的MySQL口令是一样的,PASSWORD()将招致与在Unix口令文件被存储的一样的加密值。见6.2MySQL用户名和口令。

6.13Accessdenied毛病的缘故原由

当你试着连接MySQL服务器时,假如你碰着Accessdenied毛病,显现鄙人面的表指出一些你能用来改正这个成绩的举措:

你是在安装MySQL今后运转mysql_install_db的剧本,来设置初始受权表内容吗?假如不是,如许做。见6.10设置初始MySQL权限。经由过程实行这个命令测试初始权限:
shell>mysql-uroottest

服务器应当让你无误地毗连。你也应当包管你在MySQL数据库目次有一个文件“user.MYD”。一般,它是“PATH/var/mysql/user.MYD”,在此PATH是MySQL安装根目次的路径。

在一个新的安装今后,你应当毗连服务器而且设置你的用户及其存取允许:
shell>mysql-urootmysql

服务器应当让你毗连,由于MySQLroot用户初始时没有口令。既然那也是一个平安风险,当你正在设置其他MySQL用户时,设定root口令是一件主要的事请。假如你作为root实验毗连而且失掉这个毛病:

Accessdeniedforuser:@unknowntodatabasemysql

这意味着,你没有一个条目在user表中的一个User列值为root而且mysqld不克不及为你的客库剖析主机名。在这类情形下,你必需用--skip-grant-tables选项重启服务器而且编纂你的“/etc/hosts”或“windowshosts”文件为你的主机增添一个条目。

假如你从一个3.22.11之前的版本更新一个现存的MySQL安装到3.22.11版或今后版本,你运转了mysql_fix_privilege_tables剧本吗?假如没有,运转它。在GRANT语句变得能事情时,受权表的布局用MySQL3.22.11修正。
假如你间接对受权表做修正(利用INSERT或UPDATE语句)而且你的改动仿佛被疏忽,记着,你必需收回一个FLUSHPRIVILEGES语句或实行一个mysqladminflush-privileges命令招致服务器再次读进表,不然你的改动要道下一次服务器被重启时再失效。记着在你设定root口令今后,你将不必要指定它,直到在你洗濯(flush)权限今后,由于服务器仍旧不会晓得你改动了口令!
假如你的权限仿佛在一个会话(session)傍边改动了,多是一个超等用户改动了他们。再次装进受权表感化于新客户毗连,可是它也影响现存的毗连,如6.9权限改动什么时候失效大节所述。
为了测试,用--skip-grant-tables选项启动mysqld保卫历程,然后你能够改动MySQL受权表而且利用mysqlaccess剧本反省你的修正是不是有准期的效果。当你对你的改动中意时,实行mysqladminflush-privileges告知mysqld服务器入手下手利用新的权限表。注重:再次装进受权表掩盖了--skip-grant-tables选项。这同意你告知服务器入手下手利用受权表,而不必停失落偏重启它。
假如你有一个Perl、Python或ODBC程序的存取成绩,试着用mysql-uuser_namedb_name或mysql-uuser_name-pyour_passdb_name与服务器毗连。假如你能用mysql客户毗连,这是你程序的一个成绩而不是存取权限的成绩。(注重在-p和口令之间没有空格;你也能利用--password=your_pass句法指定口令。)
假如你不克不及让口令事情,记得假如你用INSERT,UPDATE或SETPASSWORD语句设置口令,你必需利用PASSWORD()函数。假如你用GRANT...INDENTIFIEDBY语句或mysqladminpassword命令指定口令,PASSWORD()函数是不必要的。见6.12如何设置口令。
localhost是你当地主机名的一个同义词,而且也是假如你不明白地指定主机而客户实验毗连的缺省主机。但是,假如你正在运转于一个利用MIT-pthreads的体系上,毗连localhost是不可的(localhost毗连利用Unix套接字举行,它没被MIT-pthreads撑持),为了在如许的体系上制止这个成绩,你应当利用--host选项明白地定名服务器主机,这将做一个TCP/IP毗连到mysqld服务器。在这类情形下,你必需有在服务器主机上的user表中条目标你实在的主机名。(即便你在服务器统一台的主机上运转一个客户程序,这也是真的。)
当实验用mysql-uuser_namedb_name与数据库毗连时,假如你失掉一个Accessdenied毛病,你大概有与user桌有关的成绩,经由过程实行mysql-urootmysql而且收回上面的SQL语句反省:
mysql>SELECT*FROMuser;

了局应当包括一个有Host和User列的条目婚配你的盘算机主机名和你的MySQL用户名。

Accessdenied毛病动静将告知你,你正在用哪一个用户实验登录,你正在试图用毗连哪一个主机,而且你是不是正在利用一个口令。一般,你应当在user表中有一个条目,准确地婚配在毛病动静给出的主机名和用户名。
假如当你试着从一个不是MySQL服务器正在运转的主机上毗连时,你失掉以下毛病,那末在user表中没有婚配那台主机行:
Host...isnotallowedtoconnecttothisMySQLserver

你能够经由过程利用mysql命令行工具(在服务器主机上!)修改它,把你正在试图毗连的用户/主机名组合新加一行到user表中。假如你不在运转MySQL3.22而且你不晓得你正在从它毗连的呆板的IP数字或主机名,你应当把一个%条目作为Host列值放在user表中而且在服务器呆板上利用--log选项重启mysqld。在试图从客户呆板毗连今后,在MySQL纪录文件中的信息将显现你怎样真正举行毗连。(然后用在纪录文件下面显现出的实践的主机名取代user表中的%条目。不然,你将有一个不平安的体系。)

假如mysql-uroottest事情可是mysql-hyour_hostname-uroottest招致Accessdenied,那末在user表中你大概没有你的主机的准确名字。这里的一个广泛的成绩是在user表条目中的Host值指定一个独一的主机名,可是你体系的名字剖析例程前往一个完整正轨的域名(或相反)。比方,假如你在user表中有一个主机是tcx的条目,可是你的DNS告知MySQL你的主机名是tcx.subnet.se,条目将不事情。实验把一个条目加到user表中,它包括你主机的IP数字作为Host列的值。(别的,你能够把一个条目加到user表中,它有包括一个通配符如tcx.%的Host值。但是,利用以“%”开头的主机名是不平安的而且不保举!)
假如mysql-uuser_nametest事情可是mysql-uuser_nameother_db_name不事情,对other_db_name,你在db表中没有无一个条目列出。
当在服务器呆板上实行mysql-uuser_namedb_name时,它事情,可是在别的客户呆板上实行mysql-hhost_name-uuser_namedb_name时,它却不事情,你没有把客户呆板列在user表或db表中。
假如你不克不及弄分明你为何失掉Accessdenied,从user表中删除一切Host包括通配符值的条目(包括“%”或“_”的条目)。一个很广泛的毛病是拔出用Host=%和User=someuser拔出一个新条目,以为这将解决方案提供商开始推动DBaaS浪潮之前,他们应该深入了解究竟什么是DBaaS。

变相怪杰 发表于 2015-1-19 22:38:47

但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)

再见西城 发表于 2015-1-26 19:54:21

光写几个SQL实在叫无知。

老尸 发表于 2015-2-4 20:20:47

需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。

若相依 发表于 2015-2-10 06:36:53

但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)

精灵巫婆 发表于 2015-2-28 23:38:50

可以动态传入参数,省却了动态SQL的拼写。

分手快乐 发表于 2015-3-17 06:12:34

对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。

admin 发表于 2015-3-23 23:20:51

是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
页: [1]
查看完整版本: MYSQL网页编程之MySQL中文参考手册7(MySQL 存取权限体系...