Mysql

刪除mariadb中的數百萬條記錄後如何釋放硬碟空間

  • April 5, 2022

我們有一個應用程序,我們每隔幾秒鐘就可以接收資訊,我們將這些資訊記錄在一個我們稱之為事件的表中,該表目前重 240 GB,這是我們迄今為止最大的。

前段時間我們刪除了記錄以保留特定日期的記錄。不久前我們意識到儲存數據庫的伺服器正在填滿磁碟,刪除數百萬條記錄後,磁碟空間保持不變。

搜尋網際網路我們發現執行以下查詢 ALTER TABLE tablename ENGINE = Innodb; 將釋放已刪除記錄的已用空間。

但是我們遇到了一個問題,因為我們有大於200G的表,所以命令執行的時間很長,導致新的資訊由於阻塞導致無法及時插入。

我們找到的選項如下:

  • 製作數據庫的副本(主 - 從),從我們在這裡看到的內容來看,我們必須對主伺服器進行備份並將其傳遞給從伺服器,以便它從發生的地方開始複製,為此我們有詳細資訊是不是我們想關閉我們目前的伺服器以使我們的服務保持正常執行,但我們也不希望有任何資訊失去。我們前一天有我們伺服器的備份,我們可以使用它,但是我們如何恢復一天內沒有插入的資訊,如果創建備份,備份有什麼,從哪裡配置?
  • 備份我們目前的數據庫並將它們上傳到新伺服器,以免使用 ALTER TABLE tablename ENGINE = Innodb 命令,為此我們必須關閉伺服器。
  • 執行 ALTER TABLE tablename ENGINE = Innodb 命令,我們執行一個測試,在我們作為測試的 10 GB 表中,執行大約需要 25 分鐘。

有沒有更優化的方式來釋放空間而不必取消我們的服務並且不會失去資訊?或者如果必須在盡可能短的時間內完成?

這個查詢 ALTER TABLE tablename ENGINE = Innodb 知道它是否鎖定了表。

生產環境資訊:Ubuntu Ubuntu 16.04.3 LTS mysql Distribution 10.1.21-MariaDB 所有表的類型為Engine = Inodb

非常感謝你

InnoDB 表空間文件永遠不會收縮是正確的。刪除大量行後,大文件中可能會有未使用的空間,但該文件仍會佔用文件系統上的大量空間。

使文件更小的唯一方法是將剩餘的數據複製到新的表空間,然後刪除原始表空間。這就是您描述的 ALTER 語句的作用。該聲明的替代形式是:

ALTER TABLE <name> FORCE;

OPTIMIZE TABLE <name>;

他們都做同樣的事情。我喜歡 FORCE 的那個,因為我最清楚它在做什麼。

將大量數據複製到新表空間需要很長時間,並且會在表執行時阻止對錶的訪問。

我過去在一些工作中所做的是使用免費工具pt-online-schema-change來執行此任務,而不會阻止對錶的訪問。實際上,它可能比直接執行 ALTER TABLE 需要更長的時間,但由於它不會阻止訪問,因此不會導致中斷,因此沒有人會因為需要很長時間而感到不安。我們已經在比您描述的大得多的表上執行了這個,大到需要幾天才能完成。

你使用 MariaDB。我沒有,而且我從未親自將 pt-online-schema-change 與 MariaDB 一起使用。但我從其他使用者那裡了解到它的工作原理是一樣的,因為 MariaDB 與 MySQL 足夠相似,pt-online-schema-change 所需的功能也一樣。MariaDB 與 MySQL 不是同一個產品,但在這種情況下它已經足夠接近了。

計劃 A:創建一個新表,複製行,交換名稱。

B計劃:在這裡查看幾個相關的技術:http: //mysql.rjweb.org/doc.php/deletebig

引用自:https://dba.stackexchange.com/questions/310566