日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql二进制日志内容说明_MySQL二进制日志相关问题详细说明

發布時間:2024/9/19 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql二进制日志内容说明_MySQL二进制日志相关问题详细说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

軟件安裝:裝機軟件必備包

SQL是Structured Query Language(結構化查詢語言)的縮寫。SQL是專為數據庫而建立的操作命令集,是一種功能齊全的數據庫語言。在使用它時,只需要發出“做什么”的命令,“怎么做”是不用使用者考慮的。SQL功能強大、簡單易學、使用方便,已經成為了數據庫操作的基礎,并且現在幾乎所有的數據庫均支持SQL。本文出處:

(保留出處并非什么原創作品權利,本人拙作還遠遠達不到,僅僅是為了鏈接到原文,因為后續對可能存在的一些錯誤進行修正或補充,無他)

今天無意中發現了一個云棲社區舉行的MySQL“第一季:挑戰玄慚之 慢SQL性能優化賽”,在測試服務器上執行其測試腳本寫入數據的時候報錯提示如下,

Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage,increase this mysqld variable and try agagin

提示max_binlog_cache_size空間不足,因為開啟了二進制日志,之前是默認設置沒有大批量的事務性操作,沒有遇到該問題,這一次一開始就遇到一個較大的事務性操作就失敗了。

之后修改binlog_cache_size的大小之后,問題解決。

由于使用的是默認的innodb引擎,開啟了二進制日志,

對于事務性的操作,是要事物完成的時候寫入二進制日志,事物提交之前,執行的寫入性操作會被緩存起來,直到整個事物完成,mysqld進程會將整個事物寫入二進制日志。

當事物開始的時候,會按照binlog_cache_size系統變量指定的值分配內容空間,如果指定的binlog_cache_size緩存空間不夠,執行的事務性操作回滾并提示失敗。

順便總結一下二進制日志(binary log)以及其相關參數信息

什么是二進制日志?

用來記錄操作MySQL數據庫中的寫入性操作(增刪改,但不包括查詢),相當于sqlserver中的完整恢復模式下的事務日志文件。

二進制日志的作用?

1,用于復制,配置了主從復制的時候,主服務器會將其產生的二進制日志發送到slave端,slave端會利用這個二進制日志的信息在本地重做,實現主從同步

2,用戶恢復,MySQL可以在全備和差異備份的基礎上,利用二進制日志進行基于時間點或者事物Id的恢復操作。原理雷同于主從復制的日志重做。

二進制日志(binary log)的相關參數信息

1,開啟二進制日志

開啟二進制日志,需要指定一個log-bin參數的路徑,比如:log_bin=/var/lib/mysql/mysql-bin

開始二進制日志之后會自動生成一個管理二進制日志的log_bin_index文件。log_bin選項也顯示為on,也即開啟了二進制日志。

2,二進制日志文件的格式

二進制日志的格式由參數binlog_format控制,二進制日志有三種模式,基于語句(statement)的,基于行的(row),以及結合前兩者的混合模式(mixed)

基于語句的二進制功能有一些硬傷(個人認為),比如同樣的update語句中的利用當前時間的now更新操作,在主服務器和從服務器上同樣都是獲取當前時間,主從復制得到的結果是不一樣的。

基于行的二進制日志模式解決了基于語句的一些缺陷,但是某些情況下回產生大量的日志,比如一個update操作更新了100W行數據,如果是基于行的二進制日志,結果就是產生了100W條日志

基于混合模式的,結合上述兩種方式的優點。

可以在配置文件中設置:binlog_format = MIXED

3,二進制日志的記錄時機

二進制日志記錄可以使同步的,也即事物提交之后就寫入二進制日志,也可以是異步的,由操作系統的磁盤緩存覺得什么時候寫入磁盤。

由參數sync_binlog= n來控制,設置sync_binlog = 1的話,表示最高安全級別的寫入(但也不能保證不丟失任何事物日志),相當于是一種安全寫入模式,不過對性能有一定的影響。

個人覺得,如果是事務性的引擎,本身就是為了保證事物安全的,沒理由不把sync_binlog 設置為1。

據說設置為sync_binlog設置為1也會潛在丟失一個事務日志的可能性,但是還沒想明白為什么會丟失,因為既然是事務性引擎,還有一層undo或者redo日志在做后盾啊?

后面想想,因為有redo和undo日志的存在,事物的一致性可以在主服務器上得到保證,應該是主從復制的時候,可能丟失的一條事物可能無法傳遞到從服務器。

4,二進制日志的單個文件大小

