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] &
 ;
+--------------------+--------------------------+
| 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                      |
mv  mysql.log  mysql_old.log 
 mysqladmin  -uroot -pmysql flush-logs
On Windows, use rather than.


查詢日志 general  query 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;
general  query log 的清理
mv general.log  general_old.log 
 mysqladmin  -uroot -pmysql flush-logs
On Windows, use  rather than.

 set  global sql_log_off=on; 可以讓 當前session不記錄 執行的sql 語句
 慢查詢日志采用的是簡單的文本格式,可以通過文本編輯器查看其中的內容,其中記錄了語句的執行時刻,執行消耗的時間,執行用戶,連接主機等相關信息。mysql還提供了專門分析日志的工具, mysqlslowdump用來解決可能存在的性能問題。
慢查詢只有在大於 
long_query_time 指定時間的sql statement , min_examined_row_limit最小檢查行數限制 才會被檢查,語句被寫入slow log 是在語句被執行后,並且釋放鎖之前,默認情況下,慢查詢日志是被關閉的
 
long_query_time 的值被設置為0-10之間,默認值是10.
  :系統管理語句 就在慢查詢日志中. 系統管理語句包括 ALTER TABLEANALYZE TABLECHECK TABLECREATE INDEXDROP INDEXOPTIMIZE TABLE, and REPAIR TABLE.
log-short-format   記錄少量的日志 
5.6.5版本開始新增了一個參數log_throttle_queries_not_using_indexes,用來表示每分鍾允許記錄到slow log的且未使用索引的SQL語句次數。  該值默認為0,表示沒有限制。在生產環境下,若沒有使用索引,此類SQL語句會頻繁地被記錄到slow log,從而導致slow log文件的大小不斷增加,故DBA可通過此參數進行配置。

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是打開
  show variables like 'log_output';              ---日志存放的方式,是表還是文件

 5.1.12 之前開啟慢查詢
打開慢查詢,運行如下sql:
set global log_slow_queries = ON;


mysql> set long_query_time=0.01; #設置大於0.1s的sql語句記錄下來
 ; 
+---------------------+-----------------------------------+
| Variable_name       | Value                             |
+---------------------+-----------------------------------+
| log_slow_queries    | OFF                               |
| slow_launch_time    | 2                                 |
| slow_query_log      | OFF                               |
+-----------------+----------+
| Variable_name   | Value    |
使用 MySQL自帶命令mysqldumpslow查看

 

eg:
mysqldumpslow -s c -t 20 host-slow.log
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  還有其他的一下附加參數
binlog-do-db=db_name   顯示指定,mysql會忽略正對其他書庫執行query,而僅僅記錄正對指定數據庫執行的query

binlog-ignore-db=db_name

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


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

sync_binlog:
mysql> show variables like 'sync_binlog';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 0     |
參數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的架構時,需要配置。
如果沒有指定文件名 默認mysql-bin,默認路徑為datadir目錄

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以是binary方式存取,不能直接查看,需要用mysql提供的mysqlbinlog工具查看

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

2. mysql> purge master logs to 'mysq-bin.******' 命令可以刪除指定編號前的所有日志
4. 在my.cnf 中指定日志過期 expire_logs-days=n 
可以使用purgebinary logs語句來清除binary logs。


Binlog_format參數也特別重要。從mysql5.1版本開始引入這個參數,該參數可以設置的值有STATEMENT\ROWMIXED

(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)


 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


 總結:

日志直接性能損耗數據庫系統中最為昂貴的IO 資源,在默認情況下,系統僅打開錯誤日志,關閉了其他所有日志,以達到盡可能減少IO 損耗提高系統性能的目的。

測試環境中,為了定位某些功能具體使用了哪些SQL 語句的時候,才會在短時間段內打開該日志來做相應的分析。所以,在MySQL 系統中,會對性能產生影響的MySQL日志(不包括各存儲引擎自己的日志)主要是Binlog 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM