關於MySQL的學習,《MySQL必知必會》這本書呢,看完已經兩個月了,一直被工作以及生活的一些瑣事拖着,趁着今晚有空閑,就整理完了最后的幾章學習筆記,接下來的學習計划呢,
應該是python-web開發以及工作上的關於微服務架構的一些知識點;學習是一種狀態,更是一種習慣,只有很努力,才能看起來毫不費力!
一、安全管理
1、訪問控制
MySQL服務器的安全基礎是:用戶對他們需要的數據有適當的訪問權,即需要給用戶所需的權限且僅提供所需的訪問權,這就是所謂的訪問控制它需要創建和管理用戶賬號。
注意事項:慎用root登陸的使用;僅在絕對需要時使用它,日常的MySQL操作中,應該使用我們創建的賬號來操作。
2、管理用戶
MySQL用戶賬號和信息存儲在名為mysql的MySQL數據庫中,一般不需要直接訪問,但有時需要直接訪問(比如需要獲得所有用戶賬號列表時),為此可以使用如下命令:
USE mysql;
select user from user;
mysql數據庫有一個名為user的表,它包含所有用戶賬號;user表有個名為user的列,它存儲用戶登錄名、
3、用戶賬號
①創建用戶賬號
create user ben IDENTIFIED BY 'p@$$wOrd';
create user創建一個新用戶賬號,其中IEDNTIFIED BY用來指定一個口令,它指定的口令為純文本,MySQL將在保存到user表之前對其進行加密;為了作為散列值指定
口令,使用IEDNTIFIED BY PASSWORD。
PS:grant和insert into的區別
grant也可以用來創建用戶賬號,但一般來說使用create user是最清楚和簡單的;此外也可以通過插入行到user表來增加用戶,但為了安全起見,不建議這么做。MySQL用來
存儲用戶賬號信息的表極為重要,因此相對於直接處理,使用標記和函數來處理這些表更好。
②重新命名用戶賬號
rename user ben to imyalost;
③刪除用戶賬號
刪除用戶賬號(以及相關的權限),使用drop user語句,如下:
drop user imyalost;
4、設置訪問權限
創建用戶賬號后,必須分配訪問權限(新建的用戶賬號沒有任何訪問權限,可以登錄但是無法讀寫);為了看到賦予賬號的權限,使用如下語句:
show grants for imyalost;
用戶定義:MySQL的權限用戶名和主機名結合定義,如果不指定主機名,則使用默認主機名%(授予用戶訪問權限而不管主機名)。
設置權限使用grants語句,要求如下:
①要授予的權限
②被授予訪問權限的數據庫或表
③用戶名
grant select on crashcourse.* to imyalost;
此grant允許用戶在crashcourse.*(crashcourse數據庫的所有表)上使用select,用戶imyalost對crashcourse數據庫中所有數據擁有只讀權限。
每個grant添加(更新)用戶的一個權限,MySQL讀取所有授權,並根據它們確定權限。
grant的反操作為revoke,用它撤銷特定的權限,例如:
revoke select on crashcourse.* from imyalost;
解析:這條revoke語句取消上面的賦予用戶imyalost的select權限;被撤銷的權限必須存在,否則會出錯。
PS:grant和revoke可在幾個層次上控制訪問權限:
①整個服務器,使用grant all和revoke all;
②整個數據庫,使用on database.*;
③特定的表,使用on database.table;
④特定的列;
⑤特定的存儲過程;
PS:具體的可授予或撤銷的MySQL權限,請自行搜索;
在使用grant和revoke時,用戶賬號必須存在,但對所涉及的對象沒有這個要求,這樣的好處是:允許管理員數據庫和表之前設計和實現安全措施;缺點在於,
當某個數據庫或表被刪除時,相關訪問權限仍然存在,而且如果將來重新創建數據庫或表時,這些權限仍然起作用。
簡化多次授權:可以通過列出各權限並用逗號分隔,將多余的grant語句串聯,如下所示:
grant select,insert on crashcourse.* to imyalost;
5、更改口令
更改用戶口令,可使用set password語句,新口令必須如下加密:
set password for imyalost = password('n3w p@$$w0rd');
解析:set password更新用戶口令,新口令必須傳到password()函數進行加密。
此外,set password還可以設置自己的口令,比如:
set password = password('n3w p@$$w0rd');
PS:不指定用戶名時,set password更新當前登錄用戶的口令。
二、數據庫維護
1、備份數據
MySQL數據也需要經常備份,由於MySQL數據庫基於磁盤文件,普通的備份系統就能備份MySQL數據,但由於這些文件總是處於打開和使用狀態,普通的文件副本備份不一定有效。
下面列出一些可行的解決方案:
①使用命令行實用程序mysqldump轉儲所有數據庫內容到某個外部文件;在進行常規備份前該程序應該正常運行,以便能正確備份轉儲文件;
②使用命令行實用程序mysqlhotcopy從一個數據庫復制所有數據(並非所有數據庫引擎都支持該程序);
③使用MySQL的backup table或select into outfile轉儲所有數據到某個外部文件;這兩條語句都接受將要創建的系統文件名,此系統文件必須不存在,否則會報錯。
數據可用restoretable來復原。
PS:為保證所有數據被寫入磁盤(包括索引數據),需要在備份前使用flush tables語句,刷新數據。
2、進行數據庫維護
MySQL提供了一系列的語句,可用來保證數據庫正確和正常運行,如下:
①analyze table orders;
此語句用來檢查表鍵是否正確。
②check table orders,orderitems;
check table用來針對許多問題進行檢查,在MyISAM表上還對索引進行檢查。check table支持一系列的用語MyISAM表的方式,如下:
changed檢查自最后一次檢查以來改動過的表;
extended執行最徹底的檢查;fast只檢查未正常關閉的表;
medium檢查所有被刪除的鏈接並進行鍵檢驗;
quick只進行快速掃描。
③optimize table orders;
當從一個表刪除大量數據,使用此語句來收回所用的空間,從而優化表的性能。
3、診斷啟動問題
服務器啟動問題通常在對MySQL配置或服務器本身進行更改時出現,一般在排除系統啟動問題時,首先應盡量手動啟動服務器;MySQL常用的mysqlid命令行如下:
①- -help顯示幫助——————一個選項列表;
②- -safe-mode裝載減去某些最佳配置的服務器;
③- -verbose顯示全文本消息(為獲得更詳細的幫助消息與- -help聯合使用);
④- -version顯示版本信息然后退出。
4、查看日志文件
MySQL管理員依賴的一系列日志文件,主要的日志文件如下:
①錯誤日志:包含啟動和關閉問題以及任意關鍵錯誤的細節。此日志通常名為hostname.err,位於data目錄中;此日志名可用- -log-error命令行選項更改;
②查詢日志:記錄所有的mysql活動,診斷問題時非常有用;由於其可能很快地變得非常大,因此不應長時間使用它;日志名通常為hostname.log,位於data目錄中,
此名字可用- -log命令行選項更改;
③二進制日志:記錄更新過數據的所有語句。通常名為hostname-bin,位於data目錄內,此名字可用- -log-bin命令行選項修改;
④緩慢查詢日志:記錄執行緩慢的任何查詢。在確定數據庫何處需要優化很有用,通常名為hostname-slow.log,位於data目錄中,可使用- -log-slow-querier命令行更改。
PS:使用日志時,可使用flush logs語句來刷新和重新開始所有日志文件。
三、性能優化
改善數據庫性能需要知道的一些關鍵點:
1、關鍵的生產DBMS應該運行在自己專用的服務器上;
2、MySQL使用一系列默認的設置預先配置的,但后期很可能需要調整內存分配、緩沖區大小等;
3、MySQL是一個多用戶多線程的DBMS,它經常執行多個任務。如果這些任務中某個執行緩慢,則所有的請求都會執行緩慢,如果遇到顯著的性能不良,可使用show processlist
顯示所有活動進程(以及它們的線程ID和執行時間,還可以用kill命令終結某個特定進程);
4、編寫select語句的方法很多,應多嘗試聯結、並、子查詢等,找出最佳方法;
5、使用explain語句讓MySQL解釋它將如何執行一條select語句;
6、一般情況下,存儲過程執行的比一條一條的執行其中的各條MySQL語句要快;
7、總是使用正確的數據類型;
8、絕不要檢索比需要的還多的數據,即:不要使用select *(除非真正需要);
9、有的操作(包括insert)支持一個可選的delayed關鍵字,如果使用它,將把控制立即返回給調用程序,並且一旦有可能就實際執行該操作;
10、導入數據時,應關閉自動提交;
11、必須索引數據庫表以改善數據庫性能,應該分析使用select語句以找出重復的where和order by字句(如果一個簡單的where子句返回結果花費時間過長,則可以斷定其中
使用的列就是需要索引的對象);
12、使用多條select語句和連接它們的union語句,可以極大的改善性能;
13、索引改善數據檢索的性能,但損害數據插入、刪除和更新的性能。如果有些表收集數據但不經常被搜索,則在有必要之前不要索引它們(索引可根據需要添加和刪除);
14、like很慢,一般建議使用fulltext;
15、數據庫是不斷變化的實體;
16、最重要的規則:每條規則在某些條件下都會被打破。