Mysql

是否有 OPTIMIZE TABLE 進度的進度指示器?

  • February 22, 2019

MySQL 5.1.4x (Windows) | Innodb

我最近從一個 mySQL 數據庫(幾十萬行)中清除了數據,我打算使用

OPTIMIZE TABLE LOGTABLEFOO1,LOGTABLEFOO2,LOGTABLEFOO3;

為了減少數據空間佔用,空白空間在文件系統中佔用。

我擔心的是,一旦我啟動這個命令,我將不知道它需要多長時間或它在過程中的位置。無論如何我可以確定這些資訊嗎?據我所知,沒有進度指示器。

MySQL 沒有任何東西可以指示OPTIMIZE TABLE;.

您可能必須使用 Windows 資源管理器進入作業系統並尋找不斷增長的 tmp 表。提示:臨時表是沒有 . frm文件名#sql-9999.MYD#sql-9999.MYI. 雖然這兩個文件存在,但查詢將被視為正在進行中。要知道多遠,必須知道行數乘以平均行長才能估計完成或剩餘的百分比。

MariaDB 對以下方面有一些進度計量

  • ALTER TABLE
  • ADD INDEX
  • DROP INDEX
  • LOAD DATA INFILE
  • CHECK TABLE
  • REPAIR TABLE
  • ANALYZE TABLE
  • OPTIMIZE TABLE

我之前已經討論過關於 MySQL 操作的主題

如果您試圖減少 InnoDB 的 ibdata1 的大小,刪除表只會在 ibdata1 中留下很大的空白。您必須執行完整的 InnoDB 基礎設施清理。

更新 2012-12-21 19:30 EDT

由於這個數據庫使用innodb,我可以尋找一個不斷增長的臨時表嗎?

假設你想跑步

OPTIMIZE TABLE mydb.mytable;

看兩個涉及innodb_file_per_table的場景和這個OPTIMIZE TABLE

場景 #1:innodb_file_per_table 已禁用

執行OPTIMIZE TABLE將導致所有數據和索引頁面mydb.mytable連續附加到 ibdata1。這將留下之前佔用的空間,進一步增加碎片化的瘋狂。

在這種情況下,臨時表將作為 InnoDB 存在,並將在 ibdata1 中實現。因此,將沒有任何東西可以進行視覺監控。

場景 #2:innodb_file_per_table 已啟用

對於每個 InnoDB 表 mydb.mytable 您將擁有

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd

.ibd文件包含表的數據和索引頁。

執行OPTIMIZE TABLE將導致所有數據和索引頁面被寫入您可以在 Windows 資源管理器中看到mydb.mytable的外部文件。.ibd

警告

啟用innodb_file_per_table並執行OPTIMIZE TABLE將永遠不會回收之前在 ibdata1 中佔用的空間。您必須執行InnoDB 清理以重新創建 ibdata1,以使數據和索引永遠不會再駐留在 ibdata1 中。

結論

如前所述,MariaDB 可以監控OPTIMIZE TABLE;

如果你想要一些你可以監控的東西並且你啟用了innodb_file_per_table,你可以替換

OPTIMIZE TABLE LOGTABLEFOO1,LOGTABLEFOO2,LOGTABLEFOO3;

具有以下機械等效物:

CREATE TABLE LOGTABLEFOO1_NEW LIKE LOGTABLEFOO1;
INSERT INTO LOGTABLEFOO1_NEW SELECT * FROM LOGTABLEFOO1;
ALTER TABLE LOGTABLEFOO1 RENAME LOGTABLEFOO1_OLD;
ALTER TABLE LOGTABLEFOO1_NEW RENAME LOGTABLEFOO1;
DROP TABLE LOGTABLEFOO1_OLD;
ANALYZE TABLE LOGTABLEFOO1;

CREATE TABLE LOGTABLEFOO2_NEW LIKE LOGTABLEFOO2;
INSERT INTO LOGTABLEFOO2_NEW SELECT * FROM LOGTABLEFOO2;
ALTER TABLE LOGTABLEFOO2 RENAME LOGTABLEFOO2_OLD;
ALTER TABLE LOGTABLEFOO2_NEW RENAME LOGTABLEFOO2;
DROP TABLE LOGTABLEFOO2_OLD;
ANALYZE TABLE LOGTABLEFOO2;

CREATE TABLE LOGTABLEFOO3_NEW LIKE LOGTABLEFOO3;
INSERT INTO LOGTABLEFOO3_NEW SELECT * FROM LOGTABLEFOO3;
ALTER TABLE LOGTABLEFOO3 RENAME LOGTABLEFOO3_OLD;
ALTER TABLE LOGTABLEFOO3_NEW RENAME LOGTABLEFOO3;
DROP TABLE LOGTABLEFOO3_OLD;
ANALYZE TABLE LOGTABLEFOO3;

請記住OPTIMIZE TABLE只不過ALTER TABLE ... ENGINE=InnoDB;ANALYZE TABLE

通過這些步驟,您可以提前知道臨時表是什麼

  • LOGTABLEFOO1_NEW.ibd
  • LOGTABLEFOO2_NEW.ibd
  • LOGTABLEFOO3_NEW.ibd

只需監視每個文件的存在和大小,直到它消失。

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