You may find this surprising, but did you know that there are several moving parts to ibdata1? Even with [innodb_file_per_table][1] enabled, here the classes of information stored in ibdata1

- Data Dictionary
- Double Write Buffer (support data consistency; used for Crash Recovery)
- Insert Buffer (Buffers Changes to Secondary Non-Unique Indexes)
- Rollback Segments
- Undo Space **(where the most uncontrolled growth can happen)**

#Pictorial Representation of InnoDB Architecture

![InnoDB Architecture][2]

What can make ibdata1 grow suddenly?

According to [mysqlperformanceblog.com's `Reasons for run-away main Innodb Tablespace`][3]:

- Lots of Transactional Changes
- Very Long Transactions
- Lagging Purge Thread

As long as your total InnoDB dataset is relatively small and you would like to shrink ibdata1, you can do the following:

STEP 01: Schedule downtime

STEP 02: mysqldump all databases to /root/MySQLData.sql

    mysqldump -uroot -p --all-databases --routines --triggers > /root/MySQLData.sql

STEP 03: Run `SET GLOBAL innodb_fast_shutdown = 0;`

STEP 04: Drop all databases except the `mysql` and `information_schema` database

STEP 05: `service mysql stop`

STEP 06: `rm -f /var/lib/mysql/ib*`

STEP 07: `service mysql start` (recreates ibdata1, ib_logfile0, ib_logfile1)

STEP 08: Login to mysql

STEP 09: At mysql prompt, run `mysql> source /root/MySQLData.sql`

That's it. I have done this many, many times : [**Howto: Clean a mysql InnoDB storage engine?**][4]

From here, you just have to live with the weird growth due to transactions.

Give it a Try !!!


  [1]: http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_file_per_table
  [2]: https://i.sstatic.net/9EcRi.jpg
  [3]: http://www.mysqlperformanceblog.com/2010/06/10/reasons-for-run-away-main-innodb-tablespace/
  [4]: https://stackoverflow.com/questions/3927690/howto-clean-a-mysql-innodb-storage-engine/4056261#4056261