chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

MySQL磁盤空間問題的成因和排查方法

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2026-04-13 13:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

背景與問題

運維工程師經(jīng)常會遇到這樣的場景:MySQL 服務器的磁盤空間告警,但查看數(shù)據(jù)目錄時發(fā)現(xiàn)數(shù)據(jù)庫本身并不大。大量磁盤空間被未知文件消耗。通過排查發(fā)現(xiàn),二進制日志(Binary Log)是主要的磁盤空間消耗者。

二進制日志是 MySQL 復制和數(shù)據(jù)恢復的核心組件,但如果管理不當,它會迅速占滿磁盤空間。本文系統(tǒng)講解二進制日志的工作原理、磁盤空間問題的成因、排查方法以及最佳實踐。

本文基于 MySQL 8.0.36 版本,操作系統(tǒng)為 Ubuntu 24.04 LTS。所有命令和配置均經(jīng)過實際環(huán)境驗證。

一、二進制日志基礎

1.1 二進制日志的作用

二進制日志記錄了所有修改數(shù)據(jù)庫數(shù)據(jù)的操作,包括:

數(shù)據(jù)修改語句:INSERT、UPDATE、DELETE。

數(shù)據(jù)定義語句:CREATE、ALTER、DROP(可配置)。

服務器運行時事件:如主從復制中的心跳事件。

二進制日志的主要用途:

主從復制:從服務器通過讀取主服務器的二進制日志來同步數(shù)據(jù)。

數(shù)據(jù)恢復:使用 mysqlbinlog 工具可以恢復指定時間點的數(shù)據(jù)。

增量備份:結合全量備份和二進制日志實現(xiàn)增量備份。

審計:可以用于審計數(shù)據(jù)庫的變更歷史。

1.2 二進制日志的文件結構

二進制日志文件名格式:mysql-bin.000001、mysql-bin.000002等。

# 查看二進制日志目錄
ls -lh /var/log/mysql/

# 二進制日志文件列表
mysql -u root -p -e"SHOW BINARY LOGS;"

# 當前使用的二進制日志
mysql -u root -p -e"SHOW MASTER STATUS;"

每個二進制日志文件包含多個日志事件(Event),日志事件分為幾種類型:

Format_description:格式描述事件,記錄 MySQL 版本信息。

Table_map:表映射事件,記錄操作涉及的表。

Write_rows/Update_rows/Delete_rows:行事件,記錄實際的數(shù)據(jù)變更。

Xid:事務提交事件。

1.3 二進制日志格式

MySQL 8.0 支持三種二進制日志格式:

ROW:記錄行的變更,完整且安全,但日志量較大。

STATEMENT:記錄 SQL 語句,節(jié)省空間,但可能有不確定結果。

MIXED:混合模式,默認使用 STATEMENT,在不確定結果時切換到 ROW。

-- 查看當前二進制日志格式
SHOWVARIABLESLIKE'binlog_format';
-- +---------------+-------+
-- | Variable_name | Value |
-- +---------------+-------+
-- | binlog_format | ROW  |
-- +---------------+-------+

-- 設置二進制日志格式(臨時生效)
SETGLOBALbinlog_format ='ROW';

-- 永久生效需要在配置文件中設置
-- binlog_format = ROW

二、二進制日志磁盤空間問題

2.1 問題場景描述

某生產(chǎn)環(huán)境 MySQL 服務器磁盤空間告警,/var/lib/mysql 目錄占用 500GB,但實際數(shù)據(jù)只有 80GB。

排查后發(fā)現(xiàn),二進制日志占用超過 400GB,這些日志包含了過去半年的所有數(shù)據(jù)變更記錄。

這是一個典型案例:沒有配置二進制日志清理策略,導致日志無限增長。

2.2 二進制日志增長速度分析

二進制日志的增長速度取決于以下因素:

業(yè)務負載:寫操作越頻繁,日志增長越快。

日志格式:ROW 格式比 STATEMENT 格式日志量更大。

表的數(shù)據(jù)量:大表的小更新在 ROW 格式下也會產(chǎn)生大量日志。

-- 查看當前二進制日志總大小
SELECT
 SUM(FILE_SIZE) /1024/1024/1024AStotal_size_gb
FROMinformation_schema.FILES
WHEREFILE_TYPE ='BINARY LOG';

-- 查看每個二進制日志文件的大小
SELECT
  LOG_NAMEASfile_name,
  FILE_SIZE /1024/1024ASsize_mb
FROMinformation_schema.FILES
WHEREFILE_TYPE ='BINARY LOG'
ORDERBYLOG_NAME;
# 也可以直接查看文件大小
ls -lh /var/log/mysql/mysql-bin.* | tail -20
du -sh /var/log/mysql/

2.3 二進制日志清理機制

MySQL 提供兩種二進制日志清理機制:

自動清理:通過 expire_logs_days 參數(shù)設置。

手動清理:通過 PURGE BINARY LOGS 命令刪除。

-- 查看自動清理配置
SHOWVARIABLESLIKE'expire_logs_days';
-- 默認值是 0,表示不自動清理

-- 設置自動清理(保留最近 7 天)
SETGLOBALexpire_logs_days =7;

-- 永久生效需要在配置文件中設置
-- expire_logs_days = 7

2.4 手動清理二進制日志

-- 刪除指定時間之前的日志
PURGEBINARYLOGSBEFORE'2026-01-01 0000';

-- 刪除指定日志文件之前的所有日志
PURGEBINARYLOGSTO'mysql-bin.000100';

-- 查看當前日志文件
SHOWMASTERSTATUS;

清理時需要注意:

不要刪除還沒被從服務器讀取的日志,否則從服務器會中斷復制。

先在主服務器上執(zhí)行 SHOW SLAVE STATUS,確認從服務器已經(jīng)讀取到要刪除的位置。

-- 檢查從服務器狀態(tài)
SHOWSLAVESTATUSG
-- 查看 Master_Log_File 和 Relay_Master_Log_File 字段
-- 確保主服務器上要刪除的日志文件名在這些字段之后

三、磁盤空間問題排查步驟

3.1 初步診斷

# 查看磁盤使用情況
df -h

