mysql log_来吧,了解下mysql有哪些log
概述
mysql里面有很多l(xiāng)og,比如用于主從同步的bin_log,防止數(shù)據(jù)丟失的redo_log,慢查詢?nèi)罩緎low_log等等
redo log
InnoDB有buffer pool(簡稱bp)。
bp是數(shù)據(jù)庫頁面的緩存,對InnoDB的任何修改操作都會首先在bp的page上進(jìn)行,然后這樣的頁面將被標(biāo)記為dirty并被放到專門的flush list上,后續(xù)將由master thread或?qū)iT的刷臟線程階段性的將這些頁面寫入磁盤(disk or ssd)。這樣的好處是避免每次寫操作都操作磁盤導(dǎo)致大量的隨機(jī)IO,階段性的刷臟可以將多次對頁面的修改merge成一次IO操作,同時異步寫入也降低了訪問的時延。然而,如果在dirty page還未刷入磁盤時,server非正常關(guān)閉,這些修改操作將會丟失,如果寫入操作正在進(jìn)行,甚至?xí)捎趽p壞數(shù)據(jù)文件導(dǎo)致數(shù)據(jù)庫不可用。為了避免上述問題的發(fā)生,Innodb將所有對頁面的修改操作寫入一個專門的文件,并在數(shù)據(jù)庫啟動時從此文件進(jìn)行恢復(fù)操作,這個文件就是redo log file。 這樣的技術(shù)推遲了bp頁面的刷新,從而提升了數(shù)據(jù)庫的吞吐,有效的降低了訪問時延。 帶來的問題是額外的寫redo log操作的開銷(順序IO,當(dāng)然很快),以及數(shù)據(jù)庫啟動時恢復(fù)操作所需的時間。
Undo Log
Undo
Log是為了實現(xiàn)事務(wù)的原子性,在MySQL數(shù)據(jù)庫InnoDB存儲引擎中,還用UndoLog來實現(xiàn)多版本并發(fā)控制(簡稱:MVCC)。
事務(wù)的原子性(Atomicity)
事務(wù)中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作。如果在執(zhí)行的過程中發(fā)了錯誤,要回滾(Rollback)到事務(wù)開始前的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過。
bin-log
binlog有三種格式:Statement、Row以及Mixed。
Statement
基于SQL語句的復(fù)制(statement-based replication,SBR),
每一條會修改數(shù)據(jù)的sql語句會記錄到binlog中。優(yōu)點是并不需要記錄每一條sql語句和每一行的數(shù)據(jù)變化,減少了binlog日志量,節(jié)約IO,提高性能。缺點是在某些情況下會導(dǎo)致master-slave中的數(shù)據(jù)不一致(如sleep()函數(shù), last_insert_id(),以及user-defined functions(udf)等會出現(xiàn)問題)
Row
基于行的復(fù)制(row-based replication,RBR),默認(rèn)
不記錄每條sql語句的上下文信息,僅需記錄哪條數(shù)據(jù)被修改了,修改成什么樣了。而且不會出現(xiàn)某些特定情況下的存儲過程、或function、或trigger的調(diào)用和觸發(fā)無法被正確復(fù)制的問題。缺點是會產(chǎn)生大量的日志,尤其是alter table的時候會讓日志暴漲。
Mixed
混合模式復(fù)制(mixed-based replication,MBR)。
以上兩種模式的混合使用,一般的復(fù)制使用STATEMENT模式保存binlog,對于STATEMENT模式無法復(fù)制的操作使用ROW模式保存binlog,MySQL會根據(jù)執(zhí)行的SQL語句選擇日志保存方式。
查看binlog_format
show variables like 'binlog_format'
relay_log:
Mysql 主節(jié)點將binlog寫入本地,從節(jié)點定時請求增量binlog,主節(jié)點將binlog同步到從節(jié)點。 從節(jié)點單獨進(jìn)程會將binlog
拷貝至本地 relaylog中。
從節(jié)點定時重放relay log。
slow-log
慢查詢就是通過設(shè)置來記錄超過一定時間的SQL語句,一般通過slowlog找到影響系統(tǒng)性能的sql
開啟slow-log
在my.conf 中增加
slow_query_log = 1 // 開啟slow-log long_query_time = 1 //
查詢時間超過1s的sql會被記錄
分析slow-log
在slow-log目錄下執(zhí)行
more slow-query.log
Query_time: 查詢耗時
Rows_examined: 檢查了多少條記錄
Rows_sent : 返回了多少行記錄(結(jié)果集)
通過分析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
看到每秒的慢查詢統(tǒng)計
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
訪問次數(shù)最多的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條里面含有左連接的查詢語句
mysqldumpslow -s t -t 10 -g “l(fā)eft join” /usr/local/mysql/log/3304/slowquery.log
詳見mysqldumpslow -h
general_log
general_log可以記錄所有執(zhí)行過的sql,用于排查分析sql性能,但記錄log會增加系統(tǒng)負(fù)擔(dān),可以暫時開啟,分析完之后再關(guān)閉general_log
開啟general_log
查看general_log
總結(jié)
以上是生活随笔為你收集整理的mysql log_来吧,了解下mysql有哪些log的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 松滋市属于哪个市(湖北荆州市松滋地理位置
- 下一篇: mysql all_同样是MySQL的a
