mysql 幾種日誌學習

mysql 5.5 有以下幾種日誌: 


錯誤日誌(error log): log-err
查詢日誌(general  query log): log
慢查詢日誌: -log-slow-queries       
二進制日誌 (binary log): log-bin
 中繼日誌( relay log)
innodb 在線redo 日誌
默認情況下,沒有啓動任何log,可以通過log 選項來啓動相關的log


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)


默 認情況下,所有日誌創建於mysqld數據目錄中。通過刷新日誌,你可以強制 mysqld來關閉和重新打開日誌文件(或者在某些情況下切換到一個新的日誌)。當你執行一個FLUSH LOGS語句或執行mysqladmin flush-logs或mysqladmin refresh時,出現日誌刷新


1. 錯誤日誌
錯誤日誌記錄着mysqld啓動和停止,以及服務器在運行過程中發生的錯誤的相關信息。在默認情況下,系統記錄錯誤日誌的功能是關閉的,錯誤信息被輸出到標準錯誤輸出。需要在啓動的時候開啓 log-error選項
如果沒有指定文件名 默認hostname.err,默認路徑爲datadir目錄
指定日誌路徑兩種方法
編輯my.cnf     寫入 log-error=[path]
通過命令參數錯誤日誌  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 查詢日誌 general  query log
Geleral log記錄了服務器接收到的每一個查詢或是命令,無論這些查詢或是命令是否正確甚至是否包含語法錯誤,general log 都會將其記錄下來 ,記錄的格式爲 {Time ,Id ,Command,Argument }。也正因爲mysql服務器需要不斷地記錄日誌,開啓General log會產生不小的系統開銷。 因此,Mysql默認是把General log關閉的。  general  query log寫入日誌是在客戶端執行命令,並且釋放鎖之前,寫入日誌


數據庫訪問量很大,想要從SQL方面進行優化,因爲爲了性能考慮,一般general log不會開啓。slow log可以定位一些有性能問題的sql,而general log會記錄所有的SQL。l


general query log和slow query log開始支持寫到文件或者數據庫表兩種方式,並且日誌的開啓,輸出方式的修改,都可以在Global級別動態修改。


 查看日誌的存放方式 show variables like 'log_output';
mysql> show variables  like "%log_output%" ;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | FILE  |
+---------------+-------+
1 row in set (0.00 sec)


如果設置mysql> set global log_output='table'  的話,則日誌結果會記錄到名爲gengera_log的表中,這表的默認引擎都是CSV
如果設置表數據到文件  set global log_output=file;
設置general log的日誌文件路徑:set global general_log_file='/tmp/general.log';
開啓general log: set global general_log=on;    ---不需要服務器的重啓
關閉general log: set global general_log=off;


查看tmp/general.log的信息,可以大致看到哪些sql查詢/更新/刪除/插入比較頻繁了。比如有些表不是經常變化的,查詢量又很大,就完全可以cache;對主備延遲要求不高的表,讀可以放到備庫;等等


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; 可以讓 當前session不記錄 執行的sql 語句


3、慢查詢日誌: -log-slow-queries
 慢查詢日誌採用的是簡單的文本格式,可以通過文本編輯器查看其中的內容,其中記錄了語句的執行時刻,執行消耗的時間,執行用戶,連接主機等相關信息。mysql還提供了專門分析日誌的工具, mysqlslowdump用來解決可能存在的性能問題。
慢查詢只有在大於  long_query_time 指定時間的sql statement , min_examined_row_limit最小檢查行數限制 纔會被檢查,語句被寫入slow log 是在語句被執行後,並且釋放鎖之前,默認情況下,慢查詢日誌是被關閉的
 
long_query_time 的值被設置爲0-10之間,默認值是10.
log_slow_admin_statements  : 系統管理語句 就在慢查詢日誌中. 系統管理語句包括 ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, and REPAIR TABLE.
log_queries_not_using_indexes 默認情況下,管理語句和不使用索引的語句是不會記錄在慢查詢中的,需要人工設置
log-short-format   記錄少量的日誌 
log_throttle_queries_not_using_indexes :5.6.5版本開始新增了一個參數log_throttle_queries_not_using_indexes,用來表示每分鐘允許記錄到slow log的且未使用索引的SQL語句次數。 該值默認爲0,表示沒有限制。在生產環境下,若沒有使用索引,此類SQL語句會頻繁地被記錄到slow log,從而導致slow log文件的大小不斷增加,故DBA可通過此參數進行配置。
log_slow_slave_statements   :默認情況下a replication slave does not write replicated queries to the slow query log. To change this, use thelog_slow_slave_statements system variable.


---指定初始化參數,開啓慢查詢
slow_query_log = 1   0是關閉慢查詢,1是打開
slow_query_log_file =  /var/lib/mysql/log-slow-query.log    ---指定慢查詢日誌的名稱,如果你沒有指定慢查詢日誌的名稱,默認會在數據文件目錄下創建 host_name-slow.log慢查詢日誌
show variables like 'log_output';              ---日誌存放的方式,是表還是文件


