权限分类:
USAGE --无权限,只有登录数据库,只可以使用test或test_*数据库
ALL --所有权限
select/update/delete/super/slave/reload --指定的权限
with grant option --允许把自己的权限授予其它用户(此用户拥有建立账号的权限)
权限级别:
1、*.* --全库、全表(mysql.user)
2、mysql.* --mysql库下所有表(某库中的所有表)(mysql.db)
3、mysql.user --mysql库中user表(单表)(mysql.table_priv)
4、mysql.user.host --mysql库中user表的host列(mysql.columns_priv)
用户权限:
username@localhost
1、username --你被授予了什么权限
2、username/password --账号密码
3、localhost --表示你可以在哪里登录(这里表示只能本机通过socket登录)
user@localhost --表示user只能在本地通过socket登录服务器
user@192.168.0.1 --表示user用户只能在192.168.0.1登录数据库服务器
user@192.168.0.0/255.555.255.0
--指定某个子网的主机可以登录数据库
user@% --表示user用户能在所有的机器上登录数据库服务器
新建user02用户, 要求user02只能在本机登录而且对DB这个库的所有表拥有完全控制的权限:
mysql> grant all on DB.* to user02@'localhost' identified by '123';
mysql> select user,password,host from mysql.user; --查看用户创建是否成功
更改user02在所有机器上都能登录数据库.
mysql> update mysql.user set host='%' where user='user02';
mysql> flush privileges;
让user02可以把自己的权限授予其它用户:
mysql> grant ALL on DB.* to user02@'%' with grant option;
Query OK, 0 rows affected (0.00 sec)
查看权限:
mysql> show grants; --查看自己的权限
mysql> show grants for user02@'%'; --查看指定用户的权限
权限的作用范围(*.* database.* database.table)
mysql> grant select,update on DB.t3 to user04@'localhost' identified by '123';
列的授权:
mysql> grant update (user) on mysql.user to user03@'%';
mysql> grant update (user,host,password) on mysql.user to user03@'%';
权限的保存位置:
mysql.user --所有mysql用户的账号和密码,以及对用户对全库全表权限(*.*)
mysql.db --非mysql库的授权都保存在此(db.*)
mysql.table_priv --某库某表的授权(db.table)
mysql.columns_priv --某库某表某列的授权(db.table.col1)
mysql.procs_priv --某库存储过程的授权
------------------
revoke
REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost'; --撤消指定的权限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ... --撤消所有的权限
mysql> drop user user02; --撤消所有权限后把用户一并删除
Query OK, 0 rows affected (0.00 sec)
-----------------
忘记root密码的操作:
mysql的用户验证逻辑:
mysqluser-->mysqld(3306/scoket)-->(host/user/password)-->mysql.user
1、关闭正在运行的mysql服务器
2、重新启mysql,但启动的过程让mysql跳过用户验证(mysql.user),然后改密码
3、安全关闭mysql,然后再启动,这样密码就被重置了。
# service mysql stop 或 pkill -9 mysql
# cd /opt/mysql-glibc
# /opt/mysql-glibc/bin/mysqld_safe --defaults-file=/data2/my.cnf --skip-grant-tables &
mysql> update mysql.user set password=password('147258369') where user='root';
# mysqladmin shutdown
# /opt/mysql-glibc/bin/mysqld_safe --defaults-file=/data2/my.cnf &