1. 程式人生 > >MySQL——簡單的安全管理、資料庫維護、效能優化

MySQL——簡單的安全管理、資料庫維護、效能優化

訪問控制

MySQL伺服器的安全基礎是:使用者應該對他們需要的資料具有適當的訪問許可權,既不能多也不能少,即使用者不能對過多的資料具有過多的訪問許可權。

1、對於非現實的資料庫實驗時可以使用root使用者進行登入,但是在現實世界的日常工作中,決不能使用root(必須嚴肅對待root登入的使用,僅在絕對需要使用時才能使用它,如不能登入其他管理賬號時使用root),應該建立一系列的賬戶,對這些賬號分配不同的許可權(有的用於管理、有的功使用者使用、有的功開發人員使用等),限制它們的使用。

2、訪問控制的目的不僅僅是防止使用者的惡意企圖,更常見的是防止無意識錯誤的結果。

管理使用者

MySQL使用者賬號和資訊儲存在名為mysql的MySQL資料庫中,一般不需要直接訪問mysql資料庫和表,但有時需要直接訪問,需要直接訪問它的時機之一時在需要獲得所有使用者賬號列表時,用法:

USE mysql;
SELECT user FROM user;

//user表是mysql資料庫中特有的,它包含所有使用者賬號,user表中有一個user列,user列儲存使用者的登入名。

執行結果: 

 注意:試驗對使用者賬號和許可權進行更改的最好辦法是開啟多個數據庫客戶機(如mysql命令列實用程式的多個副本),一個座位管理登入,其他作為被測試的使用者登入。

建立使用者賬號

建立一個使用者賬號使用CREATE USER語句,語法:

CREATE USER 使用者名稱 IDENTIFIED BY 密碼;

IDENTIFIED BY用於指定雜湊口令,即指定的口令為純文字,MySQL將在儲存到user表之前對其進行加密。

重新命名使用者賬號

重新命名使用者賬號使用RENAME USER語句,語法:

RENAME USER 舊的使用者賬號 TO 新的使用者賬號;

刪除使用者賬號

刪除使用者賬號(包含相關的許可權)使用DROP USER 語句,語法:

DROP USER 使用者賬號;

設定訪問許可權

GRANT(進行授權)和REVOKE(撤銷授權)可以在 整個伺服器、整個資料庫、特定的表、特定的列、特定的儲存過程這幾個層次上控制訪問許可權。

1、檢視使用者賬號的許可權使用SHOW GRANTS FOR語句,語法:

SHOW GRANTS FOR 使用者賬號;

注意:MySQL的許可權用  使用者名稱和主機名結合定義(如

[email protected],Hern代表使用者名稱),如果不指定主機名則使用預設的主機名%(授予使用者訪問許可權而不管主機名)。

2、為了設定許可權,使用GRANT語句,GRANT語句使用的規則:要授予的許可權、被授予訪問許可權的資料庫或表、使用者名稱。

語法:

GRANT 要授予的許可權 ON 被授予許可權的資料庫或表 TO 使用者名稱;

//可以通過列出各項許可權並用逗號( , )分隔一次性賦予多項許可權(簡化多次授權)

GRNAT 要授予的許可權1,要授予的許可權2,要授予的許可權3…… ON 被授予許可權的資料庫或表 TO 使用者名稱;

例如:

GRANT SELECT,DROP,DELETE,INSERT,UPDATE ON test.* TO Hern;

//代表使用者Hern對test資料庫中的所有資料具有隻讀訪問許可權

//Hern    代表使用者賬號

//test.*  代表test資料庫的所有表

//SELECT  代表只授予SELECT訪問許可權

 撤銷特定的許可權

撤銷特定的許可權使用REVOKE語句,需要撤銷的許可權必須存在,否則會報錯。語法:

REVOKE 需要撤銷的許可權 ON 被撤銷許可權的資料庫或表 TO 使用者名稱;

//可以通過列出各項許可權並用逗號( , )分隔一次性撤銷多項許可權(簡化多次撤銷)

