MySql学习19-----用户管理
MySql是一個多用戶數(shù)據(jù)庫,具有功能強(qiáng)大的訪問控制系統(tǒng),可以為不同用戶指定允許的權(quán)限。MySql用戶可以分為普通用戶和root用戶。root用戶是超級管理員,擁有所有權(quán)限,包括創(chuàng)建用戶、刪除用戶和修改用戶的密碼等管理權(quán)限;普通用戶只擁有被授予的各種權(quán)限。用戶管理包括管理用戶賬戶、權(quán)限等。
一. 權(quán)限表
MySql服務(wù)器通過權(quán)限表來控制用戶對數(shù)據(jù)庫的訪問,權(quán)限表存放在MySql數(shù)據(jù)庫中,由MySql_install_db腳本初始化。存儲賬戶權(quán)限信息表主要有:user、db、host、tables_priv、columns_priv和procs_priv。比如,下面以user表為例:
user表是MySql中最重要的一個權(quán)限表,記錄允許連接到服務(wù)器的賬號信息,里面的權(quán)限是全局級的。比如:一個用戶在user表中被賦予了DELETE權(quán)限,則該用戶可以刪除MySql服務(wù)器上所有數(shù)據(jù)庫中的任何記錄。
1 mysql> desc user; 2 +------------------------+-----------------------------------+------+-----+-----------------------+-------+ 3 | Field | Type | Null | Key | Default | Extra | 4 +------------------------+-----------------------------------+------+-----+-----------------------+-------+ 5 | Host | char(60) | NO | PRI | | | 6 | User | char(32) | NO | PRI | | | 7 | Select_priv | enum('N','Y') | NO | | N | | 8 | Insert_priv | enum('N','Y') | NO | | N | | 9 | Update_priv | enum('N','Y') | NO | | N | | 10 | Delete_priv | enum('N','Y') | NO | | N | | 11 | Create_priv | enum('N','Y') | NO | | N | | 12 | Drop_priv | enum('N','Y') | NO | | N | | 13 | Reload_priv | enum('N','Y') | NO | | N | | 14 | Shutdown_priv | enum('N','Y') | NO | | N | | 15 | Process_priv | enum('N','Y') | NO | | N | | 16 | File_priv | enum('N','Y') | NO | | N | | 17 | Grant_priv | enum('N','Y') | NO | | N | | 18 | References_priv | enum('N','Y') | NO | | N | | 19 | Index_priv | enum('N','Y') | NO | | N | | 20 | Alter_priv | enum('N','Y') | NO | | N | | 21 | Show_db_priv | enum('N','Y') | NO | | N | | 22 | Super_priv | enum('N','Y') | NO | | N | | 23 | Create_tmp_table_priv | enum('N','Y') | NO | | N | | 24 | Lock_tables_priv | enum('N','Y') | NO | | N | | 25 | Execute_priv | enum('N','Y') | NO | | N | | 26 | Repl_slave_priv | enum('N','Y') | NO | | N | | 27 | Repl_client_priv | enum('N','Y') | NO | | N | | 28 | Create_view_priv | enum('N','Y') | NO | | N | | 29 | Show_view_priv | enum('N','Y') | NO | | N | | 30 | Create_routine_priv | enum('N','Y') | NO | | N | | 31 | Alter_routine_priv | enum('N','Y') | NO | | N | | 32 | Create_user_priv | enum('N','Y') | NO | | N | | 33 | Event_priv | enum('N','Y') | NO | | N | | 34 | Trigger_priv | enum('N','Y') | NO | | N | | 35 | Create_tablespace_priv | enum('N','Y') | NO | | N | | 36 | ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | | 37 | ssl_cipher | blob | NO | | NULL | | 38 | x509_issuer | blob | NO | | NULL | | 39 | x509_subject | blob | NO | | NULL | | 40 | max_questions | int(11) unsigned | NO | | 0 | | 41 | max_updates | int(11) unsigned | NO | | 0 | | 42 | max_connections | int(11) unsigned | NO | | 0 | | 43 | max_user_connections | int(11) unsigned | NO | | 0 | | 44 | plugin | char(64) | NO | | mysql_native_password | | 45 | authentication_string | text | YES | | NULL | | 46 | password_expired | enum('N','Y') | NO | | N | | 47 | password_last_changed | timestamp | YES | | NULL | | 48 | password_lifetime | smallint(5) unsigned | YES | | NULL | | 49 | account_locked | enum('N','Y') | NO | | N | | 50 +------------------------+-----------------------------------+------+-----+-----------------------+-------+ 51 45 rows in set (0.00 sec) View Codeuser表有45個字段,如上面所示。這些字段可以分為4類,分別是用戶列、權(quán)限列、安全列和資源控制列。
(1)用戶列:比如Host、User。
(2)權(quán)限列:user表中對應(yīng)的權(quán)限是針對所有用戶數(shù)據(jù)庫的。這些字段值的類型為ENUM。可以取得值只能是Y和N。Y表示該用戶有對應(yīng)的權(quán)限,N表示沒有。
(3)安全列:安全列只有6個字段,其中兩個是ssl相關(guān)的,兩個是x509相關(guān)的,另外兩個是授權(quán)插件相關(guān)的。
(4)資源控制列:資源控制列的字段使用來限制用戶使用的資源。比如:
? ? ? ? ?max_questions:用戶每小時允許執(zhí)行的查詢操作次數(shù)。
二. 賬戶管理
mysql的客戶端連接是以用戶名來登錄服務(wù)端。
服務(wù)端可以對用戶的權(quán)限來進(jìn)行更改,所以每個用戶對數(shù)據(jù)庫或?qū)?shù)據(jù)表的權(quán)限都是不一樣的。
一般來說不應(yīng)該使用root用戶登錄,因為root用戶擁有最高的權(quán)限,可以進(jìn)行刪除數(shù)據(jù)庫等“危險”操作。為了安全,應(yīng)該使用其他用戶登錄,并且給他分配合適的權(quán)限。
并且用戶應(yīng)該是有密碼的,使用匿名用戶(沒有密碼)是非常危險的,如果這個匿名用戶又是開放遠(yuǎn)程登錄的話那別人只要檢測到你的端口是開放的就可以登錄你的mysql了。
2.1 登陸和退出MySql服務(wù)器
MySql命令常用參數(shù)如下:
(1)-h主機(jī)名,可以使用該參數(shù)指定主機(jī)名或ip,如果不指定,默認(rèn)是localhost。
(2)-u用戶名,可以使用該參數(shù)指定用戶名。
(3)-p密碼,可以使用該參數(shù)指定登陸密碼。如果該參數(shù)后面有一段字段,則該字段字符串將作為用戶的密碼直接登陸。如果后面沒有內(nèi)容,則登陸的時候會提示輸入密碼。注意:該參數(shù)后面的字符串和-p之前不能有空格。
(4)-P端口號,該參數(shù)后面接MySql服務(wù)器的端口號,默認(rèn)為3306。
(5)數(shù)據(jù)庫名,可以在命令的最后指定數(shù)據(jù)庫名。
(6)-e執(zhí)行SQL語句。如果指定了該參數(shù),將在登陸后執(zhí)行-e后面的命令或SQL語句并退出。
舉例:使用Hermioner用戶登陸到本地MySql服務(wù)器的mytest數(shù)據(jù)庫中,同時執(zhí)行一條查詢語句。
1 C:\Users\Hermioner>mysql -h localhost -u Hermioner -p mytest -e "desc account;" 2 Enter password: ********* 3 +-------+-------------+------+-----+---------+----------------+ 4 | Field | Type | Null | Key | Default | Extra | 5 +-------+-------------+------+-----+---------+----------------+ 6 | id | int(11) | NO | PRI | NULL | auto_increment | 7 | name | varchar(40) | YES | | NULL | | 8 | money | double | YES | | NULL | | 9 +-------+-------------+------+-----+---------+----------------+ View Codeexit命令可以直接退出。
2.2 新建用戶
創(chuàng)建新用戶,必須有相應(yīng)的權(quán)限來執(zhí)行創(chuàng)建操作。在MySql數(shù)據(jù)庫中,有兩種方式創(chuàng)建新用戶:一種是使用CREATE USER或GRANT語句;另一種是直接操作MYSQL授權(quán)表。最好的辦法是使用GRANT語句,因為這樣更加精確,錯誤少。
- 方式1:create user 用戶名@可登錄地址 identified by '密碼';
- 沒有可登錄地址代表所有地址都能登錄
- 如果只允許本地登錄,應(yīng)該設(shè)置成localhost
- 方式2:grant 權(quán)限 on 數(shù)據(jù)庫.數(shù)據(jù)表 to 用戶名@可登錄地址 identified by '密碼';
- 方式3:可以使用Insert直接往user表中插入數(shù)據(jù),但不建議使用。
note:create user語句創(chuàng)建的新用戶沒有任何權(quán)限,還需要使用grant語句賦予用戶權(quán)限。而grant語句不僅可以創(chuàng)建新用戶,還可以在創(chuàng)建的同時對用戶授權(quán)。
note:一般情況下,最好使用GRANT或者CREATE USER語句,而不要直接將用戶信息插入user表。因為user表中存儲了全局級別的權(quán)限以及其他的賬戶信息,如果意外破壞了user表中的記錄,則可能會對MYSQL服務(wù)器造成很大影響。
2.2 撤銷權(quán)限+重新授權(quán)
如果此時發(fā)現(xiàn)剛剛給的權(quán)限太大了,如果我們只是想授予它在某個數(shù)據(jù)庫上的權(quán)限,那么需要切換到root 用戶撤銷剛才的權(quán)限,重新授權(quán):
| 1 2 | REVOKE ALL?PRIVILEGES?ON?*.* FROM?'username'@'localhost'; GRANT?ALL?PRIVILEGES?ON?mytest.* TO?'username'@'localhost'?IDENTIFIED BY?'password'; |
甚至還可以指定該用戶只能執(zhí)行 select 和 update 命令:
| 1 | GRANT?SELECT, UPDATE?ON?mytest.* TO?'username'@'localhost'?IDENTIFIED BY?'password'; |
這樣一來,再次以username登陸 MySQL,只有mytest數(shù)據(jù)庫是對其可見的,并且如果你只授權(quán)它select權(quán)限,那么它就不能執(zhí)行delete 語句。
另外每當(dāng)調(diào)整權(quán)限后,通常需要執(zhí)行以下語句刷新權(quán)限:
| 1 | FLUSH PRIVILEGES; |
也可以通過show grants命令查看權(quán)限授予執(zhí)行的命令:
show grants for 'zhangsan';2.4 修改密碼
(1)root用戶修改自己的密碼
使用MySqladmin命令
mysqladmin -u username -h localhost -p password "newpwd"(2)root用戶修改普通用戶的密碼
GRANT USAGE ON *.* TO 'someuser'@'%' IDENTIFIED BY 'somepassword';比如:使用Grant語句將Hermioner用戶的密碼修改為”123“
GRANT USAGE ON *.* TO 'Hermioner'@'localhost' IDENTIFIED BY '123';(3)普通用戶修改密碼
普通用戶登陸MySql服務(wù)器后,通過SET語句設(shè)置自己的密碼
SET PASSWORD=PASSWORD(''newpassword'');note: 其實上面三種方式都可以采用set方法來修改。知識選擇了每一種情況下更加適合的方式介紹。比如,還可以通過操作user表中的字段進(jìn)行修改。
2.5 密碼丟失解決
這種情況分為兩種
下面根據(jù)這兩個種情況 分別進(jìn)行處理
情況一:
使用set password 命令
set password for ‘root’@’localhost’ = password(‘hhhh’); -- 即hhhh為新密碼
使用update命令
首先進(jìn)入 mysql數(shù)據(jù)庫,執(zhí)行下面的三條語句
use mysql;
update user set password = password('hhhh');
flush privileges; --tiger 即為新密碼
情況二:
?
??1、更改相應(yīng)的配置文件
Windows ----> 找到my.ini 文件
Linux ?----> 找到配置文件 my.cnf 文件
?
找到在?[mysqld]?下添加skip-grant-tables,然后保存并退出
?
window下 如圖
?
Linux下 如圖
?
2、重啟mysql服務(wù):
Linux: service mysqld restart
window:
????net stop mysql ?-- 停止服務(wù)
????net start mysql ?-- 開啟服務(wù)
3、修改root用戶密碼 ,進(jìn)入cmd中 輸入 mysql后 輸入下面的語句
MySQL> UPDATE mysql.user SET Password=PASSWORD('新密碼') where USER='root';
MySQL> flush privileges;
MySQL> exit
4、再去把配置文件中的?skip-grant-tables注釋掉(如圖),然后重啟mysql(見步驟2)
5、退出?即可用新密碼登錄
2.6 刪除賬戶
- drop user 用戶名;
- 在mysql5.0之前drop user命令只會刪除用戶,而不刪除權(quán)限,在5.0之前需要先用revoke刪除權(quán)限。
2.7 查看當(dāng)前用的數(shù)據(jù)庫和查看當(dāng)前的用戶
? ?select database();
? ?select user();
?2.8 匿名賬戶
?
Question:已經(jīng)將一個賬戶的信息從數(shù)據(jù)庫中完全刪除,為什么該用戶還能登陸?
Answer:出現(xiàn)這種情況的原因可能有多種。最有可能的是在user數(shù)據(jù)表中存在匿名賬戶。在user表中匿名賬戶的User字段值為空字符串,這會允許任何人連接到數(shù)據(jù)庫,檢測是否存在匿名登陸用戶的方法是,輸入以下語句:
select *from user where User=' ';
如果有記錄返回,則說明存在匿名用戶,需要刪除該記錄,以保證數(shù)據(jù)庫的訪問安全,刪除語句為:
delete from user where user=' ';
這樣一來,該賬戶肯定不能登陸MySql服務(wù)器了。
?
轉(zhuǎn)載于:https://www.cnblogs.com/Hermioner/p/10409582.html
總結(jié)
以上是生活随笔為你收集整理的MySql学习19-----用户管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用java语言实现C#中的ref关键
- 下一篇: mysql什么情况下使用索引