MySQL命令學習筆記(八)

1 安全管理

1.1 訪問控制

MySQL服務器的安全基礎是: 用戶應該對他們需要的數據具有適當的訪問權,既不能多也不能少

1.2 管理用戶

MySQL用戶賬號和信息存儲在名爲mysql的MySQL數據庫中。獲得所有用戶賬號列表時,可使用以下代碼:

USE mysql;
SELECT user FROM user;

結果如下:
user
這裏只有root一個賬戶。接下來開始創建賬戶。

1.2.1 創建用戶賬號

爲了創建一個新用戶賬號,使用CREATE USER語句,如下所示:

CREATE USER ben IDENTIFIED BY '123456';

結果如下:
create user.png
指定散列口令 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.png
每個GRANT添加(或更新)用戶的一個權限。 MySQL讀取所有授權,並根據它們確定權限

GRANT的反操作爲REVOKE,用它來撤銷特定的權限。示例如下:

REVOKE SELECT ON test.* FROM jerry;

這條REVOKE語句取消剛賦予用戶jerry的SELECT訪問權限。 被撤銷的訪問權限必須存在,否則會出錯,結果如下:
REVOKE.png
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;

結果如下:
RO SELECT.png
上圖是第一句SELECT執行的結果,然後依次執行上述語句如下:
ROLLBACK.png
首先執行一條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;

ANALYZE TABLE

  • 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索引),然後在導入完成後再重建它們
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章