mysql之binlog和各種日誌介紹

1.錯誤日誌html

錯誤日誌做用記錄MySQL的啓動、中止信息以及在MySQL運行過程當中的錯誤信息。

參數log_error(默認開啓)  修改後重啓生效mysql

log_error=[path/[file_name]],若是不指定文件名,則默認hostname.err.sql

查看錯誤日誌路徑:shell

mysql> show variables like '%log_error%';數據庫

刪除錯誤日誌後:安全

<5.5.7版本時,flush logs會將filename.err命名爲filename.err_old服務器

>5.5.7版本則只是會重建錯誤日誌,也就是除非錯誤日誌被刪除了,會重建一個不然不會對線上錯誤日誌有影響。網絡

注意:刪除錯誤日誌後,不會自動重建。須要flush logs或者重啓數據庫。session

 

mysqladmin -u root -p flush-logs  或者 mysql>flush logs;從新後生成錯誤日誌(同名).分佈式

2.MySQL general日誌(默認關閉)

做用:會記錄全部的mysql內執行的sql語句(注意是全部語句,包括查詢語句).通常不開啓,由於要記錄全部的語句,因此IO壓力比較大當統計某些sql的執行頻率,寫腳本過濾一些sql.是用到.
查看general日誌路徑:
mysql> show variables like '%general_log%';

general_log(默認關閉){0-關閉,1-開啓能夠在線打開和關閉;

set global general_log='ON;

general_log_file=file_name,

不指定文件名只指定路徑則爲hostname.log (例如主機名爲master,則爲master.log)

3.MySQL慢查詢日誌(默認關閉)

做用:記錄慢sql,執行比較慢的sql.

路徑mysql> show variables like '%slow_query_log%';

MySQL的慢查詢日誌是MySQL提供的一種日誌記錄,它用來記錄在 MySQL中響應時間超過閥值的語句。(默認關閉)

注意:慢查詢日誌不會計算語句在開始執行以前等待鎖的時間 (initial slow query)mysqld只會從語句等待的鎖釋放掉,並開始執行開始計算時間(執行開始後的鎖定時間會記錄)。因此慢查詢日誌中的語句順序和語句的發出順序或者general log的順序不一樣。

相關參數:

slow_query_log =1/0   ---開啓關閉慢查詢

long_query_time = 1 2 3  ---慢查詢閥值.(單位是s)

log_queries_not_using_indexes:記錄沒有用索引的查詢

參數:log_throttle_queries_not_using_indexes:#設定每分鐘記錄到日誌的未使用索引的語句數目,超過這個數目後只記錄語句數量和花費的總時間

參數:min_examined_row_limit:要檢查的行數大於等於N時 才記錄爲慢查詢,前提是必須知足long_query_time log-queries-not-using-indexes約束。

參數:log_slow_admin_statements:管理語句是否記錄

參數:log_slow_slave_statements:從庫的語句執行是否記錄.

慢日誌信息例子:

# Time: 2018-10-18T21:56:45.731545+08:00

# User@Host: root[root] @ localhost []  Id:     5

# Query_time: 3.059106  Lock_time: 0.000208 Rows_sent: 1048576  Rows_examined: 1048576

SET timestamp=1539871005;

select * from lbg;

分析:

Time:---sql執行完時間。 

 root[root] @ localhost     ---用戶、發出sql的ip

 Query_time:       ----sql執行時間        

 Lock_time:            ---查詢等待鎖的時間

 Rows_sent            -----結果集大小

Rows_examined         ---掃描行數

SET timestamp        ----發出sql的時間

慢日誌分析工具:  MySQLdumpSlow工具

-s, 是表示按照何種方式排序,ctlr分別是按照記錄次數、時間、查詢時間、返回 的記錄數來排序,

acatalar,表示相應的倒敘;

-t, top n的意思,即爲返回前面多少條的數據;

-g, 後邊能夠寫一個正則匹配模式,大小寫不敏感的;

好比:

統計用時最長的10sql

mysqldumpslow  -s t -t 10 mysql-slow.log

執行頻率最高的10sql

mysqldumpslow  -s c -t 10 mysql-slow.log 

例子:

[root@lbg logs]# mysqldumpslow  -s t -t 10 mysql-slow.log 

Reading mysql slow query log from mysql-slow.log

Count: 1  Time=18.34s (18s)  Lock=0.00s (0s)  Rows=1048576.0 (1048576), []@[]

  throttle:         N 'S' warning(s) suppressed.

Count: 1  Time=3.06s (3s)  Lock=0.00s (0s)  Rows=1048576.0 (1048576), root[root]@localhost

  select * from lbg

Count: 4  Time=0.01s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), root[root]@localhost

  insert into lbg select * from lbg

