Sunday, 4 June 2017

database - 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.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


http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html



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.



http://dev.mysql.com/doc/refman/5.1/en/drop-database.html



You have probably seen this:
http://bugs.mysql.com/bug.php?id=1341



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



Regarding the information_schema, that is not necessary nor possible to drop. It is in fact just a bunch of read-only views, not tables. And there are no files associated with the them, not even a database directory. The informations_schema is using the memory db-engine and is dropped and regenerated upon stop/restart of mysqld. See https://dev.mysql.com/doc/refman/5.7/en/information-schema.html.

No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...