日誌文件解析mysql版,mysql運行日誌文件

本文目錄一覽:

mysql中如何用mysqlbinlog工具將日誌文件生成txt文件出來分析

MySQL 的 Binlog 記錄著 MySQL 資料庫的所有變更信息,了解 Binlog 的結構可以幫助我們解析Binlog,甚至對 Binlog 進行一些修改,或者說是「篡改」,例如實現類似於 Oracle 的 flashback 的功能,恢復誤刪除的記錄,把 update 的記錄再還原回去等。本文將帶您探討一下這些神奇功能的實現,您會發現比您想像地要簡單得多。本文指的 Binlog 是 ROW 模式的 Binlog,這也是 MySQL 8 里的默認模式,STATEMENT 模式因為使用中有很多限制,現在用得越來越少了。

Binlog 由事件(event)組成,請注意是事件(event)不是事務(transaction),一個事務可以包含多個事件。事件描述對資料庫的修改內容。

現在我們已經了解了 Binlog 的結構,我們可以試著修改 Binlog 里的數據。例如前面舉例的 Binlog 刪除了一條記錄,我們可以試著把這條記錄恢復,Binlog 裡面有個刪除行(DELETE_ROWS_EVENT)的事件,就是這個事件刪除了記錄,這個事件和寫行(WRITE_ROWS_EVENT)的事件的數據結構是完全一樣的,只是刪除行事件的類型是 32,寫行事件的類型是 30,我們把對應的 Binlog 位置的 32 改成 30 即可把已經刪除的記錄再插入回去。從前面的 「show binlog events」 裡面可看到這個 DELETE_ROWS_EVENT 是從位置 378 開始的,這裡的位置就是 Binlog 文件的實際位置(以位元組為單位)。從事件(event)的結構裡面可以看到 type_code 是在 event 的第 5 個位元組,我們寫個 Python 小程序把把第383(378+5=383)位元組改成 30 即可。當然您也可以用二進位編輯工具來改。

找出 Binlog 中的大事務

由於 ROW 模式的 Binlog 是每一個變更都記錄一條日誌,因此一個簡單的 SQL,在 Binlog 里可能會產生一個巨無霸的事務,例如一個不帶 where 的 update 或 delete 語句,修改了全表裡面的所有記錄,每條記錄都在 Binlog 裡面記錄一次,結果是一個巨大的事務記錄。這樣的大事務經常是產生麻煩的根源。我的一個客戶有一次向我抱怨,一個 Binlog 前滾,滾了兩天也沒有動靜,我把那個 Binlog 解析了一下,發現裡面有個事務產生了 1.4G 的記錄,修改了 66 萬條記錄!下面是一個簡單的找出 Binlog 中大事務的 Python 小程序,我們知道用 mysqlbinlog 解析的 Binlog,每個事務都是以 BEGIN 開頭,以 COMMIT 結束。我們找出 BENGIN 前面的 「# at」 的位置,檢查 COMMIT 後面的 「# at」 位置,這兩個位置相減即可計算出這個事務的大小,下面是這個 Python 程序的例子。

切割 Binlog 中的大事務

對於大的事務,MySQL 會把它分解成多個事件(注意一個是事務 TRANSACTION,另一個是事件 EVENT),事件的大小由參數 binlog-row-event-max-size 決定,這個參數默認是 8K。因此我們可以把若干個事件切割成一個單獨的略小的事務

ROW 模式下,即使我們只更新了一條記錄的其中某個欄位,也會記錄每個欄位變更前後的值,這個行為是 binlog_row_image 參數控制的,這個參數有 3 個值,默認為 FULL,也就是記錄列的所有修改,即使欄位沒有發生變更也會記錄。這樣我們就可以實現類似 Oracle 的 flashback 的功能,我個人估計 MySQL 未來的版本從可能會基於 Binlog 推出這樣的功能。

了解了 Binlog 的結構,再加上 Python 這把瑞士軍刀,我們還可以實現很多功能,例如我們可以統計哪個表被修改地最多?我們還可以把 Binlog 切割成一段一段的,然後再重組,可以靈活地進行 MySQL 資料庫的修改和遷移等工作。

