分享程式代碼相關筆記
目前文章總數:157 篇
最後更新:2024年 12月 07日
在工作環境中,開發環境資源有限,常常需要解決伺服器(Ubuntu),空間不足的問題。
開發環境的空間不足,最好是由開發人員自行解決,若由 IT 人員處理,可能會造成非預期的錯誤
※ EX: 沒有溝通好,導致遺漏告知某些檔案不可刪除,都有可能發生
可以使用以下指令查詢當前空間配置,輸入以下:
※ df 可參考連結</f>
df -h
可知道 Mounted On 的 / 位置檔案空間已 100%
接著檢查 / 目錄下的目錄哪個占用最大,輸入以下:
※ du 可參考連結
du -h --max-depth=1 /
可知道 Mounted On 的 /var 位置檔案空間已 96G
接著檢查 /var 目錄下的目錄哪個占用最大,輸入以下:
du -h --max-depth=1 /var
可知道 Mounted On 的 /var/lib 位置檔案空間已 96G
接著檢查 /var/lib 目錄下的目錄哪個占用最大,輸入以下:
du -h --max-depth=1 /var/lib
可知道 Mounted On 的 /var/lib/mysql 位置檔案空間已 96G
接著檢查 /var/lib/mysql 目錄下的目錄哪個占用最大,輸入以下:
du -h --max-depth=1 /var/lib/mysql
但這時可以觀察到 /var/lib/mysql 此目錄下就是占用 96G 的最大元兇
這邊使用工具連進該機器,檢查 /var/lib/mysql 有什麼檔案
最終發現有大量的 binlog 占用了 96G 空間( 1,048,577 大約 1GB,每個檔案 1G)
Binlog (二進制日誌)詳細可參考 Mysql 官方手冊
以下是使用 Binlog 的用途簡介
數據恢復 | : | 二進位日誌可以用來在崩潰或其他資料損壞情況下恢復資料庫。透過重新套用二進位日誌中的更改,可以將資料庫還原到最後一次備份後的狀態。 |
主從複製 | : | MySQL 使用二進位日誌實作主從複製。主伺服器將所有變更記錄到二進位日誌中,從伺服器讀取並套用這些日誌,從而保持與主伺服器的資料同步。 |
分析 | : | 二進制日誌可以用來審計資料庫操作和偵錯應用程式問題。透過分析二進位日誌,可以了解哪些操作導致了特定的資料變更。 |
※ 例如 INSERT、UPDATE、DELETE 和其他更新操作。 |
binlog 會持續對硬碟寫入資料,對於空間小的機器會容易出現問題,可以依照以下考量,決定是否不啟用:
資料庫環境不需要復原功能 | : | 在開發、測試或臨時環境中,如果不需要備份還原或資料復原功能,可以考慮關閉二進位日誌。在這種情況下,資料庫的重建和資料復原通常不是首要任務。 |
效能最佳化 | : | 如果資料庫包含大量高頻更新的表,二進位日誌可能導致效能下降。 |
資料不重要或不需要持久化 | : | 如果資料庫中儲存的資料不重要,或是臨時性的資料(例如快取、會話資料等),可以考慮關閉二進位日誌。在這種情況下,即使資料遺失,也不會造成重大影響。 |
資源限制 | : | 果您的伺服器儲存空間非常有限,且您無法承擔二進位日誌檔案不斷增加所需的磁碟空間,您可能需要關閉二進位日誌以節省空間。 |
不需備份 | : | 有其他的資料保護策略,確定不用的情況下 |
可以知道 Binlog 大多情況下都是開啟最為安全,即使是開發中,大多情況都是持久化資料。
若 Mysql 無法啟動的情況下,需要手動先刪除檔案
釋放空間後,再啟動 Mysql
systemctl restart mysqld
請手動先刪除時間最遠的檔案,例如以下2個 binlog
輸入以下指令,查找 Mysql 當前有效的 Binlog:
SHOW BINARY LOGS;
可以觀察到只列出 207 ~ 227 這些檔案是有效的 Binlog ,其餘都可以被捨棄刪除
若非必要,請盡量避免手動刪除 Binlog ,在人為操作的過程,若失誤會對 Mysql 造成不可逆的錯誤。
因此 Mysql 服務啟動後,請輸入以下指令刪除不要的 Binlog 資料,以下是基於時間刪除:
刪除 2024-7-14 以前的 Binlog
PURGE BINARY LOGS BEFORE '2024-07-14 00:00:00'
回到 Ubuntu 機器,查詢後,可以確認已騰出 60G ,並且 Mysql 都是正常的狀況。
若要根本性的解決佔用空間過大的問題,可以先配置好保留資料的時間範例
mysql 服務的設定檔案,通常在這個目錄下,並且打開 my.cnf
\etc
在 [mysqld] 的下方添加 expire_logs_days = 7
表示我們只保留 7 天的 binlog
expire_logs_days = 7
最後在重啟 Mysql 服務,即配置完成
systemctl restart mysqld