20171110 MySQL進階(一)

  • 數(shù)據(jù)庫基本概念回顧
  • 數(shù)據(jù)庫的并發(fā)控制:鎖
  • MySQL的事務(wù)設(shè)置
  • MySQL的索引設(shè)置
  • MySQL的用戶和權(quán)限管理

一、數(shù)據(jù)庫基本概念回顧

(一)數(shù)據(jù)庫的分類

(1)關(guān)系型數(shù)據(jù)庫:RDBMS
  • 主流產(chǎn)品:Oracle, SQL Server, MySQL, MariaDB, PostgreSQL
(2)非關(guān)系型數(shù)據(jù)庫:No-SQL DBMS
  • Document store:文檔型數(shù)據(jù)庫,e.g. MongoDB
  • Key-value store:鍵值存儲數(shù)據(jù)庫,e.g. Redis
  • Wide column store:列存儲數(shù)據(jù)庫
  • Graph DBMS:圖形數(shù)據(jù)庫
  • Search engine:搜索引擎,e.g. Solr, ElasticSearch
  • Time Series DBMS:時序數(shù)據(jù)庫,e.g. InfluxDB

(二)MySQL的基本概念

(1)MySQL的三個分支
  • Oracle官方MySQL
  • MariaDB,MySQL創(chuàng)始人創(chuàng)建的分支
  • Percona Server, 在InnoDB引擎的基礎(chǔ)上開發(fā)的XtraDB
(2)MySQL的存儲引擎
  • 常見的存儲引擎:SHOW ENGINES;
    MyISAM, Aria, InnoDB, MRG_MYISAM, CSV, BLACKHOLE, MEMORY, PERFORMANCE_SCHEMA, ARCHIVE, FEDERATED

  • InnoDB:原由InnoBase公司開發(fā),XtraDB是Percona開發(fā)的增強版

    • 數(shù)據(jù)存儲于表空間(table space)中,分兩種方式:

      • 所有數(shù)據(jù)庫中的所有類型為InnoDB的表的數(shù)據(jù)和索引存儲于同一個表空間中
        文件:ibdata1, ibdata2, ...
      • 每表的數(shù)據(jù)文件(數(shù)據(jù)和索引,存儲于數(shù)據(jù)庫目錄)存儲于自己專用的表空間文件中
        需要在配置文件中設(shè)置innodb_file_per_table=ON
        數(shù)據(jù)文件:tbl_name.ibd
        表結(jié)構(gòu)的定義:tbl_name.frm
    • 事務(wù)型存儲引擎,符合ACID(原子性,一致性,隔離性,持久性)原則,適合對事務(wù)要求較高的場景中

    • 基于MVCC(Mutli Version Concurrency Control)多版本并發(fā)控制,支持高并發(fā)

    • 支持四個隔離級別,默認級別為REPEATABLE-READ;間隙鎖以防止幻讀

    • 使用聚集索引(主鍵索引)

    • 支持自適應(yīng)Hash索引

    • 鎖粒度:行級鎖;間隙鎖

  • MyISAM:MySQL原生引擎,性能不好

    • 支持全文索引(FULLTEXT index)、表壓縮、空間函數(shù)(GIS)
    • 不支持事務(wù)
    • 鎖粒度:表級鎖
    • 崩潰無法保證表安全恢復(fù)
    • 非聚集索引
  • 其它的存儲引擎:

    • CSV:將CSV文件(以逗號分隔字段的文本文件)作為MySQL表文件
    • MRG_MYISAM:將多個MyISAM表合并成的虛擬表
    • BLACKHOLE:類似于/dev/null,不真正存儲數(shù)據(jù)
    • MEMORY:內(nèi)存存儲引擎,支持hash索引,表級鎖,常用于臨時表
    • FEDERATED:用于訪問其它遠程MySQL服務(wù)器上表的存儲引擎接口

二、數(shù)據(jù)庫的并發(fā)控制:鎖