Died at /usr/local/mysql/bin/mysqldumpslow line 161, <> chunk 6.

4.binlog

 1.binlog做用及文件路徑

做用: binlog實際上是(binary log)是MySQL二進制日誌,以二進制的形式記錄了對於數據庫的變動操做,記錄全部的mysql的變化狀況(不包括select show 等查詢語句),其左右有:

1.用來查看mysql變動

2.mysql的備份恢復

3.mysql的主從複製

查看bin_log路徑:

mysql> show variables like '%log_bin_basename%';

[root@lbg mysql3306]# ll mysql-bin*

-rw-r----- 1 mysql mysql 154 Oct 18 22:07 mysql-bin.000001

-rw-r----- 1 mysql mysql  43 Oct 18 22:07 mysql-bin.index

說明: mysql-bin.000001,數字慢慢增大,剛生成的binlog大小爲154.

其中mysql-bin.index 裏記錄的就是bin-log文件的位置。

[root@lbg mysql3306]# cat mysql-bin.index 

/home/mysql3306/mysql3306/mysql-bin.000001

     2.bin-log生成方式

1.mysql在啓動時候,會生成新的binlog.

2.flush logs     ----從新生成錯誤日誌,也會從新生成bin-log

3.當達到單個binlog 文件的閥值的時候

mysql> show variables like '%max_binlog%';

 Variable_name                               Value                

 max_binlog_cache_size           8589934592           

 max_binlog_size                      1073741824           

 max_binlog_stmt_cache_size  18446744073709547520 

注意:當超過1GB文件的時候,會自動切到新的binlog,執行某些大事務,爲了事務的完整性,binlog要等事務執行完成後切換,因此binlog可能大於1GB.

 

     3.bin-log相關參數

binlog_cache_size 內存分配,線程級別的內存分配,要給每個線程單獨的分配binlog cache

binlogcache大小=binlog_cache_size*線程數(這也是buffer-pool爲最大爲內存75%的緣由之一,要留一部份內存給binlog和操做系統用)

max_binlog_cache_size,全局參數,全部的binlogcache size總和不超過該值,超過該值,報下面錯: Multi-statement transaction required more than 'max_binlog_cache_size' bytes ofstorage

max_binlog_size:設置 binlog文件的最大值,默認和最大是1GB,並不能嚴格限定二進制文件的大小

binlog_do_db: 此參數表示只記錄指定數據庫的二進制日誌

binlog_ignore_db: 此參數表示不記錄指定的數據庫的二進制日誌

binlog_checksum  {CRC32|NONE}

binlog時,會將內容生成校驗位,以後存儲在binlog中。默認狀況下,服務器記錄事件的長度以及事件自己,並使用它來驗證事件是否正確寫入。也能夠經過設置binlog_checksum系統變量來使服務器爲事件寫入校驗和。

log_bin與log_bin_basename:決定了msyql binlog的名字,生成的binlog名字爲mysql-bin.000001

binlog_format: 規定binlog的格式,binlog有三種格式statementrow以及mixed默認使用statement,建議使用row格式

expire_logs_days :過時時間(單位是天)

sync_binlog: 值爲01n,    在提交n次事務後,進行binlog的落盤,0爲不進行強行的刷新操做,而是由文件系統控制刷新日誌文件.  若是是在線交易和賬有關的數據建議設置成1, 若是是其它數據能夠保持爲0便可。(1配置參數之一.)

0  1s落盤一次

1  每次commit落盤一次

n  n個事務落盤一次

sql_log_bin  --關閉當前sessionbinlog (導入大量數據時,不但願記錄binlog.導完再開啓參數)

    4.清理binlog

 在開啓mysql的主從後,會產生大量的binlog日誌文件,可能佔用大量的磁盤空間,

 1.手工刪除binlog

mysql> reset master; //刪除masterbinlog ---會刪除全部的binlog文件,重置爲1,很是危險.

###reset master後,會形成slave沒法找到master的嚴重後果