如何分析錯誤日誌啊,mysql\apache\下的日誌文件

錯誤日誌和訪問日誌一樣也是Apache的標準日誌。本文分析錯誤日誌的內容,介紹如何設置和錯誤日誌相關的選項,文檔錯誤和CGI錯誤的分類,以及如何方便地查看日誌內容,等等。

一、位置和內容

錯誤日誌無論在格式上還是在內容上都和訪問日誌不同。然而,錯誤日誌和訪問日誌一樣也提供豐富的信息,我們可以利用這些信息分析伺服器的運行情況、哪裡出現了問題。

錯誤日誌的文件名字是error_log,但如果是Windows平台,則錯誤日誌的文件名字是error.log。錯誤日誌的位置可以通過ErrorLog指令設置:

ErrorLog logs/error.log

除非文件位置用「/」開頭,否則這個文件位置是相對於ServerRoot目錄的相對路徑。如果Apache採用默認安裝方式安裝,那麼錯誤日誌的位置應該在/usr/local/apache/logs下。但是,如果Apache用某種包管理器安裝,錯誤日誌很可能在其他位置。

正如其名字所示,錯誤日誌記錄了伺服器運行期間遇到的各種錯誤,以及一些普通的診斷信息,比如伺服器何時啟動、何時關閉等。

我們可以設置日誌文件記錄信息級別的高低,控制日誌文件記錄信息的數量和類型。這是通過LogLevel指令設置的,該指令默認設置的級別是error,即記錄稱得上錯誤的事件。有關該指令中允許設置的各種選項的完整清單,請參見的Apache文檔。

大多數情況下,我們在日誌文件中見到的內容分屬兩類:文檔錯誤和CGI錯誤。但是,錯誤日誌中偶爾也會出現配置錯誤,另外還有前面提到的伺服器啟動和關閉信息。

二、文檔錯誤

文檔錯誤和伺服器應答中的400系列代碼相對應,最常見的就是404錯誤——Document Not Found(文檔沒有找到)。除了404錯誤以外,用戶身份驗證錯誤也是一種常見的錯誤。

404錯誤在用戶請求的資源(即URL)不存在時出現,它可能是由於用戶輸入的URL錯誤,或者由於伺服器上原來存在的文檔因故被刪除或移動。

順便說一下,按照Jakob Nielson的意見,在不提供重定向或者其他補救措施的情況下,我們永遠不應該移動或者刪除Web網站的任何資源。Nielson的更多文章,請參見。

當用戶不能打開伺服器上的文檔時,錯誤日誌中出現的記錄如下所示:

[Fri Aug 18 22:36:26 2000] [error]

[client 192.168.1.6] File does not exist:

/usr/local/apache/bugletdocs/Img/south-korea.gif

  可以看到,正如訪問日誌access_log文件一樣,錯誤日誌記錄也分成多個項。

錯誤記錄的開頭是日期/時間標記,注意它們的格式和access_log中日期/時間的格式不同。access_log中的格式被稱為「標準英文格式」,這或許是歷史跟我們開的一個玩笑,但現在要改變它已經太遲了。

錯誤記錄的第二項是當前記錄的級別,它表明了問題的嚴重程度。這個級別信息可能是LogLevel指令的文檔中所列出的任一級別(參見前面LogLevel的鏈接),error級別處於warn級別和crit級別之間。404屬於error錯誤級別,這個級別表示確實遇到了問題,但伺服器還可以運行。

錯誤記錄的第三項表示用戶發出請求時所用的IP地址。

記錄的最後一項才是真正的錯誤信息。對於404錯誤,它還給出了完整路徑指示伺服器試圖訪問的文件。當我們料想某個文件應該在目標位置卻出現了404錯誤時,這個信息是非常有用的。此時產生這種錯誤的原因往往是由於伺服器配置錯誤、文件實際所處的虛擬主機和我們料想的不同,或者其他一些意料不到的情況。

由於用戶身份驗證問題而出現的錯誤記錄如下所示:

[Tue Apr 11 22:13:21 2000]

[error] [client 192.168.1.3] user rbowen@rcbowen.

