Thursday, 15 October 2015

How to shrink/purge ibdata1 file in MySQL

         That ibdata1 isn't shrinking is a particularly annoying feature of MySQL. The ibdata1 file canĀ“t actually be shrunk unless you delete all databases, remove the files and reload a dump.

But you can configure MySQL so that each table, including its indexes, is stored as a separate file. In that way ibdata1 will not grow as large. According to Bill Karwin's comment this is enabled by default as of version 5.6 of MySQL.
It was a while ago I did this. 

However, to setup your server to use separate files for each table you need to change my.cnf in order to enable this:

[mysqld]
innodb_file_per_table=1


As you want to reclaim the space from ibdata1 you actually have to delete the file:

1) Do a mysqldump of all databases, procedures, triggers etc except the mysql and performance_schema databases
2) Drop all databases except the above 2 databases
3) Stop mysql
4) Delete ibdata1 and ib_log files
5) Start mysql
6) Restore from dump

When you start MySQL in step 5 the ibdata1 and ib_log files will be recreated.

Now you're fit to go. When you create a new database for analysis, the tables will be located in separate ibd* files, not in ibdata1. As you usually drop the database soon after, the ibd* files will be deleted. 

By using the command ALTER TABLE <tablename> ENGINE=innodb or OPTIMIZE TABLE <tablename> one can extract data and index pages from ibdata1 to separate files. However, ibdata1 will not shrink unless you do the steps above.

Note:To Use InnoDB to store all Data's in Database on Singe File ibdata1,  then edit the my.cnf 

 [mysqld]
innodb_file_per_table=OFF

No comments:

Post a Comment