MySQL binlog

  • 今天想到binlog的一個問題,binlog是何時生成的呢?
    正常情況下應(yīng)該是每次執(zhí)行更改數(shù)據(jù)的SQL都會生成對應(yīng)的binlog event,
    但是如果平時注意的話,就會意識到binlog里不會記錄rollback的事務(wù),只有提交的事務(wù),
    那就推測binlog是在提交時生成的.

  • 但是用戶提交時再生成binlog的話,信息在哪保存的呢?
    redo里只有物理頁的修改,不可能是根據(jù)redo生成
    想到binlog有個參數(shù)
    binlog_cache_size
    官方文檔上說: The size of the cache to hold changes to the binary log during a transaction.
    也就是緩存一個事務(wù)過程中的數(shù)據(jù)變化
    而且這個是每個session都會分配那么大的緩存

  • 那如果一個大事務(wù),修改的數(shù)據(jù)超過了緩存大小呢?

mysql> show status like 'binlog%';
+----------------------------+------------------+
| Variable_name              | Value            |
+----------------------------+------------------+
| Binlog_snapshot_file       | mysql-bin.000011 |
| Binlog_snapshot_position   | 23554531         |
| Binlog_cache_disk_use      | 0                |
| Binlog_cache_use           | 1013712          |
| Binlog_stmt_cache_disk_use | 0                |
| Binlog_stmt_cache_use      | 15               |
+----------------------------+------------------+

查看官網(wǎng)
Binlog_cache_disk_use
The number of transactions that used the temporary binary log cache but that exceeded the value of binlog_cache_size and used a temporary file to store statements from the transaction.
可見超過binlog_cache_size的數(shù)據(jù),就直接緩存到臨時文件中了

  • 那到底何時落盤呢?
    查看參數(shù)
    sync_binlog
    sync_binlog=N
    where N is a value other than 0 or 1: The binary log is synchronized to disk after N binary log commit groups have been collected.
    可見binlog刷盤是按照事務(wù)來做的

由此可見,binlog在提交前都是先緩存,提交后才會落盤

查看源碼確認(rèn)

MySQL Version: 8.0.16

  • 查看binlog相關(guān)函數(shù) commit (之前版本為 binlog_commit)
/*
 提交事務(wù)后處理當(dāng)前session的binlog以及存儲引擎層的提交
主要有三部分工作:
1. 完善binlog cache,補(bǔ)充必要的cache
2. 執(zhí)行 execute an ordered flush and commit
3. 判斷處理異常錯誤
*/
TC_LOG::enum_result MYSQL_BIN_LOG::commit(THD *thd, bool all) {
  .........
    // 重點(diǎn)關(guān)注提交部分
    if (ordered_commit(thd, all, skip_commit)) DBUG_RETURN(RESULT_INCONSISTENT);
  .........
}
  • ordered_commit 函數(shù)
/*
處理組提交部分邏輯
流程如下:
  1. Queue ourselves for flushing.
  2. Grab the log lock, which might result is blocking if the mutex is
     already held by another thread.
  3. If we were not committed while waiting for the lock
     1. Fetch the queue
     2. For each thread in the queue:
        a. Attach to it
        b. Flush the caches, saving any error code
     3. Flush and sync (depending on the value of sync_binlog).
     4. Signal that the binary log was updated
  4. Release the log lock
  5. Grab the commit lock
     1. For each thread in the queue:
        a. If there were no error when flushing and the transaction shall be
  committed:
           - Commit the transaction, saving the result of executing the commit.
  6. Release the commit lock
  7. Call purge, if any of the committed thread requested a purge.
  8. Return with the saved error code
*/

