1. 程式人生 > >Mysql系列 - 第3天:管理員必備技能(必須掌握)

Mysql系列 - 第3天:管理員必備技能(必須掌握)

這是mysql系列第3篇文章。

環境:mysql5.7.25,cmd命令中進行演示。

在玩mysql的過程中,經常遇到有很多朋友在雲上面玩mysql的時候,說我建立了一個使用者為什麼不能登入?為什麼沒有許可權?等等各種問題,本文看完之後,這些都不是問題了。

本文主要內容

  1. 介紹Mysql許可權工作原理
  2. 檢視所有使用者
  3. 建立使用者
  4. 修改密碼
  5. 給使用者授權
  6. 檢視使用者許可權
  7. 撤銷使用者許可權
  8. 刪除使用者
  9. 授權原則說明
  10. 總結

Mysql許可權工作原理

mysql是如何來識別一個使用者的呢?

mysql為了安全性考慮,採用主機名+使用者名稱來判斷一個使用者的身份,因為在網際網路中很難通過使用者名稱來判斷一個使用者的身份,但是我們可以通過ip或者主機名判斷一臺機器,某個使用者通過這個機器過來的,我們可以識別為一個使用者,所以mysql中採用使用者名稱+主機名來識別使用者的身份。當一個使用者對mysql傳送指令的時候,mysql就是通過使用者名稱和來源(主機)來斷定使用者的許可權。

Mysql許可權驗證分為2個階段:

  1. 階段1:連線資料庫,此時mysql會根據你的使用者名稱及你的來源(ip或者主機名稱)判斷是否有許可權連線
  2. 階段2:對mysql伺服器發起請求操作,如create table、select、delete、update、create index等操作,此時mysql會判斷你是否有許可權操作這些指令

許可權生效時間

使用者及許可權資訊放在庫名為mysql的庫中,mysql啟動時,這些內容被讀進記憶體並且從此時生效,所以如果通過直接操作這些表來修改使用者及許可權資訊的,需要重啟mysql或者執行flush privileges;才可以生效。

使用者登入之後,mysql會和當前使用者之間建立一個連線,此時使用者相關的許可權資訊都儲存在這個連線中,存放在記憶體中,此時如果有其他地方修改了當前使用者的許可權,這些變更的許可權會在下一次登入時才會生效。

檢視mysql中所有使用者

使用者資訊在mysql.user表中,如下:

mysql> use mysql;
Database changed
mysql> select user,host from user;
+---------------+--------------+
| user          | host         |
+---------------+--------------+
| test4         | 127.0.0.%    |
| test4         | 192.168.11.% |
| mysql.session | localhost    |
| mysql.sys     | localhost    |
| root          | localhost    |
| test2         | localhost    |
+---------------+--------------+
6 rows in set (0.00 sec)

建立使用者

語法:

create user 使用者名稱[@主機名] [identified by '密碼'];

說明:

  1. 主機名預設值為%,表示這個使用者可以從任何主機連線mysql伺服器
  2. 密碼可以省略,表示無密碼登入

示例1:不指定主機名

不指定主機名時,表示這個使用者可以從任何主機連線mysql伺服器

mysql> use mysql;
Database changed

mysql> select user,host from user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
3 rows in set (0.00 sec)

mysql> create user test1;
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| test1         | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)
    
mysql> exit
Bye

C:\Users\Think>mysql -utest1
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 49
Server version: 5.7.25-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, 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.

上面建立了使用者名稱為test1無密碼的使用者,沒有指定主機,可以看出host的預設值為%,表示test1可以從任何機器登入到mysql中。

使用者建立之後可以在mysql庫中通過 select user,host from user;檢視到。

其他示例

create user 'test2'@'localhost' identified by '123';

說明:test2的主機為localhost表示本機,此使用者只能登陸本機的mysql

create user 'test3'@% identified by '123';

說明:test3可以從任何機器連線到mysql伺服器

create user 'test4'@'192.168.11.%' identified by '123';

說明:test4可以從192.168.11段的機器連線mysql

修改密碼【3種方式】

方式1:通過管理員修改密碼

SET PASSWORD FOR '使用者名稱'@'主機' = PASSWORD('密碼');

方式2:create user 使用者名稱[@主機名] [identified by '密碼'];

set password = password('密碼');

方式3:通過修改mysql.user表修改密碼

use mysql;
update user set authentication_string = password('321') where user = 'test1' and host = '%';
flush privileges;

注意:

通過表的方式修改之後,需要執行flush privileges;才能對使用者生效。

5.7中user表中的authentication_string欄位表示密碼,老的一些版本中密碼欄位是password。

