Mysql

與 puppet-dashboard 一起使用時,如何防止 MySQL 增加其磁碟空間使用量?

  • September 3, 2014

設置

我們有一個使用 MySQL v5.1.73(innoDB 儲存引擎)和 puppet-dashboard 版本 1.2.23 設置的 Debian Linux。您可能已經猜到了,puppet-dashboard 使用 MySQL 作為其後端。

此外,它不應該是相關的,但這是 vSphere 5.5 上的 VMware 虛擬機。

問題

問題在於,儘管 puppet 節點的數量和執行頻率保持相對相同,但 MySQL 使用的磁碟空間仍在以令人不安的方式不斷增加,以至於現在已經成為一個問題。

下圖說明了這個問題。

磁碟空間下降

我們已經實施了兩個 cron 作業,應該可以釋放磁碟空間。它們如下,並且都每天執行:

  • 耙 RAILS_ENV=生產數據庫:原始:優化
  • rake RAILS_ENV=生產報告:修剪:孤立最多=3 單位=星期一

您可以在圖中看到的下降是 cron 作業正在執行並佔用更多空間以試圖釋放一些空間。

未啟用 MySQL 二進制日誌。此伺服器上使用的 95% 的磁碟空間位於 /var/lib/mysql/dashboard_production,這是儲存 MySQL 數據的目錄。

我們之前在使用不同的應用程序(Zabbix 監控)時遇到過這個問題,不得不轉儲數據庫並重新導入以釋放空間。這是一個非常痛苦的過程,不是一個非常優雅的解決方案,但它最終奏效了。

有什麼辦法可以回收這個磁碟空間?我們能做些什麼來阻止這種行為?

編輯 1

我們確實在使用 innoDB,並且我們沒有使用配置指令“innodb_file_per_table”。

按照 Felix 的要求,命令的輸出如下:

+----------------------+-------------------+-------------+
| table_schema         | table_name        | data_length |
+----------------------+-------------------+-------------+
| dashboard_production | resource_statuses | 39730544640 |
| dashboard_production | metrics           |   643825664 |
| dashboard_production | report_logs       |   448675840 |
| dashboard_production | timeline_events   |    65634304 |
| dashboard_production | reports           |    50937856 |
| dashboard_production | resource_events   |    38338560 |
| glpidb               | glpi_crontasklogs |    21204608 |
| ocsweb               | softwares         |     8912896 |
| ocsweb               | deploy            |     5044208 |
| phpipam              | logs              |     1269584 |
+----------------------+-------------------+-------------+

此外,我將嘗試沒有提到的“孤立”選項以及其他替代方案的報告:修剪任務,並將保持此問題的更新。

編輯 2

我執行了 reports:prune rake 任務,儘管刪除了 230000 份報告,但它繼續佔用更多空間……因此,我將繼續使用其他選項。

在此處輸入圖像描述

解決方案

在刪除數據庫中三分之二的條目後,它只釋放了 200MB 的磁碟空間,這是毫無意義的。我們最終轉儲了內容並重新導入它,注意啟用“innodb_file_per_table”。

我們只需要等待,看看這是否能長期解決解決方案,但目前似乎是這樣。

我發現這篇文章似乎很好地解決了這個問題

http://ximunix.blogspot.co.uk/2014/01/howto-cleanup-puppet-reports-and-db.html

發表者 Ximena Cardinali

小故事是開始小批量刪除報告,然後從 MySQL 中回收空間


HOWTO 清理木偶報告和數據庫

如果 Puppet Dashboard 的數據庫使用數 GB 並且每天都在變大,這是一種收回一些空間的方法。

作為 Puppet Dashboard 日常維護的一部分,您應該每天執行兩個 rake 作業。

cd /usr/share/puppet-dashboard
env RAILS_ENV=production rake reports:prune upto=5 unit=day
env RAILS_ENV=production rake reports:prune:orphaned

您可以更改 RAILS_ENV 和天數 (day)、週數 (wk)、月數 (mon) 等以匹配您的系統及其需求。

  1. 停止傳入報告:

cd /path/to/puppet-dashboard

env RAILS_ENV=生產腳本/delayed_job -p dashboard -m stop 2. 開始小批量刪除報表

