最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL 表空卻 ibd 文件過大的問題及解決方法

 更新時間:2025年08月19日 08:59:34   作者:阿陶學長  
本文給大家介紹MySQL表空卻ibd文件過大的問題及解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

登錄數(shù)據(jù)庫查看某張表,數(shù)據(jù)行數(shù)顯示為 0,但對應的 ibd 文件卻占用了幾個 GB 的磁盤空間?近期在客戶生產(chǎn)環(huán)境中,我們就碰到了這類典型問題 —— 大量 ibd 文件占用磁盤資源,表內(nèi)卻無數(shù)據(jù),最終定位到binlog 緩存參數(shù)配置與事務回滾后的表空間未釋放是核心原因。

一、問題背景:表空卻 “吃滿” 磁盤的怪事

客戶反饋,生產(chǎn)環(huán)境中多臺 MySQL 主機的 ibd 文件體積異常,部分文件甚至達到數(shù) GB,但通過select count(*)查詢對應表,結(jié)果均為 0。起初我們推測是 “數(shù)據(jù)歸檔后未整理碎片”—— 比如大量 DELETE 操作后,InnoDB 未釋放表空間導致碎片堆積,但進一步分析卻推翻了這個猜想:

  • 查看 binlog 日志,未發(fā)現(xiàn)批量 DELETE 操作記錄;
  • 開啟 general log 跟蹤后發(fā)現(xiàn),應用側(cè)每天凌晨會執(zhí)行insert into ... select * from 大表的 SQL,目的是對前一天的業(yè)務數(shù)據(jù)做備份;
  • 備份過程中,事務因觸發(fā)max_binlog_cache_size參數(shù)限制而回滾,但 InnoDB 已分配的表空間并未隨之釋放,最終導致 “表空 ibd 大” 的現(xiàn)象。

二、問題復現(xiàn):一步步還原異常場景

為了驗證問題根源,我們用 sysbench 工具搭建測試環(huán)境,完整復現(xiàn)了客戶的異常過程(測試版本:MySQL 8.0)。

1. 準備測試源表與數(shù)據(jù)

先用 sysbench 創(chuàng)建 1 張含 1000 萬行數(shù)據(jù)的源表sbtest1,模擬客戶的 “每日業(yè)務大表”,并查看初始表空間大?。?/p>

# 查看源表數(shù)據(jù)量
mysql> select count(*) from test.sbtest1;
+----------+
| count(*) |
+----------+
| 10000000 |
+----------+
1 row in set (4.17 sec)
# 查看源表ibd文件大?。s2.27GB)
mysql> select name, FILE_SIZE/1024/1024/1024 as GB 
       from information_schema.INNODB_TABLESPACES 
       where name='test/sbtest1';
+--------------+----------------+
| name         | GB             |
+--------------+----------------+
| test/sbtest1 | 2.269531250000 |
+--------------+----------------+
1 row in set (0.00 sec)

2. 配置max_binlog_cache_size參數(shù)

為模擬 “參數(shù)限制導致回滾”,將max_binlog_cache_size設為 1GB(遠小于備份事務所需的 binlog 緩存):

# 全局設置參數(shù)為1GB
mysql> set global max_binlog_cache_size=1*1024*1024*1024;
Query OK, 0 rows affected (0.00 sec)
# 驗證參數(shù)生效
mysql> select @@max_binlog_cache_size;
+-------------------------+
| @@max_binlog_cache_size |
+-------------------------+
|                1073741824 |
+-------------------------+
1 row in set (0.00 sec)

3. 執(zhí)行備份 SQL 并觸發(fā)回滾

創(chuàng)建空表t1,并執(zhí)行insert into ... select *備份數(shù)據(jù),此時因事務所需 binlog 緩存超過 1GB,直接報錯回滾:

# 復制源表結(jié)構創(chuàng)建t1
mysql> create table test.t1 like test.sbtest1;
Query OK, 0 rows affected (0.01 sec)
# 執(zhí)行備份SQL,觸發(fā)參數(shù)限制報錯
mysql> insert into test.t1 select * from test.sbtest1;
ERROR 1197 (HY000): Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again

4. 查看異常結(jié)果

雖然備份事務回滾,t1表無數(shù)據(jù),但 ibd 文件已占用 1.34GB 空間:

# t1表無數(shù)據(jù)
mysql> select count(*) from test.t1;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)
# t1表ibd文件大小異常
mysql> select name, FILE_SIZE/1024/1024/1024 as GB 
       from information_schema.INNODB_TABLESPACES 
       where name='test/t1';
+---------+----------------+
| name    | GB             |
+---------+----------------+
| test/t1 | 1.339843750000 |
+---------+----------------+
1 row in set (0.00 sec)

三、深層原因:InnoDB 表空間與 binlog 緩存的 “暗坑”

問題的核心在于InnoDB 的表空間管理機制與 **max_binlog_cache_size的作用 **:

  • max_binlog_cache_size的限制:該參數(shù)控制單個事務執(zhí)行時,寫入 binlog 所需的最大內(nèi)存緩存。當事務(如本次的大表insert select)需要的 binlog 緩存超過該值時,MySQL 會直接終止事務并回滾。
  • InnoDB 表空間不 “回縮”:事務執(zhí)行過程中,InnoDB 會為新數(shù)據(jù)分配表空間(按 extent 塊分配,默認 1MB / 塊);即使事務回滾,InnoDB 只會刪除數(shù)據(jù)記錄(標記為 “可復用”),但不會釋放已分配給表的磁盤空間 —— 這就導致 ibd 文件大小不會因回滾而縮小,出現(xiàn) “表空文件大” 的情況。

四、解決方案:臨時應急與長期優(yōu)化

針對這類問題,我們需要分 “臨時解決當前異常” 和 “長期避免同類問題” 兩步處理:

1. 臨時解決:調(diào)大參數(shù),完成備份

若需立即恢復備份功能并釋放表空間,可臨時調(diào)大max_binlog_cache_size(需根據(jù)備份數(shù)據(jù)量估算,如設為 4GB):

# 臨時調(diào)大參數(shù)(重啟后失效)
set global max_binlog_cache_size=4*1024*1024*1024;
# 重新執(zhí)行備份SQL,確保事務完成
insert into test.t1 select * from test.sbtest1;
# 若表已異常(空表大ibd),可通過“重建表”釋放空間
alter table test.t1 engine=InnoDB;

2. 長期優(yōu)化:規(guī)避大事務,優(yōu)化備份策略

臨時調(diào)參無法根治問題,長期需從 “減少大事務” 和 “優(yōu)化備份邏輯” 入手:

  • 按日期分表存儲:應用側(cè)將每日新數(shù)據(jù)寫入 “日表”(如data_20240520),備份時直接操作小表,避免跨大表的insert select(大事務的根源);
  • 規(guī)范參數(shù)配置:根據(jù)是否開啟 GTID 調(diào)整max_binlog_cache_size
    • 未開啟 GTID:建議最大值不超過 4GB;
    • 已開啟 GTID:無需刻意限制(默認 16EB,足夠應對多數(shù)場景);
  • 替換備份方式:用mysqldumpxtrabackup等工具替代 “insert select備份”,這類工具無需占用 binlog 緩存,且能避免大事務。

五、關鍵參數(shù):max_binlog_cache_size詳解

為幫助大家更好地配置該參數(shù),整理核心信息如下:

配置項詳情
作用控制單個事務寫入 binlog 時可使用的最大內(nèi)存緩存大小
作用域全局(Global)
動態(tài)修改支持(set global生效,無需重啟 MySQL)
默認值(32 位系統(tǒng))4294967295 字節(jié)(4GB)
默認值(64 位系統(tǒng))18446744073709547520 字節(jié)(16EB)
配置建議未開 GTID:≤4GB;已開 GTID:使用默認值,無需額外限制
最小限制4096 字節(jié)(不可低于此值)

六、運維總結(jié):預防比解決更重要

這類 “表空 ibd 大” 的問題,本質(zhì)是 “參數(shù)配置不合理” 與 “SQL 使用不規(guī)范” 的疊加。日常運維中,建議:

  • 制定參數(shù)標準:梳理核心參數(shù)(如max_binlog_cache_sizeinnodb_file_per_table)的配置規(guī)范,根據(jù)業(yè)務場景調(diào)整;
  • 管控大事務:禁止跨大表的insert select、批量更新等操作,拆分超大事務為小事務;
  • 同步研發(fā)認知:向研發(fā)側(cè)同步數(shù)據(jù)庫使用手冊,明確 “避免大事務”“合理分表” 等要求,減少因操作不當導致的異常;
  • 定期巡檢:通過腳本監(jiān)控 ibd 文件大小與表數(shù)據(jù)量的匹配度,提前發(fā)現(xiàn) “空表大文件” 等異常。

通過以上措施,既能避免磁盤資源浪費,也能減少 MySQL 因大事務導致的性能瓶頸,讓數(shù)據(jù)庫運維更高效、更穩(wěn)定。

到此這篇關于MySQL 表空卻 ibd 文件過大的問題及解決方法的文章就介紹到這了,更多相關mysql ibd文件過大內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • mysql利用覆蓋索引避免回表優(yōu)化查詢

    mysql利用覆蓋索引避免回表優(yōu)化查詢

    這篇文章主要給大家介紹了關于mysql如何利用覆蓋索引避免回表優(yōu)化查詢的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • mysql workbench 設置外鍵的方法實現(xiàn)

    mysql workbench 設置外鍵的方法實現(xiàn)

    在MySQL Workbench中設置外鍵屬性是非常方便的,本文就來介紹一下mysql workbench 設置外鍵的方法實現(xiàn),具有一定能的參考價值,感興趣的可以了解一下
    2024-01-01
  • 詳解MySQL(InnoDB)是如何處理死鎖的

    詳解MySQL(InnoDB)是如何處理死鎖的

    這篇文章主要介紹了MySQL(InnoDB)是如何處理死鎖的,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Mysql之行與列的多種轉(zhuǎn)換實現(xiàn)方式

    Mysql之行與列的多種轉(zhuǎn)換實現(xiàn)方式

    這篇文章主要介紹了Mysql之行與列的多種轉(zhuǎn)換實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2026-03-03
  • Mysql連接join查詢原理知識點

    Mysql連接join查詢原理知識點

    在本文里我們給大家整理了一篇關于Mysql連接join查詢原理知識點文章,對此感興趣的朋友們可以學習下。
    2019-02-02
  • 記一次MySQL的優(yōu)化案例

    記一次MySQL的優(yōu)化案例

    這篇文章主要介紹了記一次MySQL的優(yōu)化案例,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-10-10
  • MySQL中TRUNCATE TABLE命令的使用

    MySQL中TRUNCATE TABLE命令的使用

    TRUNCATE TABLE命令是一個用于快速刪除表中所有數(shù)據(jù)的重要工具,本文就來介紹一下MySQL中TRUNCATE TABLE命令的使用,具有一定的參考價值,感興趣的可以了解一下
    2026-03-03
  • MySQL字符集中文亂碼解析

    MySQL字符集中文亂碼解析

    這篇文章主要給大家解析了MySQL字符集中文亂碼的問題,文章通過代碼示例講解的非常詳細,對我們的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-09-09
  • mysql中如何用varchar字符串按照數(shù)字排序

    mysql中如何用varchar字符串按照數(shù)字排序

    這篇文章主要介紹了mysql中用varchar字符串按照數(shù)字排序方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • MySQL添加索引及添加字段并建立索引方式

    MySQL添加索引及添加字段并建立索引方式

    這篇文章主要介紹了MySQL添加索引及添加字段并建立索引方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論

蒙阴县| 买车| 贵阳市| 无极县| 改则县| 个旧市| 司法| 泸西县| 长兴县| 昌都县| 延吉市| 北辰区| 枝江市| 沙雅县| 琼结县| 册亨县| 蓬安县| 洛隆县| 恩平市| 许昌市| 噶尔县| 习水县| 锦州市| 彰化市| 大兴区| 开鲁县| 和林格尔县| 乌恰县| 文安县| 兴隆县| 开远市| 新津县| 衡山县| 安陆市| 洪洞县| 常熟市| 浮山县| 克拉玛依市| 米脂县| 青河县| 盐津县|