mysql> reset slave; //刪除slave的中繼日誌

mysql> purge master logs before '2012-03-30 17:20:00'; //刪除指定日期之前的日誌索引中binlog日誌文件

mysql> purge master logs to 'binlog.000002'; //刪除指定日誌文件的日誌索引中binlog日誌文件

或者直接用操做系統命令直接刪除:直接rm(mysql-bin日誌,刪除索引信息mysql-bin.index裏對應信息.)注意:不能刪除正在使用的binlog(1.編號最大的binlog  2.從庫尚未同步完成的binlog,)  這種方法儘可能不用.

 2.自動刪除binlog(經過參數expire_logs_days )

經過binlog參數(expire_logs_days ,設置binlog的過時參數)來實現mysql自動刪除binlog

show binary logs;

show variables like 'expire_logs_days';

set global expire_logs_days=7;

    5.binlog格式

binlog格式由參數binlog_format定義.分三種: statement , row,mixed  格式.

statement格式:

特色:記錄每一條數據的SQL語句,將執行的每一條SQL記錄在binlog.

優勢:減小日誌量,節省IO,提升性能。

缺點:某些SQL中的函數沒法使用,好比SYSDATE(),在同步過程當中會出現沒法同步的問題。

row格式:

特色:修改以前和修改以後的行的信息.

binlog中僅僅記錄哪一條記錄被修改,不記錄sql語句,會詳細記錄每一row的更改細節,不會出現沒法複製的問題。

優勢:安全,通常線上使用row格式。

缺點:由於要記錄每一條修改記錄的日誌, 數據比較大,可能對數據網絡壓力 IO壓力形成影響大量佔用磁盤IO和大量使用硬盤空間。

mixed格式:

特色:結合了上面兩種方式,通常的語句使用SQL語句來記錄,遇到特殊的語句使用row格式來記錄,保證數據的一致性和複製的準確性。

注意:上面三種都是針對DML語句, DDL無論在哪一個格式,都只記錄語句. drop table test1;

查看binlog格式:    mysql> show variables like '%binlog_format%'; 

修改binlog格式: mysql> set global binlog_format='row';

顯示存在的binlog: mysql> show binary logs;

查看binlog文件內容: mysql> show binlog events;

通常咱們咱們如何在binlog裏面定位一個事務?

文件名:mysql-bin.000001. 加上position點能夠定位一個事務.

position:就是寫入binlog的字節數.(154開啓,前面是無心義信息.開始文件就是154)

xid :是儲存引擎內部分佈式事務編號。

  6.查看binlog文件

在數據庫裏查看:mysql> show binlog events;(這是通過被解析後的結果,其實文件底層是二進制)
查看binlog文件:
[root@lbg1 mysql3306]# mysqlbinlog mysql-bin.000003 -vv >/tmp/lbg.bin

--vv的做用:第一個v,顯示sql,第二個v,顯示sql的字段類型和其餘信息.

[root@lbg1 mysql3306]# cat /tmp/lbg.bin

@1指表的第1個字段。@2表示第2個字段。底下藍色的###段落是其上面對應亂碼翻譯後的解釋。

 

注意:mysqlbinlog命令文件是否是安裝目錄下的bin文件裏(which mysqlbinlog),由於可能系統安裝過mysql,那麼可能讀取的是/usr/bin/mysqlbinlog,低版本解析有問題。

mysqlbinlog使用方法:

截取pos點範圍或者時間範圍的binlog:start-datetime   stop-datetime 或者start-positionstop-position  。

使用mysqlbinlog查看binlog:

/usr/local/mysql/bin/mysqlbinlog  /home/mysql3306/mysql3306/mysql-bin.000001  > /tmp/mysql_binlog.sql

根據時間查看binlog:

/usr/local/mysql/bin/mysqlbinlog --start-date="2017-04-20 9:00:00" --stop-date="2017-07-20 18:00:00"

/home/mysql3306/mysql3306/mysql-bin.000001 > /tmp/mysql_binlog.sql

startstop的範圍是 [start, stop)

根據pos點查看binlog:

/usr/local/mysql/bin/mysqlbinlog bin.000017 --start-position=1959 --stop-position=2057 -vv > /tmp/a.sql

解析row格式的mysqlbinlogSQL格式:

mysqlbinlog  mysql-bin.000001 --base64-output=DECODE-ROWS  -vv > /tmp/all.bin