REVOKE 需要撤銷的許可權1,需要撤銷的許可權2,需要撤銷的許可權3…… ON 被撤銷許可權的資料庫或表 TO 使用者名稱;

 GRANT和REVOKE 的常見許可權:

  • All/All Privileges許可權代表全域性或者全資料庫物件級別的所有許可權
  • Alter許可權代表允許修改表結構的許可權,但必須要求有create和insert權 限配合。如果是rename表名,則要求有alter和drop原表,create和 insert新表的許可權
  • Alter routine許可權代表允許修改或者刪除儲存過程、函式的許可權
  • Create許可權代表允許建立新的資料庫和表的許可權
  • Createroutine許可權代表允許建立儲存過程、函式的許可權
  • Createtablespace許可權代表允許建立、修改、刪除表空間和日誌組的權 限
  • Create temporary tables許可權代表允許建立臨時表的許可權
  • Createuser許可權代表允許建立、修改、刪除、重新命名user的許可權
  • Createview許可權代表允許建立檢視的許可權Delete許可權代表允許刪除行資料的許可權
  •  Drop許可權代表允許刪除資料庫、表、檢視的許可權,包括truncatetable命令
  • Event許可權代表允許查詢,建立,修改,刪除MySQL事件
  • Execute許可權代表允許執行儲存過程和函式的許可權
  • File許可權代表允許在MySQL可以訪問的目錄進行讀寫磁碟檔案操作,可使用 的命令包括load data infile,select ... into outfile,load file()函式
  •  Grant option許可權代表是否允許此使用者授權或者收回給其他使用者你給予的權 限
  • Index許可權代表是否允許建立和刪除索引
  • Insert許可權代表是否允許在表裡插入資料,同時在執行analyze table,optimize table,repair table語句的時候也需要insert許可權
  • Lock許可權代表允許對擁有select許可權的表進行鎖定,以防止其他連結對此表 的讀或寫
  • Process許可權代表允許檢視MySQL中的程序資訊,比如執行showprocesslist,
  • Reference許可權是在5.7.6版本之後引入,代表是否允許建立外來鍵
  • Reload許可權代表允許執行flush命令,指明重新載入許可權表到系統記憶體中, refresh命令代表關閉和重新開啟日誌檔案並重新整理所有的表
  • Replication client許可權代表允許執行show master status,show slave status,show binary logs命令
  • Replication slave許可權代表允許slave主機通過此使用者連線master以便建立主從 複製關係
  • Select許可權代表允許從表中檢視資料,某些不查詢表資料的select執行則不需 要此許可權,如Select 1+1,Select PI()+2;而且select許可權在執行update/delete 語句中含有where條件的情況下也是需要的
  • Showdatabases許可權代表通過執行showdatabases命令檢視所有的資料庫名
  • Show view許可權代表通過執行show create view命令檢視檢視建立的語句mysqladmin processlist, show engine等命令
  • Shutdown許可權代表允許關閉資料庫例項,執行語句包括mysqladmin shutdown
  • Super許可權代表允許執行一系列資料庫管理命令,包括kill強制關閉某個連線 命令,change master to建立複製關係命令,以及create/alter/drop server等命 令
  • Trigger許可權代表允許建立,刪除,執行,顯示觸發器的許可權
  • Update許可權代表允許修改表中的資料的許可權
  • Usage許可權是建立一個使用者之後的預設許可權,其本身代表連線登入許可權

系統許可權表

• 許可權儲存在mysql庫的user,db, tables_priv, columns_priv, and procs_priv這幾個系統表中,待MySQL例項啟動後就載入到記憶體中
• User表:存放使用者賬戶資訊以及全域性級別(所有資料庫)許可權,決定了 來自哪些主機的哪些使用者可以訪問資料庫例項,如果有全域性許可權則意味
著對所有資料庫都有此許可權
• Db表:存放資料庫級別的許可權,決定了來自哪些主機的哪些使用者可以訪 問此資料庫
• Tables_priv表:存放表級別的許可權,決定了來自哪些主機的哪些使用者可以 訪問資料庫的這個表
• Columns_priv表:存放列級別的許可權,決定了來自哪些主機的哪些使用者可 以訪問資料庫表的這個欄位
• Procs_priv表:存放儲存過程和函式級別的許可權
• User和db許可權表結構
• User許可權表結構中的特殊欄位
• Plugin,password,authentication_string三個欄位存放使用者認證資訊
• Password_expired設定成’Y’則表明允許DBA將此使用者的密碼設定成過期而 且過期後要求使用者的使用者重置密碼(alter user/set password重置密碼)
• Password_last_changed作為一個時間戳欄位代表密碼上次修改時間,執 行create user/alter user/set password/grant等命令建立使用者或修改使用者密 碼時此數值自動更新
• Password_lifetime代表從password_last_changed時間開始此密碼過期的天 數
• Account_locked代表此使用者被鎖住,無法使用
• Tables_priv和columns_priv許可權表結構
• Timestamp和grantor兩個欄位暫時沒用
• Tables_priv和columns_priv許可權值
• procs_priv許可權表結構
• Routine_type是列舉型別,代表是儲存過程還是函式
• Timestamp和grantor兩個欄位暫時沒用
• 系統許可權表字段長度限制表
• 許可權認證中的大小寫敏感問題
• 欄位user,password,authencation_string,db,table_name大小寫敏感
• 欄位host,column_name,routine_name大小寫不敏感
• User使用者大小寫敏感

更改口令(即密碼)

