權限分類:
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登錄服務器
[email protected] --表示user用戶只能在192.168.0.1登錄數據庫服務器
[email protected]/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 &