是否有 OPTIMIZE TABLE 進度的進度指示器?
MySQL 5.1.4x (Windows) | Innodb
我最近從一個 mySQL 數據庫(幾十萬行)中清除了數據,我打算使用
OPTIMIZE TABLE LOGTABLEFOO1,LOGTABLEFOO2,LOGTABLEFOO3;
為了減少數據空間佔用,空白空間在文件系統中佔用。
我擔心的是,一旦我啟動這個命令,我將不知道它需要多長時間或它在過程中的位置。無論如何我可以確定這些資訊嗎?據我所知,沒有進度指示器。
MySQL 沒有任何東西可以指示
OPTIMIZE TABLE;
.您可能必須使用 Windows 資源管理器進入作業系統並尋找不斷增長的 tmp 表。提示:臨時表是沒有 .
frm
文件名#sql-9999.MYD
和#sql-9999.MYI
. 雖然這兩個文件存在,但查詢將被視為正在進行中。要知道多遠,必須知道行數乘以平均行長才能估計完成或剩餘的百分比。
ALTER TABLE
ADD INDEX
DROP INDEX
LOAD DATA INFILE
CHECK TABLE
REPAIR TABLE
ANALYZE TABLE
OPTIMIZE TABLE
我之前已經討論過關於 MySQL 操作的主題
May 02, 2012
:如何監控大型 .sql 文件的導入進度?Jan 17, 2012
:添加索引非常慢…是否有 mysql cmd 來獲取 ETA 或顯示進度?如果您試圖減少 InnoDB 的 ibdata1 的大小,刪除表只會在 ibdata1 中留下很大的空白。您必須執行完整的 InnoDB 基礎設施清理。
Apr 01, 2012
: innodb_file_per_table 可取嗎?Mar 25, 2012
:為什麼 InnoDB 將所有數據庫儲存在一個文件中?Mar 29, 2011
:在 Windows (NTFS) 上執行的 MySQL 數據庫伺服器的最大表大小表類型 InnoDBFeb 04, 2011
: MySQL InnoDB - innodb_file_per_table 缺點?Oct 29, 2010
: Howto: 清理 mysql 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
只需監視每個文件的存在和大小,直到它消失。