在mysql  5.1.12 之前開啓慢查詢
使用sql語句來修改:不能按照my.conf中的項來修改的。修改通過"show VARIABLES like "%slow%" "
打開慢查詢,運行如下sql:
set global log_slow_queries = ON;




mysql> set long_query_time=0.01; #設置大於0.1s的sql語句記錄下來




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的順序,說明寫的不夠詳細,俺用下來,包括看了代碼,主要有 c,t,l,r和ac,at,al,ar,分別是按照query次數,時間,lock的時間和返回的記錄數來排序,前面加了a的時倒序 -t,是top n的意思,即爲返回前面多少條的數據 -g,後邊可以寫一個正則匹配模式,大小寫不敏感的
mysqldumpslow -s c -t 20 host-slow.log
mysqldumpslow -s r -t 20 host-slow.log
上述命令可以看出訪問次數最多的20個sql語句和返回記錄集最多的20個sql。
mysqldumpslow -t 10 -s t -g “left join” host-slow.log這個是按照時間返回前10條裏面含有左連接的sql語句。




4 二進制日誌: -log-bin
二進制日誌不會記錄select ,show 等不修改數據的語句。打開二進制日誌會消耗一些系統系能,但是對於複製和系統恢復,所帶來的好處大於減少的性能, 二進制日誌即binlog日誌 記錄數據定義語言(DDL)和數據控制語言(DML) 但不包括數據查詢語言。


二進制日誌的功能
1、恢復(recovery)
2、複製(replication)


binlog  還有其他的一下附加參數
max_binlog_size 設置binlog的最大存儲上線,當日志達到該日誌的上限時,mysql會重新創建一個日誌開始記錄,不過偶爾也會超出該設置的binlog,一般都是以爲即將達到上限時候,產生了一個比較大的事物,爲了保證事物的安全,mysql不會將同一個事物分開記錄到兩個binlog


binlog-do-db=db_name  明確告訴mysql,需要對某個數據庫記錄binlog,如果有了binlog-do-db=db_name  顯示指定,mysql會忽略正對其他書庫執行query,而僅僅記錄正對指定數據庫執行的query


binlog-ignore-db=db_name  :顯示的指定忽略某個數據庫的binlog記錄。


binlog-do-db=db_name  指定保存更新到 binlog 的數據庫
binlog-ignore-db=db_name  指定不保存更新到 binlog 的數據庫
 binlog-do-db 和binlog-ignore-db 參數 有一個共同的概念,參數db_name 不是指query 語句更新的數據所在的數據庫,而是執行query的時候,當前所處的數據庫。不論更新那個數據庫的數據,mysql僅僅比較當前連接所處的數據庫與參數設置的數據庫名。而不會分析query語句所更新的數據庫所在數據庫。


binlog_cache_size :
mysql> show variables like  'Binlog_cache_size' ; 
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| binlog_cache_size | 32768 |
+-------------------+-------+
1 row in set (0.00 sec)


當使用事務的存儲引擎InnoDB時,所有未提交的事務會記錄到一個緩存中,等待事務提交時,直接將緩衝中的二進制日誌寫入二進制日誌文件,而該緩衝的大小由binlog_cache_size決定,默認大小爲32KB,此外,binlog_cache_size是基於回話的,也就是,當一個線程開始一個事務時,mysql會自動分配一個大小爲binlog_cache_size的緩存,因此該值得設置需要相當小心,可以通過show global status 查看binlog_cache_use、binlog_cache_disk_use的狀態,可以判斷當前binlog_cache_size的設置是否合適。


sync_binlog:
mysql> show variables like 'sync_binlog';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 0     |
+---------------+-------+
1 row in set (0.01 sec)
參數sync_binlog=[N]表示每寫緩存多少次就同步到磁盤,如果將N設置爲1,則表示採用同步寫磁盤的方式來寫二進制日誌,該參數很重要,這個以後還會提到。值得注意的是,在將該參數設置爲1時,也應該將innodb_support_xa設爲1來解決,這可以確保二進制日誌和InnoDB存儲引擎數據文件的同步


 set  global sql_log_off=on; 可以讓 當前session不記錄 執行的sql 語句


Log-slave-update該參數在搭建master=>slave=>slave的架構時,需要配置。




指定日誌路徑
mysqld_safe --user=mysql --log-bin=[path] &
如果沒有指定文件名 默認mysql-bin,默認路徑爲datadir目錄
編輯my.cnf
[mysqld]
log-bin=[path]


log-bin             = /var/log/mysql/mysql-bin.log    --指定二進制日誌的名稱
log_bin_index       = /var/log/mysql/mysql-bin.log.index     --二進制日誌索引的名稱
relay_log           = /var/log/mysql/mysql-bin.relay    ---中繼日誌的名稱
relay_log_index     = /var/log/mysql/mysql-bin.relay.index    ---中級日誌索引的名稱


