來吧,瞭解下mysql有哪些log

概述

mysql裏面有不少log,好比用於主從同步的bin_log,防止數據丟失的redo_log,慢查詢日誌slow_log等等mysql

redo log

InnoDB有buffer pool(簡稱bp)。
bp是數據庫頁面的緩存, 對InnoDB的任何修改操做都會首先在bp的page上進行,而後這樣的頁面將被標記爲dirty並被放到專門的flush list上,後續將由master thread或專門的刷髒線程階段性的將這些頁面寫入磁盤(disk or ssd)。這樣的好處是避免每次寫操做都操做磁盤致使大量的隨機IO,階段性的刷髒能夠將屢次對頁面的修改merge成一次IO操做,同時異步寫入也下降了訪問的時延。然而,若是在dirty page還未刷入磁盤時,server非正常關閉,這些修改操做將會丟失,若是寫入操做正在進行,甚至會因爲損壞數據文件致使數據庫不可用。爲了不上述問題的發生,Innodb將全部對頁面的修改操做寫入一個專門的文件,並在數據庫啓動時今後文件進行恢復操做,這個文件就是redo log file。 這樣的技術推遲了bp頁面的刷新,從而提高了數據庫的吞吐,有效的下降了訪問時延。 帶來的問題是額外的寫redo log操做的開銷(順序IO,固然很快),以及數據庫啓動時恢復操做所需的時間。

Undo Log

Undo
Log是爲了 實現事務的原子性,在MySQL數據庫InnoDB存儲引擎中,還用UndoLog來實現多版本併發控制(簡稱:MVCC)。
事務的原子性(Atomicity)
事務中的全部操做,要麼所有完成,要麼不作任何操做,不能只作部分操做。若是在執行的過程當中發了錯誤,要回滾(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過。

bin-log

binlog有三種格式: Statement、Row以及Mixed

Statement

基於SQL語句的複製(statement-based replication,SBR),
每一條會修改數據的sql語句會記錄到binlog中。優勢是並不須要記錄每一條sql語句和每一行的數據變化,減小了binlog日誌量,節約IO,提升性能。缺點是在某些狀況下會致使master-slave中的數據不一致(如sleep()函數, last_insert_id(),以及user-defined functions(udf)等會出現問題)c++

Row

基於行的複製(row-based replication,RBR),默認
不記錄每條sql語句的上下文信息,僅需記錄哪條數據被修改了,修改爲什麼樣了。並且不會出現某些特定狀況下的存儲過程、或function、或trigger的調用和觸發沒法被正確複製的問題。缺點是會產生大量的日誌,尤爲是alter table的時候會讓日誌暴漲。sql

Mixed

混合模式複製(mixed-based replication,MBR)。
以上兩種模式的混合使用,通常的複製使用STATEMENT模式保存binlog,對於STATEMENT模式沒法複製的操做使用ROW模式保存binlog,MySQL會根據執行的SQL語句選擇日誌保存方式。
查看binlog_format
show variables like 'binlog_format'數據庫

relay_log:

Mysql 主節點將binlog寫入本地,從節點定時請求增量binlog,主節點將binlog同步到從節點。 從節點單獨進程會將binlog
拷貝至本地 relaylog中。
從節點定時重放relay log

slow-log

慢查詢就是經過設置來記錄超過必定時間的SQL語句,通常經過slowlog找到影響系統性能的sql

開啓slow-log

在my.conf 中增長緩存

slow_query_log = 1 // 開啓slow-log long_query_time = 1 //
查詢時間超過1s的sql會被記錄

分析slow-log

在slow-log目錄下執行
more slow-query.log
clipboard.png併發

Query_time: 查詢耗時
Rows_examined: 檢查了多少條記錄
Rows_sent : 返回了多少行記錄(結果集)
經過分析slow-log文件,能夠找到最慢的sql
按Rows_examined 逆序,列出前100條
grep Rows_examined slow-query.log | sort -g -k9 -r|uniq -u |head -100
指定Rows_examined一值,查找
grep -A 1 -B 2 "Rows_examined: 24460" slow-query.log
看到每秒的慢查詢統計
awk '/^#Time:/{print $3,$4,c;c=0}/^# User /{c++}' slow-query.log >/tmp/aaa.log

mysqldumpslow命令

訪問時間最長的10個sql語句異步

mysqldumpslow -t 10 /usr/local/mysql/log/3304/slowquery.log

訪問次數最多的10個sql語句函數

mysqldumpslow -s c -t 10 /usr/local/mysql/log/3304/slowquery.log

訪問記錄集最多的10個sql性能

mysqldumpslow -s r -t 10 /usr/local/mysql/log/3304/slowquery.log

獲得按照時間排序的前10條裏面含有左鏈接的查詢語句spa

mysqldumpslow -s t -t 10 -g 「left join」 /usr/local/mysql/log/3304/slowquery.log

詳見mysqldumpslow -h

general_log

general_log能夠 記錄全部執行過的sql,用於排查分析sql性能,但記錄log會增長系統負擔,能夠暫時開啓,分析完以後再關閉general_log

開啓general_log

clipboard.png

查看general_log

clipboard.png

相關文章
相關標籤/搜索