給使用者授權

建立使用者之後,需要給使用者授權,才有意義。

語法:

grant privileges ON database.table TO 'username'[@'host'] [with grant option]

grant命令說明:

  • priveleges (許可權列表),可以是all,表示所有許可權,也可以是select、update等許可權,多個許可權之間用逗號分開。
  • ON 用來指定許可權針對哪些庫和表,格式為資料庫.表名 ,點號前面用來指定資料庫名,點號後面用來指定表名,*.* 表示所有資料庫所有表。
  • TO 表示將許可權賦予某個使用者, 格式為username@host,@前面為使用者名稱,@後面接限制的主機,可以是IP、IP段、域名以及%,%表示任何地方。
  • WITH GRANT OPTION 這個選項表示該使用者可以將自己擁有的許可權授權給別人。注意:經常有人在建立操作使用者的時候不指定WITH GRANT OPTION選項導致後來該使用者不能使用GRANT命令建立使用者或者給其它使用者授權。
    備註:可以使用GRANT重複給使用者新增許可權,許可權疊加,比如你先給使用者新增一個select許可權,然後又給使用者新增一個insert許可權,那麼該使用者就同時擁有了select和insert許可權。

示例:

grant all on *.* to 'test1'@‘%’;

說明:給test1授權可以操作所有庫所有許可權,相當於dba

grant select on seata.* to 'test1'@'%';

說明:test1可以對seata庫中所有的表執行select

grant select,update on seata.* to 'test1'@'%';

說明:test1可以對seata庫中所有的表執行select、update

grant select(user,host) on mysql.user to 'test1'@'localhost';

說明:test1使用者只能查詢mysql.user表的user,host欄位

檢視使用者有哪些許可權

show grants for '使用者名稱'[@'主機']

主機可以省略,預設值為%,示例:

mysql> show grants for 'test1'@'localhost';
+--------------------------------------------------------------------+
| Grants for test1@localhost                                         |
+--------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'localhost'                          |
| GRANT SELECT (host, user) ON `mysql`.`user` TO 'test1'@'localhost' |
+--------------------------------------------------------------------+
2 rows in set (0.00 sec)

show grants;

檢視當前使用者的許可權,如:

mysql> show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT ALL PRIVILEGES ON `test`.* TO 'root'@'localhost'              |
| GRANT DELETE ON `seata`.* TO 'root'@'localhost'                     |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
4 rows in set (0.00 sec)

撤銷使用者的許可權

語法

revoke privileges ON database.table FROM '使用者名稱'[@'主機'];

可以先通過show grants命令查詢一下使用者對於的許可權,然後使用revoke命令撤銷使用者對應的許可權,示例:

mysql> show grants for 'test1'@'localhost';
+--------------------------------------------------------------------+
| Grants for test1@localhost                                         |
+--------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'localhost'                          |
| GRANT SELECT (host, user) ON `mysql`.`user` TO 'test1'@'localhost' |
+--------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> revoke select(host) on mysql.user from test1@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'test1'@'localhost';
+--------------------------------------------------------------+
| Grants for test1@localhost                                   |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'localhost'                    |
| GRANT SELECT (user) ON `mysql`.`user` TO 'test1'@'localhost' |
+--------------------------------------------------------------+
2 rows in set (0.00 sec)

上面我們先通過grants命令檢視test1的許可權,然後呼叫revoke命令撤銷對mysql.userhost欄位的查詢許可權,最後又通過grants命令查看了test1的許可權,和預期結果一致。

刪除使用者【2種方式】

方式1:

drop user '使用者名稱'[@‘主機’],示例:

mysql> drop user test1@localhost;
Query OK, 0 rows affected (0.00 sec)

drop的方式刪除使用者之後,使用者下次登入就會起效。

方式2:

通過刪除mysql.user表資料的方式刪除,如下:

delete from user where user='使用者名稱' and host='主機';
flush privileges;

注意通過表的方式刪除的,需要呼叫flush privileges;重新整理許可權資訊(許可權啟動的時候在記憶體中儲存著,通過表的方式修改之後需要重新整理一下)。

授權原則說明

  • 只授予能滿足需要的最小許可權,防止使用者幹壞事,比如使用者只是需要查詢,那就只給select許可權就可以了,不要給使用者賦予update、insert或者delete許可權
  • 建立使用者的時候限制使用者的登入主機,一般是限制成指定IP或者內網IP段
  • 初始化資料庫的時候刪除沒有密碼的使用者,安裝完資料庫的時候會自動建立一些使用者,這些使用者預設沒有密碼
  • 為每個使用者設定滿足密碼複雜度的密碼
  • 定期清理不需要的使用者,回收許可權或者刪除使用者

