DBA數(shù)據(jù)庫筆記之(二)MySQL的安全管理和特性

MySQL的安全管理

MySQL如何進行用戶管理

用戶管理

  • 創(chuàng)建用戶
create user 'local'@'localhost' identified by 'password'
# 本機登錄用戶
create user 'local'@'192.168.0.1' identified by 'password'
# 遠程登錄用戶
create user 'local'@'192.168.0.%' identified by 'password'
# 網(wǎng)段用戶授權

local 用戶名
localhost 只允許在本機登錄(MySQL安裝的機器)
password 密碼

  • 查詢用戶
select user,host from mysql.user;
select * from mysql.user\G;

\G 表示將查詢結果進行按列打印苹粟,可以使每個字段打印到單獨的行有滑。即將查到的結構旋轉90度變成縱向。

  • 刪除用戶
drop user 'local'@'192.168.0.1';

控制MySQL用戶權限

  • 權限分類
  1. 全局權限
  2. 數(shù)據(jù)庫權限
  3. 表和列權限
  • 常用權限
權限 解釋
insert 允許寫入數(shù)據(jù)
delete 允許刪除數(shù)據(jù)
select 允許查詢數(shù)據(jù)
update 允許更新數(shù)據(jù)
create 允許創(chuàng)建庫和表
create role 允許創(chuàng)建角色
create user 啟用創(chuàng)建用戶嵌削、刪除用戶毛好、重命名用戶和撤銷所有權限
drop 允許刪除庫、表苛秕、視圖等
drop role 開啟刪除角色
alter 允許修改表結構
lock tables 在具有select權限的表上啟用鎖表權限
show databases 開啟查看所有庫的權限
super 允許使用其他管理操作肌访,比如: CHANGE REPLICATION SOURCE TO,CHANGE MASTER TO,KILLPURGE BINARY LOGS.SET GLOBAL,還包括mysgladmin debug 命令
all 除grant option 和proxy權限外艇劫,賦予其他所有權限
更多 MySQL 權限可參考官方文檔: https://dev.mysql.com/doc/refman/8.0/en/grant.html
show privileges;
# 顯示MySQL支持的所有權限
  • 用戶授權
grant insert,delete,select,update on database.* to 'local'@'localhost';
# 給 'local'@'localhost' 用戶賦予 database 數(shù)據(jù)庫下所有表增刪改查權限

grant insert,delete,select,update on database.table to 'local'@'localhost';
# 給用戶賦予數(shù)據(jù)庫下某個表的增刪改查權限

grant select(id,name) on database.table to local@localhost;
# 給用戶 local@localhost 賦予 database.table 的查詢id吼驶,name字段的權限
  • 查詢權限
show grants for 'local'@'localhost';
  • 權限回收
revoke select,insert,delete on database.* from 'local'@'localhost';
  • 權限授予的原則

使用不同的用戶
權限最小原則
避免使用root

MySQL角色的管理

  • 創(chuàng)建角色
create role 'java_developer'
  • 給角色賦權
grant select,update,delete,insert on database.* to 'java_developer';
  • 使用角色
create user 'test'@'localhost' indentified by '123456';
grant 'java_developer' to 'test'@'localhost';
# 給用戶分配角色
show grants for 'test'@'localhost';
  • 撤銷角色
revoke java_developer from 'test'@'localhost';
  • 刪除角色
drop role java_developer;

MySQL密碼的管理

  • 修改root密碼
alter user user() identified by 'password'
  • 修改普通用戶的密碼
alter user 'local'@'localhost' identified by 'password'
  • 設置隨機密碼
create user 'local'@'localhost' identified by random password;
# 新建用戶隨機密碼
alter user 'local'@'localhost' identified by random password;
# 修改已經(jīng)存在的用戶隨機密碼
  • 強制使用強密碼
install component 'file://component_validate_password';
show global variables like 'validate_password%';
# 顯示密碼規(guī)則
  • 密碼試錯
create user 'test'@'localhost' identified by '123456' failed_login_attempts 4 password_lock_time 3;
# 連續(xù)錯誤輸入4次就會鎖定3天
grant select on *.* to 'test'@'localhost';
# 賦權,登錄測試

如何限制用戶使用資源

  • 用戶資源限制的參數(shù)
參數(shù) 解釋
MAX_QUERIES_PER_HOUR 每小時限制多少次查詢
MAX_UPDATES_PER_HOUR 每小時限制多少次更新
MAX_CONNECTIONS_PER_HOUR 賬戶每小時可以連到服務器的次數(shù)
MAX_USER_CONNECTION 一個賬號同時連接到服務器的數(shù)量
  • 資源限制的使用

