1. 程式人生 > >Mysql DBA 高級運維學習筆記-Mysql數據庫中的日誌文件

Mysql DBA 高級運維學習筆記-Mysql數據庫中的日誌文件

驗證 5.1 更新數據 war 運行時 oca rep 比較 並不是

1.錯誤日誌(Error log)

(1)錯誤日誌的介紹

錯誤日誌(error log):記錄MySQL服務進程mysqld在自動/關閉或遠行過程中遇到的錯誤信息

(2)錯誤日誌的調整

在my.cnf配置文件裏面查看錯誤日誌log-error

[root@mysql ~]# sed -n ‘78,80p‘ /data/3306/my.cnf 
[mysqld_safe]
log-error=/data/3306/mysql_zbf3306.err
pid-file=/data/3306/mysqld.pid

2.查詢日誌(Query Log)

(1)查詢日誌的介紹

查詢日誌(query log):又可分兩類

普通查詢日誌(general query log):記錄客戶端連接信息和執行的SQL語句信息。

慢查詢日誌(slow query log):記錄執行時間超出指定值。(long_query_time)的SQL語句。

(2)普通查詢日誌的調整(general query log

普通查詢日誌不重要,在工作中是不開的

a.我們先登錄mysql看一下general log有沒有開啟

mysql> show variables like ‘%general_log%‘;
+------------------+---------------------------+
| Variable_name| Value |
+------------------+---------------------------+
| general_log  | OFF|
| general_log_file | /data/3306/data/mysql.log |
+------------------+---------------------------+
2 rows in set (0.00 sec)

通過查詢我們得知general_log沒有開啟,下面我們將general_log開啟

b.在線開啟general_log

mysql> set global  general_log=ON;
Query OK, 0 rows affected (0.00 sec)

c.查看general_log是否開啟

mysql> show variables like ‘%general_log%‘;
+------------------+---------------------------+
| Variable_name| Value |
+------------------+---------------------------+
| general_log  | ON|
| general_log_file | /data/3306/data/mysql.log |
+------------------+---------------------------+
2 rows in set (0.00 sec)
[root@mysql ~]# ll /data/3306/data/mysql.*
 -rw-rw----. 1 mysql mysql 363 2月  13 01:02 /data/3306/data/mysql.log

d.測試general_log作用

general query log:記錄客戶端連接信息和執行的SQL語句信息:下面我們來驗證一下
創建一個庫

mysql> create database nn;
Query OK, 1 row affected (0.01 sec)

接下來我們查看一下mysql.log普通查詢日誌

[root@mysql ~]# cat /data/3306/data/mysql.log 
/usr/local/mysql/bin/mysqld, Version: 5.5.32-log (Source distribution). started with:
Tcp port: 3306  Unix socket: /data/3306/mysql.sock
Time Id CommandArgument
180213  1:11:05    25 Query create database nn

我們看這裏面記錄了我剛才創建庫的語句。

(3)慢查詢的調整(重要,優化SQL語句做增量備份主從同步都需要)

[root@mysql ~]# sed -n "33,35p" /data/3306/my.cnf 
long_query_time = 1
#log-slow-queries = /data/3306/slow.log
#log_queries_not_using_indexes

long_query_time參數多長時間記錄慢查詢,log-slow-queries慢查詢的位置,log_queries_not_using_indexes參數是沒使用索引的語句記錄到log裏面去。

3.二進制日誌(Binary Log)

(1)二進制日誌的介紹

二進制日誌(binary log):記錄數據被修改的相關信息。

(2)二進制日誌的調整

[root@mysql ~]# egrep "\[mysqld]|log-bin|log-sla" /data/3306/my.cnf 
[mysqld]
log-bin = /data/3306/mysql-bin
log-slave-updates

log_bin是記錄binlog

sql_log_bin臨時不記錄binlog

4.binlog日誌的三種模式

4.1 Statement Level模式

每一條會修改的數據的sql都會記錄到master的binlog中,slave在復制的時候sql進程會解析成和原來master端執行過的相同的sql來再次執行。
優點:Stament level下的優點首先就是解決了row level下的缺點,不需要記錄每一行數據的變化,減少bin-log日誌量,節約IO,提高性能。因為他只需要記錄在Master上所執行的語句的細節,以及執行語句時候的上下文的信息。
缺點:由於他是記錄的執行語句,所以為了讓這些語句在slave端也能正確執行,那麽他還必須記錄每條語句在執行的時候的一些相關信息,也就是上下文信息,以保證所有語句在slave端執行的時候能夠得到和在master端執行時候相同的語句。另外就是,由於MySQL現在發展比較快,很多的新功能不斷的加入,使MySQL的復制遇到了不小的挑戰,自然復制的時候涉及到越復雜的內容,bug也就越容易出現。在statement level下,目前已經發現的就有不少情況會造成MySQL的復制出現問題,主要是修改數據的時候使用了某些特定的函數或者功能的時候會出現,比如:sleep()函數在有些版本中就不能正確復制,在存儲過程中使用了last_insert_id()函數,可能會是slave和master上得到不一致的id等等,由於row level是基於每一行來記錄的變化,所以不會出現類似的問題。

4.2 Row Level模式

日誌中會記錄成每一行數據被修改的形式,然後再slave端再對相同的數據進行修改。
優點:在row level模式下,binlog中可以不記錄執行的sql語句的上下文相關的信息,僅僅只需要記錄那一條記錄被修改了,修改成什麽樣了,所以row level的日誌內容會非常清楚的記錄下每一行數據修改的細節,非常容易理解。而且不會出現某些特定情況下的存儲過程,或function,以及trigger的調用和觸發無法被正確復制的問題。他能夠解決statement level模式解決不了的問題。
缺點:row level模式下,所有的執行的語句當記錄到日誌中的時候,都將以每行的修改為記錄,這樣可能會產生大量的日誌內容,比如這樣的一條update語句:update student set name=’nishishei’where name=’linzhongniao’,執行之後,日誌中記錄的不是這條update語句而是這條語句所更新的每一條記錄的變化情況,這樣就記錄成很多條記錄被更新的很多個事件。自然,bin-log日誌的存儲量就會很大。

4.3 Mixed模式

Mixed模式是前兩種模式的混合,在Mixed模式下,MySQL會根據執行的每一條具體的sql語句來劃分對待記錄的日誌形式,也就是在Statement和Row之間的選擇一種,覺得哪一種模式好就用哪一種記錄。新版本中的Statement level 還是和以前一樣,僅僅記錄執行的語句。而新版本的MySQL中對row level 模式也被做了優化,並不是多有的修改都會以row level來記錄,想遇到表結構變更的時候就會以statement 模式來記錄,如果sql語句確實就是update或者delete等修改數據的語句,那麽還是會記錄所有行的變更。

5. 調整binlog日誌模式方法

5.1 在配置文件中修改的方法

下面是Mysql5.5默認模式也是我們前面主從復制默認的模式

mysql> show variables like ‘%binlog_format%‘;
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+

在配置文件中修改的參數如下

[root@mysql ~]# sed -n "39,42p" /data/3306/my.cnf 
log-bin = /data/3306/mysql-bin
#binlog_format = "STATEMENT"
#binlog_format = "ROW"
binlog_format = "MIXED"

官方推薦是用混合模式

5.2 在線修改立即生效方法

(1)運行時在線修改,當前會話生效

mysql> set session binlog_formant = ‘STATEMENT‘;
mysql> set session binlog_formant = ‘ROW‘;
mysql> set session binlog_formant = ‘MIXED‘;

(2)全局生效,所有用戶都生效:

mysql> set global binlog_format = ‘ROW‘;
mysql> set global binlog_format = ‘STATEMENT‘;
mysql> set global binlog_format = ‘MIXED‘;

(3)實戰演示全局修改binlog日誌模式以及row的原理演示

a.修改為row模式

mysql> set global binlog_format = ‘ROW‘;
Query OK, 0 rows affected (0.00 sec)

如果查詢默認模式沒有修改突出登錄,再登錄查看默認模式就修改了

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

b.刷新binlog

為了更好的演示我們刷新一下binlog,這時候我們再更新數據的時候就會往新生成的binlog日誌文件裏面寫了。

[root@mysql 3306]# mysqladmin -uroot -p123456 -S /data/3306/mysql.sock flush-logs

c.登錄mysql修改lingzhongniao庫的數據

我們將linzhongniao庫中student表中的name字段的數據都修改為linzhongniao2

mysql> update student set name=‘linzhongniao2‘;
Query OK, 9 rows affected (0.00 sec)
Rows matched: 9  Changed: 9  Warnings: 0

mysql> select * from student;
+----+---------------+
| id | name  |
+----+---------------+
|  1 | linzhongniao2 |
|  3 | linzhongniao2 |
|  5 | linzhongniao2 |
|  6 | linzhongniao2 |
|  8 | linzhongniao2 |
| 10 | linzhongniao2 |
| 11 | linzhongniao2 |
| 13 | linzhongniao2 |
| 15 | linzhongniao2 |
+----+---------------+
9 rows in set (0.00 sec)

d.查看binlog日誌文件

[root@mysql 3306]# mysqlbinlog --base64-output=decode-rows -v  mysql-bin.000026
……省略……
#180214  0:52:30 server id 1  end_log_pos 245   Table_map: `linzhongniao`.`student` mapped to number 33
#180214  0:52:30 server id 1  end_log_pos 617   Update_rows: table id 33 flags: STMT_END_F
### UPDATE `linzhongniao`.`student`
### WHERE
###   @1=1
###   @2=‘linzhongniao1‘
### SET
###   @1=1
###   @2=‘linzhongniao2‘
### UPDATE `linzhongniao`.`student`
### WHERE
###   @1=3
###   @2=‘linzhongniao1‘
### SET
###   @1=3
###   @2=‘linzhongniao2‘
### UPDATE `linzhongniao`.`student`
### WHERE
###   @1=5
###   @2=‘linzhongniao1‘
### SET
###   @1=5
###   @2=‘linzhongniao2‘
### UPDATE `linzhongniao`.`student`
### WHERE
###   @1=6
###   @2=‘linzhongniao1‘
### SET
###   @1=6
###   @2=‘linzhongniao2‘
### UPDATE `linzhongniao`.`student`
### WHERE
###   @1=8
###   @2=‘linzhongniao1‘
### SET
###   @1=8
###   @2=‘linzhongniao2‘
### UPDATE `linzhongniao`.`student`
### WHERE
###   @1=10
###   @2=‘linzhongniao1‘
### SET
###   @1=10
###   @2=‘linzhongniao2‘
### UPDATE `linzhongniao`.`student`
### WHERE
###   @1=11
###   @2=‘linzhongniao1‘
### SET
###   @1=11
###   @2=‘linzhongniao2‘
### UPDATE `linzhongniao`.`student`
### WHERE
###   @1=13
###   @2=‘linzhongniao1‘
### SET
###   @1=13
###   @2=‘linzhongniao2‘
### UPDATE `linzhongniao`.`student`
### WHERE
###   @1=15
###   @2=‘linzhongniao1‘
### SET
###   @1=15
###   @2=‘linzhongniao2‘
# at 617
#180214  0:52:30 server id 1  end_log_pos 644   Xid = 39
COMMIT/*!*/;
DELIMITER ;
# End of log file

我們看上面的內容可以發現row模式記錄每一行記錄被修改的內容,修改成什麽樣了,這樣就會導致bin-log日誌的存儲量就會很大

Mysql DBA 高級運維學習筆記-Mysql數據庫中的日誌文件