- 數(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
- 所有數(shù)據(jù)庫中的所有類型為InnoDB的表的數(shù)據(jù)和索引存儲于同一個表空間中
事務(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ù)需要施加的鎖
- 顯式鎖的使用:
LOCK TABLES
LOCK TABLES tbl_name read|write, tbl_name read|write, ...
UNLOCK TABLES
FLUSH TABLES
FLUSH TABLES tbl_name,... [WITH READ LOCK];
UNLOCK TABLES;
SELECT cluase [FOR UPDATE | LOCK IN SHARE MODE]
(五)實驗1:讀鎖、寫鎖的區(qū)別
- 對表students添加顯式讀鎖
- 在另一個進程對此表進行讀操作沒有被阻塞,立即執(zhí)行
- 釋放對表students的讀鎖后,添加顯式寫鎖
- 在另一個進程對此表進行讀操作被阻塞,待手動釋放寫鎖后才能執(zhí)行
- 通過FLUSH命令對表添加讀鎖
- 在另一個對此表的讀操作未被阻塞,而寫操作被阻塞
- 總結(jié):
- 讀鎖允許其他進程對表進行讀操作,不允許寫操作;
寫鎖不允許其他進程對表進行讀寫操作 - 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)限