1. Dump All Databases
First, create a backup of all databases to ensure you don't lose any data.
bashmysqldump -u root -p --all-databases > all_databases.sql
2. Stop MySQL
Stop the MySQL service to prepare for removing the InnoDB data files.
bashsudo systemctl stop mysqld
3. Remove InnoDB Data Files
Remove the InnoDB data files. These files are typically located in the /var/lib/mysql
directory. Be very careful with this step, as removing the wrong files can result in data loss.
bashsudo rm -rf /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile0 /var/lib/mysql/ib_logfile1
4. Edit MySQL Configuration
Ensure innodb_file_per_table
is enabled in the MySQL configuration file (usually located at /etc/my.cnf
or /etc/mysql/my.cnf
).
Add or ensure the following lines are present under the [mysqld]
section:
ini[mysqld]
innodb_file_per_table=1
This setting makes sure that each InnoDB table and its indexes are stored in a separate file, which makes it easier to manage disk space in the future.
5. Start MySQL
Start the MySQL service again.
bashsudo systemctl start mysqld
6. Restore the Dumped Databases
Import the SQL dump file you created earlier.
bashmysql -u root -p < all_databases.sql
Additional Tips
Optimize Tables Regularly: Regularly running
OPTIMIZE TABLE
can help keep table sizes down and manage free space better.sqlOPTIMIZE TABLE your_table;
Monitor Disk Usage: Use monitoring tools and set up alerts for disk space usage to avoid running into space issues in the future.
Log Rotation: Ensure logs are being rotated properly to avoid log files consuming too much space.
bashsudo logrotate /etc/logrotate.conf
By following these steps, you should be able to reclaim disk space used by the ibdata1
file. This process involves some downtime, so plan accordingly.