OPTIMIZE TABLE 进度是否有进度指示器?

Mik*_*e B 6 mysql innodb windows mysql-5.1

MySQL 5.1.4x (Windows) | 数据库

我最近从 mySQL 数据库(几十万行)中清除了数据,我打算使用

OPTIMIZE TABLE LOGTABLEFOO1,LOGTABLEFOO2,LOGTABLEFOO3;
Run Code Online (Sandbox Code Playgroud)

为了减少文件系统中的空白空间占用的数据空间。

我担心的是,一旦我开始执行此命令,我将不知道要花多长时间或在此过程中处于什么位置。无论如何我可以确定这些信息吗?据我所知,没有进度指示器。

Rol*_*DBA 12

MySQL 没有任何东西可以指示OPTIMIZE TABLE;.

您可能必须使用 Windows 资源管理器访问操作系统并查找不断增长的 tmp 表。提示:临时表是 MyISAM 表,没有 . 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;
Run Code Online (Sandbox Code Playgroud)

看两个涉及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将导致所有数据和索引页mydb.mytable写入到.ibd您可以在 Windows 资源管理器中看到的外部文件。

警告

启用innodb_file_per_table并运行OPTIMIZE TABLE将永远不会回收以前在 ibdata1 中占用的空间。您将必须执行InnoDB 清理以重新创建 ibdata1,以使数据和索引永远不会再驻留在 ibdata1 中。

结论

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

如果你想要一些你可以监控的东西并且你启用了innodb_file_per_table,你可以替换

OPTIMIZE TABLE LOGTABLEFOO1,LOGTABLEFOO2,LOGTABLEFOO3;
Run Code Online (Sandbox Code Playgroud)

具有以下机械等效项:

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;
Run Code Online (Sandbox Code Playgroud)

请记住OPTIMIZE TABLE是什么,但ALTER TABLE ... ENGINE=InnoDB;随后ANALYZE TABLE

通过这些步骤,您可以提前知道临时表是什么

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

只需监视每个文件的存在和大小,直到它消失。


归档时间:

查看次数:

18034 次

最近记录:

6 年,7 月 前