1、訪問控制mysql
MySQL服務器的安全基礎:用戶對他們須要的數據有適當的訪問權。sql
訪問控制:給用戶所需的權限且僅提供所需的訪問權。它須要建立和管理用戶帳號。數據庫
PS:嚴肅對待root登錄的使用,僅在絕對須要時使用它。平常的MySQL操做中,不該該使用root。安全
2、管理用戶(下面3點)服務器
MySQL用戶帳號和信息存儲在名爲mysql的MySQL數據庫中。多線程
通常不須要直接訪問,但有時須要直接訪問(如須要得到全部用戶帳號列表),代碼以下:ide
USE mysql;函數
select user from user;性能
PS:mysql數據庫中有個user表,它包含全部用戶帳號;user表有個名爲user的列,它存儲用戶登陸名。優化
3、用戶帳號
A、建立用戶帳號:
create user ben identified by 'p@$$wOrd';
create user建立一個新用戶帳號。identified by用來指定口令,它指定的口令爲純文本,MySQL將在保存到user表以前對其進行加密;爲了做爲散列值指定口令。
PS:建立用戶帳號時不必定須要口令。
grant和insert into的區別:
grant也能夠用來建立用戶帳號,但通常來講使用create user是最清楚和簡單的;
也可經過插入行到user表來增長用戶,但爲安全起見,不建議這麼作。MySQL用來存儲用戶帳號信息的表極爲重要,所以相對於直接處理,使用標記和函數來處理這些表更好。
B、從新命名用戶帳號:
rename user ben to bforta;
C、刪除用戶帳號:
刪除用戶帳號(以及相關的權限),使用drop user語句,以下:
drop user bforta;
4、設置訪問權限
建立用戶帳號後,必須分配訪問權限。新建的用戶帳號沒有任何訪問權限,能夠登陸但沒法讀寫;
一、查看某帳號權限:show grants for bforta@%;
結果爲:grant usage on crashcourse.* to bforta; 權限USAGE ON *.*表示在任意數據庫和任意表上對任何東西沒有權限。
MySQL的權限用:用戶名和主機名結合定義user@host,若是不指定主機名,則使用默認主機名%(授予用戶訪問權限而無論主機名)。
二、設置權限使用grants時,要求至少給出如下信息:1要授予的權限;2被授予訪問權限的數據庫或表;3用戶名。
grant select on crashcourse.* to bforta;
此grant容許用戶在crashcourse.*(crashcourse數據庫的全部表)上使用select,用戶bforta對crashcourse數據庫中全部數據擁有隻讀權限。
每一個grant添加(更新)用戶的一個權限,MySQL讀取全部受權,並根據它們肯定權限。
三、grant的反操做爲revoke,用它撤銷特定的權限,例如:
revoke select on crashcourse.* from bforta;
這條revoke語句取消上面的賦予用戶的select權限;被撤銷的權限必須存在,不然會出錯。
PS:grant和revoke可在如下幾個層次上控制訪問權限:
·整個服務器,使用grant all和revoke all;
·整個數據庫,使用on database.*;
·特定的表,使用on database.table;
·特定的列;
·特定的存儲過程;
可授予或撤銷的MySQL權限,請自行查看文檔;
四、使用grant和revoke時,用戶帳號必須存在,但對所涉及的對象沒有這個要求。
好處:容許管理員在建立數據庫和表以前設計和實現安全措施;
缺點:當某個數據庫或表被刪除時,相關訪問權限仍然存在,且若是未來從新建立數據庫或表時,這些權限仍然起做用。
簡化屢次受權:經過列出各權限並用逗號分隔,將多餘的grant語句串聯,以下所示:
grant select,insert on crashcourse.* to bforta;
5、更改口令
一、更改用戶口令,可以使用set password語句,新口令必須以下加密:
set password for bforta = password('n3w p@$$w0rd');
set password更新用戶口令,新口令必須傳到password()函數進行加密。
二、set password還能夠設置本身的口令,好比:
set password = password('n3w p@$$w0rd');
PS:不指定用戶名時,set password更新當前登陸用戶的口令。
1、備份數據
因爲MySQL數據庫基於磁盤文件,普通的備份系統和例程就能備份MySQL數據,但因爲這些文件老是處於打開和使用狀態,普通的文件副本備份不必定有效。
可行的解決方案:
A、使用命令行實用程序mysqldump轉儲全部數據庫內容到某個外部文件;在進行常規備份前該程序應該正常運行,以便能正確備份轉儲文件;
B、使用命令行實用程序mysqlhotcopy從一個數據庫複製全部數據(並不是全部數據庫引擎都支持該程序);
C、使用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在這個問題發生時報告錯誤,但因爲多數MySQL服務器是做 爲系統進程或服務自動啓動的,這些消息可能看不到。
在排除系統啓動問題時,首先應儘可能手動啓動服務器;MySQL服務器自身經過在命令行上執行mysqld啓動。下面是幾個重要的mysqld 命令行選項:
- -help顯示幫助(一個選項列表);
- -safe-mode裝載減去某些最佳配置的服務器;
- -verbose顯示全文本消息(爲得到更詳細的幫助消息與- -help聯合使用);
- -version顯示版本信息而後退出。
4、查看日誌文件
MySQL管理員依賴的一系列日誌文件,主要的日誌文件以下:
1、錯誤日誌:包含啓動和關閉問題以及任意關鍵錯誤的細節。此日誌一般名爲hostname.err,位於data目錄中;此日誌名可用- -log-error命令行選項更改;
2、查詢日誌:記錄全部的mysql活動,診斷問題時很是有用;可能會很快地變得很是大,所以不該長時間使用它;日誌名一般爲hostname.log,位於data目錄中,此名字可用- -log命令行選項更改;
3、二進制日誌:記錄更新過數據的全部語句。一般名爲hostname-bin,位於data目錄內,此名字可用- -log-bin命令行選項修改;
4、緩慢查詢日誌:記錄執行緩慢的任何查詢。在肯定數據庫何處須要優化頗有用,一般名爲hostname-slow.log,位於data目錄中,可以使用- -log-slow-querier命令行更改。
PS:使用日誌時,可以使用flush logs語句來刷新和從新開始全部日誌文件。
改善數據庫性能須要知道的一些關鍵點:
一、關鍵的生產DBMS應該運行在本身專用的服務器上;
二、MySQL是用一系列默認設置預先配置的,但後期可能須要調整內存分配、緩衝區大小等;(爲查看當前設置,可以使用SHOW VARIABLES;和SHOW STATUS;)
三、MySQL是一個多用戶多線程的DBMS,常常同時執行多個任務。若是這些任務中某個執行緩慢,則全部請求都會執行緩慢,若是遇到顯著的性能不良,可以使用show processlist顯示全部活動進程(以及它們的線程ID和執行時間,還能夠用kill命令終結某個特定進程);
四、編寫同一條select語句的方法不少,應多嘗試聯結、並、子查詢等,找出最佳方法;
五、使用explain語句讓MySQL解釋它將如何執行一條select語句;
六、通常狀況下,存儲過程執行的比一條一條的執行其中的各條MySQL語句要快;
七、老是使用正確的數據類型;
八、毫不要檢索比須要的還多的數據,即:不要使用select *(除非真正須要);
九、有的操做(包括insert)支持一個可選的delayed關鍵字,若是使用它,將把控制當即返回給調用程序,而且一旦有可能就實際執行該操做;
十、導入數據時,應關閉自動提交;
十一、必須索引數據庫表以改善數據庫性能,分析使用select語句以找出重複的where和order by子句(若是一個簡單的where子句返回結果花費時間過長,則能夠判定其中使用的列就是須要索引的對象)
十二、SELECT語句中有一系列複雜的OR條件,可以使用多條select語句和鏈接它們的union語句,能夠極大的改善性能;
1三、索引改善數據檢索的性能,但損害數據插入、刪除和更新的性能。若是有些表收集數據但不常常被搜索,則在有必要以前不要索引它們(索引可根據須要添加和刪除);
1四、like很慢,通常建議使用fulltext;
1五、數據庫是不斷變化的實體;一組優化良好的表一下子後可能就面 目全非了
1六、最重要的規則:每條規則在某些條件下都會被打破。