(一)鎖類型 :

讀鎖:共享鎖,可被多個讀操作共享
寫鎖:排它鎖,獨占鎖

(二)鎖粒度:

表鎖:在表級別施加鎖,并發(fā)性較低
行鎖:在行級別施加鎖,并發(fā)性較高;維持鎖狀態(tài)的成本較大

(三)鎖策略:在鎖粒度及數(shù)據(jù)安全性之間尋求一種平衡機制

存儲引擎:存儲引擎自行決定鎖級別以及何時施加或釋放鎖
MySQL Server:表級別,可自行決定,也允許顯式請求

(四)鎖類別:

顯式鎖:用戶手動請求的鎖
隱式鎖:存儲引擎自行根據(jù)需要施加的鎖

  • 顯式鎖的使用:
    1. LOCK TABLES
      LOCK TABLES tbl_name read|write, tbl_name read|write, ...
      UNLOCK TABLES

    2. FLUSH TABLES
      FLUSH TABLES tbl_name,... [WITH READ LOCK];
      UNLOCK TABLES;

    3. SELECT cluase [FOR UPDATE | LOCK IN SHARE MODE]

(五)實驗1:讀鎖、寫鎖的區(qū)別

  • 對表students添加顯式讀鎖
  • 在另一個進程對此表進行讀操作沒有被阻塞,立即執(zhí)行
  • 釋放對表students的讀鎖后,添加顯式寫鎖
  • 在另一個進程對此表進行讀操作被阻塞,待手動釋放寫鎖后才能執(zhí)行
  • 通過FLUSH命令對表添加讀鎖
  • 在另一個對此表的讀操作未被阻塞,而寫操作被阻塞
  • 總結(jié):
  1. 讀鎖允許其他進程對表進行讀操作,不允許寫操作;
    寫鎖不允許其他進程對表進行讀寫操作
  2. SQL語言的運行時間除了與復(fù)雜性有關(guān)外,還受數(shù)據(jù)庫所處的環(huán)境影響(例如大量寫操作的環(huán)境下,很難迅速通過FLUSH命令添加讀鎖)

三、MySQL的事務(wù)設(shè)置

  • 事務(wù):一組原子性的SQL查詢、或者是一個或多個SQL語句組成的獨立工作單元

(一)事務(wù)日志的配置項:

innodb_log_files_in_group
innodb_log_group_home_dir
innodb_log_file_size
innodb_mirrored_log_groups

(二)ACID測試:

A:AUTOMICITY,原子性;整個事務(wù)中的所有操作要么全部成功執(zhí)行,要么全部失敗后回滾
C:CONSISTENCY,一致性;數(shù)據(jù)庫總是應(yīng)該從一個一致性狀態(tài)轉(zhuǎn)為另一個一致性狀態(tài)
I:ISOLATION,隔離性;一個事務(wù)所做出的操作在提交之前,是否能為其它事務(wù)可見;出于保證并發(fā)操作之目的,隔離有多種級別
D:DURABILITY,持久性;事務(wù)一旦提交,其所做出的修改會永久保存

(三)控制事務(wù)邏輯:

  • 自動提交:單語句事務(wù)
    查詢自動提交設(shè)置:SELECT @@autocommit;
    取消自動提交設(shè)置:SET @@session.autocommit=0;

  • 手動控制事務(wù):
    啟動:START TRANSACTION
    提交:COMMIT
    回滾:ROLLBACK

  • 事務(wù)支持savepoints:
    SAVEPOINT identifier
    ROLLBACK [WORK] TO [SAVEPOINT] identifier
    RELEASE SAVEPOINT identifier

