MySQL(十四)管理維護及性能優化


關於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、最重要的規則:每條規則在某些條件下都會被打破。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM