MySQL用户账号管理(添加、删除、限制、设置密码、远程访问)

来源:互联网 发布:lumia 专用软件 编辑:程序博客网 时间:2024/05/16 18:23

1.添加MySQL账户

mysql> GRANT ALL PRIVILEGES ON *.* TO ‘www’@'localhost’IDENTIFIED BY ’123456′ WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO ‘www’@'%’IDENTIFIED BY ’123456′ WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO ‘admin’@'localhost’;
mysql> GRANT USAGE ON *.* TO ‘dummy’@'localhost’;
用GRANT语句创建的账户有下面的属性:
前两个账户有相同的用户名www和密码123456。两个账户均为超级用户账户,具有完全的权限可以做任何事情。一个账户 (‘www’@'localhost’)只用于从本机连接时。另一个账户(‘www’@'%’)可用于从其它主机连接。请注意www的两个账户必须能从任何主机以www连接。没有localhost账户,当www从本机连接时,mysql_install_db创建的localhost的匿名用户账户将占先。结果是,www将被视为匿名用户。原因是匿名用户账户的Host列值比’www’@'%’账户更具体,这样在user表排序顺序中排在前面。

一个账户有用户名admin,没有密码。该账户只用于从本机连接。授予了RELOAD和PROCESS管理权限。这些权限允许admin用户执行mysqladmin reload、mysqladmin refresh和mysqladmin flush-xxx命令,以及mysqladmin processlist。未授予访问数据库的权限。你可以通过GRANT语句添加此类权限。

一个账户有用户名dummy,没有密码。该账户只用于从本机连接。未授予权限。通过GRANT语句中的USAGE权限,你可以创建账户而不授予任何权限。它可以将所有全局权限设为’N'。假定你将在以后将具体权限授予该账户。

2.从MySQL删除用户账户

要想移除账户,应使用DROP USER语句:
DROP USER user [, user] …

3.限制账户资源

要想用GRANT语句设置资源限制,使WITH子句来命名每个要限制的资源和根据每小时记数的限制值。例如,要想只以限制方式创建可以访问customer数据库的新账户,执行该语句:

mysql> GRANT ALL ON customer.* TO ‘francis’@'localhost’
-> IDENTIFIED BY ‘frank’
-> WITH MAX_QUERIES_PER_HOUR 20
-> MAX_UPDATES_PER_HOUR 10
-> MAX_CONNECTIONS_PER_HOUR 5
-> MAX_USER_CONNECTIONS 2;

要想设置或更改已有账户的限制,在全局级别使用GRANT USAGE语句(在*.*)。下面的语句可以将keer的查询限制更改为200:

mysql> GRANT USAGE ON *.* TO ‘keer’@'localhost’ WITH MAX_QUERIES_PER_HOUR 200;
该语句没有改变账户的已有权限,只修改了指定的限制值。

要想取消已有限制,将该值设置为零。例如,要想取消keer每小时可以连接的次数的限制,使用该语句:
mysql> GRANT USAGE ON *.* TO ‘keer’@'localhost’ WITH MAX_CONNECTIONS_PER_HOUR 0;
当账户使用资源时如果有非零限制,则对资源使用进行记数。

4.设置账户密码

可以用mysqladmin命令在命令行指定密码:
shell> mysqladmin -u username -h hostname password “yourpassword”
该命令重设密码的账户为user表内匹配User列的username和Host列你发起连接的客户端的记录。

为账户赋予密码的另一种方法是执行SET PASSWORD语句:
mysql> SET PASSWORD FOR ‘www’@'%’ = PASSWORD(’123456′);

只有root等可以更新mysql数据库的用户可以更改其它用户的密码。如果你没有以匿名用户连接,省略FOR子句便可以更改自己的密码:
mysql> SET PASSWORD = PASSWORD(’123456′);

你还可以在全局级别使用GRANT USAGE语句(在*.*)来指定某个账户的密码而不影响账户当前的权限:
mysql> GRANT USAGE ON *.* TO ‘www’@'%’ IDENTIFIED BY ’123456′;

一般情况下最好使用上述方法来指定密码,你还可以直接修改user表:
要想在创建新账户时建立密码,在Password列提供一个值:
shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password) VALUES(‘%’,'www’,PASSWORD(’123456′));
mysql> FLUSH PRIVILEGES;

要想更改已有账户的密码,使用UPDATE来设置Password列值:
shell> mysql -u root mysql
mysql> UPDATE user SET Password = PASSWORD(’123456′) WHERE Host = ‘%’ AND User = ‘www’;
mysql> FLUSH PRIVILEGES;

当你使用SET PASSWORD、INSERT或UPDATE指定账户的密码时,必须用PASSWORD()函数对它进行加密。(唯一的特例是如果密码为空,你不需要使用PASSWORD())。需要使用PASSWORD()是因为user表以加密方式保存密码,而不是明文。如果你忘记了,你可能会象这样设置密码:
shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password) VALUES(‘%’,'www’,’123456′);
mysql> FLUSH PRIVILEGES;
结果是密码’123456′保存到user表后没有加密。当www使用该密码连接服务器时,值被加密并同保存在user表中的进行比较。但是,保存的值为字符串’123456′,因此比较将失败,服务器拒绝连接:
shell> mysql -u www -p 123456 test
Access denied
当然你使用GRANT … IDENTIFIED BY语句或mysqladmin password命令设置密码,它们均会加密密码。在这种情况下,不需要使用 PASSWORD()函数。

5.设置账号远程访问

有些时候创建的数据库账号都是针对数据库服务器本地的,在集群中mysql数据库是共用的,那就需要给出一个账号能够让集群中的其他服务器远程访问,具体操作如下
mysql> use mysql;
mysql> GRANT ALL ON *.* TO www@’%’ IDENTIFIED BY ’123456′ WITH GRANT OPTION;
#注解:允许任何IP地址的主机用【www】帐户和密码【123456】来访问这个MySQL Server
#必须加类似这样的帐户,才可以远程登陆。root帐户是无法远程登陆的,只可以localhost登陆

测试使用下面命令即可
mysql -h *.*.*.* -u www -p 123456

在测试的发现了一个问题
mysql -h localhost -u www -p 123456
如下命令我在本地用localhost访问是失败的,google之后才发现原来上面的’%'居然不包括localhost的,所以为了本地也能方位数据库需要再加上下面一句
mysql> GRANT ALL ON *.* TO www@’localhost’ IDENTIFIED BY ’123456′ WITH GRANT OPTION;
okay,测试通过