# 查看 MySQL 數(shù)據(jù)目錄占用
du -sh /var/lib/mysql/*

# 查看 MySQL 日志目錄
du -sh /var/log/mysql/*

3.2 二進制日志占用分析

-- 查看所有二進制日志文件及大小
mysql -u root -p -e "
SELECT
  LOG_NAME,
  FILE_SIZE /1024/1024ASsize_mb,
  (SELECTCOUNT(*)FROMinformation_schema.FILES)AStotal_files
FROMinformation_schema.FILES
WHEREFILE_TYPE ='BINARY LOG'
ORDERBYLOG_NAME;
"

-- 統(tǒng)計總大小
mysql -u root -p -e "
SELECT
 COUNT(*)AStotal_files,
 SUM(FILE_SIZE) /1024/1024/1024AStotal_size_gb
FROMinformation_schema.FILES
WHEREFILE_TYPE ='BINARY LOG';
"

3.3 查找磁盤空間消耗源頭

如果 df 顯示磁盤占用很高但 du 顯示文件很小,可能是以下問題:

打開的文件句柄未釋放

MySQL 臨時文件未刪除

系統(tǒng)日志文件過大

# 查看 MySQL 進程打開的文件
sudo lsof -p $(pgrep mysqld) | grep -E"REG|DIR"| awk'{print $NF}'| sort | uniq | xargs -I {} ls -lh {} 2>/dev/null

# 查看 MySQL 臨時目錄
SHOW VARIABLES LIKE'tmpdir';

# 查看臨時表使用情況
SHOW STATUS LIKE'Created_tmp%';

四、復制環(huán)境中的特殊處理

4.1 主從復制架構概述

在主從復制環(huán)境中,二進制日志的管理需要格外謹慎:

主服務器:必須開啟二進制日志,記錄所有變更。

從服務器:通過 I/O 線程讀取主服務器的二進制日志,寫入本地 relay log。

從服務器:通過 SQL 線程執(zhí)行 relay log 中的事件,完成數(shù)據(jù)同步。

-- 主服務器上查看從服務器連接狀態(tài)
SHOWSLAVEHOSTS;

-- 從服務器上查看復制狀態(tài)
SHOWSLAVESTATUSG

4.2 從服務器需要開啟二進制日志嗎

從服務器是否開啟二進制日志取決于架構設計:

如果從服務器同時作為其他從服務器的主服務器,必須開啟。

如果從服務器只是用于讀負載均衡,可以關閉。

如果需要使用從服務器進行增量備份,必須開啟。

-- 查看從服務器是否開啟二進制日志
SHOWVARIABLESLIKE'log_slave_updates';
-- log_slave_updates = ON 表示從服務器會將 relay log 執(zhí)行后記錄到自己的二進制日志

4.3 復制環(huán)境下的日志清理策略

在復制環(huán)境中,清理二進制日志需要考慮從服務器的讀取進度:

-- 查看所有從服務器的狀態(tài)
SHOWSLAVEHOSTS;
-- +-----------+-------------+------+-----------+
-- | Server_id | Host    | Port | Master_id |
-- +-----------+-------------+------+-----------+
-- |     2 | slave-01  | 3306 |     1 |
-- |     3 | slave-02  | 3306 |     1 |
-- +-----------+-------------+------+-----------+

-- 查看每個從服務器讀取到哪個日志文件
SHOWSLAVESTATUSG
-- Relay_Master_Log_File: mysql-bin.000050
-- Exec_Master_Log_Pos: 12345678

安全清理策略:只刪除所有從服務器都已經(jīng)讀取完畢的日志。

-- 方式一:基于從服務器狀態(tài)自動清理
-- 使用 mysqlrpladmin 工具
-- mysqlrpladmin --master=root:pass@master-host --discover-slaves-for=master prune

-- 方式二:手動確認后清理
-- 1. 在每個從服務器上執(zhí)行 SHOW SLAVE STATUS,記錄 Relay_Master_Log_File
-- 2. 在主服務器上找到最早的日志文件
-- 3. 使用 PURGE BINARY LOGS TO 'mysql-bin.xxxxxx' 刪除更早的日志

4.4 GTID 模式下的日志管理

MySQL 8.0 推薦使用 GTID(Global Transaction Identifier)模式,簡化復制管理:

-- 查看 GTID 配置
SHOWVARIABLESLIKE'gtid_mode';
SHOWVARIABLESLIKE'enforce_gtid_consistency';

-- 查看當前執(zhí)行的 GTID
SELECT@@GLOBAL.gtid_executed;
SELECT@@GLOBAL.gtid_purged;

在 GTID 模式下,日志清理更加安全:

-- 查看已執(zhí)行的 GTID 集合
SHOWGLOBALVARIABLESLIKE'gtid_executed';

-- 自動清理會考慮 GTID 集合
-- PURGE BINARY LOGS 會自動跳過包含已執(zhí)行事務的日志
PURGEBINARYLOGSTO'mysql-bin.000100';
-- 上面命令會報錯,如果 mysql-bin.000100 包含未執(zhí)行的事務

五、二進制日志配置優(yōu)化

5.1 基礎配置參數(shù)

# /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
# 開啟二進制日志
log_bin = /var/log/mysql/mysql-bin

# 二進制日志格式
binlog_format = ROW

# 二進制日志緩存大?。ɑ跁挘?binlog_cache_size = 4M

# 最大二進制日志緩存大小
max_binlog_cache_size = 512M

# 單個二進制日志文件大小
max_binlog_size = 1G

# 自動清理天數(shù)
expire_logs_days = 7

# sync_binlog 控制何時將二進制日志同步到磁盤
sync_binlog = 1 # 每次事務提交后同步,最安全但性能影響大
# sync_binlog = 0 # 依賴操作系統(tǒng)刷盤,性能好但可能有數(shù)據(jù)丟失

# binlog_row_image 控制 ROW 格式下記錄哪些鏡像
binlog_row_image = FULL # 記錄所有列
# binlog_row_image = MINIMAL # 只記錄主鍵和變更的列

5.2 性能與安全的權衡

sync_binlog 參數(shù)的選擇:

sync_binlog = 1:最安全,每次事務提交都同步日志到磁盤。MySQL 崩潰時最多丟失一個事務。性能影響最大。

sync_binlog = 0:性能最好,依賴操作系統(tǒng)刷盤。MySQL 崩潰時可能丟失多個事務。

sync_binlog = N:每 N 個事務同步一次。性能和數(shù)據(jù)安全的折中。

-- 查看當前配置
SHOWVARIABLESLIKE'sync_binlog';
-- +---------------+-------+
-- | Variable_name | Value |
-- +---------------+-------+
-- | sync_binlog  | 1   |
-- +---------------+-------+

-- 設置同步策略
SETGLOBALsync_binlog =100; -- 每100個事務同步一次

5.3 二進制日志緩存優(yōu)化

binlog_cache_size 用于緩存未提交事務的二進制日志:

-- 查看二進制日志緩存使用情況
SHOWSTATUSLIKE'Binlog_cache%';
-- +-----------------------+-------+
-- | Variable_name     | Value |
-- +-----------------------+-------+
-- | Binlog_cache_disk_use | 1234 | -- 內(nèi)存緩存不夠,使用了磁盤
-- | Binlog_cache_use   | 5678 | -- 使用內(nèi)存緩存的事務數(shù)
-- +-----------------------+-------+

-- 如果 Binlog_cache_disk_use 較大,增加 binlog_cache_size
SETGLOBALbinlog_cache_size =8*1024*1024; -- 8MB

5.4 行格式下的優(yōu)化

binlog_row_image 參數(shù)影響 ROW 格式下的日志大小:

-- FULL:記錄所有列的完整數(shù)據(jù)
-- MINIMAL:只記錄主鍵和實際變更的列
-- NOBLOB:對于沒有 BLOB 列的表,不記錄 BLOB 數(shù)據(jù)

SHOWVARIABLESLIKE'binlog_row_image';
-- +------------------+-------+
-- | Variable_name  | Value |
-- +------------------+-------+
-- | binlog_row_image | FULL |
-- +------------------+-------+

-- 如果表沒有 BLOB 列,可以設置為 MINIMAL 減少日志量
SETGLOBALbinlog_row_image = MINIMAL;

六、實戰(zhàn)案例分析

6.1 案例一:未配置自動清理導致磁盤爆滿

6.1.1 問題現(xiàn)象

監(jiān)控告警:/var 分區(qū)使用率超過 90%。

SSH 登錄后檢查:du -sh /var/lib/mysql 顯示只有 200GB。

但 df -h 顯示已使用 350GB。

6.1.2 排查過程

# 查看磁盤使用
df -h /var
# Filesystem   Size Used Avail Use% Mounted on
# /dev/sda1    400G 380G  20G 95% /var

# 查看 MySQL 目錄詳情
du -sh /var/lib/mysql/*
# 78G   /var/lib/mysql/data (實際數(shù)據(jù))
# 280G  /var/lib/mysql/binlog (二進制日志)
# 12G   /var/lib/mysql/relaylog (從服務器 relay log)

# 確認二進制日志
ls -lh /var/log/mysql/mysql-bin.0* | tail -10

6.1.3 問題根因

配置文件中未設置 expire_logs_days 參數(shù),默認為 0 表示不自動清理。

業(yè)務上線時從全量備份恢復后,從未清理過二進制日志。

沒有配置從服務器的 relay log 清理。

6.1.4 解決步驟

-- 1. 確認從服務器狀態(tài)
SHOWSLAVESTATUSG
-- Relay_Master_Log_File: mysql-bin.00150
-- Exec_Master_Log_Pos: 1234567

-- 2. 設置自動清理(保留最近 7 天)
SETGLOBALexpire_logs_days =7;

-- 3. 手動清理超過 7 天的日志
PURGEBINARYLOGSTO'mysql-bin.00150';

-- 4. 修改配置文件永久生效
-- 在 [mysqld] 段添加或修改:
-- expire_logs_days = 7

-- 5. 從服務器也需要清理 relay log
SHOWVARIABLESLIKE'relay_log_purge';
SETGLOBALrelay_log_purge =ON;

6.1.5 預防措施

在 MySQL 配置文件中始終設置 expire_logs_days。

部署監(jiān)控告警,監(jiān)控二進制日志目錄大小。

定期檢查二進制日志使用情況。

6.2 案例二:大事務導致單個日志文件過大

6.2.1 問題現(xiàn)象

某個表執(zhí)行了大表更新,導致二進制日志瞬間增長 50GB。

max_binlog_size 設置為 1GB,但單個日志文件超過 10GB。

6.2.2 排查過程

-- 查看最大的二進制日志文件
SELECT
  LOG_NAME,
  FILE_SIZE /1024/1024ASsize_mb
FROMinformation_schema.FILES
WHEREFILE_TYPE ='BINARY LOG'
ORDERBYFILE_SIZEDESC
LIMIT10;

-- 查看是什么時間點開始變大
SHOWBINARYLOGS;

6.2.3 問題分析

大表更新(如 UPDATE t SET col = 'xxx' 沒有 WHERE 條件)產(chǎn)生了大量 ROW 格式日志。

max_binlog_size 只是觸發(fā)切換的條件,不是硬性限制。

大事務必須完整寫入一個二進制日志文件,不能分割。

6.2.4 解決建議

分批處理大事務:

-- 原來的一次性更新
-- UPDATE large_table SET status = 1;

-- 改為分批更新
DELIMITER //
CREATEPROCEDUREbatch_update()
BEGIN
 DECLAREbatch_sizeINTDEFAULT1000;
 DECLAREoffset_numINTDEFAULT0;
 DECLAREdoneINTDEFAULTFALSE;

  WHILE NOT doneDO
   UPDATElarge_table
   SETstatus=1
   WHEREidBETWEENoffset_numANDoffset_num + batch_size -1;

   SEToffset_num = offset_num + batch_size;

   -- 檢查是否還有未更新的記錄
    IF ROW_COUNT() < batch_size THEN
? ? ? ? ? ??SET?done =?TRUE;
? ? ? ??ENDIF;

? ? ? ??-- 提交當前批次
? ? ? ??COMMIT;
? ??ENDWHILE;
END?//
DELIMITER ;

CALL?batch_update();

6.3 案例三:從服務器 relay log 占用大量空間

6.3.1 問題現(xiàn)象

從服務器磁盤空間告警,但主服務器一切正常。

檢查發(fā)現(xiàn)從服務器的 relay-log 目錄占用 200GB。

6.3.2 排查過程

-- 在從服務器上查看 relay log 配置
SHOWVARIABLESLIKE'%relay%';
-- relay_log      = /var/lib/mysql/mysql-relay-bin
-- relay_log_purge   = ON
-- relay_log_space_limit = 0 (0 表示不限制)

-- 查看 relay log 文件
ls -lh /var/lib/mysql/mysql-relay-bin.* | head -20

6.3.3 問題根因

雖然 relay_log_purge 默認為 ON,但以下情況會導致 relay log 堆積:

復制中斷,從服務器無法執(zhí)行事件。

網(wǎng)絡問題導致從服務器長時間無法讀取主服務器的日志。

某些大事務導致單個 relay log 文件過大。

6.3.4 解決方案

-- 確保 relay log 自動清理開啟
SHOWVARIABLESLIKE'relay_log_purge';
SETGLOBALrelay_log_purge =ON;

-- 如果有復制中斷,先解決中斷問題
SHOWSLAVESTATUSG
-- 查看 Last_Error 和 Last_IO_Error 字段

-- 手動清理 relay log
STOPSLAVE;
PURGERELAYLOGS;
STARTSLAVE;

七、二進制日志監(jiān)控

7.1 監(jiān)控指標

-- 二進制日志總大小
SELECT
 COUNT(*)AStotal_files,
 SUM(FILE_SIZE) /1024/1024AStotal_mb,
 MAX(FILE_SIZE) /1024/1024ASmax_file_mb
FROMinformation_schema.FILES
WHEREFILE_TYPE ='BINARY LOG';

-- 二進制日志寫入統(tǒng)計
SHOWSTATUSLIKE'Binlog%';
-- +-----------------------+-------+
-- | Variable_name     | Value |
-- +-----------------------+-------+
-- | Binlog_cache_disk_use | 0   |
-- | Binlog_cache_use   | 1000 |
-- +-----------------------+-------+

-- 復制相關的二進制日志統(tǒng)計
SHOWSTATUSLIKE'Slave%';

7.2 監(jiān)控腳本

#!/bin/bash
# 二進制日志監(jiān)控腳本

ALERT_THRESHOLD_GB=100
LOG_DIR="/var/log/mysql"
MYSQL_USER="root"
MYSQL_PASS="YourPassword"

# 獲取二進制日志總大小
TOTAL_SIZE=$(mysql -u${MYSQL_USER}-p${MYSQL_PASS}-N -e"
SELECT SUM(FILE_SIZE) / 1024 / 1024 / 1024
FROM information_schema.FILES
WHERE FILE_TYPE = 'BINARY LOG';
")

# 比較閾值
if["$(echo "$TOTAL_SIZE > $ALERT_THRESHOLD_GB" | bc)"-eq 1 ];then
 echo"ALERT: Binary log size (${TOTAL_SIZE}GB) exceeds threshold (${ALERT_THRESHOLD_GB}GB)"
 # 發(fā)送告警通知
 # 這里可以接入郵件、短信、釘釘?shù)雀婢? exit1
fi

# 獲取最舊的日志文件
OLDEST_LOG=$(mysql -u${MYSQL_USER}-p${MYSQL_PASS}-N -e"SHOW BINARY LOGS;"| head -1 | awk'{print $1}')

# 獲取最新日志文件
NEWEST_LOG=$(mysql -u${MYSQL_USER}-p${MYSQL_PASS}-N -e"SHOW BINARY LOGS;"| tail -1 | awk'{print $1}')

echo"Binary Log Report:"
echo"Total Size:${TOTAL_SIZE}GB"
echo"Files:${OLDEST_LOG}to${NEWEST_LOG}"
echo"Oldest file:${OLDEST_LOG}"

7.3 Prometheus 監(jiān)控配置

# mysql_exporter 二進制日志監(jiān)控指標
-job_name:'mysql'
static_configs:
-targets:['localhost:9104']
relabel_configs:
-source_labels:[__address__]
 target_label:instance
 regex:'(.+):d+'
 replacement:'${1}'

八、二進制日志恢復實踐

8.1 基于時間點的恢復

# 假設需要恢復到 2026-01-15 1000 的狀態(tài)

# 1. 先找到對應的日志文件
mysqlbinlog --no-defaults --stop-datetime="2026-01-15 0959"
 /var/log/mysql/mysql-bin.000123 > /tmp/full_recovery.sql

# 2. 如果需要跳過某些錯誤
mysqlbinlog --no-defaults 
 --stop-datetime="2026-01-15 0959"
 --database=opsdb 
 /var/log/mysql/mysql-bin.000123 /var/log/mysql/mysql-bin.000124 
 > /tmp/partial_recovery.sql

# 3. 恢復數(shù)據(jù)
mysql -u root -p < /tmp/full_recovery.sql

8.2 基于位置點的恢復

# 找到需要恢復的位置點
mysqlbinlog --no-defaults --base64-output=decode-rows -v 
 /var/log/mysql/mysql-bin.000123 | grep -A 5"DROP TABLE"| head -30

# 找到位置點后
mysqlbinlog --no-defaults 
 --stop-position=12345678 
 /var/log/mysql/mysql-bin.000123 > /tmp/recovery.sql

mysql -u root -p < /tmp/recovery.sql

8.3 從從服務器恢復

如果主服務器的二進制日志不可用,可以從從服務器恢復:

-- 在從服務器上執(zhí)行
SHOWSLAVESTATUSG
-- 記錄 Master_Log_File 和 Exec_Master_Log_Pos
# 從從服務器的 relay log 恢復
mysqlbinlog --no-defaults 
 --start-position=123 
 --stop-position=12345678 
 /var/lib/mysql/mysql-relay-bin.000050 > /tmp/slave_recovery.sql

mysql -u root -p < /tmp/slave_recovery.sql

九、最佳實踐總結

9.1 配置規(guī)范

# /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
# 二進制日志基礎配置
log_bin = /var/log/mysql/mysql-bin
binlog_format = ROW
max_binlog_size = 1G
expire_logs_days = 7

# 性能優(yōu)化
sync_binlog = 1000 # 性能敏感場景
binlog_cache_size = 8M
max_binlog_cache_size = 512M

# 從服務器配置
log_slave_updates = ON
relay_log_purge = ON
relay_log_recovery = ON

9.2 運維規(guī)范

每日檢查二進制日志目錄大小。

設置合理的告警閾值(建議磁盤使用的 80%)。

重要數(shù)據(jù)變更前記錄當前的二進制日志位置。

定期備份二進制日志到異地存儲。

9.3 恢復預案

每季度測試一次恢復流程。

維護最新的備份和日志位置文檔。

記錄所有大事務的日志位置,便于選擇性恢復。

總結

二進制日志是 MySQL 運維中最重要的組件之一,但也是最容易引發(fā)磁盤空間問題的組件。

理解二進制日志的工作原理是解決問題的前提:它記錄所有數(shù)據(jù)變更,用于復制和恢復,在 ROW 格式下日志量可能很大。

磁盤空間暴漲的主要原因是未配置自動清理策略。在生產(chǎn)環(huán)境中,必須設置 expire_logs_days 參數(shù),并配置監(jiān)控告警。

復制環(huán)境下清理日志需要格外謹慎,必須確保所有從服務器已經(jīng)讀取完畢要刪除的日志文件。

大事務會產(chǎn)生大量日志,分批處理是最佳實踐。

日常監(jiān)控和定期檢查是預防問題的關鍵。配置合理的告警閾值,建立日志增長趨勢分析,才能在問題發(fā)生前發(fā)現(xiàn)端倪。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 磁盤
    +關注

    關注

    1

    文章

    401

    瀏覽量

    26575
  • MySQL
    +關注

    關注

    1

    文章

    928

    瀏覽量

    29737
  • 日志
    +關注

    關注

    0

    文章

    148

    瀏覽量

    11092

原文標題:MySQL 磁盤空間暴漲,二進制日志可能才是元兇

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    如何在Ubuntu系統(tǒng)中釋放磁盤空間

    這個帶有腳本的快速指南有助于清理舊的快照版本,并在 Ubuntu 系統(tǒng)中釋放一些磁盤空間。
    發(fā)表于 10-20 10:27 ?3008次閱讀

    Linux磁盤空間異常爆滿,該怎么查?

    在服務器運維過程中,我們時常會遇到這樣的情況,收到服務器磁盤空間告警。
    發(fā)表于 11-29 09:00 ?1252次閱讀

    解決大家Protel99SE文檔太大占磁盤空間方法

    本帖最后由 qq601039293 于 2011-7-19 10:00 編輯 希望這個方法能解決大家的文件太大占用磁盤空間方法,不喜勿噴,懂得可以無視,希望能幫助新人。{:soso_e100
    發(fā)表于 07-19 09:58

    Linux webpack 10.1false磁盤空間報告錯誤

    大家好,在幾次不成功的安裝之后,我甚至嘗試以root用戶身份登錄(?。偸堑玫藉e誤的錯誤警告說“磁盤空間太小”。但是我有大約17 GB的可用空間。Debian和Debian類似的分布都有相同
    發(fā)表于 09-29 14:54

    PNA-X校準可以首先檢查是否有足夠的磁盤空間可用嗎

    :硬盤驅動器上剩余的0字節(jié)可用磁盤空間。我的問題是,在校準所有過程之前我應該??保留多少可用磁盤空間,以確保不會出現(xiàn)問題?;蛘摺叭啃省边^程是否可以首先檢查是否有足夠的磁盤空間可用,因為在此過程中似乎
    發(fā)表于 01-15 14:14

    在Linux下增加磁盤空間的步驟

    在給Linux分區(qū)時,總是有那么一點吝嗇,給的空間較小。在使用過程中,裝上Matlab等大型軟件后,才驀然發(fā)現(xiàn)磁盤已沒有空間,不過亡羊補牢為時不晚。Warning:對硬盤分區(qū)很危險,要在備份重要資料以后再進行。慎重。言歸正傳,說
    發(fā)表于 07-11 08:42

    Linux下可以用df命令查看磁盤空間

    Linux下 df 命令查看磁盤空間
    發(fā)表于 07-12 11:07

    Linux的剩余磁盤空間利用技巧

    Linux利用剩余的磁盤空間
    發(fā)表于 07-30 14:28

    如何在Mac上清理磁盤空間?這些方法你用過了嗎

    Mac電腦設備使用久了,可能會保存特別多的無用文件,那么Mac磁盤空間將會面臨不夠用的情況。那么該如何在Mac上清理磁盤空間?如何在Mac上清理磁盤空間?1、卸載長期不使用的應用卸載長期不使
    發(fā)表于 09-09 21:05

    請問根目錄分區(qū)磁盤空間不夠了怎么擴充?

    安裝了一些軟件后,根目錄磁盤空間使用率已經(jīng)達到92%了,SD卡是32G的,實際只使用了16G,可不可以擴大根目錄分區(qū)的容量,把后面16G也給分配到根目錄分區(qū)?
    發(fā)表于 09-13 07:22

    Linux中的可用磁盤空間如何檢查?

    跟蹤磁盤利用率信息是系統(tǒng)管理員(和其他人)的日常待辦事項列表之一。Linux 有一些內(nèi)置的使用程序來幫助提供這些信息。df 命令意思是 “disk-free”,顯示 Linux 系統(tǒng)上可用和已使用的磁盤空間。
    的頭像 發(fā)表于 07-25 18:53 ?4077次閱讀
    Linux中的可用<b class='flag-5'>磁盤空間</b>如何檢查?

    通過df命令顯示磁盤空間使用情況

    這 df 命令顯示文件系統(tǒng)上的設備名稱、總塊數(shù)、總磁盤空間、已用磁盤空間、可用磁盤空間和掛載點信息。
    的頭像 發(fā)表于 05-16 11:30 ?2229次閱讀

    服務器運維過程收到磁盤空間告警怎么辦

    在服務器運維過程中,我們時常會遇到這樣的情況,收到服務器磁盤空間告警:
    的頭像 發(fā)表于 11-03 10:30 ?2679次閱讀

    linux磁盤空間滿了怎么清理

    和告警信息一致,接著我們就是要找到導致磁盤空間滿的目錄或文件 如何找到占用空間大的目錄或文件? 一種比較笨的方法是,在根目錄下,通過du -hs命令,列出各目錄所占空間大小。
    的頭像 發(fā)表于 11-09 11:46 ?2136次閱讀
    linux<b class='flag-5'>磁盤空間</b>滿了怎么清理

    Linux磁盤空間告警的常見原因和診斷方法

    磁盤空間告警是運維工作中最常見的告警類型之一。當磁盤空間耗盡時,應用程序無法寫入日志、數(shù)據(jù)庫無法正常提交、容器無法創(chuàng)建新鏡像,甚至系統(tǒng)日志寫入失敗會導致難以診斷的連鎖故障。本文從實際運維經(jīng)驗出發(fā),提供一套完整的磁盤空間問題定位和
    的頭像 發(fā)表于 04-08 14:25 ?97次閱讀