可以用两种方式创建 MySQL 账户: 1. 使用 GRANT 语句 2. 直接操作 MySQL 授权表 最好的方法是使用 GRANT 语句, 因为这样更精确, 错误少 创建超级用户: mysql GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' IDENTIFIED BY 'some_pass' WITH GRANT OPTION; mys
可以用两种方式创建 MySQL 账户:
1. 使用 GRANT 语句
2. 直接操作 MySQL 授权表
最好的方法是使用 GRANT 语句, 因为这样更精确, 错误少
创建超级用户:
- mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
- mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
其中两个账户有相同的用户名 monty 和密码 some_pass 两个账户均为超级用户账户, 具有完全的权限可以做任何事情一个账户 ('monty'@'localhost')只用于从本机连接时另一个账户 ('monty'@'%') 可用于从其它主机连接请注意 monty 的两个账户必须能从任何主机以 monty 连接
如果没有 localhost 账户, 当 monty 从本机连接时, mysql_install_db 创建的 localhost 的匿名用户账户将占先结果是, monty 将被视为匿名用户原因是匿名用户账户的 Host 列值比'monty'@'%'账户更具体, 这样在 user 表排序顺序中排在前面
创建管理用户, 不授予数据库权限:
mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
一个账户有用户名 admin, 没有密码该账户只用于从本机连接授予了 RELOAD 和 PROCESS 管理权限这些权限允许 admin 用户执行 mysqladmin reloadmysqladmin refresh 和 mysqladmin flush-xxx 命令, 以及 mysqladmin processlist 未授予访问数据库的权限你可以通过 GRANT 语句添加此类权限
一个账户有用户名 dummy, 没有密码该账户只用于从本机连接未授予权限通过 GRANT 语句中的 USAGE 权限, 你可以创建账户而不授予任何权限它可以将所有全局权限设为'N'假定你将在以后将具体权限授予该账户
mysql> GRANT USAGE ON *.* TO 'dummy'@'localhost';
除了 GRANT, 你可以直接用 INSERT 语句创建相同的账户, 然后使用 FLUSH PRIVILEGES 告诉服务器重载授权表:
- shell> mysql --user=root mysql
- mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('some_pass'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
- mysql> INSERT INTO user VALUES('%','monty',PASSWORD('some_pass'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
- mysql> INSERT INTO user SET Host='localhost',User='admin', Reload_priv='Y', Process_priv='Y';
- mysql> INSERT INTO user (Host,User,Password) VALUES('localhost','dummy','');
- mysql> FLUSH PRIVILEGES;
当你用 INSERT 创建账户时使用 FLUSH PRIVILEGES 的原因是告诉服务器重读授权表否则, 只有重启服务器后更改方会被注意到使用 GRANT, 则不需要使用 FLUSH PRIVILEGES
用 INSERT 使用 PASSWORD()函数是为了加密密码 GRANT 语句为你加密密码, 因此不需要 PASSWORD()
创建 3 个账户, 允许它们访问专用数据库每个账户的用户名为 custom, 密码为 obscure
- mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.* TO 'custom'@'localhost' IDENTIFIED BY 'obscure';
- mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO 'custom'@'whitehouse.gov' IDENTIFIED BY 'obscure';
- mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO 'custom'@'server.domain' IDENTIFIED BY 'obscure';
这 3 个账户可以用于:
第 1 个账户可以访问 bankaccount 数据库, 但只能从本机访问
第 2 个账户可以访问 expenses 数据库, 但只能从主机 whitehouse.gov 访问
第 3 个账户可以访问 customer 数据库, 但只能从主机 server.domain 访问
如果你想要让某个用户从给定域的所有机器访问(例如, mydomain.com), 你可以在账户名的主机部分使用含 %'通配符的 GRANT 语句:
mysql> GRANT ... ON *.* TO 'myname'@'%.mydomain.com' IDENTIFIED BY 'mypass';
MySQL 删除用户账户
使用 DROP USER, 您可以取消一个账户和其权限, 操作如下:
DROP USER user;
该语句可以删除来自所有授权表的帐户权限记录
要点: DROP USER 不能自动关闭任何打开的用户对话而且, 如果用户有打开的对话, 此时取消用户, 则命令不会生效, 直到用户对话被关闭后才生效一旦对话被关闭, 用户也被取消, 此用户再次试图登录时将会失败这是有意设计的
设置账户密码
用 mysqladmin 命令在命令行指定密码
shell> mysqladmin -u user_name -h host_name password "newpwd"
该命令重设密码的账户为 user 表内匹配 User 列的 user_name 和 Host 列你发起连接的客户端的记录
为账户赋予密码的另一种方法是执行 SET PASSWORD 语句:
mysql> SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('biscuit');
只有 root 等可以更新 mysql 数据库的用户可以更改其它用户的密码
如果你没有以匿名用户连接, 省略 FOR 子句便可以更改自己的密码:
mysql> SET PASSWORD = PASSWORD('biscuit');
你还可以在全局级别使用 GRANT USAGE 语句 (在 *.*) 来指定某个账户的密码而不影响账户当前的权限:
mysql> GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';
一般情况下最好使用上述方法来指定密码
要想在创建新账户时建立密码, 在 Password 列提供一个值:
- mysql> INSERT INTO user (Host,User,Password) VALUES('%','jeffrey',PASSWORD('biscuit'));
- mysql> FLUSH PRIVILEGES;
要想更改已有账户的密码, 使用 UPDATE 来设置 Password 列值:
- mysql> UPDATE user SET Password = PASSWORD('bagel') WHERE Host = '%' AND User = 'francis';
- mysql> FLUSH PRIVILEGES;
来源: https://www.php1.cn/detail/php-b5e07aa4f4.html