引用自 https://blog.csdn.net/feierleba/article/details/64131731
mysql 5.5 有以下幾種日志:
錯(cuò)誤日志(error log): log-err
查詢?nèi)罩?general query log): log
慢查詢?nèi)罩? -log-slow-queries
二進(jìn)制日志 (binary log): log-bin
中繼日志( relay log)
innodb 在線redo 日志
默認(rèn)情況下,沒有啟動(dòng)任何log,可以通過(guò)log 選項(xiàng)來(lái)啟動(dòng)相關(guān)的log
是否啟用了日志
mysql>show variables like 'log_%';
怎樣知道當(dāng)前的日志
mysql> show master status;
顯示二進(jìn)制日志數(shù)目
mysql> show master logs;
看二進(jìn)制日志文件用mysqlbinlog
shell>mysqlbinlog mail-bin.000001
或者shell>mysqlbinlog mail-bin.000001 | tail
在配置文件中指定log的輸出位置.
Windows:Windows 的配置文件為 my.ini,一般在 MySQL 的安裝目錄下或者 c:\Windows 下。
Linux:Linux 的配置文件為 my.cnf ,一般在 /etc 下。
在linux下:
Sql代碼 [圖片上傳失敗...(image-1f7de4-1551249610357)]
-
在[mysqld] 中輸入
-
log
- log-error=/usr/local/mysql/log/error.log
- log=/usr/local/mysql/log/mysql.log
- long_query_time=2
- log-slow-queries= /usr/local/mysql/log/slowquery.log
windows下:
Sql代碼 [圖片上傳失敗...(image-67a9bf-1551249610357)]
-
在[mysqld] 中輸入
-
log
- log-error="E:/PROGRA1/EASYPH1.0B1/mysql/logs/error.log"
- log="E:/PROGRA1/EASYPH1.0B1/mysql/logs/mysql.log"
- long_query_time=2
- log-slow-queries= "E:/PROGRA1/EASYPH1.0B1/mysql/logs/slowquery.log"
開啟慢查詢
long_query_time =2 --是指執(zhí)行超過(guò)多久的sql會(huì)被log下來(lái),這里是2秒
log-slow-queries= /usr/local/mysql/log/slowquery.log --將查詢返回較慢的語(yǔ)句進(jìn)行記錄
log-queries-not-using-indexes = nouseindex.log --就是字面意思,log下來(lái)沒有使用索引的query
log=mylog.log --對(duì)所有執(zhí)行語(yǔ)句進(jìn)行記錄
mysql> show variables like 'log_%';
+---------------------------------+--------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------+
| log_bin | ON |
| log_bin_trust_function_creators | OFF |
| log_error | /var/lib/mysql/mysql.log |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | ON |
| log_slow_queries | OFF |
| log_warnings | 1 |
+---------------------------------+--------------------------+
8 rows in set (0.00 sec)
默 認(rèn)情況下,所有日志創(chuàng)建于mysqld數(shù)據(jù)目錄中。通過(guò)刷新日志,你可以強(qiáng)制 mysqld來(lái)關(guān)閉和重新打開日志文件(或者在某些情況下切換到一個(gè)新的日志)。當(dāng)你執(zhí)行一個(gè)FLUSH LOGS語(yǔ)句或執(zhí)行mysqladmin flush-logs或mysqladmin refresh時(shí),出現(xiàn)日志刷新
1. 錯(cuò)誤日志
錯(cuò)誤日志記錄著mysqld啟動(dòng)和停止,以及服務(wù)器在運(yùn)行過(guò)程中發(fā)生的錯(cuò)誤的相關(guān)信息。在默認(rèn)情況下,系統(tǒng)記錄錯(cuò)誤日志的功能是關(guān)閉的,錯(cuò)誤信息被輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出。需要在啟動(dòng)的時(shí)候開啟 log-error選項(xiàng)
如果沒有指定文件名 默認(rèn)hostname.err,默認(rèn)路徑為datadir目錄
指定日志路徑兩種方法
編輯my.cnf 寫入 log-error=[path]
通過(guò)命令參數(shù)錯(cuò)誤日志 mysqld_safe --user=mysql --log-error=[path] &
mysql> show variables like '%err%' ;
+--------------------+--------------------------+
| Variable_name | Value |
+--------------------+--------------------------+
| error_count | 0 |
| log_error | /var/log/mysql/mysql.log |
| max_connect_errors | 10 |
| max_error_count | 64 |
| slave_skip_errors | OFF |
+--------------------+--------------------------+
5 rows in set (0.00 sec)
error log 的清理
mv mysql.log mysql_old.log
mysqladmin -uroot -pmysql flush-logs
On Windows, use rename rather than mv.
2 查詢?nèi)罩?general query log
Geleral log記錄了服務(wù)器接收到的每一個(gè)查詢或是命令,無(wú)論這些查詢或是命令是否正確甚至是否包含語(yǔ)法錯(cuò)誤,general log 都會(huì)將其記錄下來(lái) ,記錄的格式為 {Time ,Id ,Command,Argument }。也正因?yàn)閙ysql服務(wù)器需要不斷地記錄日志,開啟General log會(huì)產(chǎn)生不小的系統(tǒng)開銷。 因此,Mysql默認(rèn)是把General log關(guān)閉的。 general query log寫入日志是在客戶端執(zhí)行命令,并且釋放鎖之前,寫入日志
數(shù)據(jù)庫(kù)訪問量很大,想要從SQL方面進(jìn)行優(yōu)化,因?yàn)闉榱诵阅芸紤],一般general log不會(huì)開啟。slow log可以定位一些有性能問題的sql,而general log會(huì)記錄所有的SQL。l
general query log和slow query log開始支持寫到文件或者數(shù)據(jù)庫(kù)表兩種方式,并且日志的開啟,輸出方式的修改,都可以在Global級(jí)別動(dòng)態(tài)修改。
查看日志的存放方式 show variables like 'log_output';
mysql> show variables like "%log_output%" ;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
1 row in set (0.00 sec)
如果設(shè)置mysql> set global log_output='table' 的話,則日志結(jié)果會(huì)記錄到名為gengera_log的表中,這表的默認(rèn)引擎都是CSV
如果設(shè)置表數(shù)據(jù)到文件 set global log_output=file;
設(shè)置general log的日志文件路徑:set global general_log_file='/tmp/general.log';
開啟general log: set global general_log=on; ---不需要服務(wù)器的重啟
關(guān)閉general log: set global general_log=off;
查看tmp/general.log的信息,可以大致看到哪些sql查詢/更新/刪除/插入比較頻繁了。比如有些表不是經(jīng)常變化的,查詢量又很大,就完全可以cache;對(duì)主備延遲要求不高的表,讀可以放到備庫(kù);等等
general query log 的清理
mv general.log general_old.log
mysqladmin -uroot -pmysql flush-logs
On Windows, use rename rather than mv.
tcsql perf test "
set global sql_log_off=on; 可以讓 當(dāng)前session不記錄 執(zhí)行的sql 語(yǔ)句
3、慢查詢?nèi)罩? -log-slow-queries
慢查詢?nèi)罩静捎玫氖呛?jiǎn)單的文本格式,可以通過(guò)文本編輯器查看其中的內(nèi)容,其中記錄了語(yǔ)句的執(zhí)行時(shí)刻,執(zhí)行消耗的時(shí)間,執(zhí)行用戶,連接主機(jī)等相關(guān)信息。mysql還提供了專門分析日志的工具, mysqlslowdump用來(lái)解決可能存在的性能問題。
慢查詢只有在大于
long_query_time 指定時(shí)間的sql statement , min_examined_row_limit最小檢查行數(shù)限制 才會(huì)被檢查,語(yǔ)句被寫入slow log 是在語(yǔ)句被執(zhí)行后,并且釋放鎖之前,默認(rèn)情況下,慢查詢?nèi)罩臼潜魂P(guān)閉的
long_query_time 的值被設(shè)置為0-10之間,默認(rèn)值是10.
log_slow_admin_statements : 系統(tǒng)管理語(yǔ)句 就在慢查詢?nèi)罩局? 系統(tǒng)管理語(yǔ)句包括 ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, and REPAIR TABLE.
log_queries_not_using_indexes 默認(rèn)情況下,管理語(yǔ)句和不使用索引的語(yǔ)句是不會(huì)記錄在慢查詢中的,需要人工設(shè)置
log-short-format 記錄少量的日志
log_throttle_queries_not_using_indexes :5.6.5版本開始新增了一個(gè)參數(shù)log_throttle_queries_not_using_indexes,用來(lái)表示每分鐘允許記錄到slow log的且未使用索引的SQL語(yǔ)句次數(shù)。 該值默認(rèn)為0,表示沒有限制。在生產(chǎn)環(huán)境下,若沒有使用索引,此類SQL語(yǔ)句會(huì)頻繁地被記錄到slow log,從而導(dǎo)致slow log文件的大小不斷增加,故DBA可通過(guò)此參數(shù)進(jìn)行配置。
log_slow_slave_statements :默認(rèn)情況下a replication slave does not write replicated queries to the slow query log. To change this, use thelog_slow_slave_statements system variable.
---指定初始化參數(shù),開啟慢查詢
slow_query_log = 1 0是關(guān)閉慢查詢,1是打開
slow_query_log_file = /var/lib/mysql/log-slow-query.log ---指定慢查詢?nèi)罩镜拿Q,如果你沒有指定慢查詢?nèi)罩镜拿Q,默認(rèn)會(huì)在數(shù)據(jù)文件目錄下創(chuàng)建 host_name-slow.log慢查詢?nèi)罩?/p>
show variables like 'log_output'; ---日志存放的方式,是表還是文件
在mysql 5.1.12 之前開啟慢查詢
使用sql語(yǔ)句來(lái)修改:不能按照my.conf中的項(xiàng)來(lái)修改的。修改通過(guò)"show VARIABLES like "%slow%" "
打開慢查詢,運(yùn)行如下sql:
set global log_slow_queries = ON;
mysql> set long_query_time=0.01; #設(shè)置大于0.1s的sql語(yǔ)句記錄下來(lái)
mysql> show VARIABLES like "%slow%" ;
+---------------------+-----------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------+
| log_slow_queries | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/log-slow-query.log |
+---------------------+-----------------------------------+
4 rows in set (0.00 sec)
mysql> show variables like "long_query_time";
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 0.010000 |
+-----------------+----------+
1 row in set (0.00 sec)
使用MySQL自帶命令mysqldumpslow查看
常用命令
-s ORDER what to sort by (t, at, l, al, r, ar etc), 'at’ is default
-t NUM just show the top n queries
-g PATTERN grep: only consider stmts that include this string
eg:
s,是order的順序,說(shuō)明寫的不夠詳細(xì),俺用下來(lái),包括看了代碼,主要有 c,t,l,r和ac,at,al,ar,分別是按照query次數(shù),時(shí)間,lock的時(shí)間和返回的記錄數(shù)來(lái)排序,前面加了a的時(shí)倒序 -t,是top n的意思,即為返回前面多少條的數(shù)據(jù) -g,后邊可以寫一個(gè)正則匹配模式,大小寫不敏感的
mysqldumpslow -s c -t 20 host-slow.log
mysqldumpslow -s r -t 20 host-slow.log
上述命令可以看出訪問次數(shù)最多的20個(gè)sql語(yǔ)句和返回記錄集最多的20個(gè)sql。
mysqldumpslow -t 10 -s t -g “l(fā)eft join” host-slow.log這個(gè)是按照時(shí)間返回前10條里面含有左連接的sql語(yǔ)句。
4 二進(jìn)制日志: -log-bin
二進(jìn)制日志不會(huì)記錄select ,show 等不修改數(shù)據(jù)的語(yǔ)句。打開二進(jìn)制日志會(huì)消耗一些系統(tǒng)系能,但是對(duì)于復(fù)制和系統(tǒng)恢復(fù),所帶來(lái)的好處大于減少的性能,
二進(jìn)制日志即binlog日志 記錄數(shù)據(jù)定義語(yǔ)言(DDL)和數(shù)據(jù)控制語(yǔ)言(DML) 但不包括數(shù)據(jù)查詢語(yǔ)言。
二進(jìn)制日志的功能
1、恢復(fù)(recovery)
2、復(fù)制(replication)
binlog 還有其他的一下附加參數(shù)
max_binlog_size 設(shè)置binlog的最大存儲(chǔ)上線,當(dāng)日志達(dá)到該日志的上限時(shí),mysql會(huì)重新創(chuàng)建一個(gè)日志開始記錄,不過(guò)偶爾也會(huì)超出該設(shè)置的binlog,一般都是以為即將達(dá)到上限時(shí)候,產(chǎn)生了一個(gè)比較大的事物,為了保證事物的安全,mysql不會(huì)將同一個(gè)事物分開記錄到兩個(gè)binlog
binlog-do-db=db_name 明確告訴mysql,需要對(duì)某個(gè)數(shù)據(jù)庫(kù)記錄binlog,如果有了binlog-do-db=db_name 顯示指定,mysql會(huì)忽略正對(duì)其他書庫(kù)執(zhí)行query,而僅僅記錄正對(duì)指定數(shù)據(jù)庫(kù)執(zhí)行的query
binlog-ignore-db=db_name :顯示的指定忽略某個(gè)數(shù)據(jù)庫(kù)的binlog記錄。
binlog-do-db=db_name 指定保存更新到 binlog 的數(shù)據(jù)庫(kù)
binlog-ignore-db=db_name 指定不保存更新到 binlog 的數(shù)據(jù)庫(kù)
binlog-do-db 和binlog-ignore-db 參數(shù) 有一個(gè)共同的概念,參數(shù)db_name 不是指query 語(yǔ)句更新的數(shù)據(jù)所在的數(shù)據(jù)庫(kù),而是執(zhí)行query的時(shí)候,當(dāng)前所處的數(shù)據(jù)庫(kù)。不論更新那個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù),mysql僅僅比較當(dāng)前連接所處的數(shù)據(jù)庫(kù)與參數(shù)設(shè)置的數(shù)據(jù)庫(kù)名。而不會(huì)分析query語(yǔ)句所更新的數(shù)據(jù)庫(kù)所在數(shù)據(jù)庫(kù)。
binlog_cache_size :
mysql> show variables like 'Binlog_cache_size' ;
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| binlog_cache_size | 32768 |
+-------------------+-------+
1 row in set (0.00 sec)
當(dāng)使用事務(wù)的存儲(chǔ)引擎InnoDB時(shí),所有未提交的事務(wù)會(huì)記錄到一個(gè)緩存中,等待事務(wù)提交時(shí),直接將緩沖中的二進(jìn)制日志寫入二進(jìn)制日志文件,而該緩沖的大小由binlog_cache_size決定,默認(rèn)大小為32KB,此外,binlog_cache_size是基于回話的,也就是,當(dāng)一個(gè)線程開始一個(gè)事務(wù)時(shí),mysql會(huì)自動(dòng)分配一個(gè)大小為binlog_cache_size的緩存,因此該值得設(shè)置需要相當(dāng)小心,可以通過(guò)show global status 查看binlog_cache_use、binlog_cache_disk_use的狀態(tài),可以判斷當(dāng)前binlog_cache_size的設(shè)置是否合適。
sync_binlog:
mysql> show variables like 'sync_binlog';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 0 |
+---------------+-------+
1 row in set (0.01 sec)
參數(shù)sync_binlog=[N]表示每寫緩存多少次就同步到磁盤,如果將N設(shè)置為1,則表示采用同步寫磁盤的方式來(lái)寫二進(jìn)制日志,該參數(shù)很重要,這個(gè)以后還會(huì)提到。值得注意的是,在將該參數(shù)設(shè)置為1時(shí),也應(yīng)該將innodb_support_xa設(shè)為1來(lái)解決,這可以確保二進(jìn)制日志和InnoDB存儲(chǔ)引擎數(shù)據(jù)文件的同步
set global sql_log_off=on; 可以讓 當(dāng)前session不記錄 執(zhí)行的sql 語(yǔ)句
Log-slave-update該參數(shù)在搭建master=>slave=>slave的架構(gòu)時(shí),需要配置。
指定日志路徑
mysqld_safe --user=mysql --log-bin=[path] &
如果沒有指定文件名 默認(rèn)mysql-bin,默認(rèn)路徑為datadir目錄
編輯my.cnf
[mysqld]
log-bin=[path]
log-bin = /var/log/mysql/mysql-bin.log --指定二進(jìn)制日志的名稱
log_bin_index = /var/log/mysql/mysql-bin.log.index --二進(jìn)制日志索引的名稱
relay_log = /var/log/mysql/mysql-bin.relay ---中繼日志的名稱
relay_log_index = /var/log/mysql/mysql-bin.relay.index ---中級(jí)日志索引的名稱
如果你執(zhí)行FLUSH LOGS,log-bin 會(huì)使用新的二進(jìn)制日志編號(hào)
查看binlog
由于binlog以是binary方式存取,不能直接查看,需要用mysql提供的mysqlbinlog工具查看
/usr/local/mysql/bin/mysqlbinlog mysql-bin.000001
show binlog events \G只能查看第一個(gè)日志的events
show binlog events in 'mysql-bin.000003';可以查看具體位置日志的events
刪除binlog 1. mysql> reset master; 刪除所有日志,新日志重新從000001開始編號(hào)
2. mysql> purge master logs to 'mysq-bin.******' 命令可以刪除指定編號(hào)前的所有日志
3. mysql> purge master logs to before 'YYYY-MM-DD HH:MM:SS' 命令可以刪除'YYYY-MM-DD HH:MM:SS'之前的產(chǎn)生的所有日志
4. 在my.cnf 中指定日志過(guò)期 expire_logs-days=n
可以使用purgebinary logs語(yǔ)句來(lái)清除binary logs。
Binlog_format參數(shù)也特別重要。從mysql5.1版本開始引入這個(gè)參數(shù),該參數(shù)可以設(shè)置的值有STATEMENT\、ROW、MIXED;
(1)STATEMENT格式和之前的mysql版本一樣,二進(jìn)制日志文件記錄的是日志的邏輯失SQL語(yǔ)句。
(2)在ROW格式下,二進(jìn)制日志記錄的不再是簡(jiǎn)單的SQL語(yǔ)句了,而是記錄表的行更改情況,此時(shí)可以將InnoDB的事務(wù)隔離基本設(shè)為READ COMMITTED,以獲得更好的并發(fā)性。
(3)MIXED格式下,mysql默認(rèn)采用的STATEMENT格式進(jìn)行二進(jìn)制日志文件的記錄,但是在一些情況下會(huì)使用ROW格式,可能的情況包括:
1)表的存儲(chǔ)引擎為NDB,這時(shí)對(duì)于表的DML操作都會(huì)以ROW格式記錄
2)使用了UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT()等不確定函數(shù)
3)使用了INSERT DELAY語(yǔ)句
4)使用了用戶定義函數(shù)
5)使用了臨時(shí)表
mysql> show variables like "%binlog_format%"
-> ;
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)
5 中繼日志( relay log)
中繼日志也是二進(jìn)制日志,用來(lái)給slave 庫(kù)恢復(fù)
6 innodb 在線redo 日志 innodb redo log
innodb 是一個(gè)事物安全的存儲(chǔ)引擎,其事物安全性主要通過(guò)在線的redo日志和記錄在表空間的undo信息來(lái)保證。redo 日志中記錄了innodb所做的所有物理變更和事物信息。innodb的redo日志同樣默認(rèn)存放在數(shù)據(jù)目錄下面??梢酝ㄟ^(guò)innodb_log_group_home_dir 來(lái)更改日志的存放位置。
通過(guò)innodb_log_files_in_group 設(shè)置日志的數(shù)量。
更新日志: -log-update
更新日志是在mysql 比較老的版本上使用的,其功能和binlog 基本類似,只不過(guò),不是一二進(jìn)制格式來(lái)記錄,而是簡(jiǎn)單的文本格式記錄內(nèi)容,自從嗎ysql增加了binlog功能之后,就很少使用更新日志了。
總結(jié):
日志直接性能損耗數(shù)據(jù)庫(kù)系統(tǒng)中最為昂貴的IO 資源,在默認(rèn)情況下,系統(tǒng)僅打開錯(cuò)誤日志,關(guān)閉了其他所有日志,以達(dá)到盡可能減少IO 損耗提高系統(tǒng)性能的目的。
但在實(shí)際應(yīng)用場(chǎng)景中,都至少需要打開二進(jìn)制日志,因?yàn)檫@是MySQL 很多存儲(chǔ)引擎進(jìn)行增量備份的基礎(chǔ),也是MySQL 實(shí)現(xiàn)復(fù)制的基本條件。有時(shí)候?yàn)榱诉M(jìn)一步的性能優(yōu)化,定位執(zhí)行較慢的SQL 語(yǔ)句,很多系統(tǒng)也會(huì)打開慢查詢?nèi)罩緛?lái)記錄執(zhí)行時(shí)間超過(guò)特定數(shù)值的SQL 語(yǔ)句。
一般情況下,在生產(chǎn)系統(tǒng)中很少有系統(tǒng)會(huì)打開查詢?nèi)罩?。因?yàn)椴樵內(nèi)罩敬蜷_之后會(huì)將MySQL 中執(zhí)行的每一條Query 都記錄到日志中,會(huì)該系統(tǒng)帶來(lái)比較大的IO 負(fù)擔(dān),而帶來(lái)的實(shí)際效益卻并不是非常大。
一般只有在開發(fā)測(cè)試環(huán)境中,為了定位某些功能具體使用了哪些SQL 語(yǔ)句的時(shí)候,才會(huì)在短時(shí)間段內(nèi)打開該日志來(lái)做相應(yīng)的分析。所以,在MySQL 系統(tǒng)中,會(huì)對(duì)性能產(chǎn)生影響的MySQL日志(不包括各存儲(chǔ)引擎自己的日志)主要是Binlog 。
參考:
http://www.cnblogs.com/benshan/archive/2013/01/16/2862212.html