一、維護,主要是日誌記錄在維護中的處理,日誌記錄文件一般保存在與數據文件相同的目錄之中,好比:Unix系統中的/usr/local/mysql/var或是/usr/local/mysql/data,在Windows中則是c:\mysql\data目錄,日誌記錄分爲如下幾類:mysql
1、錯誤日誌:保存了服務器上發生的每一個錯誤的記錄;若是須要激活錯誤日誌,添加--log-error選項到服務器啓動命令行或選項文件中,好比:sql
[root@host175 ~]# /etc/rc.d/init.d/mysqld start --log-error數據庫
Starting MySQL [ OK ]緩存
這個日誌的文件名通常是以.err爲結尾的。好比我機器上的host175.err,以下藍色字體標記的:安全
[root@host175 ~]# ls /usr/local/mysql/var/服務器
WorkDB ibdata1 mysql-bin.000008 mysql-bin.000017socket
greedland mysql mysql-bin.000009 mysql-bin.000018工具
host.test.com.err mysql-bin.000001 mysql-bin.000010 mysql-bin.000019性能
host.test.com.pid mysql-bin.000002 mysql-bin.000011 mysql-bin.000020字體
host175.err mysql-bin.000003 mysql-bin.000012 mysql-bin.000021
host175.test.com.err mysql-bin.000004 mysql-bin.000013 mysql-bin.000022
host175.test.com.pid mysql-bin.000005 mysql-bin.000014 mysql-bin.000023
ib_logfile0 mysql-bin.000006 mysql-bin.000015 mysql-bin.index
ib_logfile1 mysql-bin.000007 mysql-bin.000016 test
具體內容以下,這是一部分:
[root@host175 ~]# more /usr/local/mysql/var/host175.err
081211 17:03:35 InnoDB: Started; log sequence number 0 43665
081211 17:03:35 [Note] /usr/local/mysql/libexec/mysqld: ready for connections.
Version: '5.0.40-log' socket: '/tmp/mysql.sock' port: 3306 Source distribution
好像也記錄了一些啓動信息,固然我這裏沒有錯誤消息,而是一些指示性消息。
2、查詢日誌:這是另一個有用的日誌,由於這裏保存了客戶機發給服務器的每一個查詢的蹤影,還能夠顯示客戶機鏈接服務器以及這些客戶機所做操做的細節內容。如果但願監控以排錯爲目的的活動,就應該激活查詢日誌選項--log,也是加在服務器啓動命令行或選項文件中,以下:
[root@host175 ~]# /etc/rc.d/init.d/mysqld start --log
Starting MySQL [ OK ]
這個日誌的文件名是主機名加.log擴展名的格式,好比我機器上的host175.log,下面藍色字體標記的文件名:
[root@host175 ~]# ls /usr/local/mysql/var/
WorkDB host175.err ib_logfile0 mysql-bin.000001
mysql-bin.000005 mysql-bin.000009 mysql-bin.000013 mysql-bin.000017
mysql-bin.000021 mysql-bin.index greedland host175.log ib_logfile1 mysql-bin.000002 mysql-bin.000006 mysql-bin.000010
mysql-bin.000014 mysql-bin.000018 mysql-bin.000022 test
host.test.com.err host175.test.com.err ibdata1 mysql-bin.000003
mysql-bin.000007 mysql-bin.000011 mysql-bin.000015 mysql-bin.000019
mysql-bin.000023 host.test.com.pid host175.test.com.pid mysql
查詢日誌部份內容示例以下:
[root@host175 ~]# more /usr/local/mysql/var/host175.log
/usr/local/mysql/libexec/mysqld, Version: 5.0.40-log (Source distribution). started with:
Tcp port: 3306 Unix socket: /tmp/mysql.sock
Time Id Command Argument
081211 17:22:52 1 Connect Access denied for user 'fuhao'@'localhost' (using password: NO)
081211 17:23:12 2 Connect Access denied for user 'root'@'localhost' (using password: YES)
081211 17:23:19 3 Connect root@localhost on WorkDB
3 Query select @@version_comment limit 1
081211 17:23:24 3 Query show tables
081211 17:23:31 3 Query select * from users
這裏面對每個操做記錄的很詳細。
3、慢查詢日誌:這文件中記錄了超過預先設定時間量(根據long_query_time變量肯定)的全部查詢,任何超過這個值的查詢都將列在這個日誌文件中。如果須要查找優化性能的辦法,能夠查查這裏的問題。
咱們能夠以下這樣查看long_query_time變量的值:
mysql> show variables like 'long_query_time';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| long_query_time | 10 |
+-----------------+-------+
1 row in set (0.00 sec)
我這裏的緩存查詢時間限制設置是10秒,也就是說查詢超過10秒的都會在這個慢查詢日誌中記錄下來;
慢查詢日誌使用--log-slow-queries選項來激活,以下所示:
[root@host175 ~]# /usr/local/mysql/share/mysql/mysql.server start --log-slow-queries
Starting MySQL [ OK ]
該日誌的默認文件名是主機名後帶-slow的後綴以及.log擴展名,好比下面藍色字體所標記的:
[root@host175 ~]# ls /usr/local/mysql/var/
WorkDB host175.err ib_logfile1 mysql-bin.000003
mysql-bin.000008 mysql-bin.000013 mysql-bin.000018 mysql-bin.000023
greedland host175.log ibdata1 mysql-bin.000004
mysql-bin.000009 mysql-bin.000014 mysql-bin.000019 mysql-bin.000024
host.test.com.err host175.test.com.err mysql mysql-bin.000005
mysql-bin.000010 mysql-bin.000015 mysql-bin.000020 mysql-bin.000025
host.test.com.pid host175.test.com.pid mysql-bin.000001 mysql-bin.000006
mysql-bin.000011 mysql-bin.000016 mysql-bin.000021 mysql-bin.index
host175-slow.log ib_logfile0
具體的文件內容格式以下:
[root@host175 ~]# more /usr/local/mysql/var/host175-slow.log
/usr/local/mysql/libexec/mysqld, Version: 5.0.40-log (Source distribution). started with:
Tcp port: 3306 Unix socket: /tmp/mysql.sock
Time Id Command Argument
因爲我這裏不可能有超過10秒的查詢因此下面就沒數據了。
4、更新日誌:記錄了改變具體表的全部查詢。與update、create table和drop table同時使用的insert、replace、delete、grant和revoke語句都屬於改變具體表的查詢,可是select語句不是。
要讓服務器寫更新日誌必須在服務器啓動時帶選項--log-update,好比:
[root@host175 ~]# /usr/local/mysql/share/mysql/mysql.server start --log-update
Starting MySQL [ OK ]
若是須要從新構建一個表,可是該表在最近一次備份以後又進行了修改,這個日誌能夠發揮做用。在數據庫受到破壞的狀況下,能夠根據備份進行恢復,而後按照更新日誌從新建立記錄到查詢,這樣能夠把系統恢復到受破壞以前的情況。
5、二進制更新日誌:在版本3.23.14之後版本支持,這是一種更爲有效的保存日誌數據的格式,它比標準更新日誌記錄得更詳細,名爲mysqlbinlog實用程序能夠把二進制日誌文件轉換回文本文件格式從而能夠進行閱讀。
在啓動MySQL時使用--log-bin選項能夠建立二進制更新日誌文件,好比:
[root@host175 ~]# /usr/local/mysql/share/mysql/mysql.server start --log-bin
Starting MySQL [ OK ]
這個日誌文件的默認文件名是主機名加-bin後綴,而後有一個分辨日誌順序的數字。
發現個問題,我在5.0.40-log版本的MySQL中的二進制日誌文件不是上面說的那樣的文件名而是mysql-bin後面再帶一個分辨日誌順序的數字,好比下面藍色字體標記的:
[root@host175 ~]# ls /usr/local/mysql/var/
WorkDB host175.err ib_logfile1 mysql-bin.000003
可使用mysql>flush logs;命令刷新日誌,即關閉當前日誌並使用一個新的順序編號建立新日誌。
特別注意:如果設置了主副服務器以便進行復制,必須啓動二進制更新日誌。
6、日誌截止與循環:若是服務器很忙,日誌很快就會變得很大甚至充滿整個磁盤,因此日誌必須經過截止日期和循環進行管理,確保日誌成爲你的助手而不是累贅。
日誌循環是經過建立一個日誌文件的有限數字實現,而後進行覆蓋替換,這樣每次都會剔除最舊的文件。常見的方式是天天建立新日誌,在一個循環中使用7輪,每輪爲一週中的一天。
若是使用的是數字編碼的日誌文件,編號後的日誌能夠設置截止日期來進行管理,截止日期一到,這些文件將被刪除或歸檔,這就是日誌截止。
以上兩方法的具體實現能夠參考MySQL手冊。
二、檢查和修理表:
1、檢查表錯誤:使用命令myisamchk table-file-name,因爲myisamchk須要專門訪問該表因此最好在運行以前讓服務器脫機或是停機;一個檢查的具體例子:
[root@host175 ~]# /usr/local/mysql/bin/myisamchk -e /usr/local/mysql/var/WorkDB/users
Checking MyISAM file: /usr/local/mysql/var/WorkDB/users
Data records: 1 Deleted blocks: 0
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
- check data record references index: 2
- check records and index references
這是一個帶-e參數的最慢速度、最完整的擴展選項檢查,若是使用擴展選項檢查沒有發現錯誤就能夠肯定該表沒有問題。
myisamchk的缺點是在進行檢查時會鎖定客戶端,可是客戶端卻不能在運行myisamchk時鎖住被檢查表,在比較大的表中,這樣的檢查可能要花費數分鐘的時間,這可能會致使一些問題。有兩個替代方法:
第一,設置myisamchk可使用很大的緩存空間,可使用myisamchk --help查看修改不一樣緩存空間的選項;
第二,使用不一樣的方法檢查表,好比:check table table-name,以下所示:
mysql> check table users;
+--------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------+-------+----------+----------+
| WorkDB.users | check | status | OK |
+--------------+-------+----------+----------+
1 row in set (0.00 sec)
這種方法中還能夠在check table命令中添加關鍵字FAST、MEDIUM、EXTENDED和CHANGED,以便執行但願使用的檢查種類。
第三,經常使用myisamchk而不是check table命令的緣由是,在使用check table命令是MySQL服務器承擔了全部工做,如果服務器關閉,check table命令就無法使用了;而myisamchk在文件級工做,即便服務器關閉也能工做,而且不給MySQL服務器帶去額外壓力。myisamchk不能在InnoDB和BDB表上工做,在這些類型的表上面須要使用check table命令。
2、修理表:
myisamchk工具還能夠用來修理被毀壞的表,使用-r選項加表名就能夠開始修復過程,即:
myisamchk -r table-name
還有其餘修復選項,其中-r是修理和恢復,屬於標準恢復方法;
-o是恢復的安全模式,屬於慢速、徹底恢復方法;
-q是快速恢復方法,只檢查索引,不檢查數據文件。
因爲myisamchk在文件級工做,因此在操做時須要全部鎖被刪除而且全部客戶被排除才行。
在檢查表時,首先嚐試最快的選項-F,若是不行再使用比較慢的選項-m,最後再考慮最慢的徹底的檢查選項-e。若是在運行最強的修復可能性後問題仍然存在,那麼將不得不從備份文件恢復該表了。
修復表可用的另外一個選項是repair table命令,格式:repair table table-name,....
還可使用選項QUICK或EXTENDED關鍵字來設置修復類型,好比:
mysql>repair table users QUICK;
3、優化表:
使用命令optimize table table-name,....,這個命令的做用就好像母親整理你的房間,除了拋棄舊的、被刪除的文件之外,還能夠排序有索引的文件,把變量表行的內容設置到連續空間中,更新統計信息,可是必須注意,這個表已經被鎖定,在進行操做時不能被客戶端訪問。