com: authentication failure for “/cgi-bin/hirecareers/company.cgi”:

password mismatch

注意,由於文檔錯誤是用戶請求的直接結果,因此它們在訪問日誌中也會有相應的記錄。

三、CGI錯誤

錯誤日誌最主要的用途或許是診斷行為異常的CGI程序。為了進一步分析和處理方便,CGI程序輸出到STDERR(Standard Error,標準錯誤設備)的所有內容都將直接進入錯誤日誌。這意味著,任何編寫良好的CGI程序,如果出現了問題,錯誤日誌就會告訴我們有關問題的詳細信息。

然而,把CGI程序錯誤輸出到錯誤日誌也有它的缺點,錯誤日誌中將出現許多沒有標準格式的內容,這使得用錯誤日誌自動分析程序從中分析出有用的信息變得相當困難。

下面是一個例子,它是調試Perl CGI代碼時,錯誤日誌中出現的一個錯誤記錄:

[Wed Jun 14 16:16:37 2000] [error] [client 192.168.1.3] Premature

end of script headers: /usr/local/apache/cgi-bin/HyperCalPro/announcement.cgi

Global symbol “$rv” requires explicit package name at

/usr/local/apache/cgi-bin/HyperCalPro/announcement.cgi line 81.

Global symbol “%details” requires explicit package name at

/usr/local/apache/cgi-bin/HyperCalPro/announcement.cgi line 84.

Global symbol “$Config” requires explicit package name at

/usr/local/apache/cgi-bin/HyperCalPro/announcement.cgi line 133.

Execution of /usr/local/apache/cgi-bin/HyperCalPro/announcement.cgi

aborted due to compilation errors.

可以看到,CGI錯誤和前面的404錯誤格式相同,包含日期/時間、錯誤級別以及客戶地址、錯誤信息。但這個CGI錯誤的錯誤信息有好幾行,這往往會干擾一些錯誤日誌分析軟體的工作。

有了這個錯誤信息,即使是對Perl不太熟悉的人也能夠找出許多有關錯誤的信息,例如至少可以方便地得知是哪幾行代碼出現了問題。Perl在報告程序錯誤方面的機制是相當完善的。當然,不同的編程語言輸出到錯誤日誌的信息會有所不同。

由於CGI程序運行環境的特殊性,如果沒有錯誤日誌的幫助,大多數CGI程序的錯誤都將很難解決。

有不少人在郵件列表或者新聞組中抱怨說自己有一個CGI程序,當打開網頁時伺服器卻返回錯誤,比如「Internal Server Error」。我們可以肯定,這些人還沒有看過伺服器的錯誤日誌,或者根本不知道錯誤日誌的存在。決多大多數情況下,錯誤日誌能夠精確地指出CGI錯誤的所在以及如何修正這個錯誤。

四、查看日誌文件

我常常告訴別人說,在進行開發的同時我會不斷地檢查伺服器的日誌,以便能夠立即知道哪兒出了問題。但我得到的回答卻往往是沉默。起先我以為這種沉默意味著「你當然得這樣做」,後來我才發現這種沉默的真正含義是「我不知道別人的做法,但我自己是不幹的。」

雖然如此,下面我們還是要看看如何方便地查看伺服器日誌文件。用telnet連接到伺服器,然後輸入下面的命令:

tail -f /usr/local/apache/logs/error_log

  該命令將顯示出日誌文件的最後幾行內容,如果有新的內容加入到日誌文件,它還會立即顯示出新加入的內容。

Windows用戶也同樣可以使用這種方法,比如可以使用各種為Windows提供的Unix工具軟體包。我個人愛好一個稱為AINTX的工具,它可以在找到。

還有一種替代方法是使用下面的Perl代碼,它利用了一個稱為File::Tail的模塊:

use File::Tail;

$file=File::Tail-new(“/some/log/file”);

while (defined($line=$file-read)) {

print “$line”;

}

無論具體採用的是哪一種方法,同時打開多個終端窗口都是一種好習慣:比如在一個窗口中顯示錯誤日誌,在另一個窗口中顯示訪問日誌。這樣,我們就能夠隨時獲知網站上發生的事情並立即予以解決。轉載

