MySQL Delete 后,如何快速釋放磁盤空間


  一、起因:收到運維需求需要清理兩張監控告警的日志表,數據刪除之后,發現磁盤空間並未釋放。

  二、分析:InnoDB 數據庫在使用 delete 進行刪除操作的時候,只會將已經刪除的數據標記為刪除,並沒有把數據文件刪除,因此並不會徹底的釋放空間。這些被刪除的數據會被保存在一個鏈接清單中,當有新數據寫入的時候,MySQL 會重新利用這些已刪除的空間進行再寫入。

  三、解決:官方推薦可以使用 OPTIMIZE TABLE 命令來優化表,該命令會重新利用未使用的空間,並整理數據文件的碎片。

  語法如下:

OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL]
    TABLE tbl_name [, tbl_name] ...

  注釋:OPTIMIZE TABLE 將重新組織表數據和相關索引數據的物理存儲空間,減少存儲空間並提高I/O訪問效率。對每個表所做的影響取決於該表所使用的存儲引擎。該命令對視圖無效。

  四、舉例說明:

  1.查看優化前表占用空間大小:

root@dbs00 13:58:46:monitor$ ls -alth
total 7.1G
-rw-r-----  1 mysql mysql 5.1G Nov 21 13:59 job_status_trace_log.ibd
-rw-r-----  1 mysql mysql 1.2G Nov 21 13:58 job_execution_log.ibd

  2.使用OPTIMIZE 命令:

system@localhost 14:22:  [monitor]> optimize table job_execution_log;
+---------------------------+----------+----------+-------------------------------------------------------------------+
| Table                     | Op       | Msg_type | Msg_text                                                          |
+---------------------------+----------+----------+-------------------------------------------------------------------+
| monitor.job_execution_log | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| monitor.job_execution_log | optimize | status   | OK                                                                |
+---------------------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (1.09 sec)

system@localhost 14:23:  [monitor]> optimize table job_status_trace_log;
+------------------------------+----------+----------+-------------------------------------------------------------------+
| Table                        | Op       | Msg_type | Msg_text                                                          |
+------------------------------+----------+----------+-------------------------------------------------------------------+
| monitor.job_status_trace_log | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| monitor.job_status_trace_log | optimize | status   | OK                                                                |
+------------------------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (1.13 sec)

  3.查看優化之后的磁盤空間占用大小:

root@dpsvstadbs00 14:25:10:monitor$ ls -alth
total 868M
-rw-r-----  1 mysql mysql 368K Nov 21 14:26 job_exect_log.ibd
-rw-r-----  1 mysql mysql  17M Nov 21 14:26 job_trace_log.ibd

   4.可以使用SQL 語句查看表占用空間的大小(默認M為單位)

system@localhost 17:52:  [monitor]> select table_name,(data_length+index_length)/1048576,table_rows from information_schema.tables where t
able_schema='monitor' and table_name='job_status_trace_log';

+----------------------+------------------------------------+------------+ | table_name | (data_length+index_length)/1048576 | table_rows | +----------------------+------------------------------------+------------+ | job_trace_log | 9.0625 | 10401 | +----------------------+------------------------------------+------------+ 1 row in set (0.00 sec)

  補充:

  1、對於 InnoDB 存儲引擎 MySQL,OPTIMIZE 命令,將會被映射為 ALTER TABLE  ... FORCE,並將重建表,更新索引統計信息,釋放未使用的索引空間,這就意味着在一定程度上 OPTIMIZE  操作會造成一定的表阻塞(具體可以參加官網)。

  2、OPTIMIZE 操作會鎖表,所以最好不要在高峰期使用。

    3、OPTIMIZE 操作相當於物理刪除,一旦刪除,恢復就很麻煩,所以最好使用邏輯刪除,也不要經常使用,每月一次就夠了

官網地址:https://dev.mysql.com/doc/refman/5.7/en/optimize-table.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM