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

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

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

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

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

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

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

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

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

1. 準(zhǔn)備測(cè)試源表與數(shù)據(jù)

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

# 查看源表數(shù)據(jù)量
mysql> select count(*) from test.sbtest1;
+----------+
| count(*) |
+----------+
| 10000000 |
+----------+
1 row in set (4.17 sec)
# 查看源表ibd文件大小(約2.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ù)限制導(dǎo)致回滾”,將max_binlog_cache_size設(shè)為 1GB(遠(yuǎn)小于備份事務(wù)所需的 binlog 緩存):

# 全局設(shè)置參數(shù)為1GB
mysql> set global max_binlog_cache_size=1*1024*1024*1024;
Query OK, 0 rows affected (0.00 sec)
# 驗(yàn)證參數(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ù),此時(shí)因事務(wù)所需 binlog 緩存超過 1GB,直接報(bào)錯(cuò)回滾:

# 復(fù)制源表結(jié)構(gòu)創(chuàng)建t1
mysql> create table test.t1 like test.sbtest1;
Query OK, 0 rows affected (0.01 sec)
# 執(zhí)行備份SQL,觸發(fā)參數(shù)限制報(bào)錯(cuò)
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é)果

雖然備份事務(wù)回滾,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 的表空間管理機(jī)制與 **max_binlog_cache_size的作用 **:

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

四、解決方案:臨時(shí)應(yīng)急與長(zhǎng)期優(yōu)化

針對(duì)這類問題,我們需要分 “臨時(shí)解決當(dāng)前異常” 和 “長(zhǎng)期避免同類問題” 兩步處理:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

    這篇文章主要介紹了Mysql之行與列的多種轉(zhuǎn)換實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2026-03-03
  • Mysql連接join查詢?cè)碇R(shí)點(diǎn)

    Mysql連接join查詢?cè)碇R(shí)點(diǎn)

    在本文里我們給大家整理了一篇關(guān)于Mysql連接join查詢?cè)碇R(shí)點(diǎn)文章,對(duì)此感興趣的朋友們可以學(xué)習(xí)下。
    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命令是一個(gè)用于快速刪除表中所有數(shù)據(jù)的重要工具,本文就來介紹一下MySQL中TRUNCATE TABLE命令的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2026-03-03
  • MySQL字符集中文亂碼解析

    MySQL字符集中文亂碼解析

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

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

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

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

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

最新評(píng)論

任丘市| 赫章县| 聂荣县| 林周县| 日喀则市| 岐山县| 依安县| 金塔县| 南阳市| 蒙自县| 吉林省| 高唐县| 祁东县| 城口县| 乌什县| 屯留县| 伊春市| 西城区| 三明市| 长岭县| 当阳市| 金华市| 乐东| 宜良县| 台江县| 岳阳县| 北安市| 教育| 黔南| 北海市| 明溪县| 左贡县| 集贤县| 桂林市| 正宁县| 莱西市| 榕江县| 万年县| 安国市| 石家庄市| 厦门市|