MySQL學習從零開始--第六部分

  1. Binlog是什么?有哪幾種格式?推薦使用哪種,為什么

    Binlog是什么

    • Binlog二進制日志是MySQL Server層記錄所有更改數據庫內容的操作日志的二進制文件,如操作UPDATE,DELETE,INSERT
    • Binlog不記錄SELECT,SHOW等查詢操作
    • 使主從復制,數據恢復,審計追蹤的核心
    • 通常位于數據目錄,文件名類似:mysql-bin.000001

    通過參數bonlog_format設置格式

    • STATEMENT 記錄原始SQL語句(默認早期版本使用)
    • ROW 記錄每一行被修改的具體值(行級變更)
    • MINED 自動選擇使用STATEMENT 或 ROW,復雜操作使用 ROW,簡單操作用 STATEMENT

    推薦使用ROW格式

    描述
    精確記錄數據變更后的具體值,不受環境因素影響
    一致性高主從復制不會出現因 SQL 非確定性引起的數據不一致問題
    恢復準確更容易基于 binlog 做精準恢復

    可通過修改MySQL配置文件或使用SQL語句設置Binlog格式

    • 修改配置文件

      [mysqld]
      binlog_format = ROW  # 可選值:STATEMENT、ROW、MIXED
      
    • 使用SQL語句動態修改

      SET GLOBAL binlog_format = 'ROW';  # 可選值:STATEMENT、ROW、MIXED
      
  2. 對數據庫的操作是先執行,還是先寫入binlog中?為什么
    總結:

    事務性操作(如 InnoDB)
    執行操作 → 記錄 redo log → 寫入 binlog → 提交事務通過兩階段提交確保 binlog 與數據變更的一致性。

    非事務性操作(如 MyISAM)執行操作 → 寫入 binlog,存在崩潰導致主從不一致的風險

    • 事務性存儲引擎(如 InnoDB)的執行流程

      對于支持事務的存儲引擎,MySQL 采用 兩階段提交 確保 binlog 與數據變更的一致性

      1. 執行 SQL 并記錄 redo log
        • 執行 SQL 語句,修改內存中的數據頁(Buffer Pool)。
        • 將變更記錄到redo log(物理日志),確保崩潰恢復時數據不丟失。
      2. 準備階段(Prepare)
        • 存儲引擎將事務標記為PREPARED狀態。
        • 強制將 redo log 寫入磁盤(確保持久性)。
      3. 寫入 binlog:將事務的變更寫入binlog(邏輯日志)。
      4. 提交階段(Commit)
        • 存儲引擎將事務標記為COMMITTED狀態。
        • 寫入commit 標記到 redo log,事務完成。

      關鍵點:

      • binlog 在事務提交前寫入,但在存儲引擎真正提交前。
      • 通過 redo log 和兩階段提交,保證 binlog 與數據變更的順序一致,避免主從復制不一致。
      二、非事務性存儲引擎(如 MyISAM)的執行流程

      對于不支持事務的存儲引擎:

      1. 執行 SQL 并修改數據文件:直接執行 SQL,修改數據文件和索引。
      2. 寫入 binlog:操作完成后,將變更記錄到 binlog。

      風險
      如果在執行 SQL 后、binlog 寫入前發生崩潰,可能導致主從數據不一致(主庫已執行但從庫未復制)。

  3. 如果剛寫入binlog,數據庫出現異常,沒有寫入就重啟了,會發生什么事情

    • 在 MySQL 中,若binlog 已寫入但數據未提交時發生異常重啟,InnoDB 存儲引擎會通過 崩潰恢復和兩階段提交(2PC) 機制確保數據一致性

    • binlog 寫入后數據庫異常重啟,不會導致數據不一致,可能需要通過 redo log 完成未完成的提交操作。是 MySQL 主從復制可靠性的核心保障之一

      兩階段提交

      1. 準備階段(Prepare)
      • 執行 SQL 并記錄 redo log。
      • InnoDB 將事務標記為PREPARED,并寫入 redo log。
      1. 提交階段(Commit)
      • MySQL Server 寫入 binlog。
      • InnoDB 寫入COMMIT標記到 redo log,事務完成
    • 發生異常的三種場景及處理

    • 場景 1:binlog 寫入后,InnoDB 未收到提交指令
      • 現象:binlog 已寫入磁盤,但 InnoDB 未執行COMMIT
      • 恢復流程
        1. 重啟后,InnoDB 通過 redo log 發現事務處于PREPARED狀態。
        2. 檢查 binlog:
          • 若 binlog 存在該事務:InnoDB 自動提交事務(與 binlog 保持一致)。
          • 若 binlog 不存在:InnoDB 回滾事務。
      場景 2:binlog 寫入失敗(如磁盤已滿)
      • 現象:binlog 寫入中斷,InnoDB 未收到提交指令。
      • 恢復流程
        1. binlog 寫入失敗時,MySQL Server 會回滾事務(協調者決定)。
        2. 重啟后,InnoDB 通過 redo log 發現事務未完成,直接回滾。
      場景 3:binlog 和 redo log 部分丟失
      • 現象:binlog 或 redo log 文件損壞。
      • 恢復流程
        1. 若 binlog 完整但 redo log 丟失,事務會被重新應用(通過 binlog)。
        2. 若兩者均損壞,可能需要從備份恢復或手動修復(極端情況
  4. 隨著時間的推移,binglog越來越大怎么操作

    • 可手動清理或自動清理來管理Binlog
      方法:定期清理舊日志,手動 PURGE BINARY LOGS
      配置自動過期時間
  5. 如何強制創建新的binlog文件,這個操作有什么實際用途

    • 強制切換

      FLUSH BINARY LOGS;
      
      用途說明
      日志歸檔便于日志管理、切分日志
      主從同步初始化主庫切換 binlog 文件,讓從庫能從新起點同步
      手動備份配合 binlog 做增量控制增量恢復的起點
  6. 如何手動清理binlog(只保留當前使用的,刪除其他的),自動清理需要如何配置。

    • 清除某個 binlog 之前的所有日志

      PURGE BINARY LOGS TO 'mysql-bin.000010';
      
    • 或清除指定時間之前的日志

      PURGE BINARY LOGS BEFORE '2025-07-10 00:00:00';
      

      不能清除正在被從庫讀取的日志

    • 自動清理配置

      在my.cnf中添加:

      expire_logs_days = 7           # 保留7天
      # 或新版:
      binlog_expire_logs_seconds = 604800
      

      運行代碼重啟生效

  7. binlog 的生命周期和清理機制是什么?如何設置自動過期時間

    • 生命周期由參數 binlog_expire_logs_seconds 決定。
    • 清理方式分為手動(PURGE)和自動(expire)
    • 自動清理是 MySQL 后臺線程定期執行的,保證磁盤空間控制。
  8. 如何通過 mysqlbinlog 工具解析 binlog 內容?如何只解析某一個時間段的 binlog

    • 基本用法

      mysqlbinlog /var/lib/mysql/mysql-bin.000001
      
    • 只解析某一時間段:

      mysqlbinlog --start-datetime="2025-07-10 12:00:00" \--stop-datetime="2025-07-10 13:00:00" \/var/lib/mysql/mysql-bin.000001
      

      可以重定向為SQL文件

      mysqlbinlog ... > recover.sql
      
  9. 配置文件中確保開啟了binlog,并且使用ROW格式。

    • 在my.cnf中配置:

      [mysqld]
      log-bin=mysql-bin
      binlog_format=ROW
      server-id=1
      

      然后重啟MySQL服務

  10. 對數據庫進行全量備份,使用之前創建的任意表格新增3條記錄。

    • 全量備份 mysqldump

      mysqldump -u root -p --all-databases --single-transaction --master-data=2 > full_backup.sql
      
    • 插入記錄

      insert into student values (1001,'張三',18);
      insert into student values (1002,'李四',20);
      insert into student values (1003,'王五',22);
      
  11. drop整個表,之后使用binlog還原表,包括新增的3條記錄。

    1. 查找 drop 前的 binlog 位置或時間

    2. 使用 mysqlbinlog 導出 binlog SQL

      mysqlbinlog --start-datetime="2025-07-10 10:00:00" \--stop-datetime="2025-07-10 12:00:00" \/var/lib/mysql/mysql-bin.000003 > recover.sql
      
    3. 手動編輯文件:只保留建表和插入語句

    4. 執行SQL恢復數據:

      mysql -u root -p < recover.sql
      
  12. 主從同步中的binlog與relaylog有什么關系

    • 從庫 I/O 線程將主庫 binlog 拉過來,寫入 relay log,再由 SQL 線程執行

    • 日志類型主庫 or 從庫作用
      Binlog主庫記錄主庫的所有更改操作
      Relay log從庫是從庫從主庫拉過來的 binlog 拷貝
  13. mysql主從同步時是如何保障數據一致性的

    • 日志驅動:主庫寫操作記錄到 binlog,從庫 IO 線程拉取 binlog 存為 relay log,SQL 線程順序執行 relay log 語句,復刻主庫變更。
    • 順序執行:從庫 SQL 線程串行應用 relay log,嚴格遵循主庫事務提交順序,避免亂序導致的數據沖突。
    • GTID(可選):為事務分配全局唯一 ID,精準標記已同步事務,防重復執行,簡化故障切換時的斷點定位。
    • 故障校驗:從庫通過心跳檢測主從連接,結合Seconds_Behind_Master監控延遲,異常時觸發重連 / 修復,維持同步鏈路。
      本質是靠日志復制 + 串行重演 + 狀態校驗,讓從庫精準復刻主庫數據流轉,保障最終一致。
  14. 按照時間順序,描述主從同步的所有步驟

    1. 主庫記錄 binlog

      • 所有 DML 操作被寫入 binlog。
        主庫對 DML(增刪改)、DDL(建表等)操作,會按binlog_format(STATEMENT/ROW/MIXED)格式寫入 binlog,是復制的基礎,
    2. 從庫 I/O 線程連接主庫

      • 發起 COM_BINLOG_DUMP 請求。
        從庫啟動后,IO線程通過CHANGE MASTER TO配置的主庫信息,發起COM_BINLOG_DUMP協議請求,拉取 binlog
    3. 主庫傳送 binlog 內容

      • 主庫的 dump 線程發送 binlog 給從庫。
        主庫響應請求后,會創建dump線程,持續將 binlog 事件推送給從庫
    4. 從庫寫入 relay log

      • I/O 線程把 binlog 內容保存為中繼日志(relay log)。
        從庫IO線程接收的 binlog,會先落地為中繼日志(relay log),避免直接應用時中斷丟失
    5. SQL 線程讀取 relay log

      • 從庫 SQL 線程按順序執行這些操作,實現數據同步。
        從庫SQL線程串行解析 relay log,重演 SQL 操作,保證主從數據最終一致
    6. 完成復制

    • binlog 與事務的關聯:主庫寫 binlog 時,會通過兩階段提交(2PC) 保證與 InnoDB redo log 一致,避免主從數據分裂。
    • relay log 的管理:從庫會自動清理過期 relay log(可通過relay_log_purge等參數控制),防止日志膨脹。
    • 異常場景處理:若主從網絡中斷,IO線程會自動重連;若 SQL 線程執行報錯(如主鍵沖突),需人工介入修復(如跳過事務、修正數據

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917250.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917250.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917250.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

走進computed,了解computed的前世今生

computed&#xff08;計算屬性&#xff09;并不是vue獨創的&#xff0c;而是源自計算機科學和響應式編程的長期發展 計算理論的奠基&#xff1a; 函數式編程的純函數思想&#xff1a;計算屬性的核心特征&#xff08;無副作用、依賴輸入確定輸出&#xff09;直接來源于函數式編程…

Java 23 新特性解析與代碼示例

Java 23 新特性解析與代碼示例 文章目錄Java 23 新特性解析與代碼示例1. 引言2. 正式特性2.1. Markdown文檔注釋 (JEP 467)2.2. 廢棄sun.misc.Unsafe的內存訪問方法以移除 (JEP 471)2.3. ZGC&#xff1a;默認啟用代際模式 (JEP 474)3. 預覽特性3.1. 原始類型在模式、instanceof…

spring boot + mybatis + mysql 只有一個實體類的demo

使用MyBatis進行數據庫操作&#xff0c;配置簡單。主要演示了mybatis可以不用只使用方法名來對應mapper.java和mapper.xml。 目錄結構 pom.xml src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── springbootjdbcweb/ │ │ └── …

iRemovalPro完美繞iCloud插卡打電話,A12+支持iOS 18.1.1

iRemovalPro 專業工具全解析與操作指南 &#xff08;支持iOS 14.0 - 16.6.1&#xff0c;A7-A15芯片設備&#xff09; &#x1f449;下載地址見文末 iRemoval Pro iRemoval 專業版是一款來自外國安全研究員的工具&#xff0c;用來幫助一些人因為忘記自己的ID或者密碼&#xff0c…

安卓SELinux策略語法

目錄前言一、 通用AV規則語法1.1 allow source target:class permissions;1.2 neverallow source target:class permissions;二、type三、attribute四、typeattribute五、alias六、typealias七、init_daemon_domain7.1 init_daemon_domain 宏概述7.2 宏展開與實現7.2.1 展開后規…

vscode cursor配置php的debug,docker里面debug

VSCode PHP調試配置指南 概述 本文介紹如何在VSCode中配置PHP調試環境&#xff0c;包括本地和Docker環境。 前置要求 VSCodePHP 7.0Xdebug擴展PHP Debug VSCode擴展 本地調試配置 1. 安裝Xdebug # Ubuntu/Debian sudo apt-get install php-xdebug# MacOS brew install p…

elk部署加日志收集

清華大學鏡像源地址&#xff1a;Index of /elasticstack/8.x/yum/8.13.2/ | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror 一、elasticsearch 1.安裝 rpm -ivh elastic-agent-8.13.2-x86_64.rpm 2.修改配置 vim /etc/elasticsearch/elasticsearch.yml 修改如下&…

dify 升級1.7.1 插件無法下載依賴

dify 升級1.7.1 插件無法下載依賴 1. 安裝通義千問插件&#xff0c;各種報錯&#xff1b; 使用下面命令查看docker 鏡像日志 docker logs -f --tail100 docker-plugin_daemon-1 2025/08/01 07:42:21 full_duplex.go:59: [INFO]init environment for plugin langgenius/tongyi…

linux中簡易云盤系統項目實戰:基于 TCP協議的 Socket 通信、json數據交換、MD5文件區別與多用戶文件管理實現

&#x1f4cb; 項目介紹 本項目是一個基于Linux環境的簡易云盤系統&#xff0c;采用C/S&#xff08;客戶端/服務器&#xff09;架構&#xff0c;實現了類似百度網盤的基本功能。系統通過TCP Socket進行網絡通信&#xff0c;使用JSON格式進行數據交換&#xff0c;利用SQLite3數據…

linux中posix消息隊列的使用記錄

在linux中使用posix中的消息隊列時遇到了一個問題&#xff0c;就是在發送消息時&#xff0c;如果隊列滿了&#xff0c;mq_send接口會一直阻塞&#xff0c;經過查找資料后才發現&#xff0c;該接口默認是阻塞的&#xff0c;也就是說&#xff0c;當隊列滿了以后&#xff0c;接口會…

01 基于sklearn的機械學習-機械學習的分類、sklearn的安裝、sklearn數據集及數據集的劃分、特征工程(特征提取與無量綱化、特征降維)

文章目錄機械學習機械學習分類1. 監督學習2. 半監督學習3. 無監督學習4. 強化學習機械學習的項目開發步驟scikit-learn1 scikit-learn安裝2 sklearn數據集1. sklearn 玩具數據集鳶尾花數據集糖尿病數據集葡萄酒數據集2. sklearn現實世界數據集20 新聞組數據集3. 數據集的劃分特…

n8n】n8n的基礎概念

以下是為初學者整理的 n8n 基本概念總結&#xff0c;幫助快速理解核心功能和使用邏輯&#xff1a;1. 工作流&#xff08;Workflow&#xff09;核心單元&#xff1a;n8n的一切操作基于工作流&#xff0c;代表一個自動化流程。組成&#xff1a;由多個節點&#xff08;Nodes&#…

機器學習基礎-matplotlib

一、相關知識點二、plotfrom pylab import mpl # 設置顯示中文字體 mpl.rcParams["font.sans-serif"] ["SimHei"] # 設置正常顯示符號 mpl.rcParams["axes.unicode_minus"] False #%%#%% import matplotlib.pyplot as plt import random# 畫出…

spring-ai-alibaba 學習(十九)——graph之條件邊、并行節點、子圖節點

前面了解了基礎的概念及流程&#xff0c;以及一些參數類下面了解一些特殊的邊和節點條件邊常見的流程圖可能長這個樣子&#xff1a;其中菱形的為條件節點&#xff08;或者叫判定節點&#xff09;&#xff0c;但是在spring-ai-alibaba-graph中&#xff0c;并沒有條件節點在sprin…

深入淺出設計模式——創建型模式之原型模式 Prototype

文章目錄原型模式簡介原型模式結構關于克隆方法&#xff1a;淺拷貝/深拷貝原型模式代碼實例定義原型類和克隆方法客戶端使用代碼示例示例一&#xff1a;淺拷貝示例二&#xff1a;深拷貝原型模式總結開閉原則代碼倉庫原型模式&#xff1a;用原型實例指定創建對象的種類&#xff…

.NET 10 中的新增功能系列文章3—— .NET MAUI 中的新增功能

.NET 10 預覽版 6 中的 .NET MAUI.NET 10 預覽版 5 中的.NET MAUI.NET 10 預覽版 4 中的 .NET MAUI.NET 10 預覽版 3 中的 .NET MAUI.NET 10 預覽版 2 中的 .NET MAUI.NET 10 預覽版 1 中的 .NET MAUI 一、MediaPicker 增強功能&#xff08;預覽版6&#xff09; .NET 10 預覽…

MT Photos圖庫部署詳解:Docker搭建+貝銳蒲公英異地組網遠程訪問

如今&#xff0c;私有化部署輕量級圖床/圖庫系統&#xff0c;已經成為越來越多用戶的高頻需求。而MT Photos&#xff0c;正是一款非常適合在Docker環境下運行的自托管圖床/圖庫系統。MT Photos基于Node.js與Vue構建&#xff0c;界面簡潔美觀&#xff0c;支持多用戶權限管理、多…

解決dbeaver連接不上oceanbase數據庫的問題

解決dbeaver連接不上oceanbase數據庫的問題 問題&#xff1a; 使用dbeaver連接oceanbase數據庫報錯如下&#xff1a; ORA-00900: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near ‘dat…

Kafka——請求是怎么被處理的?

引言在分布式消息系統中&#xff0c;請求處理機制是連接客戶端與服務端的"神經中樞"。無論是生產者發送消息、消費者拉取數據&#xff0c;還是集群內部的元數據同步&#xff0c;都依賴于高效的請求處理流程。Apache Kafka作為高性能消息隊列的代表&#xff0c;其請求…

區塊鏈技術如何確保智能合約的安全性和可靠性?

智能合約作為區塊鏈上自動執行的可編程協議&#xff0c;其安全性和可靠性直接決定了區塊鏈應用的信任基礎。區塊鏈通過底層技術架構、密碼學工具和機制設計的多重保障&#xff0c;構建了智能合約的安全防線。以下從技術原理、核心機制和實踐保障三個維度展開分析&#xff1a;一…