Bug #45173 | ibdata1 keeps grownig even if innodb_file_per_table is set | ||
---|---|---|---|
Submitted: | 28 May 2009 22:50 | Modified: | 29 Jun 2009 6:30 |
Reporter: | Tech Magos | Email Updates: | |
Status: | Duplicate | Impact on me: | |
Category: | MySQL Server: InnoDB storage engine | Severity: | S3 (Non-critical) |
Version: | 5.1.30 - all | OS: | Any |
Assigned to: | CPU Architecture: | Any | |
Tags: | growing, IBData1 |
[28 May 2009 22:50]
Tech Magos
[29 May 2009 2:42]
Baron Schwartz
"We know the file stores NO real data" That is untrue.
[29 May 2009 5:19]
Sveta Smirnova
Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://dev.mysql.com/doc/ and the instructions on how to report a bug at http://bugs.mysql.com/how-to-report.php According to http://dev.mysql.com/doc/refman/5.1/en/multiple-tablespaces.html: "With multiple tablespaces enabled, InnoDB stores each *newly* created table into its own tbl_name.ibd file" "The --innodb_file_per_table option affects only table creation, not access to existing tables." "InnoDB always needs the shared tablespace because it puts its internal data dictionary and undo logs there. The .ibd files are not sufficient for InnoDB to operate. " So this is not a bug.
[30 May 2009 10:16]
Tech Magos
True, the docs do mention what you refer to and yes we had read it. Yes you are right, this is not bug, it is a feature, albeit it is a *problematic* feature. "We know the file stores NO real data" is actually true, depending how you look at it. Imagine you run a prod db which grows on data continuously and as you do not have infinite disk space you need to clear old data every so often. What happens here is you DELETE a large set of records, then run OPTIMIZE and then find that NO space is claimed back. So you just run out of space and you have to clear ibdata1 often by rebuilding the db from scratch, which takes you 20 hours. You know for sure that no real data is stored in in that extra disk (that is data of any entropy). Guessing that it is the undo log that grows when the DELETE is done but then when the deleted data is zapped (OPTIMIZE), disk is not claimed back. To us, this is a real problem and the fact that the docs talk about does not make it any better. There could be workarounds (e.g. configuration settings) for a scenario like the above that make this problem less exaggerated; pls do let us know if you know of any.
[25 Jun 2009 22:25]
Tech Magos
I reopen this oen, as i spotted that this "feature" is actually a lot worse than i thought. For a db of around 60GB of data (which constantly gets extended at one end and deleted on the "front" every week), ibdata1 file has grown to 29GB. So nearly half the disk data is actually wasted. And i am not sure how much more this file can keep growing. I request for a clear update of your docs, stating in the appropriate places that for innodb disk space planning one should take into account that ibdata* file can keep growing and will roughly require half the space of one's database's actual data - though no real data is kept in it. In case this file grows more than I have spotted (e.g. it can continue to grow to take all disk space), please state this clearly in the docs too. Many thanks
[29 Jun 2009 6:30]
Sveta Smirnova
Thank you for the feedback. There is already verified feature request - bug #1341 about this problem.
[22 Aug 2011 21:23]
James Day
If the undo log space use is a problem for you here are some possible steps that can be taken to reduce the amount of space involved: 1. Do the work in smaller chunks and commit regularly. Wait for some time between pieces. InnoDB's purge thread can't free space from the undo log until the transaction that created the entries finishes and until the last transaction started before it committed has finished. 2. If using MySQL 5.5 be sure to set innodb_purge_threads=1 so that the purge job runs in its own thread and can't be delayed by flushing activity. 3. Set innodb_io_capacity high enough for the purge thread to do sufficient work to catch up quickly. 4. If necessary, set innodb_max_purge_lag to a suitable value to delay the foreground work so the purge thread can keep up. This is not desirable but it can be better than continuous growth if the server never has a chance to catch up with purge activity. The undo log is required for making previous versions of pages available to other transactions to handle the various transaction isolation modes. James Day, MySQL Principal Support Engineer, Oracle UK