千金良方:MySQL性能优化金字塔法则
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

13.3 MySQL账号命名规则

MySQL中的账号名称由用户名和主机名两部分组成(例如:user_name@host_name),采用这种方式服务器就可以区分来自不同主机的相同用户的连接,本节将介绍如何编写有效的账号名称(包括特殊值和通配符规则)。对于使用SQL语句CREATE USER、GRANT和SET PASSWORD来操作的用户来说,都遵守以下规则。

● 账号名称构成语法:'user_name'@'host_name'。

● 仅由用户名组成的账号名称相当于’user_name'@'%'。例如:'me’相当于’me'@'%'。

● 如果用户名和主机名是合法的非引用标识符(即,不包含SQL中的关键字或命令字),则不需要使用反撇号进行引用。如果用户名或主机名中包含特殊字符(如:空格或-符号)或者通配符(如:点号或%号),则需要使用单引号或者双引号引起来,例如:'test-user'@'%.com'(注意:一旦使用引号,'me@localhost’和’me'@'localhost’的含义就是不同的,实际上在使用’me@localhost’时,MySQL将其解析为’me@localhost'@'%',而不是’me'@'localhost')。如果用户名或主机名中不包含引用字符或特殊字符等,则可不需要使用反撇号和引号。但为了规范起见,建议对主机名和用户名使用引号,例如:'me'@'localhost'。

CURRENT_USER关键字和CURRENT_USER()函数在查询语句中的效果相同,例如:select current_user和select current_user()的查询结果相同,都是返回当前连接的账号名称。

MySQL中的账号名称在mysql系统库中的权限表user中存储时,会将user_name和host_name分开存储在User和Host两个字段中。

● 在user表存储的账号信息中,每个账号包含一行记录。User和Host字段存储账号对应的用户名和主机名,其他字段存储与账号对应的权限和账号的其他属性信息。

● 其他权限表分别保存着库级别、表级别、字段级别等权限信息。这些表与user表一样,也使用User和Host字段来分别存储与账号对应的用户名和主机名。在这些表中保存着不同权限作用域的权限信息等(例如:db、columns_priv、procs_priv、proxies_priv、tables_priv,但这些表中并不保存密码信息)。

● 为了进行账号的访问检查,用户名严格区分大小写,但主机名不区分大小写。

关于账号用户名和主机名中某些特殊值或通配符的约定,如下所示。

● 在默认情况下,user表中保存着一些匿名账号,所以MySQL允许匿名账号连接(即,user_name为空的账号,但需要使用引号,如:'@ localhost')。

● 账号名称中的host_name部分可以使用多种形式,并且允许使用通配符。

■ 主机名可以是域名或操作系统主机名(需要DNS解析服务),也可以是IP地址(IPv4或IPv6地址)。'localhost’表示本地主机,'127.0.0.1’表示IPv4地址的环回接口,':: 1’表示IPv6地址的环回接口。

■ 在主机名或IP地址中都允许使用通配符“%”和“_”,它们与LIKE运算符中的通配符含义相同。例如,'%’表示匹配任意主机,'%.mysql.com’表示匹配mysql.com域中的任意主机,'192.51.100.%’表示匹配C类私有网络192.51.100中的任意主机。由于主机名允许使用IP地址+通配符(例如:'192.51.100.%’匹配192.51.100子网中的任意主机),为了阻止有人通过192.51.100.somewhere.com格式的主机名字符串构造来尝试扫描存活的主机,MySQL不会对以数字和点开头的主机名执行匹配动作。例如:如果主机名部分为1.2.example.com,则直接被MySQL忽略。IP地址只能与通配符组合,而不能与主机名组合,否则也会被忽略。

■ 对于指定为IPv4地址的主机名,可以结合子网掩码来控制子网IP地址的数量(注意:子网掩码不使用IPv6地址),格式:host_ip/netmask。例如:CREATE USER 'david'@'192.51.100.0/255.255.255.0',表示用户名为david,主机名为192.51.100.0子网中的任意主机,满足此条件的客户端主机IP地址范围从192.51.100.0到192.51.100.255。

● 当MySQL账号名称的主机名部分为IP地址时,子网掩码A、B、C类网络都支持。例如:

■ 192.0.0.0/255.0.0.0:掩码8位,表示192 A类网络中的任意主机。

■ 192.51.100.0/255.255.0.0:掩码16位,表示192.51 B类网络中的任意主机。

■ 192.51.100.0/255.255.255.0:掩码24位,表示192.51.100 C类网络中的任意主机。

■ 192.51.100.1:不带掩码,表示仅匹配具有此特定IP地址的主机。

MySQL服务器使用DNS解析时,需要注意以下问题。

● 假设本地网络中的主机具有host1.example.com的完全限定名称(DNS地址)。如果DNS将此主机解析为host1.example.com返回,则在MySQL账号名称的主机名部分也需要使用host1.example.com;如果DNS解析仅返回host1,则在MySQL账号名称的主机名部分也需要使用host1,否则会被拒绝连接。

● 如果DNS解析返回的是IP地址192.51.100.2,那么它将优先进行IP地址的精确匹配(192.51.100.2),如果未匹配成功,则继续匹配对应网络的通配符(192.51.100.%),但不匹配非法的IP地址(例如:192.051.100.2)或子网(例如:192.051.100.%)。