天天看點

MySQL使用者與權限管理

執行mysql select 查詢報錯:

SELECT command denied to user 'root'@'localhost' for table "xxx"

問題原因:

權限不足,

解決方法:

還是資料庫權限的問題,不知道為啥賦給了所有權限後還是有各種權限問題,看來有空得整理一下mysql所有相關權限的問題了...

下面才是解決這個select權限的方法:

========對于ROOT使用者的密碼操作(更改使用者密碼)========

剛剛安裝完的Mysql,隻一有個root使用者,密碼為空,而且隻能在本機登入!

為root加上密碼xxx123:

./bin/mysqladmin

-u root password xxx123

或寫成

-uroot password xxx123

加下密碼之後,在本進行進入mysql:

./bin/mysql

-uroot -p

更改root的密碼由xxx123改為yy1234:

./bin/mysqladmin -uroot -pxxx123 password yy1234

=======grant 權限 on 資料庫對象 to

使用者==========

MySQL 賦予使用者權限指令的簡單格式可概括為:

grant 權限 on 資料庫對象 to 使用者

grant 權限 on 資料庫對象 to 使用者 identified by

"密碼"

========使用者及權限管理:最常用操作執行個體========

(使用者名:dba1,密碼:dbapasswd,登入IP:192.168.0.10)

//開放管理MySQL中所有資料庫的權限

grant all on *.* to

dba1@'192.168.0.10'identified by "dbapasswd";

//開放管理MySQL中具體資料庫(testdb)的權限

grant all privileges on

testdb to dba1@'192.168.0.10'identified by "dbapasswd";

grant all on

//開放管理MySQL中具體資料庫的表(testdb.table1)的權限

testdb.teable1 to dba1@'192.168.0.10'identified by "dbapasswd";

//開放管理MySQL中具體資料庫的表(testdb.table1)的部分列的權限

grant

select(id, se, rank) on testdb.table1 to ba1@'192.168.0.10'identified by

"dbapasswd";

//開放管理操作指令

grant select, insert, update, delete on

testdb.* to dba1@'192.168.0.10'identified by "dbapasswd";

//回收權限

revoke all on *.* from dba1@localhost;

//檢視 MySQL 使用者權限

show grants;

show grants for dba1@localhost;

========使用者及權限管理:更多更詳細執行個體========

下面用執行個體來進行說明:

一、grant普通資料使用者(test1),查詢、插入、更新、删除 資料庫(test)中所有表資料的權利。

grant select on test.* to test1@'%';

grant insert on test.* to

test1@'%';

grant update on test.* to test1@'%';

grant delete on test.* to

或者,用一條 MySQL 指令來替代:

grant select, insert, update, delete on test.* to

二、grant資料庫開發人員(duser),建立表、索引、視圖、存儲過程、函數。。。等權限。

grant建立、修改、删除 MySQL 資料表結構權限。

grant create on testdb.* to duser@'192.168.0.%';

grant alter on testdb.*

to duser@'192.168.0.%';

grant drop   on testdb.* to

duser@'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 duser@'192.168.0.%';

grant show   view

on testdb.* to duser@'192.168.0.%';

grant 操作 MySQL 存儲過程、函數 權限。

grant create routine on testdb.* to duser@'192.168.0.%';

grant alter routine on testdb.* to duser@'192.168.0.%';

grant execute        on testdb.* to duser@'192.168.0.%';

三、grant 普通DBA管理某個MySQL資料庫(test)的權限。

grant all privileges on test 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 中所有資料庫中的表。

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'

execute on function testdb.fn_add to 'dba'@'localhost'

六、檢視 MySQL 使用者權限

檢視目前使用者(自己)權限:

檢視其他 MySQL 使用者權限:

show grants for dba@localhost;

七、撤銷已經賦予給 MySQL 使用者權限的權限。

revoke 跟 grant 的文法差不多,隻需要把關鍵字 “to” 換成 “from” 即可:

grant all on *.* to  dba@localhost;

revoke all on *.* from

八、MySQL grant、revoke 使用者權限注意事項

1. grant, revoke 使用者權限後,該使用者隻有重新連接配接 MySQL 資料庫,權限才能生效。