(四)實驗2:手動控制事務(wù)

  • 前提:關(guān)閉自動提交事務(wù):SET @@session.autocommit=0;

  • 表原內(nèi)容如下

  • 現(xiàn)在開始事務(wù),增加一條記錄,查看修改后的表內(nèi)容如下

    START TRANSACTION;
    INSERT students (ID,NAME,AGE,GENDER,DESCRIPTION) VALUES (6,'Marry',25,'F','Art');
    SELECT * FROM students;
    
  • 執(zhí)行回滾操作,再查看表內(nèi)容恢復(fù)成原狀,最后提交事務(wù)

    ROLLBACK;
    SELECT * FROM students;
    COMMIT;   
    

(五)實驗3:在實驗2的基礎(chǔ)上,在一個事務(wù)中建立多個保存點,分別恢復(fù)

  • 開始一個事務(wù),刪除NAME='Frank'的表記錄,此刻存為保存點test1
START TRANSACTION;
DELETE FROM students WHERE NAME='Frank';
SELECT * FROM students;
SAVEPOINT test1;
  • 更新ID=2的表記錄中AGE=22,此刻存為保存點test2
UPDATE students SET AGE=22 WHERE ID=2;
SAVEPOINT test2;
SELECT * FROM students;
  • 刪除NAME='Alice'的表記錄
DELETE FROM students WHERE NAME='Alice';
SELECT * FROM students;
  • 回滾至保存點test2,恢復(fù)了NAME='Alice'的表記錄
ROLLBACK TO test2;
SELECT * FROM students;
  • 回滾至保存點test1,ID=2的表記錄中AGE=25
ROLLBACK TO test1;
SELECT * FROM students;
  • 回滾至事務(wù)開始,恢復(fù)至NAME='Frank'的表記錄
ROLLBACK;
SELECT * FROM students;
COMMIT;

(六)事務(wù)隔離:

  • 事務(wù)隔離級別:
    READ-UNCOMMITTED:讀未提交 --> 臟讀
    READ-COMMITTED:讀提交--> 不可重復(fù)讀
    REPEATABLE-READ:可重復(fù)讀 --> 幻讀,MySQL的默認級別
    SERIALIZABLE:串行化
  • 查看事務(wù)隔離級別:
    SELECT @@session.tx_isolation;
  • 查看InnoDB存儲引擎的狀態(tài)信息:
    SHOW ENGINE innodb STATUS;

(七)實驗4:區(qū)分四級事務(wù)隔離

  • 實驗環(huán)境:兩個進程訪問同一個數(shù)據(jù)庫的同一個表,在一個進程修改表,在另一個進程查看表,以此區(qū)分四級事務(wù)隔離的區(qū)別

  • 實驗準備:兩個進程都關(guān)閉自動提交事務(wù)SET @@session.autocommit=0;

  • 測試READ-UNCOMMITTED級別

    進程1添加一條記錄,尚未提交事務(wù)

    此時進程2中已發(fā)現(xiàn)了添加的記錄,此時進程2的查詢操作即是臟讀,數(shù)據(jù)是臟數(shù)據(jù)

  • 測試READ-COMMITTED級別

    進程1刪除一條記錄,本進程查詢已經(jīng)記錄刪除

    此時進程2中查詢?nèi)耘f有被進程1刪除的記錄,當進程1提交事務(wù)后,查詢表中已經(jīng)刪除了對應(yīng)的記錄;
    READ-COMMITTED級別雖然保證了只有提交的事務(wù)結(jié)果才能被其他進程看到,但是反映在進程2卻出現(xiàn)了未有任何修改操作,而數(shù)據(jù)發(fā)生變化的“奇怪”現(xiàn)象,此種現(xiàn)象為不可重復(fù)讀

  • 測試REPEATABLE-READ級別

    進程1刪除一條記錄,本進程查詢記錄已經(jīng)刪除

    此時進程2中查詢?nèi)耘f有被進程1刪除的記錄,當進程1提交事務(wù)后,查詢表中被進程1刪除的記錄仍舊存在,故REPEATABLE-READ級別解決了不可重復(fù)讀的問題

    此時在進程2中嘗試刪除被進程1刪除的記錄,發(fā)現(xiàn)返回結(jié)果提示沒有找到符合條件的記錄被刪除,而再次嘗試查詢表記錄,發(fā)現(xiàn)被“刪除”的記錄仍舊存在,似乎詞條記錄有時存在,有時不存在,此種現(xiàn)象為幻讀

  • 測試SERIALIZABLE級別

    進程1添加一條表記錄

    此時在進程2中查詢表信息,發(fā)現(xiàn)處于等待狀態(tài)。待進程1提交事務(wù)后,進程2的查詢命令才運行出結(jié)果。進程2的查詢語句所耗費的時間遠大于一般情況,大部分時間進程2被阻塞,直到進程1完成提交事務(wù)后才能夠運行;
    這種事務(wù)隔離級別雖然避免了之前三種級別的所有問題,但是完全禁止了并行狀態(tài),數(shù)據(jù)庫的性能十分低下。

