當MySQL伺服器啟動時,它會檢查其命令列的操作,以查看它是否應該執行登入並開啟相應的記錄檔(如果應該的話)。可以讓伺服器產生兩種主要類型的日誌檔案:常規日誌檔案。它會報告客戶機的連接、查詢和其他各種各樣的事件。 在MySQL伺服器啟動時,它會檢查其命令列的操作,來查看它是否應該執行登入並開啟對應的記錄檔(如果應該的話)。可以讓伺服器產生兩種主要類型的日誌檔案:常規日誌檔案。它會報告客戶機的連接、查詢和其他各種各樣的事件。它對於追蹤伺服器的活動很有用:誰正在連接、從哪裡連接,以及他們正在做什麼。
更新日誌
它報告修改資料庫的查詢。在此上下文中的術語「更新」不僅涉及UPDATE語句,還涉及修改資料庫的所有語句。由於這個原因,它包含了對DELETE、INSERT、REPLACE、CREATE TABLE、DROP TABLE、GRANT 和REVOKE 的查詢記錄。更新日誌的內容以SQL 語句的形式書寫,這些語句用作對mysql的輸入。如果在崩潰後必須恢復表的話,更新日誌與備份是很有用的。您可以從備份檔案中還原資料庫,然後透過將更新日誌作為對mysql的輸入,重新執行在該備份檔案之後又修改資料庫的任何查詢。這樣,可將表恢復到崩潰時刻的狀態。
為了讓日誌有效,可使用--log 選項開啟常規日誌,並以--log-update 選項開啟更新日誌。可以在mysqld.safe_mysqld 或mysql.server 的命令列中,或在某個選項的[mysqld] 群組中指定這些選項。當日誌有效時,日誌檔案在缺省時被寫到伺服器的資料目錄中。
作者建議在首次使用MySQL時應使兩種日誌類型都有效。在獲得一些使用MySQL的經驗後,可能會只用更新日誌來對付,以便減少磁碟空間的需求。
在使日誌有效後,請確保不用大量的日誌資訊將磁碟填滿,尤其是如果伺服器正在處理大量的查詢話。可使用日誌檔案循環和截止時間,在避免日誌檔案無邊界地增長的同時保持最近的幾個日誌是連線可用的。
日誌檔案循環工作如下。假定日誌檔名為log。在第一個循環中, log 被重新命名為log . 0,且伺服器開始寫新的log檔案。在第二次循環中, log.0 被重新命名為log . 1,log 重新命名為log . 0,伺服器開始寫另一個新的log 檔案。這樣,每個檔案循環通過名字log . 0、log . 1,等等。當檔案到達循環的某一點時,可以終止它。
更新日誌和LOAD DATA 語句
通常,當伺服器執行LOAD DATE 語句時,它只會將該語句本身而不是被載入的行內容寫到更新日誌中。這意味著除非該資料檔案仍然保持可訪問,否則使用更新日誌的復原操作將是不完整的。為了確保這一點的安全,除非資料庫已經備份,否則不應該刪除資料檔案。
系統備份
更新日誌對於資料庫復原並不是任何時候都好,如果一個磁碟崩潰導致您失去了更新日誌的話,應確保您執行定期的檔案系統備份。將更新日誌寫到與儲存資料庫不相同的磁碟中也是一個好主意。
例如,如果您每天都循環日誌,並且想保持一週的日誌,則應保留log.0 到log . 6。在下一個循環中,將透過令log.5 覆蓋log.6 使其成為新的log.6 來終止log . 6。這樣,您就可以保留許多日誌而又避免了它們超過磁碟的限度。
日誌循環頻率和保持的舊日誌數量將依賴於伺服器的繁忙程度(活動的伺服器產生更多的日誌資訊)以及您希望為舊日誌投入多少磁碟空間。當循環常規日誌時,可以用mysqla d - min flush-logs 指令告訴伺服器關閉目前的日誌檔案並開啟新的日誌檔案。
執行常規日誌循環的腳本類似如下(可修改它來反映您的日誌基名和資料目錄的位置,或許還有希望保留的舊日誌的數量):
最好從mysqladm 帳號中執行此腳本以確保日誌檔案屬於該使用者。如果在.my.cnf 選項檔案中保留連線參數,您不需要在該腳本的mysqladmin 指令中指定任何參數。如果您不這樣做的話可以建立一個受限用戶,它除了發布刷新命令外什麼也不做。然後可以以最小的風險在該腳本中放置這個用戶的口令。如果想這樣做,則該使用者應只有RELOAD 權限。例如,若要呼叫使用者flush 並指派一個口令fl 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 .log。伺服器將一直關閉並在接收flush-logs 命令時開啟該日誌,但是伺服器並不是每次都會產生新的檔案。在這種情況下,用於更新日誌的日誌循環腳本和用於常規日誌的腳本僅在循環的檔案基名上有所不同。
如果想自動執行日誌循環和終止,可使用cron。假定循環常規日誌和更新日誌的腳本為rotate-logs 和rotate - up date - logs,且安裝在/usr/user/mysql/bin 目錄中。以mysqlladm 使用者進行註冊,然後用以下指令編輯mysqladm 使用者的crontab 檔案: % crontab -e
此命令允許編輯目前crontab 檔案的備份(如果之前沒有這樣做,則它可能為空)。按以下方法將行增加到該文件中:
這個項目告訴cron 在每天早上4 點執行此腳本。您可以改變時間或按需要進行調度。有關說明請參閱crontab 的人工頁。
-