2. 如果想讓授權的使用者,也可以将這些權限 grant 給其他使用者,需要選項 “grant option“

grant select on testdb.* to dba@localhost with grant option;

這個特性一般用不到。實際中,資料庫權限最好由 DBA 來統一管理。

補充:

可以用 CREATE USER 或

GRANT 建立使用者,後者還同時配置設定相關權限。而 REVOKE 則用于删除使用者權限,DROP USER 删除賬戶。

$ mysql -u root -p
password:

mysql> create database test; # 建立資料庫
Query OK, 1 row affected (0.00 sec)

mysql> show databases; # 檢視資料庫是否建立成功
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)

mysql> grant all on test.* to user1@'%' identified by '123456' with grant option; # 建立特權管理使用者
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from mysql.user; # 檢視使用者建立是否成功
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| user1            | %         |
| root             | 127.0.0.1 |
| debian-sys-maint | localhost |
| root             | localhost |
| root             | server    |
+------------------+-----------+
5 rows in set (0.00 sec)

mysql> show grants for user1; # 檢視使用者權限
+--------------------------------------------------------------------------------------------------+
| Grants for user1@%                                                                               |
+--------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'user1'@'%' IDENTIFIED BY PASSWORD '*6BB...2CA2AD9'                        |
| GRANT ALL PRIVILEGES ON `test`.* TO 'user1'@'%' WITH GRANT OPTION                                |
+--------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)      

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"

兩部分,後者表示該使用者被允許從何地接入。user1@'%' 表示任何位址,預設可以省略。還可以是

"[email protected].%"、"user1@%.abc.com" 等。資料庫格式為 db@table,可以是 "test.*" 或

"*.*",前者表示 test 資料庫的所有表,後者表示所有資料庫的所有表。

子句 "WITH GRANT OPTION"

表示該使用者可以為其他使用者配置設定權限。

我們用 root 再建立幾個使用者,然後由 test 資料庫的管理者 user1 為他們配置設定權限。

mysql> create user user2 identified by '123456', user3 identified by 'abcd';
Query OK, 0 rows affected (0.00 sec)

mysql> select user, host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| user1            | %         |
| user2            | %         |
| user3            | %         |
| root             | 127.0.0.1 |
| debian-sys-maint | localhost |
| root             | localhost |
| root             | server    |
+------------------+-----------+
7 rows in set (0.00 sec)      

好了,我們退出改用

user1 登入并針對 test 資料庫進行操作。

mysql> quit # 退出
Bye

$ mysql -u user1 -p123456 test # 使用新使用者登入

mysql> select database(); # 确認目前工作資料庫
+------------+
| database() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)

mysql> select current_user(); # 确認目前工作賬戶
+----------------+
| current_user() |
+----------------+
| user1@%        |
+----------------+
1 row in set (0.00 sec)      

繼續,建立一個資料表。

mysql> create table table1 # 建立表
  -> (
  ->  name varchar(50),
  ->  age integer
  -> );
Query OK, 0 rows affected (0.02 sec)

mysql> show tables; # 檢視表是否建立成功
+----------------+
| Tables_in_test |
+----------------+
| table1         |
+----------------+
1 row in set (0.00 sec)

mysql> describe table1; # 檢視表結構
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(50) | YES  |     | NULL    |       |
| age   | int(11)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into table1 values('Tom', 20); # 插入記錄
Query OK, 1 row affected (0.00 sec)

mysql> select * from table1; # 查詢記錄
+------+------+
| name | age  |
+------+------+
| Tom  |   20 |
+------+------+
1 row in set (0.00 sec)      

接下來我們為 user2, user3 配置設定權限。

mysql> grant select on test.* to user2; # 為 user2 配置設定 SELECT 權限。
Query OK, 0 rows affected (0.00 sec)

mysql> grant select on test.* to user3; # 為 user3 配置設定 SELECT 權限。
Query OK, 0 rows affected (0.00 sec)

mysql> grant insert, update on test.* to user2; # 再為 user2 增加 INSERT, UPDATE 權限。
Query OK, 0 rows affected (0.00 sec)      

好了,我們退出,切換成

user2 操作看看。

$ mysql -u user2 -p123456