更改使用者口令使用SET PASSWORD語句,新口令必須進行如下加密:

SET PASSWORD FOR 使用者賬號 = Password('口令即密碼');

//注意Password函式中的雙單引號''

也可以設定自己的口令

SET PASSWORD = Password('口令即密碼');

//注意Password()函式中的雙單引號''

備份資料

1、使用命令列實用程式mysqldump轉儲存所有資料庫內容到某個外部檔案,在進行常規備份前,這個實用程式應該正常執行,以便能正確地進行備份轉儲存檔案。

2、可以用命令列實用程式mysqlhotcopy從一個數據庫複製所有資料(並非所有資料庫引擎都支援這個實用程式)。

3、可以使用MySQL的BACKUP TABLE 或 SELECT INTO OUTFILE轉儲存所有資料到某個外部檔案,這兩條語句都接受將要建立的系統檔名,此係統檔案必須不存在,否則會出錯。

例如:

SELECT * FROM world.city
INTO OUTFILE '/temp/back.txt';

4、資料可以使用RESTORE TABLE語句來進行復原。

注意:為了保證所有資料被寫到磁碟上(包括索引資料),應該在進行備份前使用FLUSH TABLE語句舒心未寫資料。

進行資料庫維護

1、ANALYZE TABLE:用來檢查表鍵是否正確

2、CHECK TABLE:用來針對許多問題對錶進行檢查,在MyISAM表上還可以對索引進行檢查

3、CHANGED:檢查自從最後一次檢查以後改動過的表

4、MEDIUM:檢查所有被刪除的連結並進行鍵檢驗

5、QUICk:只進行快速掃描

6、FAST:只檢查未正常關閉的表

7、EXTENDED:執行最後徹底的檢查

8、OPTIMIZE TABLE:當從一個表中刪除大量資料時,使用它收回所用的空間

9、REPAIR TABLE:如果MyISAM表訪問產生不正確和不一致的結果,可以使用它修復相應的表(這條語句不應該經常使用,如果經常使用可能會有更大的問題要解決)

檢視日誌檔案

1、錯誤日誌:包含啟動和關閉問題以及任意關鍵錯誤的細節,日誌位於data目錄中,日誌檔案通常命名為hostname.err。此日誌檔名可以通過log-error命令列選項更改

2、查詢日誌:記錄所有MySQL活動,在診斷問題時非常有用,不應該長期使用它,日誌位於data目錄中,日誌檔案通常命名為hostname.log。此日誌檔名可以通過log命令列選項更改

3、二進位制日誌:記錄更新過資料(或可能更新過資料)的所有語句,日誌位於data目錄中,日誌檔案通常命名為hostname-bin。此日誌檔名可以通過log-bin命令列選項更改

4、緩慢查詢日誌:記錄執行緩慢的任何查詢,這個日誌對確定資料庫何處需要優化很有用,日誌位於data目錄中,日誌檔案通常命名為hostname-slow.log。此日誌檔名可以通過log-slow-queries命令列選項更改

5、重新整理或重新開始所有日誌檔案:使用FLUSH LOGS語句

改善效能

1、關鍵的生產DBMS應該執行在自己的專用伺服器上

2、MySQL是用一系列的預設設定預先配置的,這些設定開始通常是很好的,在資料庫執行一段時間後可能需要調整記憶體分配、緩衝區大小等(使用 SHOW VARIABLES; 或 SHOW STAUS; 語句檢視當期設定)

3、MySQL是一個多使用者多執行緒的DBMS,經常同時執行多個任務沒,如果這些任務中的某個執行緩慢,則所有的請求都會執行緩慢,如果遇到顯著的效能不良,可以使用SHOW PROCESSLIST 語句顯示所有活動程序(包含它們的執行緒ID和執行時間),可以使用 KILL 命令終結特定的程序(使用這個命令需要作為管理員登入)

4、總是有不止一種方法編寫同一條SELECT語句,應該試驗聯結、並、子查詢等,找出最佳的方法,通過使用多條SELECT語句和連線它們的UNION語句有的時候效能能極大的改進

5、使用EXPLAIN語句讓MySQL解釋它將如何執行一條SELECT語句

6、一般情況下,儲存過程執行比一條一條地執行其中的各條MySQL語句都要快

7、應該總是使用正確的資料型別

8、絕對不要檢索比需求還要多的資料

9、在匯入資料時應該關閉自動提交

10、有的操作(包括INSERT)支援一個可選的DELAYED關鍵字,如果使用它,將把控制立即返回給呼叫程式,並且一旦有可能就實際執行該操作

11、必須索引資料庫表以改善資料檢索的效能,但是索引損害資料的插入、刪除、更新的效能

12、LIKE很慢,一般情況下最好使用FULLTEXT而不是LIKE

13、資料庫是不斷變化的實體