如何查看mysql資料庫的日誌文件

一.錯誤日誌

錯誤日誌在Mysql資料庫中很重要,它記錄著mysqld啟動和停止,以及伺服器在運行過程中發生的任何錯誤的相關信息。

1.配置信息

–log-error=[file-name]用來指定錯誤日誌存放的位置。

如果沒有指定[file-name],默認hostname.err做為文件名,默認存放在DATADIR目錄中。

也可以將log-error配置到my.cnf文件中,這樣就省去了每次在啟動mysqld時都手工指定–log-error.例如:

[mysql@test2]$ vi /etc/my.cnf

# The MySQL server

[mysqld]

….

log-error = /var/lib/mysql/test2_mysqld.err

…..

2.錯誤信息樣板

080313 05:21:55 mysqld started

080313 5:21:55 InnoDB: Started; log sequence number 0 43655

080313 5:21:55 [Note] /usr/local/mysql/bin/mysqld: ready for connections.

Version: ‘5.0.26-standard-log’ socket: ‘/var/lib/mysql/mysql.sock’ port: 3306 MySQL Community Edition – Standard (GPL)

080313 5:24:13 [Note] /usr/local/mysql/bin/mysqld: Normal shutdown

080313 5:24:13 InnoDB: Starting shutdown…

080313 5:24:16 InnoDB: Shutdown completed; log sequence number 0 43655

080313 5:24:16 [Note] /usr/local/mysql/bin/mysqld: Shutdown complete

080313 05:24:16 mysqld ended

080313 05:24:47 mysqld started

080313 5:24:47 InnoDB: Started; log sequence number 0 43655

080313 5:24:47 [Note] /usr/local/mysql/bin/mysqld: ready for connections.

Version: ‘5.0.26-standard-log’ socket: ‘/var/lib/mysql/mysql.sock’ port: 3306 MySQL Community Edition – Standard (GPL)

080313 5:33:49 [Note] /usr/local/mysql/bin/mysqld: Normal shutdown

三.查詢日誌

查詢日誌記錄了clinet的所有的語句。

Note:由於log日誌記錄了資料庫所有操作,對於訪問頻繁的系統,此種日誌會造成性能影響,建議關閉。

1.配置信息

–log=[file-name]用來指定錯誤日誌存放的位置。

如果沒有指定[file-name],默認為主機名(hostname)做為文件名,默認存放在DATADIR目錄中。

也可以將log配置到my.cnf文件中,這樣就省去了每次在啟動mysqld時都手工指定–log.例如:

# The MySQL server

[mysqld]

……

#query-log

log = /var/lib/mysql/query_log.log

……

2.讀取查詢日誌

查詢日誌是純文本格可,可以使用OS文本讀取工具直接打開查看。例如:

[mysql@test2]$ tail -n 15 query_log.log

080313 7:58:28 17 Query show tables

080313 8:07:45 17 Quit

080313 10:01:48 18 Connect root@localhost on

080313 10:02:38 18 Query SELECT DATABASE()

18 Init DB test

080313 10:02:42 18 Query show tables

080313 10:03:07 18 Query select * from pet

080313 10:06:26 18 Query insert into pet values(‘hunter’,’yxyup’,’cat’,’f’,’1996-04-29′,null)

080313 10:06:39 18 Query select * from pet

080313 10:07:13 18 Query update pet set sex=’m’ where name=’hunter’

080313 10:07:38 18 Query delete from pet where name=’hunter’

080313 10:13:48 18 Query desc test8

080313 10:14:13 18 Query create table t1(id int,name char(10))

080313 10:14:41 18 Query alter table t1 add sex char(2)

[mysql@test2]$

四.慢查詢日誌

慢查詢日誌是記錄了執行時間超過參數long_query_time(單位是秒)所設定值的SQL語句日誌。

Note:慢查詢日誌對於我們發現性能有問題的SQL有很幫助,建議使用並經常分析

1.配置信息

–log-slow-queries=[file-name]用來指定錯誤日誌存放的位置。

如果沒有指定[file-name],默認為hostname-slow.log做為文件名,默認存放在DATADIR目錄中。