四、MySQL的索引設(shè)置

(一)索引的基本概念:

  • 定義:提取索引的創(chuàng)建在的表上字段中的數(shù)據(jù),構(gòu)建出一個獨特的數(shù)據(jù)結(jié)構(gòu)

  • 作用:加速查詢操作;副作用:降低寫操作性能

  • 原理:索引即是表中數(shù)據(jù)子集,通過把表中某個或某些字段的數(shù)據(jù)提取出來另存為一個特定數(shù)據(jù)結(jié)構(gòu)組織的數(shù)據(jù)

  • 索引某個字段或某些字段的策略:WHERE子句中用到的字段

(二)索引的類型:

  • 索引類型:B+ TREE,HASH
(1)B+ TREE索引:

順序存儲,每一個葉子結(jié)點到根結(jié)點的距離相同;MySQL采用左前綴索引,適合于范圍類型的數(shù)據(jù)查詢

  • 適用于B+ TREE索引的查詢類型:全鍵值、鍵值范圍或鍵前綴;
    1. 全值匹配:精確匹配某個值
    WHERE COLUMN = 'value';
    2. 匹配最左前綴:只精確匹配開始的部分
    WEHRE COLUMN LIKE 'PREFIX%';
    3. 匹配范圍值
    精確匹配某一列,范圍匹配另一列

  • 只用訪問索引的查詢:覆蓋索引
    index(Name)
    SELECT Name FROM students WHERE Name LIKE 'L%';

  • 不適用B+ TREE索引:
    1. 如果查詢條件不是從最左側(cè)列開始,索引無效
    index(age,Fname), WHERE Fname='Jerry'; , WHERE age>30 AND Fname='Smith';
    2. 不能跳過索引中的某列
    index(name,age,gender)
    WHERE name='black' and age > 30;
    WHERE name='black' AND gender='F';
    3. 如果查詢中的某個列是為范圍查詢,那么其右側(cè)的列都無法再使用索引優(yōu)化查詢
    WHERE age>30 AND Fname='Smith';

(2)Hash索引:

基于哈希表實現(xiàn),特別適用于值的精確匹配查詢;

  • 適用場景:
    只支持等值比較查詢,例如=, IN(), <=>

  • 不適用場景:
    所有非精確值查詢;MySQL僅對memory存儲引擎支持顯式的hash索引

  • 索引優(yōu)點:
    降低需要掃描的數(shù)據(jù)量,減少IO次數(shù)
    可以幫助避免排序操作,避免使用臨時表
    幫助將隨機IO轉(zhuǎn)為順序IO

(三)高性能索引策略:

  • 在WHERE中獨立使用列,盡量避免其參與運算
    反例:WHERE age+2 > 32;
  • 左前綴索引:索引構(gòu)建于字段的最左側(cè)的多少個字符,要通過索引選擇性來評估
    索引選擇性:不重復(fù)的索引值和數(shù)據(jù)表的記錄總數(shù)的比值
  • 多列索引:
    AND連接的多個查詢條件更適合使用多列索引,而非多個單鍵索引
  • 選擇合適的索引列次序:選擇性最高的放左側(cè)

