程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql數據庫用戶和權限管理記錄

mysql數據庫用戶和權限管理記錄

編輯:MySQL綜合教程

在mysql中用戶權限是一門很深的學問了,如果你對數據庫權限設置不當很容易導致整台mysql數據庫服務器上數據庫被利用,下面我們一起來看看關於mysql用戶和權限管理相關設置吧。

一、MySQL用戶的基本說明:

1.1 用戶的基本結構
MySQL的用戶:用戶名@主機

■用戶名:16個字符以內
■主機:可以是主機名、IP地址、網絡地址等
主機名:www.bKjia.c0m,localhost

IP:192.168.0.1

網絡地址:172.16.0.0/255.255.0.0

主機還支持通配符:%和_

172.16.%.%

%.bKjia.c0m
注意:對於包含了主機名的用戶,MySQL會嘗試反解析主機名,此時可能會造成連接非常慢,如果反解析的IP地址與連接點的地址不同,還可能出現無法連接的情況。因此,為了加快連接並避免出現解析問題,可以在my.cnf文件中加入如下一行加速連接:

--skip-name-resolve
MySQL用戶的密碼有MySQL內部的password()函數管理。

1.2 授權表:
MySQL用戶只是用於認證,而用戶具有的權限有相應的授權機制實現。首先MySQL用戶授權的,主要為如下劉張表:

user: Contains user accounts, global privileges, and other non-privilege columns.
user: 用戶帳號、全局權限

db: Contains database-level privileges.
db: 庫級別權限

host: Obsolete.
host: 廢棄

tables_priv: Contains table-level privileges.
tables_priv: 表級別權限

columns_priv: Contains column-level privileges.
columns_priv: 列級別權限

procs_priv: Contains stored procedure and function privileges.
procs_priv: 存儲過程和存儲函數相關的權限

proxies_priv: Contains proxy-user privileges.
proxies_priv: 代理用戶權限
在MySQL數據庫服務啟動後,這六張表會被直接加載到內存,而今後所有的認證都直接從內存中這六張表獲取,而不是去讀取磁盤。

1.3 各授權表的說明:
■user表范圍列決定是否允許或拒絕到來的連接。對於允許的連接,user表授予的權限指出用戶的全局(超級用戶)權限。這些權限適用於服務器上的all數據庫。
■db表范圍列決定用戶能從哪個主機存取哪個數據庫。權限列決定允許哪個操作。授予的數據庫級別的權限適用於數據庫和它的表。
■tables_priv和columns_priv表類似於db表,但是更精致:它們在表和列級應用而非在數據庫級。授予表級別的權限適用於表和所有它的列。授予列級別的權限只適用於專用列。
■procs_priv表適用於保存的程序。授予程序級別的權限只適用於單個程序。
管理權限(例如RELOAD或SHUTDOWN等等)僅在user表中被指定。這是因為管理性操作是服務器本身的操作並且不是特定數據庫,因此沒有理由在其他授權表中列出這樣的權限。事實上,只需要查詢user表來決定你是否執行一個管理操作。

FILE權限也僅在user表中指定。它不是管理性權限,但你在服務器主機上讀或寫文件的能力與你正在存取的數據庫無關。

當mysqld服務器啟動時,將授權表的內容讀入到內存中。你可以通過FLUSH PRIVILEGES語句或執行mysqladmin flush-privileges或mysqladmin reload命令讓它重新讀取表。

二、MySQL提供的權限
賬戶權限信息被存儲在mysql數據庫的user、db、host、tables_priv、columns_priv和procs_priv表中。在MySQL啟動時時,服務器將這些數據庫表內容讀入內存。

GRANT和REVOKE語句所用的涉及權限的名稱顯示在下表,還有在授權表中每個權限的表列名稱和每個權限有關的上下文。

權限
 列
 上下文
 
CREATE
 Create_priv
 數據庫、表或索引
 
DROP
 Drop_priv
 數據庫或表
 
GRANT OPTION
 Grant_priv
 數據庫、表或保存的程序
 
REFERENCES
 References_priv
 數據庫或表
 
ALTER
 Alter_priv
 表
 
DELETE
 Delete_priv
 表
 
INDEX
 Index_priv
 表
 
INSERT
 Insert_priv
 表
 
SELECT
 Select_priv
 表
 
UPDATE
 Update_priv
 表
 
CREATE VIEW
 Create_view_priv
 視圖
 
SHOW VIEW
 Show_view_priv
 視圖
 
ALTER ROUTINE
 Alter_routine_priv
 保存的程序
 
CREATE ROUTINE
 Create_routine_priv
 保存的程序
 
EXECUTE
 Execute_priv
 保存的程序
 
FILE
 File_priv
 服務器主機上的文件訪問
 
CREATE TEMPORARY TABLES
 Create_tmp_table_priv
 服務器管理
 
LOCK TABLES
 Lock_tables_priv
 服務器管理
 
CREATE USER
 Create_user_priv
 服務器管理
 
PROCESS
 Process_priv
 服務器管理
 
RELOAD
 Reload_priv
 服務器管理
 
REPLICATION CLIENT
 Repl_client_priv
 服務器管理
 
REPLICATION SLAVE
 Repl_slave_priv
 服務器管理
 
SHOW DATABASES
 Show_db_priv
 服務器管理
 
SHUTDOWN
 Shutdown_priv
 服務器管理
 
SUPER
 Super_priv
 服務器管理
 

三、權限更改何時生效
當mysqld啟動時,所有授權表的內容被讀進內存並且從此時生效。

