MySQL分为普通用户与root用户。这两种用户的权限不一样。
安装MySQL时会自动安装一个名为mysql的数据库。mysql数据库里面存储的都是权限表。
========
user表有39个字段。这些字段可以分为4类:
列 | 说明 |
---|---|
Select_priv | SELECT权限 |
Insert_priv | INSERT权限 |
Update_priv | UPDATE权限 |
Delete_priv | DELETE权限 |
Create_priv | 新建表权限 |
Drop_priv | 删除库和表权限 |
Reload_priv | 确定用户是否可以执行刷新和重新加载MySQL所用各种内部缓存的特定命令,包括日志、权限、主机、查询和表 |
Shutdown_priv | 确定用户是否可以关闭MySQL服务器。在将此权限提供给root账户之外的任何用户时,都应当非常谨慎 |
Process_priv | 确定用户是否可以通过SHOW PROCESSLIST命令查看其他用户的进程 |
File_priv | 确定用户是否可以执行SELECTINTO OUTFILE和LOAD DATA INFILE命令 |
Grant_priv | 确定用户是否可以将已经授予给该用户自己的权限再授予其他用户 |
References_priv | 目前只是某些未来功能的占位符;现在没有作用 |
Index_priv | 确定用户是否可以创建和删除表索引 |
Alter_priv | 确定用户是否可以重命名和修改表结构 |
Show_db_priv | 确定用户是否可以查看服务器上所有数据库的名字,包括用户拥有足够访问权限的数据库 |
Super_priv | 确定用户是否可以执行某些强大的管理功能,例如通过KILL命令删除用户进程,使用SET GLOBAL修改全局MySQL变量,执行关于复制和日志的各种命令 |
Create_tmp_table_priv | 确定用户是否可以创建临时表 |
Lock_tables_priv | 确定用户是否可以使用LOCK TABLES命令阻止对表的访问/修改 |
Execute_priv | 确定用户是否可以执行存储过程 |
Repl_slave_priv |
确定用户是否可以读取用于维护复制数据库环境的二进制日志文件。此用户位于主系统中,有利于主机和客户机之间的通信 |
Repl_client_priv | 确定用户是否可以确定复制从服务器和主服务器的位置 |
Create_view_priv | 确定用户是否可以创建视图 |
Show_view_priv | 确定用户是否可以查看视图或了解视图如何执行 |
Create_routine_priv | 确定用户是否可以更改或放弃存储过程和函数 |
Alter_routine_priv | 确定用户是否可以修改或删除存储函数及函数 |
Create_user_priv | 确定用户是否可以执行CREATE USER命令,这个命令用于创建新的MySQL账户 |
Event_priv | 确定用户能否创建、修改和删除事件 |
Trigger_priv | 确定用户能否创建和删除触发器 |
mysql> UPDATE user SET Select_priv = 'N' WHERE user= 'admin';
user表的安全列有4个字段:
ssl用于加密;x509标准可以用来标识用户。普通的发行版都没有加密功能。可以使用SHOW VARIABLES LIKE 'have_openssl'语句来查看是否具有ssl功能。如果取值为DISABLED,那么则没有ssl加密功能。
user表的4个资源控制列是:
默认值为0,表示无限制。
--------
db表存储了某个用户对一个数据库的权限。
host表中存储了某个主机对数据库的操作权限,配合db表对给定主机上数据库级操作权限做更细致的控制;但是很少用,新版本已经取消了host表;
db表的用户列有3个字段:
user表中的权限是针对所有数据库的,如果user表中的Select_priv字段取值为Y,那么该用户可以查询所有数据库中的表;
如果为某个用户设置了查询test表的权限,那么user表的Select_priv字段的取值为N。而这个SELECT权限则记录在db表中。db表中的Select_priv字段的取值将会是Y。
用户先根据user表的内容获取权限,然后再根据db表的内容获取权限。
---------
可以对单个表进行权限设置,包含8个字段:
Host、Db、User、Table_name、Column_name、Column_priv、Timestamp。
MySQL权限分配是按照user表-> db表 -> table_priv表 -> columns_priv表的顺序进行分配的。
在数据库系统中,先判断user表中的值是否为'Y',如果user表中的值是'Y',就不需要检查后面的表。如果user表为N,则一次检查后面的表。
-----------
procs_priv表可以对存储过程和存储函数进行权限设置。包含8个字段,分别是:
============
账户管理是MySQL用户管理最基本的内容。包括登录,退出MySQL服务器、创建用户、删除用户、密码管理和权限管理等内容。
格式: mysql -h主机地址 -u用户名 -p用户密码
连接到本机上(localhost)的MYSQL
首先打开DOS窗口,键入命令:
> mysql -u root -p 回车后提示你输密码
> mysql -u root -proot 回车后直接连接
连接到远程主机上的MYSQL
假设远程主机的IP为:110.110.110.110,用户名为root,密码为root。则键入以下命令:
> mysql -h110.110.110.110 -uroot -proot;
退出MYSQL
键入命令 exit 回车即可退出
或者 ctrl + c 退出
说明:
在MySQL数据库中,建立用户有3种方式:
格式:
CREATE USER user[IDENTIFIED BY [PASSWORD]'password'],
[user[IDENTIFIED BY [PASSWORD]'password']]...
user 参数表示新建用户的账户,user由用户名(User)和主机名(Host)构成;
IDENTIFIED BY 关键字用来设置用户的密码;
password 参数表示用户的密码;如果密码是一个普通的字符串,就不需要使用PASSWORD关键字。使用 PASSWORD('root123456')是给密码加密的。可以没有初始密码。
示例:
mysql> CREATE USER 'admin'@'localhost' IDENTIFIED BY'admin';
执行之后user表会增加一行记录,但权限暂时全部为‘N’。
示例:
mysql> INSERT INTO mysql.user (Host,User,Password,ssl_cipher,x509_issuer,x509_subject)
VALUES('%','newuser1',PASSWORD('123456'),'','','');
执行INSERT之后,要使用命令:
mysql> FLUSH PRIVILEGES 命令来使用户生效。
格式:
GRANT priv_type ON database.table
TO user[IDENTIFIED BY [PASSWORD]'password']
[,user [IDENTIFIED BY [PASSWORD]'password']...]
*.* 与 db(数据库).* 的区别在于:
*.* 对所有数据库生效,所以user表的SELECT会变为Y。
而 db.*对执行的数据库有效。user表SELECT为'N',更改的是Db表。
------------
格式:DROP USER user[,user]...
例: mysql> DROP USER 'newuser1'@'%';
mysql>DELETE FROM mysql.user WHERE Host = '%' AND User = 'admin';
删除完成后,一样要FLUSH PRIVILEGES才生效。
------------
格式:mysqladmin -u用户名 -p旧密码 password 新密码
例:
mysql>UPDATE user SET Password = PASSWORD('123')WHERE USER = 'myuser';
mysql>FLUSH PRIVILEGES
注:修改表的时候,密码项必须使用PASSWORD()函数对密码进行加密。
SET PASSWORD = PASSWORD("123");
SET PASSWORD FOR 'myuser'@'%' = PASSWORD("123456");
格式:
GRANT priv_type ON database.table TO user[IDENTIFIED BY [PASSWORD] 'password']
例:GRANT SELECT ON *.* TO 'test3'@'%'IDENTIFIED BY '123'
-------------
如果root用户密码丢失了,会给用户造成很大的麻烦。但是,可以通过某种特殊方法登录到root用户下,然后修改密码。
mysqld命令:mysqld --skip-grant-tables
mysqld-nt命令:mysqld-nt --skip-grant-tables
net start mysql命令:net start mysql --skip-grant-tables
mysql -u root
必须使用UPDATE语句更新mysql数据库下的user表,而不能使用SET语句,因为--skip-grant-tables不能使用SET语句。
修改完密码以后,FLUSH PRIVILEGES语句加载权限表,新密码即生效。
===========
权限名称 | 对应user表中的列 | 权限的范围 |
CREATE | Create_priv | 数据库、表或索引 |
DROP | Drop_priv | 数据库或表 |
GRANT OPTION | Grant_priv | 数据库、表、存储过程或函数 |
REFERENCES | References_priv | 数据库或表 |
ALTER | Alter_priv | 修改表 |
DELETE | Delete_priv | 删除表 |
INDEX | Index_priv | 用索引查询表 |
INSERT | Insert_priv | 插入表 |
SELECT | Select_priv | 查询表 |
UPDATE | Update_priv | 更新表 |
CREATE VIEW | Create_view_priv | 创建视图 |
SHOW VIEW | Show_view_priv | 查看视图 |
ALTER ROUTINE | Alter_routine | 修改存储过程或存储函数 |
CREATE ROUTINE | Create_routine_priv | 创建存储过程或存储函数 |
EXECUTE | Execute_priv | 执行存储过程或存储函数 |
FILE | File_priv | 加载服务器主机上的文件 |
CREATE TEMPORARY TABLES | Create_temp_table_priv | 创建临时表 |
LOCK TABLES | Lock_tables_priv | 锁定表 |
CREATE USER | Create_user_priv | 创建用户 |
PROCESS | Process_priv | 服务器管理 |
RELOAD | Reload_priv | 重新加载权限表 |
REPLICATION CLIENT | Repl_client_priv | 服务器管理 |
REPLICATION SLAVE | Repl_slave_priv | 服务器管理 |
SHOW DATABASES | Show_db_priv | 查看数据库 |
SHUTDOWN | Shutdown_priv | 关闭服务器 |
SUPER | Super_priv | 超级权限 |
--------
格式:
GRANT priv_type [(column_list)] ON database.table
TO user [IDENTIFIED BY [PASSWORD]'password']
[,user [IDENTIFIED BY [PASSWORD]'password']]...
WITH with_option[with_option]
- GRANT OPTION:被授权的用户可以将这些权限赋予给别的用户;
- MAX_QUERIES_PER_HOUR count:设置没消失可以允许执行count次查询;
- MAX_UPDATES_PER_HOUR count:设置每个消失可以允许执行count次更新;
- MAX_CONNECTIONS_PER_HOUR count:设置每小时可以建立count个连接;
- MAX_USER_CONNECTIONS count:设置单个用户可以同时具有的count个连接数;
示例:
GRANT SELECT,UPDATE ON *.* TO 'myuser'@'%' WITH GRANT OPTION;
--------
格式:
REVOKE priv_type[(column_list)] ON database.table FROM user[,user];
收回全部权限的REVOKE语句的基本格式如下:
REVOKE ALL PRIVILEGES,GRANT OPTION FROMuser[,user]...
示例:
REVOKE SELECT ON *.*FROM 'myuser'@'%';
REVOKE ALL PRIVILEGES,GRANT OPTION FROM'myuser'@'%';
---------
使用:
SELECT * FROM mysql.user
或者:
SHOW GRANTS