MySql是一个多用户数据库,具有功能强大的访问控制系统,可以为不同用户指定允许的权限。MySql用户可以分为普通用户和root用户。root用户是超级管理员,拥有所有权限,包括创建用户、删除用户和修改用户的密码等管理权限;普通用户只拥有被授予的各种权限。用户管理包括管理用户账户、权限等。
一. 权限表
MySql服务器通过权限表来控制用户对数据库的访问,权限表存放在MySql数据库中,由MySql_install_db脚本初始化。存储账户权限信息表主要有:user、db、host、tables_priv、columns_priv和procs_priv。比如,下面以user表为例:
user表是MySql中最重要的一个权限表,记录允许连接到服务器的账号信息,里面的权限是全局级的。比如:一个用户在user表中被赋予了DELETE权限,则该用户可以删除MySql服务器上所有数据库中的任何记录。
1 mysql> desc user;
2 +------------------------+-----------------------------------+------+-----+-----------------------+-------+
3 | Field | Type | Null | Key | Default | Extra |
4 +------------------------+-----------------------------------+------+-----+-----------------------+-------+
5 | Host | char(60) | NO | PRI | | |
6 | User | char(32) | NO | PRI | | |
7 | Select_priv | enum('N','Y') | NO | | N | |
8 | Insert_priv | enum('N','Y') | NO | | N | |
9 | Update_priv | enum('N','Y') | NO | | N | |
10 | Delete_priv | enum('N','Y') | NO | | N | |
11 | Create_priv | enum('N','Y') | NO | | N | |
12 | Drop_priv | enum('N','Y') | NO | | N | |
13 | Reload_priv | enum('N','Y') | NO | | N | |
14 | Shutdown_priv | enum('N','Y') | NO | | N | |
15 | Process_priv | enum('N','Y') | NO | | N | |
16 | File_priv | enum('N','Y') | NO | | N | |
17 | Grant_priv | enum('N','Y') | NO | | N | |
18 | References_priv | enum('N','Y') | NO | | N | |
19 | Index_priv | enum('N','Y') | NO | | N | |
20 | Alter_priv | enum('N','Y') | NO | | N | |
21 | Show_db_priv | enum('N','Y') | NO | | N | |
22 | Super_priv | enum('N','Y') | NO | | N | |
23 | Create_tmp_table_priv | enum('N','Y') | NO | | N | |
24 | Lock_tables_priv | enum('N','Y') | NO | | N | |
25 | Execute_priv | enum('N','Y') | NO | | N | |
26 | Repl_slave_priv | enum('N','Y') | NO | | N | |
27 | Repl_client_priv | enum('N','Y') | NO | | N | |
28 | Create_view_priv | enum('N','Y') | NO | | N | |
29 | Show_view_priv | enum('N','Y') | NO | | N | |
30 | Create_routine_priv | enum('N','Y') | NO | | N | |
31 | Alter_routine_priv | enum('N','Y') | NO | | N | |
32 | Create_user_priv | enum('N','Y') | NO | | N | |
33 | Event_priv | enum('N','Y') | NO | | N | |
34 | Trigger_priv | enum('N','Y') | NO | | N | |
35 | Create_tablespace_priv | enum('N','Y') | NO | | N | |
36 | ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
37 | ssl_cipher | blob | NO | | NULL | |
38 | x509_issuer | blob | NO | | NULL | |
39 | x509_subject | blob | NO | | NULL | |
40 | max_questions | int(11) unsigned | NO | | 0 | |
41 | max_updates | int(11) unsigned | NO | | 0 | |
42 | max_connections | int(11) unsigned | NO | | 0 | |
43 | max_user_connections | int(11) unsigned | NO | | 0 | |
44 | plugin | char(64) | NO | | mysql_native_password | |
45 | authentication_string | text | YES | | NULL | |
46 | password_expired | enum('N','Y') | NO | | N | |
47 | password_last_changed | timestamp | YES | | NULL | |
48 | password_lifetime | smallint(5) unsigned | YES | | NULL | |
49 | account_locked | enum('N','Y') | NO | | N | |
50 +------------------------+-----------------------------------+------+-----+-----------------------+-------+
51 45 rows in set (0.00 sec)
View Code
user表有45个字段,如上面所示。这些字段可以分为4类,分别是用户列、权限列、安全列和资源控制列。
(1)用户列:比如Host、User。
(2)权限列:user表中对应的权限是针对所有用户数据库的。这些字段值的类型为ENUM。可以取得值只能是Y和N。Y表示该用户有对应的权限,N表示没有。
(3)安全列:安全列只有6个字段,其中两个是ssl相关的,两个是x509相关的,另外两个是授权插件相关的。
(4)资源控制列:资源控制列的字段使用来限制用户使用的资源。比如:
max_questions:用户每小时允许执行的查询操作次数。
二. 账户管理
mysql的客户端连接是以用户名来登录服务端。
服务端可以对用户的权限来进行更改,所以每个用户对数据库或对数据表的权限都是不一样的。
一般来说不应该使用root用户登录,因为root用户拥有最高的权限,可以进行删除数据库等“危险”操作。为了安全,应该使用其他用户登录,并且给他分配合适的权限。
并且用户应该是有密码的,使用匿名用户(没有密码)是非常危险的,如果这个匿名用户又是开放远程登录的话那别人只要检测到你的端口是开放的就可以登录你的mysql了。
2.1 登陆和退出MySql服务器
MySql命令常用参数如下:
(1)-h主机名,可以使用该参数指定主机名或ip,如果不指定,默认是localhost。
(2)-u用户名,可以使用该参数指定用户名。
(3)-p密码,可以使用该参数指定登陆密码。如果该参数后面有一段字段,则该字段字符串将作为用户的密码直接登陆。如果后面没有内容,则登陆的时候会提示输入密码。注意:该参数后面的字符串和-p之前不能有空格。
(4)-P端口号,该参数后面接MySql服务器的端口号,默认为3306。
(5)数据库名,可以在命令的最后指定数据库名。
(6)-e执行SQL语句。如果指定了该参数,将在登陆后执行-e后面的命令或SQL语句并退出。
举例:使用Hermioner用户登陆到本地MySql服务器的mytest数据库中,同时执行一条查询语句。
1 C:\Users\Hermioner>mysql -h localhost -u Hermioner -p mytest -e "desc account;"
2 Enter password: *********
3 +-------+-------------+------+-----+---------+----------------+
4 | Field | Type | Null | Key | Default | Extra |
5 +-------+-------------+------+-----+---------+----------------+
6 | id | int(11) | NO | PRI | NULL | auto_increment |
7 | name | varchar(40) | YES | | NULL | |
8 | money | double | YES | | NULL | |
9 +-------+-------------+------+-----+---------+----------------+
View Code
exit命令可以直接退出。
2.2 新建用户
创建新用户,必须有相应的权限来执行创建操作。在MySql数据库中,有两种方式创建新用户:一种是使用CREATE USER或GRANT语句;另一种是直接操作MYSQL授权表。最好的办法是使用GRANT语句,因为这样更加精确,错误少。
- 方式1:create user 用户名@可登录地址 identified by '密码';
- 没有可登录地址代表所有地址都能登录
- 如果只允许本地登录,应该设置成localhost
- 方式2:grant 权限 on 数据库.数据表 to 用户名@可登录地址 identified by '密码';
- 方式3:可以使用Insert直接往user表中插入数据,但不建议使用。
note:create user语句创建的新用户没有任何权限,还需要使用grant语句赋予用户权限。而grant语句不仅可以创建新用户,还可以在创建的同时对用户授权。
note:一般情况下,最好使用GRANT或者CREATE USER语句,而不要直接将用户信息插入user表。因为user表中存储了全局级别的权限以及其他的账户信息,如果意外破坏了user表中的记录,则可能会对MYSQL服务器造成很大影响。
2.2 撤销权限+重新授权
如果此时发现刚刚给的权限太大了,如果我们只是想授予它在某个数据库上的权限,那么需要切换到root 用户撤销刚才的权限,重新授权:
REVOKE ALL PRIVILEGES ON *.* FROM 'username'@'localhost';
GRANT ALL PRIVILEGES ON mytest.* TO 'username'@'localhost' IDENTIFIED BY 'password';
甚至还可以指定该用户只能执行 select 和 update 命令:
GRANT SELECT, UPDATE ON mytest.* TO 'username'@'localhost' IDENTIFIED BY 'password';
这样一来,再次以username登陆 MySQL,只有mytest数据库是对其可见的,并且如果你只授权它select权限,那么它就不能执行delete 语句。
另外每当调整权限后,通常需要执行以下语句刷新权限:
FLUSH PRIVILEGES;
也可以通过show grants
命令查看权限授予执行的命令:
show grants for 'zhangsan';
2.4 修改密码
(1)root用户修改自己的密码
使用MySqladmin命令
mysqladmin -u username -h localhost -p password "newpwd"
(2)root用户修改普通用户的密码
GRANT USAGE ON *.* TO 'someuser'@'%' IDENTIFIED BY 'somepassword';
比如:使用Grant语句将Hermioner用户的密码修改为”123“
GRANT USAGE ON *.* TO 'Hermioner'@'localhost' IDENTIFIED BY '123';
(3)普通用户修改密码
普通用户登陆MySql服务器后,通过SET语句设置自己的密码
SET PASSWORD=PASSWORD(''newpassword'');
note: 其实上面三种方式都可以采用set方法来修改。知识选择了每一种情况下更加适合的方式介绍。比如,还可以通过操作user表中的字段进行修改。
2.5 密码丢失解决
这种情况分为两种
- 通过图形界面已经进入mysql,但是忘记了原来的密码
- 根本就进不去mysql,原来的密码也忘记了
下面根据这两个种情况 分别进行处理
情况一:
使用set password 命令
set password for ‘root’@’localhost’ = password(‘hhhh’); -- 即hhhh为新密码
使用update命令
首先进入 mysql数据库,执行下面的三条语句
use mysql;
update user set password = password('hhhh');
flush privileges; --tiger 即为新密码
情况二:
1、更改相应的配置文件
Windows ----> 找到my.ini 文件
Linux ----> 找到配置文件 my.cnf 文件
找到在 [mysqld] 下添加skip-grant-tables,然后保存并退出
window下 如图
Linux下 如图
2、重启mysql服务:
Linux: service mysqld restart
window:
net stop mysql -- 停止服务
net start mysql -- 开启服务
3、修改root用户密码 ,进入cmd中 输入 mysql后
MySQL> UPDATE mysql.user SET Password=PASSWORD('新密码') where USER='root';
MySQL> flush privileges;
MySQL> exit
4、再去把配置文件中的 skip-grant-tables注释掉(如图),然后重启mysql(见步骤2)
5、退出 即可用新密码登录
2.6 删除账户
- drop user 用户名;
- 在mysql5.0之前drop user命令只会删除用户,而不删除权限,在5.0之前需要先用revoke删除权限。
2.7 查看当前用的数据库和查看当前的用户
select database();
select user();
2.8 匿名账户
Question:已经将一个账户的信息从数据库中完全删除,为什么该用户还能登陆?
Answer:出现这种情况的原因可能有多种。最有可能的是在user数据表中存在匿名账户。在user表中匿名账户的User字段值为空字符串,这会允许任何人连接到数据库,检测是否存在匿名登陆用户的方法是,输入以下语句:
select *from user where User=' ';
如果有记录返回,则说明存在匿名用户,需要删除该记录,以保证数据库的访问安全,删除语句为:
delete from user where user=' ';
这样一来,该账户肯定不能登陆MySql服务器了。