MySQL日志管理
mysql日志(默認存放在datadir):
同大多數關系型數據庫一樣,日志文件是MySQL數據庫的重要組成部分。MySQL有幾種不同的日志文件,通常包括錯誤日志文件,二進制日志,查詢日志,慢查詢日志,等等。這些日志可以幫助我們定位mysqld內部發生的事件,數據庫性能故障,記錄數據的變更歷史,用戶恢復數據庫等等。
- 錯誤日志 --錯誤日志,記錄mysql服務端在運行時產生的錯誤信息 以及mysql啟動和關閉時的日志信息
- 查詢日志 --select * from xxx; show databases;記錄建立的客戶端連接和執行的語句
- 慢查詢日志 --慢查詢時間閥值,以秒為單位,如果超過這個閥值就是慢查詢
- binlog二進制日志 --記錄對數據庫增、刪、改的SQL操作,可以使用這個日志做增量備份
- 事務日志 --每次增、刪、改的SQL操作時,會把操作SQL語句寫在事務日志,只innodb存儲引擎才支持事務日志
- relay-binlog --主從復制日志,從機器上從主機器復制過來日志,根據日志來同步數據。 記錄所有更改數據的語句。還用於復制。
查詢日志
# 查看mysql版本
mysql> show variables like '%version%';
+-------------------------+------------------------------+
| Variable_name | Value |
+-------------------------+------------------------------+
| innodb_version | 5.6.37 |
| protocol_version | 10 |
| slave_type_conversions | |
| version | 5.6.37 |
| version_comment | MySQL Community Server (GPL) |
| version_compile_machine | x86_64 |
| version_compile_os | Linux |
+-------------------------+------------------------------+
7 rows in set (0.01 sec)
# 查看查詢日志系統變量
mysql> show variables like '%general%';
+------------------+-------------------------------------+
| Variable_name | Value |
+------------------+-------------------------------------+
| general_log | OFF |
| general_log_file | /var/lib/mysql/vagrant-centos65.log | #沒有開啟的情況下不會有這個文件
+------------------+-------------------------------------+
2 rows in set (0.00 sec)
# 開啟查詢日志
mysql> set @@global.general_log=1;
Query OK, 0 rows affected (0.00 sec)
#查看查詢日志
[root@vagrant-centos65 mysql]# cat vagrant-centos65.log
/usr/sbin/mysqld, Version: 5.6.37 (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
170929 15:37:08 20 Query show variables like '%general%'
170929 15:37:12 20 Query set @@global.general_log=0
/usr/sbin/mysqld, Version: 5.6.37 (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
170929 15:38:37 20 Query show databases
170929 15:38:38 20 Query SELECT DATABASE()
20 Init DB aaaa
20 Query show databases
20 Query show tables
20 Field List t1
20 Field List t2
20 Field List t3
170929 15:38:50 20 Query show tables
170929 15:38:54 20 Query select * from t1
170929 15:38:56 20 Query select * from t2
170929 15:38:59 20 Quit
錯誤日志:
mysql 啟動和關閉 ,報錯
mysql> show variables like '%error%';
+--------------------+------------------------------+
| Variable_name | Value |
+--------------------+------------------------------+
| error_count | 0 |
| log_error | /data2/rhel6.example.com.err |
| max_connect_errors | 10 |
| max_error_count | 64 |
| slave_skip_errors | OFF |
+--------------------+------------------------------+
5 rows in set (0.00 sec)
[root@rhel6 ~]# vim /data2/rhel6.example.com.err
[root@rhel6 ~]# : > /data2/rhel6.example.com.err
[root@rhel6 ~]# mysqladmin -uroot shutdown
[root@rhel6 mysql-glibc]# ./bin/mysqld_safe &
模擬故障:
[root@rhel6 data2]# mkdir bak
[root@rhel6 data2]# mv mysql bak/
[root@rhel6 mysql-glibc]# mysqladmin -uroot shutdown
[root@rhel6 data2]# cd /opt/mysql-glibc/
[root@rhel6 mysql-glibc]# ./bin/mysqld_safe &
[root@rhel6 mysql-glibc]# cat /data2/rhel6.example.com.err
[ERROR]
[root@rhel6 mysql-glibc]# cd /data2/
[root@rhel6 data2]# mv bak/mysql/ ./
[root@rhel6 mysql-glibc]# ./bin/mysqld_safe &
二進制日志(binlog日志):
二進制日志(又叫binlog日志)記錄了所有增刪改語句,但是不包括數據查詢語句,語句是以“事件”的形式保存的,它描述數據更改的過程。該日志的兩個主要功能是:數據的恢復與數據的復制。
- 數據的恢復:MySQL本身具備數據備份和恢復功能。比如,我們每天午夜12:00進行數據的備份。如果某天,下午13:00,數據庫出現故障,導致數據庫內容丟失。我們可以通過二進制日志解決這個問題。解決思路是,可以先將前一天午夜12:00的數據備份文件恢復到數據庫,然后再使用二進制日志回復從前一天午夜12:00到當天13:00對數據庫的操作。
- 數據復制:MySQL支持主從服務器間的數據復制功能,並通過該功能實現數據庫的冗余機制以保證數據庫的可用性和提高數據庫德性能。MySQL正是通過二進制日志實現數據的傳遞。主服務器上的二進制日志內容會被發送到各個從服務器上,並在每個從服務器上執行,從而保證了主從服務器之間數據的一致性。
mysql> show variables like '%bin%'; #查看二進制日志的參數
+-----------------------------------------+----------------------+
| Variable_name | Value |
+-----------------------------------------+----------------------+
| binlog_cache_size | 32768 | # 為每個session 分配的內存,在事務過程中用來存儲二進制日志的緩存。
| binlog_direct_non_transactional_updates | OFF |
| binlog_format | STATEMENT |
| binlog_stmt_cache_size | 32768 |
| innodb_locks_unsafe_for_binlog | OFF |
| log_bin | OFF |
| log_bin_trust_function_creators | OFF |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 1073741824 |
| max_binlog_stmt_cache_size|18446744073709547520 |
| sql_log_bin | ON |
| sync_binlog | 0 |
+-----------------------------------------+----------------------+
12 rows in set (0.00 sec)
mysql> set global log_bin=on; ERROR 1238 (HY000): Variable 'log_bin' is a read only variable
開啟二進制日志
```shell
binary log
log-bin = mysqld-bin
log-bin-index = /abc/logs/binlog_index
注意在5.7之后的版本開啟二進制日志還需要添加一個server_id參數,且如果存在主從數據庫的情況下,主庫的server_id值必須大於從庫
server_id = 1

重啟一下mysql 二進制日志就已經開啟了
### 查看二進制日志:

### binlog日志屬性:
```shell
mysqld-bin.000001 | 三種情況會產生新的日志 1.超過1G 2.關閉mysqld 3.截斷日志
mysql> flush logs; --截斷日志 會重新生成一個Binlog日志文件
注意: 最后一個日志就是當前使用的日志 二進制日志只記錄 增刪改, 不會記錄查詢的語句
二進制日志管理:
mysql> show binary logs; --查看當前所有的二進制日志
mysql> PURGE BINARY LOGS BEFORE '2012-03-26 16:21:00';
mysql> purge binary logs to 'mysqld.000005'; --刪除mysqld.000005以前所有的日志,但不刪除日志終結點
shell>mysqlbinlog /data2/mysqld.bin00001 --查看binlog文件中的內容
shell> mysqladmin -uroot -p456 flush-logs 截斷日志
mysql> show master status --查詢當前使用哪個二進制日志
mysql> flush logs; --截斷二進制日志
mysql> flush master; --清空二進制日志
log_slow_queries=/mysql/logs/slow --慢查詢日志
long-query-time=1 --只要超過1秒的查詢將被記錄下來,以便被做調優時做參考。
慢查詢日志:
慢查詢日志是記錄所有執行時間超過參數long_query_time(單位:秒),的SQL語句日志。為了獲得表鎖,而等待的時間,不算執行時間。我們可以通過log-slow-queries=[file_name]選項來啟動慢查詢日志功能。和前面的日志一樣,如果沒有指定file_name,那么日志目錄在datedir目錄下,且默認的名字為host_name-slow.log。我們可以通過慢查詢日志的分析,來優化我們的SQL語句和建立新的索引達到優化數據庫的作用。
查詢慢查詢日志
開啟慢查詢日志
設置慢查詢日志閾值
永久開啟慢查詢日志和
[root@rhel6 logs]# vim /etc/my.cnf
#slow log
slow_query_log=on
slow_query_log_file=/abc/logs/slow.log
long_query_time=1
---
/etc/init.d/mysqld stop
/etc/init.d/mysqld start