(四)EXPLAIN來分析索引有效性:

(1)語法:

EXPLAIN [explain_type] SELECT select_options

(2)輸出結(jié)果分析:
  • id:當前查詢語句中,第#個SELECT語句的編號

  • select_type:查詢類型

    • 簡單查詢:SIMPLE
    • 復(fù)雜查詢:
      簡單子查詢:SUBQUERY
      用于FROM中的子查詢:DERIVED
      聯(lián)合查詢中的第一個查詢:PRIMARY
      聯(lián)合查詢中的第一個查詢之后的其它查詢:UNION
      聯(lián)合查詢生成的臨時表:UNION RESULT
  • table:查詢針對的表

  • type:關(guān)聯(lián)類型,或稱為訪問類型,即MySQL如何去查詢表中的行

    • ALL:全表掃描
    • index:根據(jù)索引的順序進行的全表掃描;但同時如果Extra列出現(xiàn)了"Using index”表示使用了覆蓋索引
    • range:有范圍限制地根據(jù)索引實現(xiàn)范圍掃描;掃描位置始于索引中的某一項,結(jié)束于另一項
    • ref:根據(jù)索引返回的表中匹配到某單個值的所有行(匹配給定值的行不止一個)
    • eq_ref:根據(jù)索引返回的表中匹配到某單個值的單一行,僅返回一個行,但需要與某個額外的參考值比較,而不是常數(shù)
    • const,system:與某個常數(shù)比較,且只返回一行
  • possiable_keys:查詢中可能會用到的索引

  • key:查詢中使用的索引

  • key_len:查詢中用到的索引長度

  • ref:在利用key字段所顯示的索引完成查詢操作時所引用的列或常量值

  • rows:MySQL估計出的為找到所有的目標項而需要讀取的行數(shù)

  • Extra:額外信息

    • Using index:使用了覆蓋索引進行的查詢
    • Using where:拿到數(shù)據(jù)后還要再次進行過濾
    • Using temporary:使用了臨時表以完成查詢
    • Using filesort:對結(jié)果使用了一個外部索引排序

(五)實驗5:索引的使用

  • 環(huán)境準備:建立一個足夠大的表
// 創(chuàng)建表
MariaDB [test]> CREATE TABLE employees (ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,NAME VARCHAR(10) NOT NULL,AGE TINYINT UNSIGNED,GENDER ENUM('M','F'),MAJOR VARCHAR(50));
// 腳本批量添加表記錄,共500條
GENDER=("M" "F")
for i in {1..500};do mysql -e "INSERT INTO test.employees (NAME,AGE,GENDER) VALUES ('emp$i','$[$RANDOM%43+18]','${GENDER[$RANDOM%2]}')"; done
  • 此時分析查詢語句:EXPLAIN SELECT * FROM employees WHERE AGE>50;

select_type='SIMPLE'表示當前為簡單查詢,type='ALL'表示為全表查詢,此時尚未用到索引,rows代表預(yù)計查詢需要讀取的行數(shù)

  • 創(chuàng)建索引
    AGE單字段索引:CREATE INDEX age ON employees (AGE);
    AGE, NAME多字段索引:CREATE INDEX age_and_name ON employees (AGE,NAME);
    NAME, AGE多字段索引:CREATE INDEX name_and_age ON employees (NAME,AGE);
    顯示索引信息:SHOW INDEXES FROM employees;
  • 分析查詢語句:EXPLAIN SELECT NAME FROM employees WHERE AGE>50;

type='range'表示根據(jù)索引范圍搜索,possible_keys='age, age_and_name'表示可能用到的索引為age, age_and_name,key='age_and_name'表示真正使用的索引為age_and_name;

由于搜索字段為AGE,索引age, age_and_name都是以字段AGE開始,故系統(tǒng)認為他們可能被用到;而由于age_and_name索引包含了查詢結(jié)果字段,故被選做實際用到的索引;