總結

  1. 通過命令的方式操作使用者和許可權不需要重新整理,下次登入自動生效
  2. 通過操作mysql庫中表的方式修改、使用者資訊,需要呼叫flush privileges;重新整理一下,下次登入自動生效
  3. mysql識別使用者身份的方式是:使用者名稱+主機
  4. 本文中講到的一些指令中帶主機的,主機都可以省略,預設值為%,表示所有機器
  5. mysql中使用者和許可權的資訊在庫名為mysql的庫中

Mysql系列目錄

  1. 第1天:mysql基礎知識
  2. 第2天:詳解mysql資料型別(重點)

mysql系列大概有20多篇,喜歡的請關注一下!

相關推薦

Mysql系列 - 3管理員必備技能(必須掌握)

這是mysql系列第3篇文章。 環境:mysql5.7.25,cmd命令中進行演示。 在玩mysql的過程中,經常遇到有很多朋友在雲上面玩mysql的時候,說我建立了一個使用者為什麼不能登入?為什麼沒有許可權?等等各種問題,本文看完之後,這些都不是問題了。 本文主要內容 介紹Mysql許可權工作原理 檢視所

java高併發系列 - 14JUC中的LockSupport工具類,必備技能

這是java高併發系列第14篇文章。 本文主要內容: 講解3種讓執行緒等待和喚醒的方法,每種方法配合具體的示例 介紹LockSupport主要用法 對比3種方式,瞭解他們之間的區別 LockSupport位於java.util.concurrent(簡稱juc)包中,算是juc中一個基礎類,juc中很多地

java高併發系列 - 15JUC中的Semaphore,最簡單的限流工具類,必備技能

這是java高併發系列第15篇文章 Semaphore(訊號量)為多執行緒協作提供了更為強大的控制方法,前面的文章中我們學了synchronized和重入鎖ReentrantLock,這2種鎖一次都只能允許一個執行緒訪問一個資源,而訊號量可以控制有多少個執行緒可以同時訪問特定的資源。 Semaphore常用

java高併發系列 - 16JUC中等待多執行緒完成的工具類CountDownLatch,必備技能

這是java高併發系列第16篇文章。 本篇內容 介紹CountDownLatch及使用場景 提供幾個示例介紹CountDownLatch的使用 手寫一個並行處理任務的工具類 假如有這樣一個需求,當我們需要解析一個Excel裡多個sheet的資料時,可以考慮使用多執行緒,每個執行緒解析一個sheet裡的資料

Mysql高手系列 - 4DDL常見操作彙總

這是Mysql系列第4篇。 環境:mysql5.7.25,cmd命令中進行演示。 DDL:Data Define Language資料定義語言,主要用來對資料庫、表進行一些管理操作。 如:建庫、刪庫、建表、修改表、刪除表、對列的增刪改等等。 文中涉及到的語法用[]包含的內容屬於可選項,下面做詳細說明。 庫的管

Mysql高手系列 - 5DML操作彙總,確定你都會?

這是Mysql系列第5篇。 環境:mysql5.7.25,cmd命令中進行演示。 DML(Data Manipulation Language)資料操作語言,以INSERT、UPDATE、DELETE三種指令為核心,分別代表插入、更新與刪除,是必須要掌握的指令,DML和SQL中的select熟稱CRUD(增刪

3CSS浮動、定位、表格、表單總結

特性 input 器) 用戶 style line ie瀏覽器 練習 doctype 今天學的是浮動、定位、表格、表單等內容,這些是CSS中最容易混淆的知識,有許多小技巧在寫代碼過程中需要註意。下面是主要知識點: 一、float浮動1、塊元素在一行顯示2、內聯元素支持寬高3

JVM系列3到底什麼是虛擬機器?

我們都知道在 Windows 系統上一個軟體包裝包是 exe 字尾的,而這個軟體包在蘋果的 Mac OSX 系統上是無法安裝的。類似地,Mac OSX 系統上軟體安裝包則是 dmg 字尾,同樣無法在 Windows 系統上安裝。 為什麼不同系統上的軟體無法安裝,這是因為作業系統底層的實現是不一樣的。對於 W

卜若的程式碼筆記系列-mysql系列-三章通過cmd登入mysql,可實現遠端登入,以及退出,切換賬號

1.通過cmd進入到各個硬碟 舉個例子:比如我現在要進入到c盤 直接: C:\Users\Skady_cat>cd/ 或者: C:\Users\Skady_cat>d: 然後cd到mysql的根目錄,如果預設安裝的話應該是這個目錄 C:\Progra

