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用戶權限
- 權限分類
- 全局權限
- 數(shù)據(jù)庫權限
- 表和列權限
- 常用權限
權限 | 解釋 |
---|---|
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密碼怎么辦蟹演?
- 配置文件增加跳過權限驗證的配置
vim /data/mysql/conf/my.cnf
# 在[mysqld]下增加
skip-grant-tables
- 重啟mysql
- 免密方式登錄mysql
mysql -uroot -p
- 修改root密碼
update mysql.user set authentication_string='' where user = 'root' and host = 'localhost';
# 再去掉免密參數(shù)
vim /data/mysql/conf/my.cnf
# 刪除 skip-grant-tables
- 重啟MySQL
- 修改密碼并重新登錄
# 空密碼登錄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()
- 存儲過程的缺點
- 不方便維護
- 存儲開銷大
- 可移植性差
觸發(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ā)器的應用場景
- 數(shù)據(jù)復制和同步
- 審計
- 數(shù)據(jù)備份
MySQL版本特性
- MySQL5.5
- 引入的新功能
- 半同步復制
- 實時線程
- Buffer Pool可拆分為多個Instances
- 元數(shù)據(jù)鎖
- 默認存儲引擎改成InnoDb
- 安全性改進
- 缺點
- 不支持全文搜索
- 不支持并行復制
- 并發(fā)能力差
- MySQL5.6
- 引入的新功能
- 支持GTID復制
- 密碼策略調整
- 元數(shù)據(jù)鎖的優(yōu)化
- 引入了基于庫的并行復制
- 引入了ICP,MRR等特性
- Undo Log可保存在獨立表空間中
- 缺點
- 基于庫的并行復制在大多數(shù)場景都不適用
- 很多全局參數(shù)不能動態(tài)修改
- 不支持JSON數(shù)據(jù)類型
- MySQL5.7
- 引入的新功能
- 組復制
- 基于WRITESET的并行復制
- 虛擬列
- 原生支持JSON類型
- 支持動態(tài)調整很多全局參數(shù)
- 支持臨時表設置為InnoDB存儲引擎
- 缺點
- 社區(qū)版無額外端口
- 大表增加字段開銷大
- 所有線程優(yōu)先級都一樣,并且都是共享的
- MySQL8.0
- 引入的新功能
- 事務性數(shù)據(jù)字典
- 快速加列
- 原子DDL
- 不可見索引
- 降序索引
- 角色管理
- 資源組
- 持久化全局變量
- Hash Join
- 額外端口
- 自增主鍵的持久化
- 數(shù)據(jù)字典的好處等曼?
- 保證數(shù)據(jù)的完整性和一致性
- 支持事務的回滾和恢復
- 提高系統(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;
- 常用的存儲引擎
- InnoDB
- MyISAM
- TokuDB
- Columnstore
- MEMORY
- CSV
- InnoDB的優(yōu)點
- 支持事務
- 行級鎖
- 并發(fā)控制
- 高新能
- 支持熱備份
- InnoDB的適用場景
- 高可靠性應用程序
- 對并發(fā)要求高的場景
- 數(shù)據(jù)一致性要求高的場景
- MyISAM的缺點
- 并發(fā)能力差
- 不支持事務
- 備份困難
- 緩存池只緩存索引里烦,不緩存數(shù)據(jù)
- 不支持外鍵約束
- TokuDB的特點
- 高壓縮比
- 快速寫入和刪除
- 在線索引創(chuàng)建,字段增加刪除和重名名
- 在線備份
- 快速恢復
- TokuDB適用場景
- 高并發(fā)寫入的場景
- 數(shù)據(jù)量大的場景
- 要求高可靠性的場景
- Columnstore的特點
- 列式存儲
- 壓縮
- 分布式架構
- 高性能查詢
- 實時數(shù)據(jù)加載
- Columnstore的適用場景
- 特別適用大數(shù)據(jù)的場景
- 高并發(fā)OLTP的應用場景
- 實時分析場景
- MEMORY的特點
- 讀寫快
- 表鎖
- 不支持事務
- 容易丟失數(shù)據(jù)
- 主從架構中的問題
- MEMORY存儲引擎的應用場景
- 臨時表
- 緩存表
- 計數(shù)器和排行榜
- CSV的特點
- 數(shù)據(jù)文件CSV格式禁谦,可直接查看數(shù)據(jù)
- CSV存儲引擎不支持索引
- CSV存儲引擎不支持分區(qū)
- CSV存儲引擎的適用場景
- 臨時性數(shù)據(jù)存儲
- 數(shù)據(jù)導出
- 備份和恢復