1 安全管理
1.1 訪問控制
MySQL服務器的安全基礎是: 用戶應該對他們需要的數據具有適當的訪問權,既不能多也不能少
1.2 管理用戶
MySQL用戶賬號和信息存儲在名爲mysql的MySQL數據庫中。獲得所有用戶賬號列表時,可使用以下代碼:
USE mysql;
SELECT user FROM user;
結果如下:
這裏只有root一個賬戶。接下來開始創建賬戶。
1.2.1 創建用戶賬號
爲了創建一個新用戶賬號,使用CREATE USER語句,如下所示:
CREATE USER ben IDENTIFIED BY '123456';
結果如下:
指定散列口令 IDENTIFIED BY指定的口令爲純文本, MySQL將在保存到user表之前對其進行加密。爲了作爲散列值指定口令,使用IDENTIFIED BY PASSWORD。
爲重新命名一個用戶賬號,使用RENAME USER語句,如下所示:
RENAME USER ben TO jerry;
1.2.2 刪除用戶賬號
爲了刪除一個用戶賬號(以及相關的權限),使用DROP USER語句,如下所示:
DROP USER jerry;
1.2.3 設置訪問權限
爲看到賦予用戶賬號的權限,使用SHOW GRANTS FOR,如下所示:
SHOW GRANTS FOR jerry;
爲設置權限,使用GRANT語句,GTANT要求至少給出以下信息:
- 要授予的權限
- 被授予訪問權限的數據庫或表
- 用戶名
GRANT的用法示例如下:
GRANT SELECT ON test.* TO jerry;
這裏表示允許用戶在test.*
(test.*
數據庫的所有表)上使用SELECT,用戶jerry對test數據庫中的所有數據具有隻讀訪問權限
結果如下:
每個GRANT添加(或更新)用戶的一個權限。 MySQL讀取所有授權,並根據它們確定權限
GRANT的反操作爲REVOKE,用它來撤銷特定的權限。示例如下:
REVOKE SELECT ON test.* FROM jerry;
這條REVOKE語句取消剛賦予用戶jerry的SELECT訪問權限。 被撤銷的訪問權限必須存在,否則會出錯,結果如下:
GRANT和REVOKE可在幾個層次上控制訪問權限:
- 整個服務器,使用GRANT ALL 和REVOKE ALL
- 整個數據庫,使用
ON database.*
- 特定的表,使用
ON database.table
- 特定的列
- 特定的存儲過程
1.2.4 更改口令
爲了更改用戶口令,可使用SET PASSWORD語句。新口令必須如下加密:
SET PASSWORD FOR jerry = PASSWORD('654321');
SET PASSWORD更新用戶口令。新口令必須傳遞到Password()函數進行加密
2 管理事務處理
2.1 事務處理
事務處理(transaction processing)可以用來維護數據庫的完整性,它保證成批的MySQL操作要麼完全執行,要麼完全不執行。
在使用事務和事務處理時,有幾個關鍵詞彙反覆出現。下面是關於事務處理需要知道的幾個術語:
- 事務(transaction)指一組SQL語句;
- 回退(rollback)指撤銷指定SQL語句的過程
- 提交(commit)指將未存儲的SQL語句結果寫入數據庫表
- 保留點(savepoint)指事務處理設置的臨時佔位符
2.2 控制事務處理
MySQL使用下面的語句來標識事務的開始:
START TRANSACTION;
2.2.1 使用ROLLBACK
MySQL的ROLLBACK命令用來回退(撤銷) MySQL語句,示例如下:
SELECT * FROM table1;
START TRANSACTION;
DELETE FROM table1;
SELECT * FROM table1;
ROLLBACK
SELECT * FROM table1;
結果如下:
上圖是第一句SELECT執行的結果,然後依次執行上述語句如下:
首先執行一條SELECT以顯示該表不爲空。然後開始一個事務處理,用一條DELETE語句刪除table1中的所有行。另一條SELECT語句驗證ordertotals確實爲空。這時用一條ROLLBACK語句回退START TRANSACTION之後的所有語句,最後一條SELECT語句顯示該表不爲空。ROLLBACK只能在一個事務處理內使用(在執行一條START TRANSACTION命令之後)。
哪些語句可以回退? 事務處理用來管理INSERT、 UPDATE和DELETE語句。你不能回退SELECT語句。(這樣做也沒有什麼意義。)不能回退CREATE或DROP操作。
2.2.2 使用COMMIT
一般的MySQL語句都是直接針對數據庫表執行和編寫的。這就是所謂的隱含提交(implicit commit),即提交(寫或保存)操作是自動進行的。
在事務處理塊中,提交不會隱含地進行。爲進行明確的提交,使用COMMIT語句,示例如下所示:
START TRANSACTION;
DELETE FROM table1 WHERE id = 1;
COMMIT;
最後的COMMIT語句僅在不出錯時寫出更改。
隱含事務關閉 當COMMIT或ROLLBACK語句執行後,事務會自 動關閉(將來的更改會隱含提交)。
2.2.3 使用保留點
簡單的ROLLBACK和COMMIT語句就可以寫入或撤銷整個事務處理。但是,只是對簡單的事務處理才能這樣做,更復雜的事務處理可能需要部分提交或回退。
爲了支持回退部分事務處理,必須能在事務處理塊中合適的位置放置佔位符。這樣,如果需要回退,可以回退到某個佔位符。
這些佔位符稱爲保留點。爲了創建佔位符,可如下使用SAVEPOINT語句:
SAVEPOINT delete1;
每個保留點都取標識它的唯一名字,以便在回退時, MySQL知道要回退到何處。爲了回退到本例給出的保留點,可如下進行:
ROLLBACK TO delete1;
釋放保留點 保留點在事務處理完成(執行一條ROLLBACK或COMMIT)後自動釋放。自MySQL 5以來,也可以用RELEASE SAVEPOINT明確地釋放保留點。
2.2.3 更改默認的提交行爲
由於默認的MySQL行爲是自動提交所有更改。換句話說,任何時候你執行一條MySQL語句,該語句實際上都是針對表執行的,而且所做的更改立即生效。爲指示MySQL不自動提交更改,需要使用以下語句:
SET autocommit=0;
autocommit標誌決定是否自動提交更改,不管有沒有COMMIT語句。設置autocommit爲0(假)指示MySQL不自動提交更改(直到autocommit被設置爲真爲止)。
3 數據庫維護
3.1 備份數據
- 使用命令行實用程序mysqldump轉儲所有數據庫內容到某個外部文件。在進行常規備份前這個實用程序應該正常運行,以便能正確地備份轉儲文件
- 可用命令行實用程序mysqlhotcopy從一個數據庫複製所有數據(並非所有數據庫引擎都支持這個實用程序)
- 可以使用MySQL的BACKUP TABLE或SELECT INTO OUTFILE轉儲所有數據到某個外部文件。這兩條語句都接受將要創建的系統文件名,此係統文件必須不存在,否則會出錯。數據可以用RESTORE TABLE來複原
首先刷新未寫數據 爲了保證所有數據被寫到磁盤(包括索引數據),可能需要在進行備份前使用FLUSH TABLES語句
3.2 進行數據庫維護
MySQL提供了一系列的語句,可以(應該)用來保證數據庫正確和正常運行,一些語句如下:
- ANALYZE TABLE用來檢查表鍵是否正確,示例如下:
ANALYZE TABLE table1;
- CHECK TABLE用來針對許多問題對錶進行檢查
ANALYZE TABLE table1;
- 若MyISAM表訪問產生不正確和不一致的結果,可能需要用REPAIR TABLE來修復相應的表
- 若從一個表中刪除大量數據,應該使用OPTIMIZE TABLE來回收所有的空間,從而優化表的性能
3.3 診斷啓動問題
在排除系統啓動問題時,首先應該儘量用手動啓動服務器。 MySQL服務器自身通過在命令行上執行mysqld啓動。下面是幾個重要的mysqld命令行選項:
--help
顯示幫助——一個選項列表--safe-mode
裝載減去某些最佳配置的服務器verbose
顯示全文本消息--version
顯示版本信息然後退出
3.4 查看日誌文件
MySQL維護管理員依賴的一系列日誌文件。主要的日誌文件有以下幾種:
- 錯誤日誌。它包含啓動和關閉問題以及任意關鍵錯誤的細節。此日誌通常名爲hostname.err,位於data目錄中。此日誌名可用–log-error命令行選項更改
- 查詢日誌。它記錄所有MySQL活動,在診斷問題時非常有用。此日誌文件可能會很快地變得非常大,因此不應該長期使用它。此日誌通常名爲hostname.log,位於data目錄中。此名字可以用–log命令行選項更改
- 二進制日誌。它記錄更新過數據(或者可能更新過數據)的所有語句。此日誌通常名爲hostname-bin,位於data目錄內。此名字可以用–log-bin命令行選項更改。
- 緩慢查詢日誌。此日誌記錄執行緩慢的任何查詢。這個日誌在確定數據庫何處需要優化很有用。此日誌通常名爲hostname-slow.log, 位 於 data 目 錄 中 。 此 名 字 可 以 用–log-slow-queries命令行選項更改
4 改善性能
- MySQL一個多用戶多線程的DBMS,換言之,它經常同時執行多個任務。如果這些任務中的某一個執行緩慢,則所有請求都會執行緩慢。若遇到顯著的性能不良,可使用SHOW PROCESSLIST
顯示所有活動進程(以及它們的線程ID和執行時間)。還可以用KILL命令終結某個特定的進(使用這個命令需要作爲管理員登錄)。 - 有不止一種方法編寫同一條SELECT語句。 應該試驗聯結、並、子查詢等,找出最佳的方法。
- 使用EXPLAIN語句讓MySQL解釋它將如何執行一條SELECT語句。
- 決不要檢索比需求還要多的數據。換言之,不要用
SELECT *
(除非你真正需要每個列) - 在導入數據時,應該關閉自動提交。你可能還想刪除索引(包括FULLTEXT索引),然後在導入完成後再重建它們