int MYSQL_BIN_LOG::ordered_commit(THD *thd, bool all, bool skip_commit) {
//     Stage #1: flushing transactions to binary log
  if (has_commit_order_manager(thd)) {
    Slave_worker *worker = dynamic_cast<Slave_worker *>(thd->rli_slave);
    Commit_order_manager *mngr = worker->get_commit_order_manager();

    if (mngr->wait_for_its_turn(worker, all)) {
      thd->commit_error = THD::CE_COMMIT_ERROR;
      DBUG_RETURN(thd->commit_error);
    }

    if (change_stage(thd, Stage_manager::FLUSH_STAGE, thd, NULL, &LOCK_log))
      DBUG_RETURN(finish_commit(thd));
  } else if (change_stage(thd, Stage_manager::FLUSH_STAGE, thd, NULL,
                          &LOCK_log)) {
    DBUG_PRINT("return", ("Thread ID: %u, commit_error: %d", thd->thread_id(),
                          thd->commit_error));
    DBUG_RETURN(finish_commit(thd));
  }
.......
  /*
    Stage #2: Syncing binary log file to disk
  */

  if (change_stage(thd, Stage_manager::SYNC_STAGE, wait_queue, &LOCK_log,
                   &LOCK_sync)) {
    DBUG_PRINT("return", ("Thread ID: %u, commit_error: %d", thd->thread_id(),
                          thd->commit_error));
    DBUG_RETURN(finish_commit(thd));
  }

  /*
    Shall introduce a delay only if it is going to do sync
    in this ongoing SYNC stage. The "+1" used below in the
    if condition is to count the ongoing sync stage.
    When sync_binlog=0 (where we never do sync in BGC group),
    it is considered as a special case and delay will be executed
    for every group just like how it is done when sync_binlog= 1.
  */
  if (!flush_error && (sync_counter + 1 >= get_sync_period()))
    stage_manager.wait_count_or_timeout(
        opt_binlog_group_commit_sync_no_delay_count,
        opt_binlog_group_commit_sync_delay, Stage_manager::SYNC_STAGE);

  final_queue = stage_manager.fetch_queue_for(Stage_manager::SYNC_STAGE);

  if (flush_error == 0 && total_bytes > 0) {
    DEBUG_SYNC(thd, "before_sync_binlog_file");
   // !!!! 調(diào)用系統(tǒng)調(diào)用 Call fsync() to sync the file to disk.
    std::pair<bool, bool> result = sync_binlog_file(false);
    sync_error = result.first;
  }

//     Stage #3: Commit all transactions in order.

}

證實(shí)確實(shí)是操作緩存到cache,提交時再做羅盤

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乎完,更是在濱河造成了極大的恐慌采盒,老刑警劉巖周循,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件植兰,死亡現(xiàn)場離奇詭異,居然都是意外死亡蟹肘,警方通過查閱死者的電腦和手機(jī)词疼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帘腹,“玉大人贰盗,你說我怎么就攤上這事≈窠罚” “怎么了童太?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胸完。 經(jīng)常有香客問我书释,道長,這世上最難降的妖魔是什么赊窥? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任爆惧,我火速辦了婚禮,結(jié)果婚禮上锨能,老公的妹妹穿的比我還像新娘扯再。我一直安慰自己,他們只是感情好址遇,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布熄阻。 她就那樣靜靜地躺著,像睡著了一般倔约。 火紅的嫁衣襯著肌膚如雪秃殉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天浸剩,我揣著相機(jī)與錄音钾军,去河邊找鬼。 笑死绢要,一個胖子當(dāng)著我的面吹牛吏恭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播重罪,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼樱哼,長吁一口氣:“原來是場噩夢啊……” “哼哀九!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唇礁,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤勾栗,失蹤者是張志新(化名)和其女友劉穎惨篱,沒想到半個月后盏筐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砸讳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年琢融,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片簿寂。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡漾抬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出常遂,到底是詐尸還是另有隱情纳令,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布克胳,位于F島的核電站平绩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏漠另。R本人自食惡果不足惜捏雌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望笆搓。 院中可真熱鬧性湿,春花似錦、人聲如沸满败。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽算墨。三九已至宵荒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間米同,已是汗流浹背骇扇。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留面粮,地道東北人少孝。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像熬苍,于是被迫代替她去往敵國和親稍走。 傳聞我的和親對象是個殘疾皇子袁翁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345