mysql> use test; # 切換工作資料庫
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> select database(); # 驗證目前工作資料庫
+------------+
| database() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)

mysql> select user(); # 驗證目前賬戶
+-----------------+
| user()          |
+-----------------+
| user2@localhost |
+-----------------+
1 row in set (0.00 sec)

mysql> show grants for user2; # 檢視目前使用者權限,顯然後來添加的 INSERT, UPDATE 被添加了。
+--------------------------------------------------------------------------------------------------+
| Grants for user2@%                                                                               |
+--------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'user2'@'%' IDENTIFIED BY PASSWORD '*6BB837....2C9'                        |
| GRANT SELECT, INSERT, UPDATE ON `test`.* TO 'user2'@'%'                                          |
+--------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)      

進行操作測試。

mysql> insert into table1 values("Jack", 21); # INSERT 操作成功
Query OK, 1 row affected (0.00 sec)

mysql> update table1 set age=22 where name='Jack'; # UPDATE 操作成功
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from table1; # SELECT 操作成功
+------+------+
| name | age  |
+------+------+
| Tom  |   20 |
| Jack |   22 |
+------+------+
2 rows in set (0.00 sec)

mysql> delete from table1 where age=22; # DELETE 操作無權限
ERROR 1142 (42000): DELETE command denied to user 'user2'@'localhost' for table 'table1'      

我們切換回

user1 管理賬戶,移除 user2 的 UPDATE 權限看看。

$ mysql -u user1 -p123456 test

mysql> revoke update on test.* from user2; # 移除 UPDATE 權限
Query OK, 0 rows affected (0.00 sec)      

再次切換回

user2。

$ mysql -u user2 -p123456 test

mysql> show grants for user2; # UPDATE 權限被移除
+--------------------------------------------------------------------------------------------------+
| Grants for user2@%                                                                               |
+--------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'user2'@'%' IDENTIFIED BY PASSWORD '*6B...2AD9'                            |
| GRANT SELECT, INSERT ON `test`.* TO 'user2'@'%'                                                  |
+--------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> update table1 set age=23 where name='Jack'; # 不在擁有 UPDATE 權限
ERROR 1142 (42000): UPDATE command denied to user 'user2'@'localhost' for table 'table1'      

好了,到此我們基本完成了建立使用者和配置設定權限的操作。接下來,我們回到

root 進行修改使用者密碼和删除使用者操作。

$ mysql -u root -p123456

mysql> set password for user3=password('abcabc'); # 修改使用者 user3 密碼
Query OK, 0 rows affected (0.00 sec)

mysql>flush privileges; # 重新整理權限表(通常隻在直接修改相關管理資料表後需要該操作)
Query OK, 0 rows affected (0.00 sec)

mysql> revoke all on *.* from user2; # 移除 user2 在所有資料庫上的權限 
Query OK, 0 rows affected (0.00 sec)

mysql> drop user user2; # 删除 user2 賬戶
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from mysql.user; # 驗證删除結果
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| user1            | %         |
| user3            | %         |
| root             | 127.0.0.1 |
| debian-sys-maint | localhost |
| root             | localhost |
| root             | server    |
+------------------+-----------+
6 rows in set (0.00 sec)      

使用者

user2 無法再次使用。

$ mysql -u user2 -p123456 test

ERROR 1045 (28000): Access denied for user 'user2'@'localhost' (using password: YES)      

試試

user3。

$ mysql -u user3 -pabc test # 連接配接失敗!哦,對了,我們修改了密碼。
ERROR 1045 (28000): Access denied for user 'user3'@'localhost' (using password: YES)

$ mysql -u user3 -pabcabc test # 新密碼成功

mysql> select * from table1; # SELECT 操作成功
+------+------+
| name | age  |
+------+------+
| Tom  |   20 |
| Jack |   22 |
+------+------+
2 rows in set (0.00 sec)      

要修改自己的密碼直接執行

"set password = password('new_password');" 即可。

------- 摘要

--------------------------------------

建立使用者:

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;      

作者:Agoly

出處:https://www.cnblogs.com/qmfsun/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

如果文中有什麼錯誤,歡迎指出。以免更多的人被誤導。