Heim >Datenbank >MySQL-Tutorial >回收InnoDB表空间_MySQL

回收InnoDB表空间_MySQL

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-01 13:29:161077Durchsuche

bitsCN.com

回收InnoDB表空间

 

以下论述均假定innodb_file_per_table开启

先用常规optimize回收:

[plain] 

mysql> select count(*) from t;  <p>+----------+  </p><p>| count(*) |  </p><p>+----------+  </p><p>|  1200096 |  </p><p>+----------+  </p><p>  </p><p>[mysql@even employees]$ ls -alh t.ibd  </p><p>-rw-rw---- 1 mysql dba 72M 10-08 17:39 t.ibd  </p><p>  </p><p>mysql> delete from t limit 800000;  </p><p>  </p><p>mysql> select count(*) from t;  </p><p>+----------+  </p><p>| count(*) |  </p><p>+----------+  </p><p>|   400096 |  </p><p>+----------+  </p><p>  </p><p>[mysql@even employees]$ ls -alh t.ibd  </p><p>-rw-rw---- 1 mysql dba 72M 10-08 17:41 t.ibd  </p><p>  </p><p>  </p><p>mysql> optimize table t;  </p><p>+-------------+----------+----------+-------------------------------------------------------------------+  </p><p>| Table       | Op       | Msg_type | Msg_text                                                          |  </p><p>+-------------+----------+----------+-------------------------------------------------------------------+  </p><p>| employees.t | optimize | note     | Table does not support optimize, doing recreate + analyze instead |  </p><p>| employees.t | optimize | status   | OK                                                                |  </p><p>+-------------+----------+----------+-------------------------------------------------------------------+  </p><p>  </p><p>[mysql@even employees]$ ls -alh t.ibd  </p><p>-rw-rw---- 1 mysql dba 29M 10-08 17:43 t.ibd</p>


 

 

来看下这种方法的缺陷

[plain] 

mysql> show processlist;  

+----+------+-----------+-----------+---------+------+-------------------+------------------+  

| Id | User | Host      | db        | Command | Time | State             | Info             |  

+----+------+-----------+-----------+---------+------+-------------------+------------------+  

|  5 | root | localhost | NULL      | Query   |    0 | NULL              | show processlist |  

|  6 | root | localhost | employees | Query   |   64 | copy to tmp table | optimize table t |  

+----+------+-----------+-----------+---------+------+-------------------+------------------+  

 

mysqladmin debug结果如下

[plain] 

Thread database.table_name          Locked/Waiting        Lock_type  

  

6       employees.t                 Locked - read         Read lock without concurrent inserts  

 

用optimize缺点显而易见:读锁,特别当你有大表时性能恐怕会深受影响

这里推荐使用percona公司:pt-online-schema-change,避免加锁

[plain] 

$ pt-online-schema-change -uroot -poracle --alter "ENGINE=InnoDB" D=employees,t=t --execute  

执行pt工具时有可能发生的类似错误:

[plain] 

Cannot chunk the original table  There is no good index and the table is oversized  

 

这是因为被作用的表需要含有主键或者唯一索引,这或许也能成为这款工具的小bug吧

bitsCN.com
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn