成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL的三大日志

數據庫 MySQL
飛機失事靠黑匣子還原真相,MySQL崩潰靠三大日志保障數據安全。作為一個工作多年的程序員,我見過太多因日志配置不當引發的災難:數據丟失、主從同步中斷、事務回滾失敗...

前言

飛機失事靠黑匣子還原真相,MySQL崩潰靠三大日志保障數據安全。

作為一個工作多年的程序員,我見過太多因日志配置不當引發的災難:數據丟失、主從同步中斷、事務回滾失敗...

今天,我將用最通俗的方式,帶你徹底掌握MySQL三大日志的底層原理,希望對你會有所幫助。

一、引子:一個數據丟失的教訓

事故現場:某電商平臺數據庫服務器宕機后,發現最近2小時訂單數據丟失。

問題根源:  錯誤配置導致redo log刷盤失效:

SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 0     |  -- 應設為1
+--------------------------------+-------+

核心結論

  1. 日志系統是MySQL的安全氣囊
  2. 不理解日志機制,等于在數據安全上裸奔

二、Redo Log:保證持久性的守護神

2.1 核心作用:崩潰恢復

WAL原則(Write-Ahead Logging)

圖片圖片

2.2 物理結構解析

循環寫入機制

圖片圖片

關鍵參數

-- 查看日志配置
SHOW VARIABLES LIKE 'innodb_log%';
+---------------------------+---------+
| Variable_name             | Value   |
+---------------------------+---------+
| innodb_log_file_size      | 50331648| -- 單個日志文件大小
| innodb_log_files_in_group | 2       | -- 日志文件數量
| innodb_log_buffer_size    | 16777216| -- 緩沖區大小
+---------------------------+---------+

2.3 刷盤策略實戰

// JDBC事務提交示例
Connection conn = DriverManager.getConnection(url, user, pwd);
try {
    conn.setAutoCommit(false);
    Statement stmt = conn.createStatement();
    stmt.executeUpdate("UPDATE account SET balance=balance-100 WHERE id=1");
    stmt.executeUpdate("UPDATE account SET balance=balance+100 WHERE id=2");
    
    // 核心配置:刷盤策略
    conn.setClientInfo("innodb_flush_log_at_trx_commit", "1");
    conn.commit(); // 觸發redo log刷盤
} catch (SQLException e) {
    conn.rollback();
}

刷盤策略對比

參數值

安全性

性能

適用場景

0

低(每秒刷)

最高

可丟失數據的緩存

1

最高(實時)

最低

金融交易系統

2

中(OS緩存)

較高

常規業務系統

三、Undo Log:事務回滾的時光機

3.1 MVCC實現原理

多版本控制流程

圖片圖片

3.2 回滾操作源碼級解析

-- 事務回滾示例
START TRANSACTION;
UPDATE users SET name='張三' WHERE id=1; 
-- 在undo log中記錄:
-- | 事務ID | 行ID | 舊值 | 回滾指針 |
-- | 101    | 1    | '李四'| 0x7F8A9B|

ROLLBACK; -- 根據undo log恢復數據

3.3 長事務引發的災難

問題場景

-- 查詢運行超過60秒的事務
SELECT * FROM information_schema.innodb_trx 
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 60;

嚴重后果

  1. Undo Log暴漲占用磁盤空間
  2. 歷史版本鏈過長導致查詢性能下降

解決方案

@Transactional(timeout = 30) // 單位:秒
public void updateOrder(Order order) {
    // 業務邏輯
}

Spring Boot項目可以設置事務超時時間。

四、Binlog:主從復制的橋梁

4.1 三種格式深度對比

格式

特點

數據安全

復制效率

STATEMENT

記錄SQL語句

ROW

記錄行變化

MIXED

自動切換模式

ROW格式的優勢

-- 原始SQL
UPDATE users SET status=1 WHERE age>30;

-- ROW格式binlog實際記錄
/* 修改前鏡像 */
id:1, status:0, age:35
id:2, status:0, age:40
/* 修改后鏡像 */
id:1, status:1, age:35
id:2, status:1, age:40

4.2 主從復制全流程剖析

圖片圖片

4.3 數據恢復實戰

場景:誤刪全表數據恢復步驟

# 1. 解析binlog找到刪除位置
mysqlbinlog --start-positinotallow=763 --stop-positinotallow=941 binlog.000001 > recovery.sql

# 2. 提取回滾SQL
grep -i 'DELETE FROM users' recovery.sql

# 3. 生成反向補償語句
sed 's/DELETE FROM/INSERT INTO/g' recovery.sql > rollback.sql

# 4. 執行恢復
mysql -u root -p < rollback.sql

五、三大日志協同工作圖

更新語句執行流程

圖片圖片

兩階段提交關鍵點

  1. redo log prepare 與 binlog 寫入的原子性
  2. 崩潰恢復時的決策邏輯:

binlog完整:提交事務

binlog不完整:回滾事務

六、生產環境優化指南

6.1 參數調優模板

my.cnf 關鍵配置:

[mysqld]
# Redo Log
innodb_log_file_size = 2G        # 建議4個日志文件
innodb_log_files_in_group = 4
innodb_flush_log_at_trx_commit = 1

# Undo Log
innodb_max_undo_log_size = 1G
innodb_undo_log_truncate = ON
innodb_purge_threads = 4

# Binlog
server_id = 1
log_bin = /data/mysql-bin
binlog_format = ROW
binlog_expire_logs_seconds = 604800 # 保留7天
sync_binlog = 1                   # 每次提交刷盤

6.2 監控指標清單

-- 關鍵監控SQL
SELECT
/* Redo Log */
  (SELECT VARIABLE_VALUE 
   FROM performance_schema.global_status 
   WHERE VARIABLE_NAME='Innodb_os_log_written') AS redo_written,
   
/* Undo Log */
  (SELECTSUM(DATA_LENGTH) 
   FROM information_schema.TABLES 
   WHERE TABLE_SCHEMA='mysql'
   AND TABLE_NAME LIKE'undo%') AS undo_size,
   
/* Binlog */
  (SELECT VARIABLE_VALUE 
   FROM performance_schema.global_status 
   WHERE VARIABLE_NAME='Binlog_cache_disk_use') AS binlog_disk_use;

6.3 常見問題解決方案

問題1:redo log文件設置過小導致頻繁checkpoint。

現象

SHOW GLOBAL STATUS LIKE 'Innodb_log_waits';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| Innodb_log_waits | 542   | -- 值>0表示存在等待
+------------------+-------+

解決

# 動態調整(需重啟生效)
SET GLOBAL innodb_log_file_size = 2147483648;

問題2:大事務導致binlog暴漲。

預防方案

// 事務拆分示例
public void batchProcess(List<Order> orders) {
    int batchSize = 100; // 每100條一個事務
    for (int i=0; i<orders.size(); i+=batchSize) {
        transactionTemplate.execute(status -> {
            List<Order> subList = orders.subList(i, Math.min(i+batchSize, orders.size()));
            processBatch(subList);
            return null;
        });
    }
}

七、總結

  1. Redo Log是生命線
  • 配置原則:innodb_flush_log_at_trx_commit=1 + 足夠大的日志文件
  • 監控重點:Innodb_log_waits 應趨近于0
  1. Undo Log是后悔藥
  • 及時清理:開啟 innodb_undo_log_truncate
  • 避免長事務:監控 information_schema.innodb_trx
  1. Binlog是復制基石
  • 格式選擇:金融級系統必須用ROW格式
  • 同步策略:主從復制時 sync_binlog=1

數據庫的可靠性不是偶然發生的,而是通過三大日志的精密協作實現的。

當你下次執行COMMIT時,請記住背后有三個強大的守護者在為你工作:

  1. Redo Log確保你的數據不會丟失
  2. Undo Log保證你的操作可以撤銷
  3. Binlog讓數據在集群間流動

敬畏日志,就是敬畏數據安全!

責任編輯:武曉燕 來源: 蘇三說技術
相關推薦

2021-08-03 17:20:00

MySQL數據庫日志

2011-01-14 17:54:43

2020-08-20 12:10:42

MySQL日志數據庫

2017-03-15 16:15:35

2010-05-12 14:05:54

MySQL安裝

2025-06-06 07:02:43

2021-09-27 10:37:36

人工智能AI深度學習

2018-03-15 09:53:48

大數據機器學習云服務

2010-06-13 16:04:14

MySQL三種安裝方式

2021-09-24 18:14:02

華為云GaussDB

2017-12-19 06:14:29

2020-08-30 16:27:30

多云云計算

2010-06-13 17:38:15

路由協議

2020-05-27 07:15:39

云3.0分散式

2010-10-22 15:45:49

無線互聯

2017-08-21 15:35:57

大數據云計算UE

2020-04-29 11:10:22

固件安全網絡攻擊漏洞

2010-07-21 09:20:31

2018-08-17 06:05:44

2013-04-10 18:51:14

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产成人 | 在线视频亚洲 | 在线观看av免费 | 日韩成人精品一区二区 | 亚洲天堂第一页 | 懂色av一区二区夜夜嗨 | 谁有毛片网站 | 天堂资源 | www.huangse| 岛国av噜噜噜久久久狠狠av | 台湾av在线 | 激情综合久久 | 69免费视频 | 黄网免费看 | 免费国产网站 | cao在线 | 亚洲国产天堂 | 精品一区二区三区视频 | 日日干夜夜撸 | 久久精品小视频 | 视频一区二区三区在线观看 | 97香蕉视频 | 欧美亚洲一区 | 欧美性猛交99久久久久99按摩 | 成人在线视频免费 | a级片在线观看 | 91靠逼视频| 日韩精品一区在线观看 | 伊人9999| 成年人免费看视频 | 在线亚洲一区 | 国产精品一区二区视频 | 在线观看日韩精品 | 亚洲经典一区 | 国产a毛片 | 黄色三级在线 | 激情高潮到大叫狂喷水 | 中文字幕国产视频 | 黄色网址在线播放 | 国产免费黄色 | 久久久久一区 |