EVOKE ALL PRIVILEGES ON *.* FROM 'username' @ 'localhost' ; GRANT ALL PRIVILEGES ON wordpress.* TO 'username' @ 'localhost' IDENTIFIED BY 'password' ; 甚至還可以指定該用戶只能執行 select 和 update 命令:
GRANT SELECT , UPDATE ON wordpress.* TO 'username' @ 'localhost' IDENTIFIED BY 'password' ; 這樣一來,再次以username登陸 MySQL,只有wordpress數據庫是對其可見的,并且如果你只授權它select權限,那么它就不能執行delete 語句。
另外每當調整權限后,通常需要執行以下語句刷新權限:
FLUSH PRIVILEGES ; 刪除剛才創建的用戶:
DROP USER username@localhost; 仔細上面幾個命令,可以發現不管是授權,還是撤銷授權,都要指定響應的host(即 @ 符號后面的內容),因為以上及格命令實際上都是在操作mysql 數據庫中的user表,可以用如下命令查看相應用戶及對應的host:
SELECT User , Host FROM user ;
MySQL Study之--MySQL用戶及權限管理 MySQL服務器通過MySQL權限表來控制用戶對 數據庫 的訪問,MySQL權限表存放在my sql數據庫 里,由 mysql _install_db腳本初始化。這些MySQL權限表分別user,db,table_priv,columns_priv和host。下面分別介紹一下這些表的結構和內容: user權限表 :記錄允許連接到服務器的用戶帳號信息,里面的權限是全局級的。 db權限表 :記錄各個帳號在各個數據庫上的操作權限。 table_priv權限表 :記錄數據表級的操作權限。 columns_priv權限表 :記錄數據列級的操作權限。 host權限表 :配合db權限表對給定主機上數據庫級操作權限作更細致的控制。這個權限表不受GRANT和REVOKE語句的影響。
案例分析: 一、創建用戶并授權(root用戶) [root@mysrv ~]# mysql -u root -poracle
mysql> select version()/g +-------------------------------------------+ | version() | +-------------------------------------------+ | 5.6.25-enterprise-commercial-advanced-log | +-------------------------------------------+ 1 row in set (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | prod | | test | +--------------------+ 5 rows in set (0.01 sec) 1、建立tom用戶并授權(特權管理用戶)
mysql> grant all on prod.* to 'tom'@'%' identified by 'tom' with grant option; Query OK, 0 rows affected (0.00 sec)
查看用戶創建是否成功: mysql> select user,host from user ;
+ -------+-----------+ | user | host | + -------+-----------+ | tom | % | | root | 127.0.0.1 | | root | ::1 | | | localhost | | root | localhost | | scott | localhost | | | mysrv | | root | mysrv | + -------+-----------+ 8 rows in set (0.00 sec) 查看tom用戶的授權: mysql> show grants for tom; +----------------------------------------------------------------------------------------------------+ | Grants for tom@% | +----------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'tom'@'%' IDENTIFIED BY PASSWORD '*71FF744436C7EA1B954F6276121DB5D2BF68FC07' | | GRANT ALL PRIVILEGES ON `prod`.* TO 'tom'@'%' WITH GRANT OPTION | +----------------------------------------------------------------------------------------------------+
GRANT 語法 : GRANT privileges (columns) ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION 權限列表: ALTER: 修改表和索引。 CREATE: 創建數據庫和表。 DELETE: 刪除表中已有的記錄。 DROP: 拋棄(刪除)數據庫和表。 INDEX: 創建或拋棄索引。 INSERT: 向表中插入新行。 REFERENCE: 未用。 SELECT: 檢索表中的記錄。 UPDATE: 修改現存表記錄。 FILE: 讀或寫服務器上的文件。 PROCESS: 查看服務器中執行的線程信息或殺死線程。 RELOAD: 重載授權表或清空日志、主機緩存或表緩存。 SHUTDOWN: 關閉服務器。 ALL: 所有權限,ALL PRIVILEGES同義詞。 USAGE: 特殊的 "無權限" 權限。 用 戶賬戶包括 "username" 和 "host" 兩部分,后者表示該用戶被允許從何地接入。tom@'%' 表示任何地址,默認可以省略。還可以是 "tom@192.168.1.%"、"tom@%.abc.com" 等。數據庫格式為 db@table,可以是 "test.*" 或 "*.*",前者表示 test 數據庫的所有表,后者表示所有數據庫的所有表。 子句 "WITH GRANT OPTION" 表示該用戶可以為其他用戶分配權限。 2、我們用 root 再創建幾個用戶,然后由 test 數據庫的管理員tom為他們分配權限。
mysql> create user 'tom1' identified by 'tom1' ,'tom2' identified by 'tom2'; Query OK, 0 rows affected (0.00 sec)
[root@mysrv ~]# mysql -u tom -ptom ERROR 1045 (28000): Access denied for user 'tom'@'localhost' (using password: YES)
tom用戶竟不能登陸?。?!
再對tom用戶授權: mysql> grant all on prod.* to 'tom'@'localhost' identified by 'tom' with grant option;; Query OK, 0 rows affected (0.00 sec)
mysql> show grants for tom; +----------------------------------------------------------------------------------------------------+ | Grants for tom@% | +----------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'tom'@'%' IDENTIFIED BY PASSWORD '*71FF744436C7EA1B954F6276121DB5D2BF68FC07' | | GRANT ALL PRIVILEGES ON `prod`.* TO 'tom'@'%' WITH GRANT OPTION | +----------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)
mysql> use mysql; Database changed mysql> select user,host from user ;
+ -------+-----------+ | user | host | + -------+-----------+ | tom | % | | tom1 | % | | tom2 | % | | root | 127.0.0.1 | | root | ::1 | | | localhost | | root | localhost | | scott | localhost | | tom | localhost | | | mysrv | | root | mysrv | + -------+-----------+ 11 rows in set (0.00 sec) tom登陸: [root@mysrv ~]# mysql -u tom -ptom prod mysql> select database(); +------------+ | database() | +------------+ | prod | +------------+ 1 row in set (0.01 sec)
mysql> select current_user(); +----------------+ | current_user() | +----------------+ | tom@localhost | +----------------+ 1 row in set (0.00 sec)
創建表:
mysql> show tables; +----------------+ | Tables_in_prod | +----------------+ | t1 | +----------------+ 1 row in set (0.00 sec)
mysql> select * from t2; +------+-------+ | id | name | +------+-------+ | 10 | tom | | 20 | jerry | | 30 | rose | +------+-------+ 3 rows in set (0.00 sec)
3、tom用戶為tom1,tom2授權 mysql> grant select on prod.* to tom1; Query OK, 0 rows affected (0.00 sec)
mysql> grant select on prod.* to tom2; Query OK, 0 rows affected (0.02 sec)
mysql> grant insert,update on prod.* to tom2; Query OK, 0 rows affected (0.00 sec)
mysql> select database(); +------------+ | database() | +------------+ | NULL | +------------+ 1 row in set (0.00 sec)
mysql> use prod; Database changed mysql> select database(); +------------+ | database() | +------------+ | prod | +------------+ 1 row in set (0.00 sec)
mysql> select current_user(); +----------------+ | current_user() | +----------------+ | tom2@% | +----------------+ 1 row in set (0.00 sec)
mysql> show grants for tom2; +------------------------------------------------------------------+ | Grants for tom2@% | +------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'tom2'@'%' IDENTIFIED BY PASSWORD | | GRANT SELECT, INSERT, UPDATE ON `prod`.* TO 'tom2'@'%' | +------------------------------------------------------------------+ 2 rows in set (0.00 sec)
mysql> show tables; +----------------+ | Tables_in_prod | +----------------+ | t1 | | t2 | +----------------+ 2 rows in set (0.00 sec)
mysql> select * from t1; +------+-------+ | id | name | +------+-------+ | 10 | tom | | 20 | jerry | | 30 | rose | +------+-------+ 3 rows in set (0.00 sec)
mysql> select * from t2; +------+-------+ | id | name | +------+-------+ | 10 | tom | | 20 | jerry | | 30 | rose | +------+-------+ 3 rows in set (0.00 sec)
mysql> select * from t1; +------+-------+ | id | name | +------+-------+ | 10 | tom | | 20 | jerry | | 30 | rose | | 40 | john | +------+-------+ 4 rows in set (0.00 sec)
mysql> select * from t1; +------+-------+ | id | name | +------+-------+ | 10 | tom | | 20 | jerry | | 30 | rose | | 40 | ellen | +------+-------+ 4 rows in set (0.00 sec)
mysql> delete from t1; ERROR 1142 (42000): DELETE command denied to user 'tom2'@'192.168.8.254' for tab le 't1' mysql> commit; Query OK, 0 rows affected (0.05 sec)
mysql> select * from t1; +------+-------+ | id | name | +------+-------+ | 10 | tom | | 20 | jerry | | 30 | rose | | 40 | ellen | +------+-------+ 4 rows in set (0.00 sec) 4、回收tom2的update權限: mysql> revoke update on prod.* from tom2; Query OK, 0 rows affected (0.00 sec)
mysql> use prod; Database changed mysql> update t1 set name='lily' where id=10; ERROR 1142 (42000): UPDATE command denied to user 'tom2'@'192.168.8.254' for tab le 't1' ---update失敗!
二、修改用戶口令:
1、root用戶修改普通用戶口令 mysql> set password for tom1=password('oracle'); Query OK, 0 rows affected (0.01 sec)
tom1重新登陸: C:/Users/Administrator>mysql -h 192.168.8.240 -utom1 -ptom1 Warning: Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'tom1'@'192.168.8.254' (using passwor d: YES) ---舊口令登陸失敗!
+ -------+-----------+ | user | host | + -------+-----------+ | jerry | % | | rose | % | | tom | % | | tom1 | % | | root | 127.0.0.1 | | root | ::1 | | | localhost | | jerry | localhost | | root | localhost | | rose | localhost | | scott | localhost | | tom | localhost | | | mysrv | | root | mysrv | + -------+-----------+ 14 rows in set (0.00 sec) ------- 摘要 --------------------------------------
創建用戶: GRANT insert, update ON testdb.* TO user1@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; CREATE USER user2 IDENTIFIED BY 'password'; 分配權限: GRANT select ON testdb.* TO user2; 查看權限: SHOW GRANTS FOR user1; 修改密碼: SET PASSWORD FOR user1 = PASSWORD('newpwd'); SET PASSWORD = PASSWORD('newpwd'); 移除權限: REVOKE all ON *.* FROM user1; 刪除用戶: DROP USER user1; 數據庫列表: SHOW DATABASES; 數據表列表: SHOW TABLES; 當前數據庫: SELECT DATABASE(); 當前用戶: SELECT USER(); 數據表結構: DESCRIBE table1; 刷新權限: FLUSH PRIVILEGES;
grant和revoke可以在幾個層次上控制訪問權限 1,整個服務器,使用 grant ALL 和revoke ALL 2,整個數據庫,使用on database.* 3,特點表,使用on database.table 4,特定的列 5,特定的存儲過程
grant 普通數據用戶,查詢、插入、更新、刪除 數據庫中所有表數據的權利。 grant select on testdb.* to common_user@’%’ grant insert on testdb.* to common_user@’%’ grant update on testdb.* to common_user@’%’ grant delete on testdb.* to common_user@’%’ 或者,用一條 MySQL 命令來替代: grant select, insert, update, delete on testdb.* to common_user@’%’ grant 數據庫開發人員,創建表、索引、視圖、存儲過程、函數。。。等權限。 grant 創建、修改、刪除 MySQL 數據表結構權限。 grant create on testdb.* to developer@’192.168.0.%’; grant alter on testdb.* to developer@’192.168.0.%’; grant drop on testdb.* to developer@’192.168.0.%’; grant 操作 MySQL 外鍵權限。 grant references on testdb.* to developer@’192.168.0.%’; grant 操作 MySQL 臨時表權限。 grant create temporary tables on testdb.* to developer@’192.168.0.%’; grant 操作 MySQL 索引權限。 grant index on testdb.* to developer@’192.168.0.%’; grant 操作 MySQL 視圖、查看視圖源代碼 權限。 grant create view on testdb.* to developer@’192.168.0.%’; grant show view on testdb.* to developer@’192.168.0.%’; grant 操作 MySQL 存儲過程、函數 權限。 grant create routine on testdb.* to developer@’192.168.0.%’; -- now, can show procedure status grant alter routine on testdb.* to developer@’192.168.0.%’; -- now, you can drop a procedure grant execute on testdb.* to developer@’192.168.0.%’; grant 普通 DBA 管理某個 MySQL 數據庫的權限。 grant all privileges on testdb to dba@’localhost’ 其中,關鍵字 “privileges” 可以省略。 grant 高級 DBA 管理 MySQL 中所有數據庫的權限。 grant all on *.* to dba@’localhost’
MySQL grant 權限,分別可以作用在多個層次上。 1. grant 作用在整個 MySQL 服務器上: grant select on *.* to dba@localhost; -- dba 可以查詢 MySQL 中所有數據庫中的表。 grant all on *.* to dba@localhost; -- dba 可以管理 MySQL 中的所有數據庫 2. grant 作用在單個數據庫上: grant select on testdb.* to dba@localhost; -- dba 可以查詢 testdb 中的表。 3. grant 作用在單個數據表上: grant select, insert, update, delete on testdb.orders to dba@localhost; 4. grant 作用在表中的列上: grant select(id, se, rank) on testdb.apache_log to dba@localhost; 5. grant 作用在存儲過程、函數上: grant execute on procedure testdb.pr_add to ’dba’@’localhost’ grant execute on function testdb.fn_add to ’dba’@’localhost’