此時rows=112,相較沒有設(shè)置索引時讀入的行數(shù)大大減少,查詢效率提升明顯

  • 分析查詢語句:EXPLAIN SELECT NAME FROM employees WHERE NAME LIKE 'emp1%';

此時搜索條件為NAME,故只有起始字段為NAME的索引name_and_age成為可能和實際被使用的索引;

type='range'表示查詢?yōu)楦鶕?jù)索引的范圍查詢

  • 分析復(fù)合查詢語句:EXPLAIN SELECT NAME,AGE FROM employees WHERE AGE< (SELECT avg(AGE) FROM employees);

這是一個復(fù)合查詢語句,主句的查詢條件是子句的查詢結(jié)果,在本例中通過子句查詢年齡的平均值,再查詢年齡小于平均值的記錄的姓名與年齡字段值,select_type明確表明了查詢語句的主從關(guān)系;

當type='index'并且Extra='Using index',表示查詢使用了覆蓋索引,效率較高

  • 分析精確查詢語句:EXPLAIN SELECT NAME,AGE FROM employees WHERE AGE=30;

type='ref'表示查詢屬于精確查詢,查詢條件匹配單個值,而匹配結(jié)果可能不止一個

  • 分析使用主鍵索引查詢語句:EXPLAIN SELECT NAME,AGE FROM employees WHERE ID=50;

type='const'表示查詢條件為精確查詢某個常數(shù),并且返回結(jié)果只有一行,通常在主鍵索引查詢時出現(xiàn)

五、MySQL的用戶和權(quán)限管理

(一)用戶賬號:user@host

  • user:賬戶名稱
  • host:此賬戶可通過哪些客戶端主機請求創(chuàng)建連接線程,可使用通配符
    %:任意長度的任意字符;
    _:任意單個字符;
  • 建議在mysql設(shè)置中跳過主機地址解析:skip_name_resolve=ON

(二)MySQL權(quán)限類別:

  • 分為:庫級別,表級別,字段級別,管理類,程序類

  • 管理類:
    CREATE USER
    RELOAD
    LOCK TABLES
    REPLICATION CLIENT, REPLICATION SLAVE
    SHUTDOWN
    FILE
    SHOW DATABASES
    PROCESS
    SUPER

  • 程序類:
    FUNCTION,PROCEDURE,TRIGGER,分別擁有以下操作
    操作:CREATE,ALTER,DROP,EXECUTE

  • 庫和表級別:
    CREATE,ALTER,DROP
    INDEX
    CREATE VIEW
    SHOW VIEW
    GRANT:能夠把自己獲得的權(quán)限生成一個副本轉(zhuǎn)贈給其它用戶,不推薦使用
    OPTION

  • 數(shù)據(jù)操作:

    • 表:
      INSERT/DELETE/UPDATE/SELECT
    • 字段:
      SELECT(col1,col2,...)
      UPDATE(col1,col2,...)
      INSERT(col1,col2,...)
  • 所有權(quán)限:ALL, ALL PRIVILEGES

  • 元數(shù)據(jù)數(shù)據(jù)庫(數(shù)據(jù)字典):mysql
    mysql數(shù)據(jù)庫用于存放各級別的權(quán)限設(shè)置,具體包含如下存放授權(quán)信息的表
    db, host, user
    tables_priv, column_priv, procs_priv, proxies_priv

