1、权限表
1.1、user表
1.1.1、用户列
Host、User、Password分别表示主机名、用户名、密码
1.1.2、权限列
决定了用户的权限,描述了在全局范围内允许对数据和数据库进行操作。
1.1.3、安全列
安全列有6个字段,其中两个是ssl相关的,2个是x509相关的,另外2个是授权插件相关的。
ssl用于加密,x509标准用于标识用户,plugin字段标识可以用于验证用户身份的插件。
1.1.4、资源控制列
用来限制用户使用的资源,包含4个字段,分别为:
1)、max_questions:用户每小时允许执行的查询操作次数。
2)、max_updates:用户每小时允许执行的更新操作次数。
3)、max_connections:用户每小时允许执行的连接操作次数。
4)、max_user_connections:用户允许同时建立的连接次数。
1.2、db表和host表
此两个表针对的是数据库。
1.2.1、用户列
db表:Host、User、Db
host表:Host、Db
1.2.2、权限列
1.3、tables_priv表和cloumns_priv表
tables_priv表用来对表设置权限;cloumns_priv表用来对表的某一列设置权限。
tables_priv表有8个字段,各字段说明如下:
1)、Host、Db、User、Table_name:主机名、数据库名、用户名、表名
2)、Grantor:表示修改该记录的用户。
3)、Timestamp:表示修改该记录的时间。
4)、Table_priv:表示对表的操作权限包括Select、Insert、Update、Delete、Create、Drop、Grant、References、Index和Alter
5)、Cloumn_priv:表示对表中的列的操作权限,包括Select、Insert、Update、References。
cloumns_priv表只有7个字段,Host、Db、User、Table_name、Cloumn_name、Timestamp、Cloumn_priv。
Cloumn_name表示指定对哪些数据列具有操作权限。
1.4、procs_priv表
procs_priv表可以对存储过程和存储函数来设置操作权限。
procs_priv表有8个字段,各字段说明如下:
1)、Host、Db、User:主机名、数据库名、用户名
2)、Routime_name:表示存储过程或函数的名称。
3)、Routine_type:表示存储过程或函数的类型。有两个值,分别是:FUNCTION和PROCEDURE。
4)、Grantor:表示插入或修改该记录的用户。
5)、Proc_priv:表示拥有的权限,包括Execute、Alter Routine、Grant 3种。
6)、Timestamp:表示修改该记录的时间。
2、账户管理
2.1、登陆和退出MYSQL服务器
通过mysql -help命令查看mysql命令帮助信息,mysql的命令常用参数如下:
1)、-h 主机名,可以使用该参数指定主机名或IP,如果不指定,则默认为localhost。
2)、-u 用户名,可以使用该参数指定用户名。
3)、-p 密码,可以使用该参数指定密码。注意:该参数后面的字符串h和-p之间不能有空格。
4)、-P 端口号,该参数后面接MYSQL服务器端口号,默认为3306.
5)、数据库名,可以在命令的最后指定数据库名。
6)、-e 执行sql语句。
2.2、新建普通用户
2.2.1、使用CREATE USER 语句创建新用户
sql
CREATE USER user_specification [,user_specification]...
user_specification:
'user'@'host'
[
IDENTIFIED BY [PASSWORD] 'password' | IDENTIFINED WITH auth_plugin [AS 'auth_string']
]
user:表示创建的用户的名称。
host:表示允许登陆的用户主机名称。
IDENTIFIED BY:表示用来设置用户的密码;
[PASSWORD]:表示使用哈希值设置密码,该参数可选。
'password':表示用户登录时使用的普通明文密码。
IDENTIFINED WITH:为用户指定一个身份验证插件。
auth_plugin:是插件的名称,插件的名称可以是一个带单引号的字符串,或者带引号的字符串。
auth_string:是可选的字符串参数,该参数将传递给身份验证插件,由该插件解释该参数的意义。
2.2.2、使用GRANT语句创建新用户。
CREATE USER语句创建的新用户没有任何权限,GRANT语句不仅可以创建新用户,还可以在创建的同时
对用 户授权。
格式:
sql
GRANT privileges ON db.table
TO 'user'@'host' [IDENTIFIED BY 'password'] [,user[IDENTIFIED BY 'password']]
[WITH GRANT OPTION];
privileges:表示赋予用户的权限类型。
db.table:表示用户的权限所作用的数据库中的表。
IDENTIFIED BY:表示用来设置用户的密码。
'password':表示用户登录时使用的普通明文密码。
WITH GRANT OPTION:为可选参数,表示对新建的用户赋予GRANT权限,即该用户可对其他用户赋予权限
2.2.3、直接操作MYSQL用户表
sql
INSERT INTO mysql.user(Host,User,Password,[privilegelist])
VALUES('host','username',PASSWORD('password'),privilegevaluelist);
用户添加成功后还需要使用 FLUSH PRIVILEGES命令,告诉服务器重新加载授权表(重启服务器也会重新加载授权表)
2.3、删除普通用户
2.3.1、使用DROP USER语句删除用户
sql
DROP USER user[,user]
2..3.2、使用DELETE语句删除用户
sql
DELETE FROM MYSQL.user WHERE host='hostname' and user='username';
2.4、root用户修改自己的密码
2.4.1、使用mysqladmin命令在命令行指定新密码
sql
mysqladmin -u username -h localhost -p password 'newpwd'
2.4.2、修改MYSQL数据库的user表
sql
UPDATE mysql.user set Password=PASSWORD('rootpwd') WHERE User='root' and Host='localhost'
执行UPDATE语句后,需要执行FLUSH PRIVILEGES语句重新加载用户权限。
2.4.3、使用SET语句修改root用户密码
sql
SET PASSWORD=PASSWORD('rootpwd');
需要执行FLUSH PRIVILEGES语句重新加载用户权限。
2.5、root用户修改普通用户密码
2.5.1、使用set语句修改普通用户密码
sql
SET PASSWORD FOR 'user'@'host'=PASSWORD('somepassword');
2.5.2、使用UPDATE修改普通用户密码
sql
UPDATE mysql.user set Password=PASSWORD('rootpwd') WHERE User='userName' and Host='hostName'
执行UPDATE语句后,需要执行FLUSH PRIVILEGES语句重新加载用户权限。
2.5.3、使用GRANT语句修改普通用户密码
在全局级别使用GRANT USAGE语句指定某个账户的密码而不影响账户当前权限。
sql
GRANT USAGE ON *.* TO 'someuser'@'%' IDENTIFIED BY 'somepassword';
2.6、普通用户修改密码
sql
SET PASSWORD=PASSWORD('newpwd');
需要执行FLUSH PRIVILEGES语句重新加载用户权限。
2.7、root用户密码丢失的解决办法
2.7.1、使用 --skip-grant-tables选项启动MySQL服务
windows下:(先切换到MYSQL的bin目录下)
mysqld命令如下:
sql
mysqld --skip-grant-tables
mysqld-nt命令如下:
sql
mysqld-nt --skip-grant-tables
linux下:
mysqld_self命令如下:
sql
mysqld_self --skip-grant-tables user=mysql
/etc/init.d/mysql命令如下:
sql
/etc/init.d/mysql start-mysqld --skip-grant-tables user
2.7.2、使用root用户登录,重新设置密码
windows下:
1)、使用net stop mysql命令停止MYSQL服务进程
2)、在命令行输入mysqld --skip-grant-tables选项启动MySQL服务
3)、打开另外一个命令窗口,输入不加密码的登录命令。
4)、登录成功后可以使用UPDATE语句h或者使用mysqladmin命令重新设置root密码
5)、加载权限表:需要执行FLUSH PRIVILEGES语句重新加载用户权限。
3、权限管理
3.1、MySQL各种权限
3.2、授权
3.2.1、全局层级
全局权限适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。
GRANT ALL ON *.* 和 REVOKE ALL ON *.*只授予和撤销全局权限
3.2.2、数据库层级
数据库权限适用于一个给定数据库中所有目标。这些权限存储在mysql.db和mysql.host表中。
GRANT ALL ON db_name.* 和 REVOKE ALL ON db_name.*只授予和撤销数据库权限
3.2.3、表层级
表权限适用于一个给定表中所有列。这些权限存储在mysql.tables_priv表中。
GRANT ALL ON db_name.table_name 和 REVOKE ALL ON db_name.table_name只授予和撤销表权限
3.2.4、列层级
列权限适用于一个给定表中单一列。这些权限存储在mysql.columns_priv表中。
3.2.5、子程序层级
CREATE ROUTINE、ALTER ROUTINE、EXECUTE和GRANT权限适用于已存储的子程序。
3.3、收回权限
3.3.1、收回所有用户的所有权限
REVOKE ALL PRIVILEGES,GRANT OPTION
sql
REVOKE ALL PRIVILEGES ON db_name.* FROM 'new_user'@'localhost';
3.3.2、收回指定的权限
sql
REVOKE priv_type[(columns)][,priv_type[(columns)]]...
ON table1,table2,....,tablen
FROM 'user'@'host'[,'user'@'host'...]
3.4、查看权限
sql
SHOW GRANTS FOR 'user'@'host'
4、访问控制
4.1、连接核实阶段
4.2、请求核实阶段
5、安全考虑
通常建议避免使用超级用户进行日常操作,而是创建具有特定权限的普通用户。
定期审查并更新用户权限,确保安全