首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0071. 如何排查 Ubuntu 機器佔滿空間的問題 & 解決 Mysql Binlog 佔用空間

日期:2024年 09月 07日

標籤: Linux Ubuntu MySQL

摘要:C# 學習筆記


解決問題:1. 找出 Ubuntu 主機空間不足
     2. 如何排除 Mysql Binlog 占滿空間的錯誤
基本介紹:本篇分為三大部分。
第一部分:排查空間不足問題
第二部分:釋放 Mysql Binlog 佔用空間
第三部分:Mysql - Binlog 配置 - 永久解決問題






第一部分:排查空間不足問題

Step 1:前言

在工作環境中,開發環境資源有限,常常需要解決伺服器(Ubuntu),空間不足的問題。

開發環境的空間不足,最好是由開發人員自行解決,若由 IT 人員處理,可能會造成非預期的錯誤
※ EX: 沒有溝通好,導致遺漏告知某些檔案不可刪除,都有可能發生



Step 2:Ubuntu 查詢空間

可以使用以下指令查詢當前空間配置,輸入以下:
※ df 可參考連結</f>

df -h


可知道 Mounted On/ 位置檔案空間已 100%


Step 3:查詢目錄下空間 - 1

接著檢查 / 目錄下的目錄哪個占用最大,輸入以下:
※ du 可參考連結

du -h --max-depth=1 /


可知道 Mounted On/var 位置檔案空間已 96G


Step 4:查詢目錄下空間 - 2

接著檢查 /var 目錄下的目錄哪個占用最大,輸入以下:

du -h --max-depth=1 /var


可知道 Mounted On/var/lib 位置檔案空間已 96G


Step 5:查詢目錄下空間 - 3

接著檢查 /var/lib 目錄下的目錄哪個占用最大,輸入以下:

du -h --max-depth=1 /var/lib


可知道 Mounted On/var/lib/mysql 位置檔案空間已 96G


Step 6:查詢目錄下空間 - 定位 Mysql

接著檢查 /var/lib/mysql 目錄下的目錄哪個占用最大,輸入以下:

du -h --max-depth=1 /var/lib/mysql


但這時可以觀察到 /var/lib/mysql 此目錄下就是占用 96G 的最大元兇


Step 7:檢查 Mysql 目錄

這邊使用工具連進該機器,檢查 /var/lib/mysql 有什麼檔案
最終發現有大量的 binlog 占用了 96G 空間( 1,048,577 大約 1GB,每個檔案 1G)




第二部分:釋放 Mysql Binlog 佔用空間


Step 1:Mysql Binlog 介紹

Binlog (二進制日誌)詳細可參考 Mysql 官方手冊


以下是使用 Binlog 的用途簡介

數據恢復 二進位日誌可以用來在崩潰或其他資料損壞情況下恢復資料庫。透過重新套用二進位日誌中的更改,可以將資料庫還原到最後一次備份後的狀態。
主從複製 MySQL 使用二進位日誌實作主從複製。主伺服器將所有變更記錄到二進位日誌中,從伺服器讀取並套用這些日誌,從而保持與主伺服器的資料同步。
分析 二進制日誌可以用來審計資料庫操作和偵錯應用程式問題。透過分析二進位日誌,可以了解哪些操作導致了特定的資料變更。
    ※ 例如 INSERT、UPDATE、DELETE 和其他更新操作。



Step 2:Mysql Binlog 要關閉時的考量

binlog 會持續對硬碟寫入資料,對於空間小的機器會容易出現問題,可以依照以下考量,決定是否不啟用:

資料庫環境不需要復原功能 在開發、測試或臨時環境中,如果不需要備份還原或資料復原功能,可以考慮關閉二進位日誌。在這種情況下,資料庫的重建和資料復原通常不是首要任務。
效能最佳化 如果資料庫包含大量高頻更新的表,二進位日誌可能導致效能下降。
資料不重要或不需要持久化 如果資料庫中儲存的資料不重要,或是臨時性的資料(例如快取、會話資料等),可以考慮關閉二進位日誌。在這種情況下,即使資料遺失,也不會造成重大影響。
資源限制 果您的伺服器儲存空間非常有限,且您無法承擔二進位日誌檔案不斷增加所需的磁碟空間,您可能需要關閉二進位日誌以節省空間。
不需備份 有其他的資料保護策略,確定不用的情況下


可以知道 Binlog 大多情況下都是開啟最為安全,即使是開發中,大多情況都是持久化資料。

Step 3:Binlog 手動刪除

若 Mysql 無法啟動的情況下,需要手動先刪除檔案
釋放空間後,再啟動 Mysql

systemctl restart mysqld


請手動先刪除時間最遠的檔案,例如以下2個 binlog


Step 4:進入 Mysql 檢查

輸入以下指令,查找 Mysql 當前有效的 Binlog:

SHOW BINARY LOGS;


可以觀察到只列出 207 ~ 227 這些檔案是有效的 Binlog ,其餘都可以被捨棄刪除


Step 5:安全的刪除 Binlog

若非必要,請盡量避免手動刪除 Binlog ,在人為操作的過程,若失誤會對 Mysql 造成不可逆的錯誤。
因此 Mysql 服務啟動後,請輸入以下指令刪除不要的 Binlog 資料,以下是基於時間刪除:
刪除 2024-7-14 以前的 Binlog

PURGE BINARY LOGS BEFORE '2024-07-14 00:00:00'




Step 6:執行結果 - 已完成釋放空間

回到 Ubuntu 機器,查詢後,可以確認已騰出 60G ,並且 Mysql 都是正常的狀況。




第三部分:Mysql - Binlog 配置 - 永久解決問題

Step 1:進入 Mysql Binlog 配置檔案

若要根本性的解決佔用空間過大的問題,可以先配置好保留資料的時間範例
mysql 服務的設定檔案,通常在這個目錄下,並且打開 my.cnf

\etc




Step 2:設定保存時間

[mysqld] 的下方添加 expire_logs_days = 7
表示我們只保留 7 天的 binlog

expire_logs_days = 7


最後在重啟 Mysql 服務,即配置完成

systemctl restart mysqld