账号的组成方式:用户名+主机(所以可以出现重复的用户名,跟其他的数据库不一样)
例如: root@localhost root@%
用户名:16字符以内.
主机名:可以用主机名和IP地址,也可以用通配符
通配符说明:172.18.10.%(IP地址为172.18.10段的所有IP地址都可以访问)
查看用户表
select * from mysql.user
创建用户
1.insert user表方法、
2.create user 方法、
3.grant 方法。
1、使用INSERT语句
mysql> insert into mysql.user (host,user,password) values ('%','john',password('123'));
可以直接用insert语句创建相同的账户,然后使用FLUSH PRIVILEGES刷新权限来告诉服务器重载授权表:
#也可以这样插入
shell> mysql -u root mysql
mysql> INSERT INTO mysql.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');
注意:操作INSERT INTO
语句插入用户会报错:
ERROR 1136 (21S01): Column count doesn't match value count at row 1
意思是给表user中插入的数据列数跟表的列数不匹配。
我的mysql版本是
mysql> status
Server version: 5.7.10 MySQL Community Server (GPL)
在新的mysql中密码字段不是password了,更改为authentication_string
2.CREATE USER
脚本:CREATE USER 'username'@'%' [IDENTIFIED BY 'PASSWORD'] 其中密码是可选项;
例子:CREATE USER 'john'@'192.168.189.71' IDENTIFIED BY "123";
CREATE USER 'john@192.168.189.%' IDENTIFIED BY "123";
CREATE USER 'john@' ;
说明:该方法创建出来的用户只有连接数据库的权限,其它权限需要授权;
3、使用grant创建用户
以root连接到服务器上后,可以添加新账户。下面的语句表示使用GRANT来设置账户:
mysql> GRANT all privileges ON 库名.表名 to 'monty'@'localhost'
-> IDENTIFIED BY 'password' WITH GRANT OPTION;
GRANT命令说明:
1.ALL PRIVILEGES 是表示所有权限,你也可以使用select、update等权限。
2.ON 用来指定权限针对哪些库和表。*.* 中前面的*号用来指定数据库名,后面的*号用来指定表名。
3.TO 表示将权限赋予某个用户。
'monty'@'localhost' 表示monty用户,@ 后面接限制的主机,可以是IP、IP段、域名以及%,%表示任何地方。(注意:这里%有的版本不包括本地,以前碰到过给某个用户设置了%允许任何地方登录,但是在本地登录不了,这个和版本有关系,遇到这个问题再加一个localhost的用户就可以了。)
4.IDENTIFIED BY指定用户的登录密码。
5.WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。(注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项导致后来该用户不能使用GRANT命令创建用户或者给其他用户授权。)
备注:可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加了一个SELECT权限,然后又给用户添加了一个INSERT权限,那么该用户就同时拥有了SELECT和INSERT权限。
创建四个用户:
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;
mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
mysql> GRANT USAGE ON *.* TO 'dummy'@'localhost';
上述用GRANT语句创建的账户具有以下属性:
其中两个账户有相同的用户名monty和密码some_pass。两个账户均为超级用户账户,具有完全的权限可以做任何事情。
一个账户 ('monty'@'localhost')只用于从本机连接。另一个账户('monty'@'%')可用于从其它主机连接。
请注意monty的两个账户必须能从任何主机以monty连接。当不具有localhost账户的用户monty从本机连接时,mysql_install_db创建的localhost匿名用户账户将具有优先权限。结果是,monty将被视为匿名用户。原因是在user表中匿名用户账户的Host列值比monty'@'%账户更具体(%相当于空HOST),这样在user表中排序是排在前面。
第三个账户有用户名admin,但没有密码。该账户只能用于本机连接。上面第三条语句中授予admin用户RELOAD和PROCESS管理权限;这些权限允许admin用户执行mysqladmin reload、mysqladmin refresh和mysqladmin flush-xxx以及mysqladmin processlist命令;但是它未被授予访问数据库的权限;你可以通过GRANT语句添加此类权限。
第四个账户有用户名dummy,但是也没有密码,该账户只用于本机连接,通过GRANT语句中赋予的USAGE权限,你可以创建账户而不授予任何权限;它可以将所有全局权限设为'N'。假定你将在以后将具体权限授予该账户。
@>mysql -u root -p
@>密码
mysql>Delete FROM user Where User='test' and Host='localhost';
mysql>flush privileges;