一、安全管理
1坦胶、訪問控制
MySQL服務器的安全基礎:用戶對他們需要的數(shù)據(jù)有適當?shù)脑L問權透典。
訪問控制:給用戶所需的權限且僅提供所需的訪問權。它需要創(chuàng)建和管理用戶賬號顿苇。
PS:嚴肅對待root登陸的使用峭咒,僅在絕對需要時使用它。日常的MySQL操作中纪岁,不應該使用root凑队。
2、管理用戶(下面3點)
MySQL用戶賬號和信息存儲在名為mysql的MySQL數(shù)據(jù)庫中幔翰。
一般不需要直接訪問漩氨,但有時需要直接訪問(如需要獲得所有用戶賬號列表),代碼如下:
USE mysql;
select user from user;
PS:mysql數(shù)據(jù)庫中有個user表导匣,它包含所有用戶賬號才菠;user表有個名為user的列,它存儲用戶登錄名贡定。
3赋访、用戶賬號
A、創(chuàng)建用戶賬號:
create user ben identified by 'p@$$wOrd';
create user創(chuàng)建一個新用戶賬號缓待。identified by用來指定口令蚓耽,它指定的口令為純文本,MySQL將在保存到user表之前對其進行加密旋炒;為了作為散列值指定口令步悠。
PS:創(chuàng)建用戶賬號時不一定需要口令。
grant和insert into的區(qū)別:
grant也可以用來創(chuàng)建用戶賬號瘫镇,但一般來說使用create user是最清楚和簡單的鼎兽;
也可通過插入行到user表來增加用戶,但為安全起見铣除,不建議這么做谚咬。MySQL用來存儲用戶賬號信息的表極為重要,因此相對于直接處理尚粘,使用標記和函數(shù)來處理這些表更好择卦。
B、重新命名用戶賬號:
rename user ben to bforta;
C、刪除用戶賬號:
刪除用戶賬號(以及相關的權限)秉继,使用drop user語句祈噪,如下:
drop user bforta;
4、設置訪問權限
創(chuàng)建用戶賬號后尚辑,必須分配訪問權限辑鲤。新建的用戶賬號沒有任何訪問權限,可以登錄但無法讀寫腌巾;
1遂填、查看某賬號權限:show grants for bforta@%;
結(jié)果為:grant usage on crashcourse.* to bforta; 權限USAGE ON .表示在任意數(shù)據(jù)庫和任意表上對任何東西沒有權限铲觉。
MySQL的權限用:用戶名和主機名結(jié)合定義user@host澈蝙,如果不指定主機名,則使用默認主機名%(授予用戶訪問權限而不管主機名)撵幽。
2灯荧、設置權限使用grants時,要求至少給出以下信息:1要授予的權限盐杂;2被授予訪問權限的數(shù)據(jù)庫或表逗载;3用戶名。
grant select on crashcourse.* to bforta;
此grant允許用戶在crashcourse.*(crashcourse數(shù)據(jù)庫的所有表)上使用select链烈,用戶bforta對crashcourse數(shù)據(jù)庫中所有數(shù)據(jù)擁有只讀權限厉斟。
每個grant添加(更新)用戶的一個權限,MySQL讀取所有授權强衡,并根據(jù)它們確定權限擦秽。
3、grant的反操作為revoke漩勤,用它撤銷特定的權限感挥,例如:
revoke select on crashcourse.* from bforta;
這條revoke語句取消上面的賦予用戶的select權限;被撤銷的權限必須存在越败,否則會出錯触幼。
PS:grant和revoke可在以下幾個層次上控制訪問權限:
·整個服務器,使用grant all和revoke all;
·整個數(shù)據(jù)庫究飞,使用on database.*;
·特定的表置谦,使用on database.table;
·特定的列;
·特定的存儲過程;
可授予或撤銷的MySQL權限,請自行查看文檔亿傅;
4媒峡、使用grant和revoke時,用戶賬號必須存在袱蜡,但對所涉及的對象沒有這個要求丝蹭。
好處:允許管理員在創(chuàng)建數(shù)據(jù)庫和表之前設計和實現(xiàn)安全措施;
缺點:當某個數(shù)據(jù)庫或表被刪除時,相關訪問權限仍然存在奔穿,且如果將來重新創(chuàng)建數(shù)據(jù)庫或表時镜沽,這些權限仍然起作用。
簡化多次授權:通過列出各權限并用逗號分隔贱田,將多余的grant語句串聯(lián)缅茉,如下所示:
grant select,insert on crashcourse.* to bforta;
5、更改口令
1男摧、更改用戶口令蔬墩,可使用set password語句,新口令必須如下加密:
set password for bforta = password('n3w p@$$w0rd');
set password更新用戶口令耗拓,新口令必須傳到password()函數(shù)進行加密拇颅。
2、set password還可以設置自己的口令乔询,比如:
set password = password('n3w p@$$w0rd');
PS:不指定用戶名時樟插,set password更新當前登錄用戶的口令。
二竿刁、數(shù)據(jù)庫維護
1黄锤、備份數(shù)據(jù)
由于MySQL數(shù)據(jù)庫基于磁盤文件,普通的備份系統(tǒng)和例程就能備份MySQL數(shù)據(jù)食拜,但由于這些文件總是處于打開和使用狀態(tài)鸵熟,普通的文件副本備份不一定有效。
可行的解決方案:
A负甸、使用命令行實用程序mysqldump轉(zhuǎn)儲所有數(shù)據(jù)庫內(nèi)容到某個外部文件流强;在進行常規(guī)備份前該程序應該正常運行,以便能正確備份轉(zhuǎn)儲文件惑惶;
B煮盼、使用命令行實用程序mysqlhotcopy從一個數(shù)據(jù)庫復制所有數(shù)據(jù)(并非所有數(shù)據(jù)庫引擎都支持該程序);
C带污、使用MySQL的backup table或select into outfile轉(zhuǎn)儲所有數(shù)據(jù)到某個外部文件僵控;這兩條語句都接受將要創(chuàng)建的系統(tǒng)文件名,此系統(tǒng)文件必須不存在鱼冀,否則會報錯报破。數(shù)據(jù)可用restoretable來復原。
PS:為保證所有數(shù)據(jù)被寫入磁盤(包括索引數(shù)據(jù))千绪,需要在備份前使用flush tables語句充易,刷新未寫數(shù)據(jù)。
2荸型、進行數(shù)據(jù)庫維護
MySQL提供了一系列的語句盹靴,可用來保證數(shù)據(jù)庫正確和正常運行,如下:
1、analyze table orders;
此語句用來檢查表鍵是否正確稿静。
2梭冠、check table orders,orderitems;
check table用來針對許多問題進行檢查,在MyISAM表上還對索引進行檢查改备。check table支持一系列的用語MyISAM表的方式控漠,如下:
changed檢查自最后一次檢查以來改動過的表;
extended執(zhí)行最徹底的檢查悬钳;fast只檢查未正常關閉的表盐捷;
medium檢查所有被刪除的鏈接并進行鍵檢驗;
quick只進行快速掃描默勾。
3碉渡、optimize table orders;
當從一個表刪除大量數(shù)據(jù),使用此語句來收回所用的空間灾测,從而優(yōu)化表的性能爆价。
3、診斷啟動問題
在排除系統(tǒng)啟動問題時,首先應盡量手動啟動服務器憔披;MySQL服務器自身通過在命令行上執(zhí)行mysqld啟動等限。下面是幾個重要的mysqld 命令行選項:
-help顯示幫助(一個選項列表);
-safe-mode裝載減去某些最佳配置的服務器芬膝;
-verbose顯示全文本消息(為獲得更詳細的幫助消息與- -help聯(lián)合使用)望门;
-version顯示版本信息然后退出。
4锰霜、查看日志文件
MySQL管理員依賴的一系列日志文件筹误,主要的日志文件如下:
1、錯誤日志:包含啟動和關閉問題以及任意關鍵錯誤的細節(jié)癣缅。此日志通常名為hostname.err厨剪,位于data目錄中;此日志名可用- -log-error命令行選項更改友存;
2祷膳、查詢?nèi)罩荆河涗浰械膍ysql活動,診斷問題時非常有用屡立;可能會很快地變得非常大直晨,因此不應長時間使用它;日志名通常為hostname.log,位于data目錄中勇皇,此名字可用- -log命令行選項更改奕巍;
3、二進制日志:記錄更新過數(shù)據(jù)的所有語句儒士。通常名為hostname-bin的止,位于data目錄內(nèi),此名字可用- -log-bin命令行選項修改着撩;
4诅福、緩慢查詢?nèi)罩荆河涗泩?zhí)行緩慢的任何查詢。在確定數(shù)據(jù)庫何處需要優(yōu)化很有用拖叙,通常名為hostname-slow.log氓润,位于data目錄中,可使用- -log-slow-querier命令行更改薯鳍。
PS:使用日志時咖气,可使用flush logs語句來刷新和重新開始所有日志文件。
三挖滤、改善性能
改善數(shù)據(jù)庫性能需要知道的一些關鍵點:
1崩溪、關鍵的生產(chǎn)DBMS應該運行在自己專用的服務器上;
2斩松、MySQL是用一系列默認設置預先配置的伶唯,但后期可能需要調(diào)整內(nèi)存分配、緩沖區(qū)大小等惧盹;(為查看當前設置乳幸,可使用SHOW VARIABLES;和SHOW STATUS;)
3、MySQL是一個多用戶多線程的DBMS钧椰,經(jīng)常同時執(zhí)行多個任務粹断。如果這些任務中某個執(zhí)行緩慢,則所有請求都會執(zhí)行緩慢嫡霞,如果遇到顯著的性能不良瓶埋,可使用show processlist顯示所有活動進程(以及它們的線程ID和執(zhí)行時間,還可以用kill命令終結(jié)某個特定進程)秒际;
4悬赏、編寫同一條select語句的方法很多,應多嘗試聯(lián)結(jié)娄徊、并闽颇、子查詢等,找出最佳方法寄锐;
5兵多、使用explain語句讓MySQL解釋它將如何執(zhí)行一條select語句尖啡;
6、一般情況下剩膘,存儲過程執(zhí)行的比一條一條的執(zhí)行其中的各條MySQL語句要快衅斩;
7、總是使用正確的數(shù)據(jù)類型怠褐;
8畏梆、絕不要檢索比需要的還多的數(shù)據(jù),即:不要使用select *(除非真正需要)奈懒;
9奠涌、有的操作(包括insert)支持一個可選的delayed關鍵字,如果使用它磷杏,將把控制立即返回給調(diào)用程序溜畅,并且一旦有可能就實際執(zhí)行該操作;
10极祸、導入數(shù)據(jù)時慈格,應關閉自動提交;
11遥金、必須索引數(shù)據(jù)庫表以改善數(shù)據(jù)庫性能浴捆,分析使用select語句以找出重復的where和order by子句(如果一個簡單的where子句返回結(jié)果花費時間過長,則可以斷定其中使用的列就是需要索引的對象)
12汰规、SELECT語句中有一系列復雜的OR條件汤功,可使用多條select語句和連接它們的union語句,可以極大的改善性能溜哮;
13、索引改善數(shù)據(jù)檢索的性能色解,但損害數(shù)據(jù)插入茂嗓、刪除和更新的性能。如果有些表收集數(shù)據(jù)但不經(jīng)常被搜索科阎,則在有必要之前不要索引它們(索引可根據(jù)需要添加和刪除)述吸;
14、like很慢锣笨,一般建議使用fulltext蝌矛;
15、數(shù)據(jù)庫是不斷變化的實體错英;一組優(yōu)化良好的表一會兒后可能就面 目全非了
16入撒、最重要的規(guī)則:每條規(guī)則在某些條件下都會被打破。
最新2020整理收集的一些高頻面試題(都整理成文檔)椭岩,有很多干貨茅逮,包含mysql璃赡,netty,spring献雅,線程碉考,spring cloud、jvm挺身、源碼侯谁、算法等詳細講解,也有詳細的學習規(guī)劃圖章钾,面試題整理等墙贱,需要獲取這些內(nèi)容的朋友請加Q君樣:909038429
/./*歡迎加入java交流Q君樣:909038429一起吹水聊天