Mysql 日誌總結

Mysql 日誌總結

 

主要包含:錯誤日誌、查詢日誌、慢查詢日誌、事務日誌、二進制日誌

1. 錯誤日誌

記錄MySQL的啓動、停止信息以及在MySQL運行過程中的錯信息。

(默認啓)

參數:

 

log_error(默認開啓)

    log_error=[path/[file_name]],如果不指定文件名,則默認hostname.err.

修改後重啓生效

 

log_warnings(在5.7.2之後被不建議使用,取而代之的是log_error_verbosity

0:數據庫啓動時候加載的內容+數據庫啓動後的錯誤+從庫停止,

會有記錄(從庫)

1 (默認):Aborted connection(5.6半同步,如果從庫超時,則日誌會記錄)

 

log_error_verbosity(5.7.2被引入)

Verbosity Value Message Types Logged

1 Errors only

2 Errors and warnings

3(默認) Errors, warnings, and notes

 

查看錯誤日誌的位置:

show variables like 'log_error';

 

刪除錯誤日誌 —Error log

<5.5.7版本時,flush logs會將filename.err命名爲filename.err_old

>5.5.7版本則只是會重建錯誤日誌,也就是除非錯誤日誌被刪除了會重建一個;否則不會對線上錯誤日誌有影響。

 

注意:刪除錯誤日誌後,不會自動重建。需要flush logs或者重啓數

據庫。

mysqladmin -u root -p flush-logs

或者

mysql>flush logs;

 

2. 查詢日誌

默認情況下查詢日誌是關閉的。由於查詢日誌會記錄用戶的所有操作,其中還包含增刪查改等信息,在併發操作大的環境下會產生大量的信息從而導致不必要的磁盤IO,會影響mysql的性能的。

 

參數:

general_log(默認關閉){0-關閉,1-開啓} 可以在線打開和關閉;

set global general_log='ON';

general_log_file=file_name,不指定文件名只指定路徑路徑則爲hostname.log

 

關於表mysql.general_log表:

select * from mysql.general_log;

• 表mysql.general_log不支持insertupdatedelete

• 表是不同步的(複製),不寫binlog

dump的時候會被忽略掉,5.6.6以後只能dump表結構,內容不會dump出來.

 

log_output=TABLE | FILE | NONE   --查詢日誌的記錄方式

TABLE:便於統計,寫入一個CSV引擎的表中。

FILE:默認。

TABLEFILE:便於統計,寫入一個CSV引擎的表中。

NONE:任何地方都不寫。

注意:如果log_output=NONE但是general_log1,則默認不寫常規日誌。

 

set sql_log_off=ON 當前操作不寫常規日誌。

 

刪除、備份general 日誌:

[root@mytest02 mysql]# mv mytest02.log mytest02.log.bak

[root@mytest02 mysql]# mysqladmin -uroot -proot flush-logs

一定記住flush logs;或者mysqladmin flush-logs

 

3. 慢查詢日誌

MySQL的慢查詢日誌是MySQL提供的一種日誌記錄,它用來記錄在MySQL中響應時間超過閥值(long_query_timemin_examined_row_limitlog_slow_admin_statements andlog_queries_not_using_indexes)的語句。(默認關閉)

 

注意:慢查詢日誌不會計算語句在開始執行之前等待鎖的時間(initial slow query),mysqld只會從語句等待的鎖釋放掉,並開始執行開始計算時間(執行開始後的鎖定時間會記錄)。所以慢查詢日誌中的語句順序和語句的發出順序或者general log的順序不同。

 

參數:

slow_query_log(默認關閉){0-關閉,1-開啓} 可以在線打開和關閉;

set global slow_query_log='ON';

slow_query_log_file=file_name,不指定路徑則爲hostname-slow.log

long_query_timeSQL執行的閥值

log_output=TABLE | FILE | NONE

TABLE:便於統計,寫入一個CSV引擎的表mysql.slow_log中。

FILE:默認。

TABLEFILE:便於統計,寫入一個CSV引擎的表mysql.slow_log中。

NONE:任何地方都不寫。

注意:如果log_output=NONE但是slow_query_log1,則默認不寫常規日誌。

 

log_queries_not_using_indexes:記錄沒有用索引的查詢

log_throttle_queries_not_using_indexes:記錄沒有使用索引查詢的語句條數在一分鐘內記錄的條數

*如何消除上線後未使用索引查詢的隱患。線上開啓5秒即可。

 

min_examined_row_limit:要檢查的行數大於等於N時才記錄爲慢查詢,前提是必須滿足long_query_timelog-queries-not-using-indexes約束。

 

log_slow_admin_statements:管理語句是否記錄ALTER TABLE, ANALYZE TABLE, CHECK TABLE,

CREATE INDEX, DROP INDEX, OPTIMIZE TABLE,and REPAIR TABLE.

log_slow_slave_statements:從庫的語句執行是否記錄

 

分析慢查詢日誌:

mysqldumpslow -s r -t 10 /database/mysql/slow-log

 得到返回記錄集最多的10個查詢。

mysqldumpslow -s t -t 10 -g  “left join”  /database/mysql/slow-log

 得到按照時間排序的前10條裏面含有左連接的查詢語句。

輸出結果分析

 

 

4. 二進制日誌

以“事件”的形式保存,描述數據的更改,包含關於每個更新數據庫的語句的執行時間。

注意:binlog只記錄完整事務。

目的:最大可能地恢復數據庫

啓用該選項數據庫性能降低1%,但保障數據庫完整性,對於重要數據庫值得以性能換完整。

參數:

 

log_bin(默認關閉){0-關閉,1-開啓} 不可以在線打開和關閉;

修改my.cnf中的參數!

log_bin_basename,不指定路徑則爲hostname-bin.00000N

log_bin_index,不置頂路徑則爲hostname-bin.index

 

注意:

所有的日誌都建議自己起名字,不要用默認!

 

binlog_cache_size:內存中緩存二進制的緩衝區大小。

注意:對於大的事務,二進制日誌會超過max_binlog_size設定的值。也

即是事務僅僅寫入一個二進制日誌。

 

 

二進制日誌記錄在語句或事務完成之後立即執行(而不是在任何鎖釋放或任何提交完成之前寫入),這確保日誌以提交順序登錄。對於不支持事務的表,執行之後馬上會被記錄到二進制日誌中去。對於未提交的事務中,更改事務表(例如InnoDB表)的所有更新(UPDATEDELETEINSERT)將被緩存,直到服務器收到COMMIT語句。 在這一點上,mysqld在執行COMMIT之前將整個事務寫入二進制日誌。對非事務性表的修改無法回滾。 如果回滾的事務包括對非事務性表的修改,則會在最後使⽤用ROLLBACK語句記錄整個事務,以確保對這些表的修改進行復制。

 

當處理事務的線程開始時,它將緩衝區語句分配一個binlog_cache_size緩衝區。 如果一個語句大於這個值,線程將打開一個臨時文件來存儲事務。 當線程結束時,臨時文件被刪除。

binlog_cache_use狀態變量顯示用於存儲語句的此緩衝區(可能還有一個臨時文件)的事務數。

binlog_cache_disk_use狀態變量顯示有多少這些事務實際上必須使用臨時文件。

這兩個變量可用於將binlog_cache_size調整到足夠大的值,以避免使用臨時文件。

max_binlog_cache_size系統變量(默認爲4GB,也是最大值)可用於限制用於緩存多語

句事務的總大小。 如果一個事務大於這個多個字節,它將失敗並回滾。 最小值爲4096

 

sync_binlog{0,1}二進制內容從緩衝區落入磁盤的時機。

5.7.7以後,sync_binlog參數被默認設置爲1,減少了binlog中的

不一致可能性。

 

expire_logs_days:日誌過期時間,一定要和備份相結合。

binlog_formatbinlog模式。

• 基於語句句:當時語句句的原樣寫⼊入。

• 基於⾏行行:只記錄受影響的⾏行行。

• 混合模式:默認⽤用語句句模式,遇到下⾯面情況⽤用基於⾏行行:

uuid()

UDF

temporary

rows_found/row_count

user()/current_user()

LOAD_FILE()

 

二進制日誌的維護:

• 切換二進制日誌:

flush logs;

• 清理所有二進制日誌,並從新開始記錄二進制日誌:

reset master;

• 清理指定編號之前的二進制日誌:

purge binary logs to 3306-bin.000005;

• 清理指定時間前的二進制日誌:

purge binary logs before '2017-02-25 19:30:57';

 

不建議手動rm刪除二進制日誌,會造成index文件不一致。

 

 

5. 事務日誌

事務日誌(InnoDB特有的日誌)可以幫助提高事務的效率。使用事務日誌,存儲引擎在修改表的數據時只需要修改其內存拷貝,再把改修改行爲記錄到持久在硬盤上的事務日誌中,而不用每次都將修改的數據本身持久到磁盤。事務日誌採用追加的方式,因此寫日誌的操作是磁盤上一小塊區域內的順序I/O,而不像隨機I/O需要在磁盤的多個地方移動磁頭,所以採用事務日誌的方式相對來說要快得多。事務日誌持久以後,內存中被修改的數據在後臺可以慢慢的刷回到磁盤。目前大多數的存儲引擎都是這樣實現的,我們通常稱之爲預寫式日誌,修改數據需要寫兩次磁盤。

 

如果數據的修改已經記錄到事務日誌並持久化,但數據本身還沒有寫回磁盤,此時系統崩潰,存儲引擎在重啓時能夠自動恢復這部分修改的數據。具有的恢復方式則視存儲引擎而定。

 

參數:

innodb_log_group_home_dir

InnoDB重做日誌文件的目錄路徑。 如果沒有指定任何InnoDB日誌變量,則默認是在

MySQL數據目錄中創建兩個名爲ib_logfile0ib_logfile1的文件。

 

innodb_log_files_in_group

日誌組中的日誌文件數。 InnoDB以循環方式寫入文件。 默認(和推薦)值爲2.文件的位置由innodb_log_group_home_dir指定。

 

innodb_log_file_size

日誌組中每個日誌文件的大小(以字節爲單位)。 日誌文件(innodb_log_file_size *innodb_log_files_in_group)的組合大小不能超過略小於512GB的最大值。默認值爲48M。最小值爲4M5.7.11

 

innodb_file_per_table

可以修改InnoDB爲獨立表空間模式,每個數據庫的每個表都會生成一個數據空間。

獨立表空間優點:

1. 每個表都有自已獨立的表空間。

2. 每個表的數據和索引都會存在自已的表空間中。

3. 可以實現單表在不同的數據庫中移動。

4. 空間可以回收(除drop table操作處,表空不能自已回收)

 

支持在線修改:

SET GLOBAL innodb_file_per_table=1;

如何將表從系統表空間中分離出來

SET GLOBAL innodb_file_per_table=1;

ALTER TABLE table_name ENGINE=InnoDB;

 

innodb_flush_log_at_trx_commit           

0log buffer將每秒一次地寫入log file中,並且log fileflush(刷到磁盤)操作同時進行。該模式下在事務提交的時候,不會主動觸發寫入磁盤的操作。

1:每次事務提交時MySQL都會把log buffer的數據寫入log file,並且flush(刷到磁盤)中去,該模式爲系統默認。

2:每次事務提交時MySQL都會把log buffer的數據寫入log file,但是flush(刷到磁盤)操作並不會同時進行。該模式下,MySQL會每秒執行一次 flush(刷到磁盤)操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章