當服務器注意到授權表被改變了時,現存的客戶端連接有如下影響:

■表和列權限在客戶端的下一次請求時生效。
■數據庫權限改變在下一個USE db_name命令生效。
■全局權限的改變和密碼改變在下一次客戶端連接時生效。
如果用GRANT、REVOKE或SET PASSWORD對授權表進行修改,服務器會注意到並立即重新將授權表載入內存。

如果你手動地修改授權表(使用INSERT、UPDATE或DELETE等等),你應該執行mysqladmin flush-privileges或mysqladmin reload告訴服務器再裝載授權表,否則你的更改將不會生效,除非你重啟服務器。

如果你直接更改了授權表但忘記重載,重啟服務器後你的更改方生效。這樣可能讓你迷惑為什麼你的更改沒有什麼變化!

 

四、MySQL用戶賬戶管理
4.1 創建用戶與授權:
4.1.1 創建用戶:CREATE USER
基本語法:

CREATE USER username@host [IDENTIFIED BY 'password']
示例:

mysql> CREATE USER barlow@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.34 sec)
4.2.2 創建用戶並授權:GRANT
基本語法:

GRANT priv_type[(column_list)] ON [object_type] priv_level TO username@'%' [IDENTIFIED BY [PASSWORD] 'password'];
■priv_type:ALL或上面的權限表格中的權限。
■priv_level:  *| *.*| db_name.*| db_name.tbl_name| tbl_name| db_name.routine_name
示例:

mysql> GRANT CREATE,INSERT,SELECT,UPDATE,DELETE ON testdb.* TO barlow@'%';
Query OK, 0 rows affected (0.21 sec)

mysql> SHOW GRANTS FOR 'barlow'@'%';
+-------------------------------------------------------------------------------------------------------+
| Grants for barlow@%                                                                                   |
+-------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'barlow'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON `testdb`.* TO 'barlow'@'%'                            |
+-------------------------------------------------------------------------------------------------------+
2 rows in set (0.01 sec)


通過上圖實例可以看到,用戶只擁有明確授權的權限。

4.3 用戶管理
4.3.1 刪除用戶:
基本語法:

DROP USER 'username'@'host'
4.3.2 重命名用戶:
基本語法:

RENAME USER old_name TO new_name
4.3.3 收回已授予的用戶權限
基本語法:

REVOKE  priv_type [(column_list)]   [, priv_type [(column_list)]] ... ON [object_type] priv_level  FROM user [, user] ...
示例:

mysql> mysql> REVOKE INSERT ON testdb.* FROM  barlow@'%';
Query OK, 0 rows affected (0.01 sec)


從上圖可以看出,barlow@'%'用戶已經沒有了INSERT權限。                        

4.3.4 修改用戶密碼:
方法一:SET PASSWORD
基本語法:

SET PASSWORD FOR 'user_name'@'host' = PASSWORD('new_password');
示例:

mysql> SET PASSWORD FOR 'barlow'@'%' = PASSWORD('987654');
Query OK, 0 rows affected (0.07 sec)
說明:管理員可以修改任何用戶的密碼,但普通用戶只能修改自己的密碼。

用戶修改自己的密碼語法(也可以使用上述語法修改):

 SET PASSWORD = PASSWORD('new_password');方法二:直接update mysql.user表的password字段實現修改密碼:基本語法:mysql> use mysql

mysql> UPDATE user SET Password = PASSWORD('new_password') WHERE User='user_name' AND Host='host';

mysql> FLUSH PRIVILEGES;
示例:

mysql> use mysql

Database changed

mysql> UPDATE user SET Password = PASSWORD('redhat') WHERE User='barlow' AND Host='%';

Query OK, 1 row affected (0.03 sec)

Rows matched: 1  Changed: 1  Warnings: 0

mysql> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.08 sec)
4.4 找回root用戶的密碼:
如果root用戶的密碼忘記後,可以通過如下方法找回:

■停止mysqld服務
■啟動mysqld_safe時傳遞兩個參數:--skip-grant-tables --skip-networking
■啟動mysqld服務
■使用直接update mysql.user表的password字段實現修改root用戶密碼
示例:

停止服務,修改mysqld_safe傳遞參數:

[root@localhost ~]# service mysqld stop

Shutting down MySQL........ SUCCESS!

[root@localhost ~]# vim /etc/init.d/mysqld

 


登錄mysql修改密碼:

[root@localhost ~]# service mysqld start

Starting MySQL....................... SUCCESS!

[root@localhost ~]# mysql            ##注意,這裡已經不需要登錄密碼了

Welcome to the MySQL monitor.  Commands end with ; or g.

Your MySQL connection id is 1

Server version: 5.6.13 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> UPDATE mysql.user SET Password = PASSWORD('123456') WHERE User='root';

Query OK, 0 rows affected (0.00 sec)

Rows matched: 3  Changed: 0  Warnings: 0

mysql> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.03 sec)
恢復mysqld_safe傳遞參數:

[root@localhost ~]# service mysqld stop

Shutting down MySQL........ SUCCESS!

[root@localhost ~]# vim /etc/init.d/mysqld

$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &

[root@localhost ~]# service mysqld start

Starting MySQL...... SUCCESS!

[root@localhost ~]# mysql   ##再次登錄,提示需要密碼

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

[root@localhost ~]# mysql -u root –p   ##使用新密碼正常登錄

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or g.

Your MySQL connection id is 2

Server version: 5.6.13 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql>
更多mysql用戶和權限管理的內容,可參考官方文檔:http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#privilege-changes

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved