程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MYSQL日志文件維護

MYSQL日志文件維護

編輯:關於MYSQL數據庫

  在MySQL服務器啟動時,它檢查其命令行的操作,來查看它是否應該執行登錄並打開相應的日志文件(如果應該的話)。可以讓服務器生成兩種主要類型的日志文件:常規日志文件。它報告客戶機的連接、查詢和其他各種各樣的事件。它對於跟蹤服務器的活動很有用:誰正在連接、從哪裡連接,以及他們正在做什麼。

  更新日志

  它報告修改數據庫的查詢。在此上下文中的術語“更新”不只涉及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 語句時,它只將該語句本身而不是被加載的行內容寫到更新日志中。這意味著除非該數據文件仍然保持可訪問,否則使用更新日志的恢復操作將是不完整的。為了確保這一點的安全,除非數據庫已經備份,否則不應該刪除數據文件。

  系統備份

  更新日志對於數據庫恢復並不是任何時候都好,如果一個磁盤崩潰導致您失去了更新日志的話,應確保您執行定期的文件系統備份。將更新日志寫到與存儲數據庫不相同的磁盤中也是一個好主意。

  例如,如果您每天都循環日志,並且想保持一周的日志,則應保留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 文件的備份(如果之前沒有這樣做,則它可能為空)。按以下方法將行增加到該文件中:

  這個項告訴cron 在每天早上4 點運行此腳本。您可以改變時間或按需要進行調度。有關說明請參見crontab 的人工頁。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved