執行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
或寫成
./bin/mysqladmin -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 testdb to dba1@'192.168.0.10'identified by "dbapasswd";
//開放管理MySQL中具體數據庫的表(testdb.table1)的權限
grant all on 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 test1@'%';
或者,用一條 MySQL 命令來替代:
grant select, insert, update, delete on test.* to test1@'%';
二、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 中所有數據庫中的表。
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'
六、查看 MySQL 用戶權限
查看當前用戶(自己)權限:
show grants;
查看其他 MySQL 用戶權限:
show grants for dba@localhost;
七、撤銷已經賦予給 MySQL 用戶權限的權限。
revoke 跟 grant 的語法差不多,只需要把關鍵字 “to” 換成 “from” 即可:
grant all on *.* to dba@localhost;
revoke all on *.* from dba@localhost;
八、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@'%' 表示任何地址,默認可以省略。還可以是 "user1@192.168.1.%"、"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;