--base64-output=DECODE-ROWS 是爲了適應mysql,  server設置binlog_format=row。

注意:若用於恢復數據,則必定不能帶--base64-output=DECODE-ROWS選項,不然會恢復有問題。

 7.導入多個binlog的注意事項

binlog恢復:

注意,若是有多個 binlog文件想要恢復, 不要一個一個恢復

shell> mysqlbinlog binlog.000001 | mysql -u root -p

shell> mysqlbinlog binlog.000002 | mysql -u root -p

上面這種恢復方式是錯誤的,若是 binlog.000001 中建立了一個臨時表(CREATE TEMPORARY TABLE),而 binlog.000002 中要使用這個臨時表,可是 第一個線程(binlog.000001) 在釋放的時候會刪除臨時表,此時第二個線程(binlog.000002) 就沒法使用這個臨時表了.

正確的作法以下:

shell> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p ##

或者

shell> mysqlbinlog binlog.000001 > /tmp/statements.sql

shell> mysqlbinlog binlog.000002 >> /tmp/statements.sql

或者

shell> mysqlbinlog binlog.00000[1-2] > /tmp/statements.sql 

shell> mysql -u root -p -e "source /tmp/statements.sql"

 8.binlog和redo的區別

Binlog:二進制日誌是一種邏輯日誌,可能只記錄了對應的SQL語句。

Innodb存儲引擎的的redo日誌記錄的是數據頁被修改的的物理格式日誌,

兩種日誌的寫入時間也不同,binlog只在事務提交的時候寫入,redo須要在事務過程當中不斷的寫入。

 9.MyFlash的使用

 該工具注意事項

1.binlog格式必須爲row,binlog_row_image=full

2.僅支持5.65.7

3.只能回滾DML(增、刪、改)

使用美團工具以下:

[root@lbg1 MyFlash-master]# unzip MyFlash.zip

[root@lbg1 MyFlash-master]# ls

binary  binlog_output_base.flashback  build.sh  doc  README.md  source  testbinlog

安裝依賴並編譯:

yum -y install glib2*

gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c -o binary/flashback

完成上面操做後:

[root@lbg1 MyFlash-master]# cd binary/

[root@lbg1 binary]# ls

flashback  mysqlbinlog20160408        ---實際此文件在編譯前就有。

其中要使用的就是flashback工具。

使用命令:

1.回滾整個文件:

./flashback --binlogFileNames=haha.000041

mysqlbinlog binlog_output_base.flashback | mysql -h -u -p

2.回滾該文件中的全部deldte語句

./flashback --sqlTypes='DELETE' --binlogFileNames=haha.000041

mysqlbinlog binlog_output_base.flashback | mysql -h -u -p

說明:使用flashback後會生成當前路徑下生成新的二進制binlog文件。想查看的話可msyqlbinlog 文件名 > /tmp/lbg.bin,再查看/tmp/lbg.bin便可,想恢復數據直接source /tmp/lbg.bin便可。

3.根據position點恢復數據

[root@lbg1 soft]#  /soft/MyFlash-master/binary/flashback   --start-position=801 --stop-position=1591   --sqlTypes='DELETE' --binlogFileNames=/home/mysql3306/mysql3306/mysql-bin.000001

注意:查找start-position時需是begin字段前的position點,stop-position的值是commit後的position點。

4.回滾大文件:

回滾

./flashback --binlogFileNames=haha.000042

切割⼤文件

./flashback --maxSplitSize=1 --binlogFileNames=binlog_output_base.flashback

應⽤

mysqlbinlog binlog_output_base.flashback.000001 | mysql -h -u -p

...

mysqlbinlog binlog_output_base.flashback. | mysql -h -u -p

10.binlog實時遠程備份命令

[root@lbg2 lbg]# mysqlbinlog --read-from-remote-server --raw --host=192.168.88.8 --port=3306 --user=root --password=root --stop-never mysql-bin.000001

----生成的binlog在本地。

不足:這個方式有個問題,對於常規的主從複製來講,若是主從直接的鏈接斷開了,則從會自動再次鏈接,而對於mysqlbinlog,若是斷開了,並不會自動鏈接。可經過腳原本彌補上述不足。實際上定義了一個死循環,若是備份失敗,則10s後從新鏈接。

相關文章
相關標籤/搜索