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 TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, and REPAIR TABLE.
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_use、binlog_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\、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)
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 設置日志的數量。
總結:
日志直接性能損耗數據庫系統中最為昂貴的IO 資源,在默認情況下,系統僅打開錯誤日志,關閉了其他所有日志,以達到盡可能減少IO 損耗提高系統性能的目的。
測試環境中,為了定位某些功能具體使用了哪些SQL 語句的時候,才會在短時間段內打開該日志來做相應的分析。所以,在MySQL 系統中,會對性能產生影響的MySQL日志(不包括各存儲引擎自己的日志)主要是Binlog 。