If you use MySQL with InnoDB, chances are you’ve seen growing IBD data files. Those are the files that actually hold your data within MySQL. By default, they only grow – they don’t shrink. So how do you know if you still have free space left in your IBD files?
There’s a query you can use to determine that:
SELECT round((data_length+index_length)/1024/1024,2) FROM information_schema.tables WHERE table_schema='zabbix' AND table_name='history_text';
The above will check a database called zabbix
for a table called history_text
. The result will be the size that MySQL has “in use” in that file. If that returns 5.000 as a value, you have 5GB of data in there.
In my example, it showed the data size to be 16GB. But the actual IBD file was over 50GB large.
$ ls -alh history_text.ibd -rw-r----- 1 mysql mysql 52G Sep 10 15:26 history_text.ibd
In this example I had 36GB of wasted space on the disk (52GB according to the OS, 16GB in use by MySQL). If you run MySQL with innodb_file_per_table=ON, you can individually shrink the IBD files. One way, is to run an OPTIMIZE
query on that table.
Note: this can be a blocking operation, depending on your MySQL version. WRITE and READ I/O can be blocked to the table for the duration of the OPTIMIZE query.
MariaDB [zabbix]> OPTIMIZE TABLE history_text; Stage: 1 of 1 'altering table' 93.7% of stage done Stage: 1 of 1 'altering table' 100% of stage done +---------------------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------------------+----------+----------+-------------------------------------------------------------------+ | zabbix.history_text | optimize | note | Table does not support optimize, doing recreate + analyze instead | | zabbix.history_text | optimize | status | OK | +---------------------+----------+----------+-------------------------------------------------------------------+ 2 rows in set (55 min 37.37 sec)
The result is quite a big file size savings:
$ ls -alh history_text.ibd -rw-rw---- 1 mysql mysql 11G Sep 10 16:27 history_text.ibd
The file that was previously 52GB in size, is now just 11GB.