(三)用戶管理命令

  • 創(chuàng)建用戶:
    CREATE USER 'user'@'host' [IDENTIFIED BY [PASSWORD] 'password'] [,'user'@'host' [IDENTIFIED BY [PASSWORD] 'password']...]

  • 重命名用戶:
    RENAME USER old_user TO new_user[, old_user TO new_user] ...

  • 刪除用戶:
    DROP USER 'user'@'host' [, 'user'@'host'] ...

  • 讓MySQL重新加載授權(quán)表:
    FLUSH PRIVILEGES
    以上用戶管理命令自帶重載授權(quán)表功能,此命令在直接修改mysql數(shù)據(jù)庫的授權(quán)表后執(zhí)行

  • 修改用戶密碼:

    • SET PASSWORD [FOR 'user'@'host'] = PASSWORD('cleartext password');
    • UPDATE mysql.user SET password=PASSWORD('cleartext password') WHERE User='USERNAME' AND Host='HOST';
    • mysqladmin -uUSERNAME -hHOST -p password 'NEW_PASS'
    • 修改后記得生效:FLUSH PRIVILEGES
  • 忘記管理員密碼的解決辦法:
    (1) 啟動mysqld進程時,使用--skip-grant-tables和--skip-networking選項
    CentOS 7:mariadb.service
    CentOS 6:/etc/init.d/mysqld
    (2) 通過UPDATE命令修改管理員密碼
    (3) 以正常方式啟動mysqld進程

  • 實驗6:實現(xiàn)MySQL忘記管理員密碼時重置密碼

    • 第1步:修改進程啟動選項
    systemctl stop mariadb.service
    
    vim /usr/lib/systemd/system/mariadb.service
    ExecStart=/usr/bin/mysqld_safe --basedir=/usr --skip-grant-tables --skip-networking
    
    systemctl daemon-reload
    systemctl start mariadb.service
    
    • 第2步:修改管理員密碼
    MariaDB [(none)]> UPDATE mysql.user SET password=PASSWORD('hellomysql') WHERE user='root';
    MariaDB [(none)]> exit
    
    • 第3步:正常方式啟動mysql
    systemctl stop mariadb.service
    
    vim /usr/lib/systemd/system/mariadb.service
    ExecStart=/usr/bin/mysqld_safe --basedir=/usr
    
    systemctl daemon-reload 
    systemctl start mariadb.service
    mysql -phellomysql
    

(四)授權(quán)管理

  • 授權(quán):GRANT
    GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user_specification [, user_specification] ...
    [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
    [WITH with_option ...]

    object_type:
    TABLE| FUNCTION| PROCEDURE
                      
    priv_level:
    *| *.*| db_name.*| db_name.tbl_name| tbl_name| db_name.routine_name
                                          
    ssl_option:
    SSL| X509| CIPHER 'cipher'| ISSUER 'issuer'| SUBJECT 'subject'                
                  
    with_option:
    GRANT OPTION| MAX_QUERIES_PER_HOUR count
    | MAX_UPDATES_PER_HOUR count| MAX_CONNECTIONS_PER_HOUR count
    | MAX_USER_CONNECTIONS count  
    
  • 查看授權(quán):SHOW GRANTS
    SHOW GRANTS [FOR 'user'@'host']

  • 取消授權(quán):REVOKE
    REVOKE priv_type [(column_list)][, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    FROM 'user'@'host' [, 'user'@'host'] ...

  • 實驗7:授權(quán)管理

    • 授予指定用戶對指定表的查詢權(quán)限
      GRANT SELECT ON hellodb.students TO 'testusr'@'192.168.136.%' IDENTIFIED BY 'centos';

    此時用戶沒有對本表增加記錄的權(quán)限

    • 增加授予指定用戶對指定表的增加記錄權(quán)限
      GRANT INSERT ON hellodb.students TO 'testusr'@'192.168.136.%' IDENTIFIED BY 'centos';

    此時用戶沒有對本表指定字段內(nèi)容的更新權(quán)限

    • 增加授予指定用戶對指定表指定字段內(nèi)容的更新權(quán)限
      GRANT UPDATE(AGE) ON hellodb.students TO 'testusr'@'192.168.136.%' IDENTIFIED BY 'centos';
    • 查看當前本用戶已獲得的授權(quán)
      SHOW GRANTS;
    • 取消之前對本用戶的授權(quán)
      REVOKE ALL PRIVILEGES ON hellodb.students FROM 'testusr'@'192.168.136.%';
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容