tensorflow100-3線性迴歸

tensorflow版 # tensorflow 實現線性迴歸 import tensorflow as tf import numpy as np import matplotlib.pyplot as plt # plt.ion() rng = np.random # 超引數 l

3函式的定義、使用、案例

函式:把一些重複的程式碼封裝起來,在需要的時候直接呼叫這個函式 函式的作用:程式碼的重用 在函式中定義的時候,函式後面的小括號的變數就是,目的在呼叫的時候 使用者傳進來的值操作 形參:函式定義時在函式名後,宣告的引數

java高併發系列 - 17JUC中的迴圈柵欄CyclicBarrier常見的6種使用場景及程式碼示例

這是java高併發系列第17篇。 本文主要內容: 介紹CyclicBarrier 6個示例介紹CyclicBarrier的使用 對比CyclicBarrier和CountDownLatch CyclicBarrier簡介 CyclicBarrier通常稱為迴圈屏障。它和CountDownLatch很相似,

java高併發系列 - 21java中的CAS操作,java併發的基石

這是java高併發系列第21篇文章。 本文主要內容 從網站計數器實現中一步步引出CAS操作 介紹java中的CAS及CAS可能存在的問題 悲觀鎖和樂觀鎖的一些介紹及資料庫樂觀鎖的一個常見示例 使用java中的原子操作實現網站計數器功能 我們需要解決的問題 需求:我們開發了一個網站,需要對訪問量進行統計,使

java高併發系列 - 22java中底層工具類Unsafe,高手必須要了解

這是java高併發系列第22篇文章,文章基於jdk1.8環境。 本文主要內容 基本介紹 通過反射獲取Unsafe例項 Unsafe中的CAS操作 Unsafe中原子操作相關方法介紹 Unsafe中執行緒排程相關方法 park和unpark示例 Unsafe鎖示例 Unsafe中保證變數的可見性 Unsafe

java高併發系列 - 23JUC中原子類,一篇就夠了

這是java高併發系列第23篇文章,環境:jdk1.8。 本文主要內容 JUC中的原子類介紹 介紹基本型別原子類 介紹陣列型別原子類 介紹引用型別原子類 介紹物件屬性修改相關原子類 預備知識 JUC中的原子類都是都是依靠volatile、CAS、Unsafe類配合來實現的,需要了解的請移步: volati

java高併發系列 - 24ThreadLocal、InheritableThreadLocal(通俗易懂)

java高併發系列第24篇文章。 環境:jdk1.8。 本文內容 需要解決的問題 介紹ThreadLocal 介紹InheritableThreadLocal 需要解決的問題 我們還是以解決問題的方式來引出ThreadLocal、InheritableThreadLocal,這樣印象會深刻一些。 目前

java高併發系列 - 25掌握JUC中的阻塞佇列

這是java高併發系列第25篇文章。 環境:jdk1.8。 本文內容 掌握Queue、BlockingQueue介面中常用的方法 介紹6中阻塞佇列,及相關場景示例 重點掌握4種常用的阻塞佇列 Queue介面 佇列是一種先進先出(FIFO)的資料結構,java中用Queue介面來表示佇列。 Queue介面中

java高併發系列 - 27實戰篇,介面效能成倍提升,讓同事刮目相看,現學現用

這是java高併發系列第27篇文章。 開發環境:jdk1.8。 案例講解 電商app都有用過吧,商品詳情頁,需要給他們提供一個介面獲取商品相關資訊: 商品基本資訊(名稱、價格、庫存、會員價格等) 商品圖片列表 商品描述資訊(描述資訊一般是由富文字編輯的大文字資訊) 資料庫中我們用了3張表儲存上面的資訊:

java併發系列 - 29高併發中常見的限流方式

這是java高併發系列第29篇。 環境:jdk1.8。 本文內容 介紹常見的限流演算法 通過控制最大併發數來進行限流 通過漏桶演算法來進行限流 通過令牌桶演算法來進行限流 限流工具類RateLimiter 常見的限流的場景 秒殺活動,數量有限,訪問量巨大,為了防止系統宕機,需要做限流處理 國慶期間,一般

java高併發系列 - 31獲取執行緒執行結果,這6種方法你都知道?

這是java高併發系列第31篇。 環境:jdk1.8。 java高併發系列已經學了不少東西了,本篇文章,我們用前面學的知識來實現一個需求: 在一個執行緒中需要獲取其他執行緒的執行結果,能想到幾種方式?各有什麼優缺點? 結合這個需求,我們使用6種方式,來對之前學過的知識點做一個回顧,加深記憶。 方式1:Thre