如果你執行FLUSH LOGS,log-bin 會使用新的二進制日誌編號




查看binlog
由於binlog以是binary方式存取,不能直接查看,需要用mysql提供的mysqlbinlog工具查看
/usr/local/mysql/bin/mysqlbinlog mysql-bin.000001


show binlog events \G只能查看第一個日誌的events
show binlog events in 'mysql-bin.000003';可以查看具體位置日誌的events


刪除binlog
1. mysql> reset master;  刪除所有日誌,新日誌重新從000001開始編號
2. mysql> purge master logs to 'mysq-bin.******' 命令可以刪除指定編號前的所有日誌
3. mysql> purge master logs to before 'YYYY-MM-DD HH:MM:SS' 命令可以刪除'YYYY-MM-DD HH:MM:SS'之前的產生的所有日誌
4. 在my.cnf 中指定日誌過期 expire_logs-days=n 
可以使用purgebinary logs語句來清除binary logs。






Binlog_format參數也特別重要。從mysql5.1版本開始引入這個參數,該參數可以設置的值有STATEMENT\、ROW、MIXED;
(1)STATEMENT格式和之前的mysql版本一樣,二進制日誌文件記錄的是日誌的邏輯失SQL語句。
(2)在ROW格式下,二進制日誌記錄的不再是簡單的SQL語句了,而是記錄表的行更改情況,此時可以將InnoDB的事務隔離基本設爲READ COMMITTED,以獲得更好的併發性。
(3)MIXED格式下,mysql默認採用的STATEMENT格式進行二進制日誌文件的記錄,但是在一些情況下會使用ROW格式,可能的情況包括:
1)表的存儲引擎爲NDB,這時對於表的DML操作都會以ROW格式記錄
2)使用了UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT()等不確定函數
3)使用了INSERT DELAY語句
4)使用了用戶定義函數
5)使用了臨時表


mysql> show variables like "%binlog_format%"
    -> ;
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)






5  中繼日誌( relay log)
 中繼日誌也是二進制日誌,用來給slave 庫恢復


6 innodb 在線redo 日誌  innodb redo log
innodb 是一個事物安全的存儲引擎,其事物安全性主要通過在線的redo日誌和記錄在表空間的undo信息來保證。redo 日誌中記錄了innodb所做的所有物理變更和事物信息。innodb的redo日誌同樣默認存放在數據目錄下面。可以通過innodb_log_group_home_dir 來更改日誌的存放位置。
通過innodb_log_files_in_group 設置日誌的數量。


 更新日誌: -log-update
更新日誌是在mysql 比較老的版本上使用的,其功能和binlog 基本類似,只不過,不是一二進制格式來記錄,而是簡單的文本格式記錄內容,自從嗎ysql增加了binlog功能之後,就很少使用更新日誌了。






 總結:
日誌直接性能損耗數據庫系統中最爲昂貴的IO 資源,在默認情況下,系統僅打開錯誤日誌,關閉了其他所有日誌,以達到儘可能減少IO 損耗提高系統性能的目的。
但在實際應用場景中,都至少需要打開二進制日誌,因爲這是MySQL 很多存儲引擎進行增量備份的基礎,也是MySQL 實現複製的基本條件。有時候爲了進一步的性能優化,定位執行較慢的SQL 語句,很多系統也會打開慢查詢日誌來記錄執行時間超過特定數值的SQL 語句。
一般情況下,在生產系統中很少有系統會打開查詢日誌。因爲查詢日誌打開之後會將MySQL 中執行的每一條Query 都記錄到日誌中,會該系統帶來比較大的IO 負擔,而帶來的實際效益卻並不是非常大。
一般只有在開發測試環境中,爲了定位某些功能具體使用了哪些SQL 語句的時候,纔會在短時間段內打開該日誌來做相應的分析。所以,在MySQL 系統中,會對性能產生影響的MySQL日誌(不包括各存儲引擎自己的日誌)主要是Binlog 。
參考:
http://www.cnblogs.com/benshan/archive/2013/01/16/2862212.html

http://blog.csdn.net/tianlesoftware/article/details/7028304



自己的乾貨:

show VARIABLES like 'log_bin'
show VARIABLES like 'log_error'
show VARIABLES like 'general_log'
show VARIABLES like 'general_log_file'
show VARIABLES like 'slow%'
先mysqldump備份一個表

mysqldump -uroot -p test >test.sql

bin log日誌中每一個操作都有一個at標記,可以依據at標記進行恢復操作

只取xx之間和xx之間的bin log數據

mysqlbinlog mysql-BIN.0000001 --START-positon-325  --stop-positon-425>log.txt

use d1;

source test.sql
source log.txt

mysqlbinlog F:/phpStudy/MySQL/log_bin/mysql-bin.000001
show binary logs


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