繼續努力爭取保留報告的時間長度。原因是 Innodb 表在一次刪除超過 10k 行時性能很差。如果您嘗試刪除幾十萬行,它將超時,並且無論如何您都必須將其分解為較小的刪除。此外,Ruby rake 程序可能會使用您的所有 RAM,並且可能在完成之前被核心殺死。這種進展應該適用於大多數人,但如果您有很多個月的數據,您可能希望從最早的一兩個月的記錄開始。在我們的案例中,我們只保留 2 週(14 天)的報告。

env RAILS_ENV=production rake reports:prune upto=6 unit=mon
env RAILS_ENV=production rake reports:prune upto=4 unit=mon
env RAILS_ENV=production rake reports:prune upto=2 unit=mon
env RAILS_ENV=production rake reports:prune upto=3 unit=wk
env RAILS_ENV=production rake reports:prune upto=1 unit=wk
env RAILS_ENV=production rake reports:prune upto=5 unit=day
  1. 確定從 MySQL 回收空間的最佳方法

根據 MySQL 的配置方式,有兩種回收空間的方法。執行此命令以確定是否啟用了“innodb_file_per_table”。如果是,則應將其設置為“ON”。注意:對於這種情況,我建議在您的 MySQL 上使用 innodb。

mysqladmin variables -u root -p | grep innodb_file_per_table

您還可以列出數據庫以查看是否有更大的數據文件。最有可能很大的表是 resource_statuses.ibd。

ls -lah /var/lib/mysql/dashboard_production
...
-rw-rw---- 1 mysql mysql      8.9K Jan 08 12:50 resource_statuses.frm
-rw-rw---- 1 mysql mysql       15G Jan 08 12:50 resource_statuses.ibd
...
  1. 以簡單的方式回收空間

如果 MySQL 配置了 innodb_file_per_table 並且您的 Dashoard DB 顯示您的數據位於大型表文件中,請執行以下操作:

mysql -u root -p
use puppet_dashboard;
OPTIMIZE TABLE resource_statuses;

這將根據目前數據創建一個新表並將其複製到位。如果您在此過程中進行列表,您應該會看到如下內容:

-rw-rw---- 1 mysql mysql       8.9K Jan  08 12:50 resource_statuses.frm
-rw-rw---- 1 mysql mysql        15G Jan  08 12:50 resource_statuses.ibd
-rw-rw---- 1 mysql mysql       8.9K Jan  08 12:50 #sql-379_415.frm
-rw-rw---- 1 mysql mysql       238M Jan  08 12:51 #sql-379_415.ibd

完成後,它會將 tmp 文件複製到位。在這種情況下,我們從 15GB 增加到 708MB。

-rw-rw---- 1 mysql mysql 8.9K Jan 08 13:01 resource_statuses.frm
-rw-rw---- 1 mysql mysql 708M Jan 08 13:03 resource_statuses.ibd
  1. 以艱難的方式回收空間

如果您的系統未配置 innodb_file_per_table 或所有目前數據都駐留在大型 ibdata 文件中,那麼回收空間的唯一方法是擦除整個安裝並重新導入所有數據。整體方法應該是這樣的:首先配置innodb_file_per_table,dump所有數據庫,然後停止Mysql,刪除/var/lib/mysql,執行mysql_install_db再次創建/var/lib/mysql,啟動MySQL,最後重新導入數據。由於數據導入,無需優化步驟。

  1. 最後,重啟delayed_job:

cd /path/to/puppet-dashboard

env RAILS_ENV=生產腳本/delayed_job -p dashboard -n 2 -m start 7. 每日報告清理和數據庫維護:

對於每日報告清理,您可以創建一個簡單的 BASH 腳本,該腳本按時間搜尋 /var/lib/puppet/reports 上的報告(在我們的例子中為 mtime +14),刪除它們,然後使用 (upto=2 unit= wk) 並將其設置在您的 crontab 中。腳本的一個範例可以是:

#!/bin/bash
REPORTS=`find /var/lib/puppet/reports -type f -mtime +14`
for i in $REPORTS; do rm -f $i; done

cd /usr/share/puppet-dashboardenv RAILS_ENV=production rake reports:prune upto=2 unit=wk

引用自:https://serverfault.com/questions/624457