二進制日志的大下就是單個日志文件的最大限制,正常情況下都不會超過設置的最大文件的大小限制,超過設置的最大限制之后,會發生日志滾動,也即重新生成一個二進制日志文件。

max_binlog_size = 100M

這里顯示的104857600單位是字節,也即104857600/1024/1024 = 100M

5,二進制日志的清理

二進制日志滾動之后會生成新的文件來存儲日志,日志文件逾期之后會自動刪除,否則會產生源源不斷的日志文件

比如可以設置過期時間為2,可配值為:expire_logs_days = 2,超過兩天的二進制日志會被自動刪除。

可以通過命令show master logs 查看當前的二進制日志文件個數

6,二進制日志文件的滾動

1)正常情況下,記錄滿之后,自動滾動,后綴名+1

2)重啟mysql服務之后,自動滾動,不管日志文件是否按照指定的最大容量寫滿

3)手動滾動,執行flush logs命令,如下執行flush logs之后,重新生成了一個二進制日志文件

4)手動刪除二進制日志

可以通過命令purge binary logs to fileName刪除指定fileName之前的文件

可以通過命令purge binary logs before '2017-03-10 10:10:00'刪除指定時間之前的文件

刪除指定日志purge binary logs before date_sub( now( ), interval 7 day);

瀟湘大神是purge master logs before date_sub( now( ), interval 7 day),應該是一個效果(binary和master關鍵詞)?

7,二進制日志的綁定(或者排除)的數據庫

可以設置某些數據庫開啟二進制日志,或者某些數據庫不開啟二進制日志

# binlog_do_db:設置master-slave時使用;

# binlog-ignore-db:設置哪個數據庫不記錄日志;

MySQL5.7.18中設置了(my.cnf中配置了),但是查詢的時候好像沒用?

8,二進制日志的緩存以及緩存大小配置

binlog_cache_size的大小,一開始提到的問題,當事物開始的時候,會按照binlog_cache_size系統變量指定的值分配內容空間,如果指定的binlog_cache_size緩存空間不夠則會報錯并回滾事物

這里顯示的記錄的單位同樣是字節,除以兩個1024之后就是以MB為單位的容量了,這里的20971520 /1024/1024就相當于20MB了。

如果有較大的事務性操作,比如在測試的時候,必須要將此緩存設置的相對較大一些,否則語句無法成功執行

max_binlog_cache_size語binlog_cache_size的區別在于前者是實例級別的cache,后者是Session級別的cache,如果并發量很大,就需要考慮將max_binlog_cache_size設置的稍微大一些。

max_binlog_cache_size默認是是4GB,最大值也是4GB,這里為了測試設置的是100MB(104857600/1024.0/1024.0)

max_binlog_cache_size設置的最大內存大小為4GB,如果服務器內容較大,比如128GB或者更大,max_binlog_cache_size默認為設置為最大也無傷大雅,因為要保證并發成功寫入。

至于對于Session級別的binlog_cache_size大小,可以根據業務情況自行調整,個人覺得設置的稍微大一點也問題不大,畢竟,除了正常的OLTP操作,有一些定時作業之類的數據提取或者merge數據之類的操作可能會產生大量的日志。

據說是可以通過查看binlog_cache_disk_use 與 binlog_cache_use來判斷binlog_cache_size是否需要調整。

但是在MySQL5.7.18中并沒有發現這個參數

9,二進制日志其他參數

max_binlog_stmt_cache_size針對非事務語句,非事務性的參數暫不關心它了

記得某次看到過某大師說過,innodb引擎優勢不僅僅在事務性的支持上,與非事物引起的myisam引擎相比,讀取性能上差距越來越小,MySQL因此將innodb設置為默認引擎。

放棄myisam,投奔innodb是正道。

binlog_checksum 用作復制的主從校檢。暫時沒有研究過這個參數,暫不論

詳細參考想想大神的文章 。

總結:

MySQL二進制日志不僅僅作用于功能性(master-slave復制)的,還作用于安全性(二進制日志)以及開啟了二進制日志情況下的事務性操作,因此對于生產環境,可以認為是一個必不可少的配置。

同時,其各種參數又會影響到某些操作,因此二進制日志的參數要格外的重視,確保數據庫在使用時在功能性和可用性上得到保證。

參考:

《涂抹MySQL》

以及各種翻書,網上資料

行動起來,可以改變思維模式以及畏懼心理。

總結

以上是生活随笔為你收集整理的mysql二进制日志内容说明_MySQL二进制日志相关问题详细说明的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。