也可以將log-slow-queries配置到my.cnf文件中,這樣就省去了每次在啟動mysqld時都手工指定–log-slow-queries.例如:

# The MySQL server

[mysqld]

……

#slow-query-log

log-slow-queries = /var/lib/mysql/slow_query_log.log

……

2.讀取慢查詢日誌

[mysql@test2]$ cat slow_query_log.log

/usr/local/mysql/bin/mysqld, Version: 5.0.26-standard-log. started with:

Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock

Time Id Command Argument

# Time: 080313 5:41:46

# User@Host: root[root] @ localhost []

# Query_time: 108 Lock_time: 0 Rows_sent: 0 Rows_examined: 8738

use test;

select count(1) from t1 a, t1 b,t1 c where a.id=b.id and b.name=c.name;

# Time: 080313 5:52:04

# User@Host: root[root] @ localhost []

# Query_time: 583 Lock_time: 0 Rows_sent: 0 Rows_examined: 508521177

select count(1) from t1 a, t1 b where a.id=b.id;

/usr/local/mysql/bin/mysqld, Version: 5.0.26-standard-log. started with:

Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock

Time Id Command Argument

# Time: 080313 10:39:59

# User@Host: root[root] @ localhost []

# Query_time: 11 Lock_time: 0 Rows_sent: 4537467 Rows_examined: 4537467

use test;

select id from tail;

如果慢查詢日誌記錄很多可以使用mysqldumpslow進行分類匯總

[mysql@test2]$ mysqldumpslow slow_query_log.log

Reading mysql slow query log from slow_query_log.log

Count: 1 Time=583.00s (583s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost

select count(N) from t1 a, t1 b where a.id=b.id

Count: 1 Time=108.00s (108s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost

select count(N) from t1 a, t1 b,t1 c where a.id=b.id and b.name=c.name

Count: 1 Time=11.00s (11s) Lock=0.00s (0s) Rows=4537467.0 (4537467), root[root]@localhost

select id from tail;

mysql有以下幾種日誌:

錯誤日誌: -log-err

查詢日誌: -log

慢查詢日誌: -log-slow-queries

更新日誌: -log-update

二進位日誌: -log-bin

在mysql的安裝目錄下,打開my.ini,在後面加上上面的參數,保存後重啟mysql服務就行了。

例如:

#Enter a name for the binary log. Otherwise a default name will be used.

#log-bin=

#Enter a name for the query log file. Otherwise a default name will be used.

#log=

#Enter a name for the error log file. Otherwise a default name will be used.

log-error=

#Enter a name for the update log file. Otherwise a default name will be used.

#log-update=

查看日至:

1. 首先確認你日誌是否啟用了

mysqlshow variables like ‘log_bin’;

如果啟用了,即ON

那日誌文件就在mysql的安裝目錄的data目錄下

cat/tail 日誌文件名

2. 怎樣知道當前的日誌

mysql show master status;

3. 查看從某一段時間到某一段時間的日誌

mysqlbinlog –start-datetime=’2008-01-19 00:00:00′

–stop-datetime=’2008-01-30 00:00:00′ /var/log/mysql/mysql-bin.000006

mysqllog1.log

mysql日誌 可以分析出什麼

開啟MySQL日誌:

找到my.ini文件

打開 log-bin=”D:\log\mysql_bin”

就會生成形如:

mysql_bin.000001

mysql_bin.index

這樣的文件。

查看MySQL日誌:

D:\mysql\binmysqlbinlog mysql_bin.000001

導出MySQL日誌到文本文件:

D:\mysql\binmysqlbinlog D:\mysql\data\mysql_bin.000002 D:\b.txt

更新MySQL日誌:

mysqladmin -u root -p password flush-logs

就會生成新的日誌文件,序號是連接起來的,比如上一個日誌文件名為:

mysql_bin.000001

執行命令後就會生成新的日誌文件:

mysql_bin.000002

原創文章,作者:HTAAI,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/317270.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
HTAAI的頭像HTAAI
上一篇 2025-01-11 16:27
下一篇 2025-01-11 16:27

相關推薦

發表回復

登錄後才能評論