創(chuàng)建用戶時限制資源

create user 'test'@'localhost' identified by '123456'  with max_queries_per_hour 500  max_updates_per_hour 100  max_connections_per_hour 50  max_user_connections 50;
  • 修改現(xiàn)有用戶的資源限制
alter user 'test'@'localhost' with max_queries_per_hour 100;  
alter user 'test'@'localhost' with max_queries_per_hour 0;  
# 取消限制 設為 0
  • 重置資源使用計數(shù)
flush user_resources;
# 或者
flush privileges;
# 兩種店煞,或者重新設置資源次數(shù)也會重置

忘記root密碼怎么辦蟹演?

  1. 配置文件增加跳過權限驗證的配置
vim /data/mysql/conf/my.cnf
# 在[mysqld]下增加
skip-grant-tables
  1. 重啟mysql
  2. 免密方式登錄mysql
mysql -uroot -p
  1. 修改root密碼
update mysql.user set authentication_string='' where user = 'root' and host = 'localhost';
# 再去掉免密參數(shù)
vim /data/mysql/conf/my.cnf
# 刪除 skip-grant-tables
  1. 重啟MySQL
  2. 修改密碼并重新登錄
# 空密碼登錄MySQL
mysql -uroot -p
# 修改密碼
alter user user() identified by '123456';

SQL MODE 詳解

  • 查詢SQL_MODE
select @@global.sql_mode;

# 查詢當前會話的SQL_MODE
select @@session.sql_mode;
  • 設置SQL_MODE
# 啟動時設置
mysql --sql-mode=""

# 配置文件中增加
vim /data/mysql/conf/my.cnf
# 在[mysqld]下新增,多個,隔開
sql-mode=""

# 設置全局
set global sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";

# 設置會話級別
set session sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
# 原有基礎上刪除某一個sql_mode
set session sql_mode=sys.list_drop(@@session.sql_mode,'NO_ENGINE_SUBSTITUTION')顷蟀;
# 原有基礎上添加一個sql_mode
set session sql_mode=sys.list_add(@@session.sql_mode,'NO_ENGINE_SUBSTITUTION')酒请;
  • 常見SQL MODE解釋
SQL MODE 解釋
STRICT_TRANS_TABLES 為事務存儲引擎啟用嚴格的SQL模式,在插入不合法數(shù)據(jù)時鸣个,MySQL將不再插入"默認值”蚌父,而是拋出錯誤。這樣可以確保數(shù)據(jù)的完整性和一致性毛萌。這種模式比較適合對數(shù)據(jù)完整性要求嚴格的場景
ANSI 等于REAL_AS_FLOAT苟弛、PIPES_AS_CONCAT、ANSI_QUOTES阁将、 IGNORE_SPACE和ONLY_FULL_GROUP_BY
TRADITIONAL 可以理解為讓MySQL像傳統(tǒng)的SQL數(shù)據(jù)庫系統(tǒng)一樣運,等于STRICT_TRANS_TABLES膏秫、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE缤削、ERROR_FOR_DIVISION_BY_ZERO和NO_ENGINE_SUBSTITUTION
ONLY_FULL_GROUP_BY 如果某個列不在group by列表中窘哈,此時如果不對該列進行聚合處理,則該列不能出現(xiàn)在select列表亭敢、having條件中以及order by列表中
NO_BACKSLASH_ESCAPES 啟用此模式將禁止使用反斜杠字符"\"作為字符串和標識符中的轉義字符滚婉,反斜杠將像其他字符串一樣變成普通字符
PIPES_AS_CONCAT 將”||“視為字符串連接操作符
NO_ENGINE_SUBTITUTION 啟用此模式時,如果創(chuàng)建或者更改表時指定了不可用的存儲引擎帅刀,則報錯不執(zhí)行;未啟用此模式時让腹,會替換成默認存儲引擎
NO_ZERO_DATE 啟用此模式,"0000-00-00" 則允許插入并產(chǎn)生警告扣溺,如果啟用此模式和嚴格模式骇窍,則不允許"0000-00-00"插入,并會報錯锥余;除非IGNORE腹纳。對于INSERT IGNORE and UPDATE IGNORE,"0000-00-00"是允許的驱犹,插入會產(chǎn)生警告
ERROR_FOR_DIVISION_BY_ZERO 啟用此模式,則除以零會插入NULL并產(chǎn)生警告嘲恍;啟用此模式和嚴格模式,除以零會產(chǎn)生錯誤雄驹, 除非IGNORE 也給出蛔钙。對于INSERT IGNORE 和 UPDATE IGNORE,除以零插入NULL并產(chǎn)生警告
NO_ZERO_IN_DATE 如果啟用此模式荠医,則零部分的日期將被插入‘0000-00-00’并產(chǎn)生警告: 如果啟用此模式和嚴格模式,則不允許包含0的日期插入桑涎,會直接報錯
REAL_AS_FLCAT 把REAL類型(存儲大小4個字節(jié)彬向,可精確到小數(shù)點后第7位)看成FLOAT類型(存儲大小為8字節(jié),可精確到小數(shù)點后第15位)
ANSI_QUOTES 雙引號將被視為標識符的引號攻冷,而不是字符串的引號
IGNORE_SPACE 函數(shù)名稱和(之間允許有空格娃胆,會導致內(nèi)置的函數(shù)變成保留字
更多SQL MODE https://dev.mysql.com/doc/refman/8.0/en/sgl-mode.html

特定場景下使用MySQL數(shù)據(jù)庫對象

視圖創(chuàng)建與應用

  • 作用

簡化查詢
保護數(shù)據(jù)
重用查詢

  • 創(chuàng)建視圖
# 舉例
# 經(jīng)常使用的SQL
select * from student_info where score >= 90;

# 創(chuàng)建視圖
create view view_test as select * from student_info where score >= 90;
# 查詢視圖,相當于執(zhí)行SQL
select * from view_test;

# 查看視圖結構
show create view view_test;
# 刪除視圖
drop view view_test;

存儲過程

存儲過程的使用方法

  • 創(chuàng)建存儲過程
# 設置SQL語句以 ;; 結束 
delimiter ;;
# database 創(chuàng)建存儲過程
create procedure user_count_proc(out s int)
begin
select count(*) into s from mysql.user;
end;;
# 改回 ; 結束
delimiter ;
  • 使用存儲過程
# 把存儲過程的結果賦予 變量s
call user_count_proc(@s);
# 查詢變量s
select @s;
  • 查詢存儲過程定義
show create procedure user_count_proc \G;
  • 刪除存儲過程
drop procedure user_count_proc;
  • 案例
# 創(chuàng)建測試數(shù)據(jù)
...
# 創(chuàng)建存儲過程
delimiter ;;
# database 創(chuàng)建存儲過程
create procedure insert_test()
begin
declare i int;
set i=1;
# 循環(huán)插入
while(i<=10000)do
insert into table()a,b) values('xxx',i);
set i = i+1;
end while;
end;;

