日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL用户与权限管理

發布時間:2024/1/17 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
或寫成
./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?whatTO?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?-p123456mysql>?use?test;?#?切換工作數據庫 Reading?table?information?for?completion?of?table?and?column?names You?can?turn?off?this?feature?to?get?a?quicker?startup?with?-ADatabase?changedmysql>?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:?0mysql>?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?testmysql>?revoke?update?on?test.*?from?user2;?#?移除?UPDATE?權限 Query?OK,?0?rows?affected?(0.00?sec)


再次切換回 user2。

$?mysql?-u?user2?-p123456?testmysql>?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?-p123456mysql>?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?testERROR?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;

?

總結

以上是生活随笔為你收集整理的MySQL用户与权限管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。