備份數據
因爲MySQL數據庫是基於磁盤的文件,普通的備份系統和例程就能備份MySQL的數據。可是,因爲這些文件老是處於打開和使用狀態,普通的文件副本備份不必定老是有效。下面列出這個問題的可能解決方案。mysql
- 使用命令行實用程序mysqldump轉儲全部數據庫內容到某個外部文件。在進行常規備份前這個實用程序應該正常運行,以便能正確地備份轉儲文件。
- 可用命令行實用程序mysqlhotcopy從一個數據庫複製全部數據(並不是全部數據庫引擎都支持這個實用程序)。
- 可使用MySQL的BACKUP TABLE或SELECT INTO OUTFILE轉儲全部數據到某個外部文件。這兩條語句都接受將要建立的系統文件名,此係統文件必須不存在,不然會出錯。數據能夠用RESTORETABLE來複原。
- 首先刷新未寫數據 爲了保證全部數據被寫到磁盤(包括索引數據),可能須要在進行備份前使用FLUSH TABLES語句。
進行數據庫維護
mysql> ANALYZE TABLE orders;
+------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------------+---------+----------+----------+
| customers.orders | analyze | status | OK |
+------------------+---------+----------+----------+
1 row in set (0.04 sec)
- ANALYZE TABLE,用來檢查表鍵是否正確,返回狀態信息。
mysql> CHECK TABLE orders,orderitems;
+----------------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------------------+-------+----------+----------+
| customers.orders | check | status | OK |
| customers.orderitems | check | status | OK |
+----------------------+-------+----------+----------+
2 rows in set (0.04 sec)
- CHECK TABLE用來針對許多問題對錶進行檢查。在MyISAM表上還對索引進行檢查。CHECK TABLE支持一系列的用於MyISAM表的方式。CHANGED檢查自最後一次檢查以來改動過的表。EXTENDED執行最完全的檢查,FAST只檢查未正常關閉的表,MEDIUM檢查全部被刪除的連接並進行鍵檢驗,QUICK只進行快速掃描。
診斷啓動問題
在排除系統啓動問題時,首先應該儘可能用手動啓動服務器。MySQL服務器自身經過在命令行上執行mysqld啓動。下面是幾個重要的mysqld命令行選項:sql
- --help顯示幫助——一個選項列表;
- --safe-mode裝載減去某些最佳配置的服務器;
- --verbose顯示全文本消息(爲得到更詳細的幫助消息與--help聯合使用);
- --version顯示版本信息而後退出。
查看日誌文件
MySQL維護管理員依賴的一系列日誌文件。主要的日誌文件有如下幾種。數據庫
- 錯誤日誌。它包含啓動和關閉問題以及任意關鍵錯誤的細節。此日誌一般名爲hostname.err,位於data目錄中。此日誌名可用--log-error命令行選項更改。
- 查詢日誌。它記錄全部MySQL活動,在診斷問題時很是有用。此日誌文件可能會很快地變得很是大,所以不該該長期使用它。此日誌一般名爲hostname.log,位於data目錄中。此名字能夠用--log命令行選項更改。
- 二進制日誌。它記錄更新過數據(或者可能更新過數據)的全部語句。此日誌一般名爲hostname-bin,位於data目錄內。此名字能夠用--log-bin命令行選項更改。注意,這個日誌文件是MySQL 5中添加的,之前的MySQL版本中使用的是更新日誌。
- 緩慢查詢日誌。顧名思義,此日誌記錄執行緩慢的任何查詢。這個日誌在肯定數據庫何處須要優化頗有用。此日誌一般名爲
hostname-slow.log ,位於 data 目錄中。此名字能夠用--log-slow-queries命令行選項更改。
在使用日誌時,可用FLUSH LOGS語句來刷新和從新開始全部日誌文件。服務器
改善性能
- 首先,MySQL(與全部DBMS同樣)具備特定的硬件建議。在學習和研究MySQL時,使用任何舊的計算機做爲服務器均可以。但對用於生產的服務器來講,應該堅持遵循這些硬件建議。
- 通常來講,關鍵的生產DBMS應該運行在本身的專用服務器上。
- MySQL是用一系列的默認設置預先配置的,從這些設置開始一般是很好的。但過一段時間後你可能須要調整內存分配、緩衝區大小等。(爲查看當前設置,可以使用SHOW VARIABLES;和SHOWSTATUS;。)
- MySQL一個多用戶多線程的DBMS,換言之,它常常同時執行多個任務。若是這些任務中的某一個執行緩慢,則全部請求都會執行緩慢。若是你遇到顯著的性能不良,可以使用SHOW PROCESSLIST顯示全部活動進程(以及它們的線程ID和執行時間)。你還能夠用KILL命令終結某個特定的進程(使用這個命令須要做爲管理員登陸)。
- 老是有不止一種方法編寫同一條SELECT語句。應該試驗聯結、並、子查詢等,找出最佳的方法。
- 使用EXPLAIN語句讓MySQL解釋它將如何執行一條SELECT語句。
- 通常來講,存儲過程執行得比一條一條地執行其中的各條MySQL語句快。
- 應該老是使用正確的數據類型。
- 決不要檢索比需求還要多的數據。換言之,不要用SELECT *(除非你真正須要每一個列)。
- 有的操做(包括INSERT)支持一個可選的DELAYED關鍵字,若是使用它,將把控制當即返回給調用程序,而且一旦有可能就實際執行該操做。
- 在導入數據時,應該關閉自動提交。你可能還想刪除索引(包括FULLTEXT索引),而後在導入完成後再重建它們。
- 必須索引數據庫表以改善數據檢索的性能。肯定索引什麼不是一件微不足道的任務,須要分析使用的SELECT語句以找出重複的
WHERE和ORDER BY子句。若是一個簡單的WHERE子句返回結果所花的時間太長,則能夠判定其中使用的列(或幾個列)就是須要索引的對象。
- 你的SELECT語句中有一系列複雜的OR條件嗎?經過使用多條SELECT語句和鏈接它們的UNION語句,你能看到極大的性能改進。
- 索引改善數據檢索的性能,但損害數據插入、刪除和更新的性能。若是你有一些表,它們收集數據且不常常被搜索,則在有必要以前不要索引它們。(索引可根據須要添加和刪除。)
- LIKE很慢。通常來講,最好是使用FULLTEXT而不是LIKE。
- 數據庫是不斷變化的實體。一組優化良好的表一下子後可能就面目全非了。因爲表的使用和內容的更改,理想的優化和配置也會改變。
- 最重要的規則就是,每條規則在某些條件下都會被打破。