在MySQL服務(wù)器啟動時,它檢查其命令行的操作,來查看它是否應(yīng)該執(zhí)行登錄并打開相應(yīng)的日志文件(如果應(yīng)該的話)。可以讓服務(wù)器生成兩種主要類型的日志文件:
常規(guī)日志文件。它報告客戶機的連接、查詢和其他各種各樣的事件。它對于跟蹤服務(wù)器的活動很有用:誰正在連接、從哪里連接,以及他們正在做什么。
更新日志。它報告修改數(shù)據(jù)庫的查詢。在此上下文中的術(shù)語“更新”不只涉及UPDATE語句,還涉及修改數(shù)據(jù)庫的所有語句。由于這個原因,它包含了對D E L E T E、INSERT、REPLACE、CREATE TABLE、DROP TABLE、GRANT 和REVOKE 的查
詢記錄。更新日志的內(nèi)容以SQL 語句的形式書寫,這些語句用作對mysql的輸入。如果在崩潰后必須恢復表的話,更新日志與備份是很有用的。您可以從備份文件中恢復數(shù)據(jù)庫,然后通過將更新日志作為對mysql的輸入,重新運行在該備份文件之后又修改數(shù)據(jù)庫的任何查詢。這樣,可將表恢復到崩潰時刻的狀態(tài)。
為了使日志有效,可使用--log 選項開啟常規(guī)日志,并用--log-update 選項開啟更新日志。可以在mysqld.safe_mysqld 或mysql.server 的命令行中,或在某個選項的[mysqld] 組中指定這些選項。當日志有效時,日志文件在缺省時被寫到服務(wù)器的數(shù)據(jù)目錄中。
筆者建議在首次使用MySQL時應(yīng)使兩種日志類型都有效。在獲得一些使用MySQL的經(jīng)驗后,可能會只用更新日志來對付,以便減少磁盤空間的需求。
在使日志有效后,要確保不用大量的日志信息將磁盤填滿,尤其是如果服務(wù)器正在處理大量的查詢話。可使用日志文件循環(huán)和截止時間,在避免日志文件無邊界地增長的同時保持最近的幾個日志是聯(lián)機可用的。
日志文件循環(huán)工作如下。假定日志文件名為l o g。在第一個循環(huán)中, log 被重新命名為l o g . 0,且服務(wù)器開始寫新的l o g文件。在第二次循環(huán)中, log.0 被重命名為l o g . 1,log 重命名為l o g . 0,服務(wù)器開始寫另一個新的log 文件。這樣,每個文件循環(huán)通過名字l o g . 0、l o g . 1,等等。當文件到達循環(huán)的某一點時,可以終止它。
更新日志和LOAD DATA 語句
通常,當服務(wù)器執(zhí)行LOAD DATE 語句時,它只將該語句本身而不是被加載的行內(nèi)容寫到更新日志中。這意味著除非該數(shù)據(jù)文件仍然保持可訪問,否則使用更新日志的恢復操作將是不完整的。為了確保這一點的安全,除非數(shù)據(jù)庫已經(jīng)備份,否則不應(yīng)該刪除數(shù)據(jù)文件。
系統(tǒng)備份
更新日志對于數(shù)據(jù)庫恢復并不是任何時候都好,如果一個磁盤崩潰導致您失去了更新日志的話,應(yīng)確保您執(zhí)行定期的文件系統(tǒng)備份。將更新日志寫到與存儲數(shù)據(jù)庫不相同的磁盤中也是一個好主意。有關(guān)重新加載日志文件的介紹,請參閱第10 章的“ MySQL數(shù)據(jù)目錄”
例如,如果您每天都循環(huán)日志,并且想保持一周的日志,則應(yīng)保留log.0 到l o g . 6。在下一個循環(huán)中,將通過令log.5 覆蓋log.6 使其成為新的log.6 來終止l o g . 6。這樣,您就可以保留許多日志而又避免了它們超過磁盤的限度。
日志循環(huán)頻率和保持的舊日志數(shù)量將依賴于服務(wù)器的繁忙程度(活動的服務(wù)器產(chǎn)生更多的日志信息)以及您希望為舊日志投入多少磁盤空間。當循環(huán)常規(guī)日志時,可以用mysqla d - min flush-logs 命令告訴服務(wù)器關(guān)閉當前的日志文件并打開新的日志文件。
執(zhí)行常規(guī)日志循環(huán)的腳本類似如下(可修改它來反映您的日志基名和數(shù)據(jù)目錄的位置,或許還有希望保留的舊日志的數(shù)量):
最好從mysqladm 賬號中運行此腳本以確保日志文件屬于那個用戶。如果在.my.cnf 選項文件中保留連接參數(shù),您不需要在該腳本的mysqladmin 命令中指定任何參數(shù)。如果您不這樣做的話可以建立一個受限用戶,它除了發(fā)布刷新命令外什么也不做。然后可以以最小的風險在該腳本中放置這個用戶的口令。如果想這樣做,則該用戶應(yīng)只有RELOAD 權(quán)限。例如,要想調(diào)用用戶flush 并分配一個口令f l us h pass,可使用下列GRANT 語句:
GRANT RELOAD ON *.* TO flush@localhost IDENTIFIEDBY "flushpass"
當需要在腳本中執(zhí)行刷新操作時,可以這樣做:
mysqladmin -uflush -pflushpass flush -logs
在Linux 中,最好用logrotate 來安裝MySQL分發(fā)包中的mysql- log - rotate 腳本,而不是自己編寫腳本。如果mysql-log-rotate 不通過RPM 文件自動安裝,應(yīng)查看MySQL分發(fā)包的support-files 目錄。
由于服務(wù)器處理更新日志文件的方法不同,日志文件的循環(huán)在更新日志與常規(guī)日志之間稍有不同。如果告訴服務(wù)器使用沒有擴展名的更新日志文件名(如up date),則服務(wù)器將使用順序的up date . 0 0 1、update.002 等自動創(chuàng)建更新日志文件名。在服務(wù)器啟動以及在日志刷新時,一個新的更新日志產(chǎn)生。如果您開啟更新日志而沒有指定文件名,服務(wù)器則使用主機名作為基名產(chǎn)生一個更新日志文件的序列。
當終止一個由這種方法生成的文件序列時,您或許想要根據(jù)其期限(最后被修改的時間)而非根據(jù)名字來終止它們。這樣做的理由是由于您不知道flush-log 命令將在何時發(fā)布,因此您不能指望在任何給定的時間周期內(nèi)創(chuàng)建固定數(shù)量的更新日志。例如,如果用mysqldump 備份表并使用--flush-logs 選項,在該更新日志名序列中的一個新文件隨每個備份一同創(chuàng)建。
對于帶有由服務(wù)器自動產(chǎn)生的順序文件名的更新日志,基于日志期限的終止腳本類似如下:
find 命令定位并刪除修改時間超過一個星期的更新日志文件。重要的是使用-name 參數(shù)來對一個數(shù)字的文件擴展名進行測試,以避免刪除由錯誤的update 所指定的表。
還可以告訴服務(wù)器使用固定的更新日志文件名(如果希望的話),如果想用與常規(guī)日志相同的方法循環(huán)更新日志,這是有用的。要想使用固定的更新日志名,應(yīng)指定一個包含擴展名的名字。例如,可以用--log-update=update.log 選項啟動服務(wù)器來使用名字up date . l o g。服務(wù)器將一直關(guān)閉并在接收flush-logs 命令時打開該日志,但是服務(wù)器并不是每次都產(chǎn)生新的文件。在這種情況下,用于更新日志的日志循環(huán)腳本和用于常規(guī)日志的腳本僅在循環(huán)的文件基名上有所不同。
如果想自動執(zhí)行日志循環(huán)和終止,可使用c r o n。假定循環(huán)常規(guī)日志和更新日志的腳本為rotate-logs 和r o t a t e - up date - l o g s,且安裝在/usr/user/mysql/bin 目錄中。以mysqlladm 用戶進行注冊,然后用以下命令編輯mysqladm 用戶的crontab 文件:
% crontab -e
此命令允許編輯當前crontab 文件的備份(如果之前沒有這樣做,則它可能為空)。按以下方法將行增加到該文件中:
這個項告訴cron 在每天早上4 點運行此腳本。您可以改變時間或按需要進行調(diào)度。有關(guān)說明請參見crontab 的人工頁。
新聞熱點
疑難解答