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