MySQL數據庫的維護處理

一、維護,主要是日誌記錄在維護中的處理,日誌記錄文件一般保存在與數據文件相同的目錄之中,好比: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,....,這個命令的做用就好像母親整理你的房間,除了拋棄舊的、被刪除的文件之外,還能夠排序有索引的文件,把變量表行的內容設置到連續空間中,更新統計信息,可是必須注意,這個表已經被鎖定,在進行操做時不能被客戶端訪問。

相關文章
相關標籤/搜索