delimiter ;

# 運行
call insert_test()
  • 存儲過程的缺點
  1. 不方便維護
  2. 存儲開銷大
  3. 可移植性差

觸發(fā)器的創(chuàng)建與使用

  • 創(chuàng)建觸發(fā)器
create trigger insert_class_info after insert on class_info_01 for each row insert into class_info_02(id,name) values (new.id,new.name);
# class_info_01 表有insert操作就會觸發(fā)往 class_info_02 表里面寫入 class_info_01 表里面新增的記錄

# 測試
  • 觸發(fā)器的應用場景
  1. 數(shù)據(jù)復制和同步
  2. 審計
  3. 數(shù)據(jù)備份

MySQL版本特性

  • MySQL5.5
  • 引入的新功能
  1. 半同步復制
  2. 實時線程
  3. Buffer Pool可拆分為多個Instances
  4. 元數(shù)據(jù)鎖
  5. 默認存儲引擎改成InnoDb
  6. 安全性改進
  • 缺點
  1. 不支持全文搜索
  2. 不支持并行復制
  3. 并發(fā)能力差
  • MySQL5.6
  • 引入的新功能
  1. 支持GTID復制
  2. 密碼策略調整
  3. 元數(shù)據(jù)鎖的優(yōu)化
  4. 引入了基于庫的并行復制
  5. 引入了ICP,MRR等特性
  6. Undo Log可保存在獨立表空間中
  • 缺點
  1. 基于庫的并行復制在大多數(shù)場景都不適用
  2. 很多全局參數(shù)不能動態(tài)修改
  3. 不支持JSON數(shù)據(jù)類型
  • MySQL5.7
  • 引入的新功能
  1. 組復制
  2. 基于WRITESET的并行復制
  3. 虛擬列
  4. 原生支持JSON類型
  5. 支持動態(tài)調整很多全局參數(shù)
  6. 支持臨時表設置為InnoDB存儲引擎
  • 缺點
  1. 社區(qū)版無額外端口
  2. 大表增加字段開銷大
  3. 所有線程優(yōu)先級都一樣,并且都是共享的
  • MySQL8.0
  • 引入的新功能
  1. 事務性數(shù)據(jù)字典
  2. 快速加列
  3. 原子DDL
  4. 不可見索引
  5. 降序索引
  6. 角色管理
  7. 資源組
  8. 持久化全局變量
  9. Hash Join
  10. 額外端口
  11. 自增主鍵的持久化
  • 數(shù)據(jù)字典的好處等曼?
  1. 保證數(shù)據(jù)的完整性和一致性
  2. 支持事務的回滾和恢復
  3. 提高系統(tǒng)的性能和擴展性

