MySQL用戶和權限管理

首發自我的博客《旺旺知識庫》http://www.toxingwang.com/database/mysql/1468.htmlhtml

1、MySQL用戶的基本說明:

1.1 用戶的基本結構

MySQL的用戶:用戶名@主機mysql

  • 用戶名:16個字符之內sql

  • 主機:能夠是主機名、IP地址、網絡地址等數據庫

主機名:www.toxingwang.com,localhostvim

IP:192.168.0.1服務器

網絡地址:172.16.0.0/255.255.0.0網絡

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

172.16.%.%函數

%.toxingwang.comurl

注意:對於包含了主機名的用戶,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-privilegesmysqladmin reload命令讓它從新讀取表。

2、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

服務器管理

3、權限更改什麼時候生效

當mysqld啓動時,全部受權表的內容被讀進內存而且今後時生效。

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

  • 表和列權限在客戶端的下一次請求時生效。

  • 數據庫權限改變在下一個USE db_name命令生效。

  • 全局權限的改變和密碼改變在下一次客戶端鏈接時生效。

若是用GRANT、REVOKE或SET PASSWORD對受權表進行修改,服務器會注意到並當即從新將受權表載入內存。

若是你手動地修改受權表(使用INSERT、UPDATE或DELETE等等),你應該執行mysqladmin flush-privilegesmysqladmin reload告訴服務器再裝載受權表,不然你的更改將不會生效,除非你重啓服務器。

若是你直接更改了受權表但忘記重載,重啓服務器後你的更改方生效。這樣可能讓你迷惑爲何你的更改沒有什麼變化!


4、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)

圖片

從上圖能夠看出,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


<a href="http://www.toxingwang.com/wp-content/uploads/2013/09/mysql-root1.jpg" class="cboxElement" rel="example4" 1468"="" style="text-decoration: none; color: rgb(1, 150, 227);">圖片

登陸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

相關文章
相關標籤/搜索