DBA必備選擇存儲引擎的技能

  • 存儲引擎常見操作

查看MySQL支持哪些存儲引擎

show engines\G;

設置存儲引擎

use database;
# 創(chuàng)建時
create table user(id int) engine=InnoDB;
# 修改當前會話的默認存儲引擎
set default_storage_engine=Memory;

修改存儲引擎

alter table user engine=InnoDB;
  • 常用的存儲引擎
  1. InnoDB
  2. MyISAM
  3. TokuDB
  4. Columnstore
  5. MEMORY
  6. CSV
  • InnoDB的優(yōu)點
  1. 支持事務
  2. 行級鎖
  3. 并發(fā)控制
  4. 高新能
  5. 支持熱備份
  • InnoDB的適用場景
  1. 高可靠性應用程序
  2. 對并發(fā)要求高的場景
  3. 數(shù)據(jù)一致性要求高的場景
  • MyISAM的缺點
  1. 并發(fā)能力差
  2. 不支持事務
  3. 備份困難
  4. 緩存池只緩存索引里烦,不緩存數(shù)據(jù)
  5. 不支持外鍵約束
  • TokuDB的特點
  1. 高壓縮比
  2. 快速寫入和刪除
  3. 在線索引創(chuàng)建,字段增加刪除和重名名
  4. 在線備份
  5. 快速恢復
  • TokuDB適用場景
  1. 高并發(fā)寫入的場景
  2. 數(shù)據(jù)量大的場景
  3. 要求高可靠性的場景
  • Columnstore的特點
  1. 列式存儲
  2. 壓縮
  3. 分布式架構
  4. 高性能查詢
  5. 實時數(shù)據(jù)加載
  • Columnstore的適用場景
  1. 特別適用大數(shù)據(jù)的場景
  2. 高并發(fā)OLTP的應用場景
  3. 實時分析場景
  • MEMORY的特點
  1. 讀寫快
  2. 表鎖
  3. 不支持事務
  4. 容易丟失數(shù)據(jù)
  5. 主從架構中的問題
  • MEMORY存儲引擎的應用場景
  1. 臨時表
  2. 緩存表
  3. 計數(shù)器和排行榜
  • CSV的特點
  1. 數(shù)據(jù)文件CSV格式禁谦,可直接查看數(shù)據(jù)
  2. CSV存儲引擎不支持索引
  3. CSV存儲引擎不支持分區(qū)
  • CSV存儲引擎的適用場景
  1. 臨時性數(shù)據(jù)存儲
  2. 數(shù)據(jù)導出
  3. 備份和恢復

MySQL必背知識點

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
禁止轉載胁黑,如需轉載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末州泊,一起剝皮案震驚了整個濱河市丧蘸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遥皂,老刑警劉巖力喷,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刽漂,死亡現(xiàn)場離奇詭異,居然都是意外死亡弟孟,警方通過查閱死者的電腦和手機贝咙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拂募,“玉大人庭猩,你說我怎么就攤上這事∶唤玻” “怎么了眯娱?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長爬凑。 經(jīng)常有香客問我徙缴,道長,這世上最難降的妖魔是什么嘁信? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任于样,我火速辦了婚禮,結果婚禮上潘靖,老公的妹妹穿的比我還像新娘穿剖。我一直安慰自己,他們只是感情好卦溢,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布糊余。 她就那樣靜靜地躺著,像睡著了一般单寂。 火紅的嫁衣襯著肌膚如雪贬芥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天宣决,我揣著相機與錄音蘸劈,去河邊找鬼。 笑死尊沸,一個胖子當著我的面吹牛威沫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洼专,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼棒掠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屁商?” 一聲冷哼從身側響起句柠,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后溯职,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體精盅,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年谜酒,在試婚紗的時候發(fā)現(xiàn)自己被綠了叹俏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡僻族,死狀恐怖粘驰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情述么,我是刑警寧澤蝌数,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站度秘,受9級特大地震影響顶伞,放射性物質發(fā)生泄漏。R本人自食惡果不足惜剑梳,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一唆貌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垢乙,春花似錦锨咙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钮孵,卻和暖如春骂倘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背油猫。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留柠偶,地道東北人情妖。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像诱担,于是被迫代替她去往敵國和親毡证。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

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