如果你有使用InnoDB來儲存你的Mysql表,使用預設設定應該會碰到個非常頭疼的問題,在Mysql的資料目錄裡有個預設只有10MB叫ibdata1的檔案沒日沒夜的增長讓你煩透了吧?裡麵包含了InnoDB引擎儲存的所有索引和資料資訊,很可惜Mysql在設計的時候就沒有收縮InnoDB表的功能,這就是為什麼你在delete,truncate,drop這些表的時候這個檔案大小沒有絲毫要減少的原因,而且你還沒辦法直觀的看到哪個資料庫佔用了大量的ibdata1,這個坑爹的問題在新版的Mysql中已經通過innodb_file_per_table這個選項來解決了,開啟該選項後,每個InnoDB表的索引和資料都會按*.ibd命名儲存到各個資料庫中,但是這個選項預設是不開啟的。
如上所說,你沒法去收縮InnoDB資料檔案,你也沒辦法在一台沒有開啟innodb_file_per_table選項的機器上直接加上該選項讓他工作,你必須在安裝完Mysql就加上這個選項,或者按照本文介紹的三種方式來操作,無論你做任何操作,請確保你已經備份了整個資料庫目錄,也別忘了停掉Mysql相關的一些服務。
前兩個方法需要擷取到Mysql資料庫執行個體中所有InnoDB的清單,如果你使用的是5.0以上的版本,這一切都很容易:SELECT TABLE_SCHEMA,TABLE_NAME FROM TABLES WHERE ENGINE = ‘InnoDB’;
修改表引擎
1.對每個InnoDB表執行 ALTER TABLE table_name ENGINE=MyISAM;
2.停止Mysql服務;
3.移除InnoDB相關檔案ibdata1等;
4.修改my.cnf中的參數,添加innodb_file_per_table;
5.啟動Mysql服務;
6.將剛才修改後的那些表改回InnoDB:ALTER TABLE table_name ENGINE=InnoDB;
匯出InnoDB表
1.使用mysqldump命令匯出所有的InnoDB表,例如: mysqldump –add-drop-table –extended-insert –disable-keys –quick ‘db_name’ –tables ‘tbl_name’ > ‘db_name.tbl_name.sql’
2.刪掉這些表:
◦SET FOREIGN_KEY_CHECKS=0;
◦DROP TABLE db_name.tbl_name;
◦DROP TABLE db_name1.tbl_name1;
◦–– DROP other tables here…
◦SET FOREIGN_KEY_CHECKS=1;
3.停止Mysql服務;
4.移除InnoDB相關檔案ibdata1等;
5.修改my.cnf中的參數,添加innodb_file_per_table;
6.啟動Mysql服務;
7.在Mysql Console下匯入表:
◦SET FOREIGN_KEY_CHECKS=0;
◦SOURCE db_name.tbl_name.sql;
◦SOURCE db_name1.tbl_name1.sql;
◦–– SOURCE other files here…
◦SET FOREIGN_KEY_CHECKS=1;
匯出整個資料庫
這個是我常用的,雖然他和耗磁碟和時間,但是確實是最簡便的:
1.匯出所有的資料: /usr/bin/mysqldump ––extended-insert ––all-databases ––add-drop-database ––disable-keys ––flush-privileges ––quick ––routines ––triggers > all-databases.sql
2.停止Mysql服務;
3.重新命名mysql資料檔案夾;
4.修改my.cnf中的參數,添加innodb_file_per_table;
5.mysql_install_db重新初始化mysqld;
6.開啟Mysql服務;
7.進入Mysql Console執行:
◦SET FOREIGN_KEY_CHECKS=0;
◦SOURCE all-databases.sql;
◦SET FOREIGN_KEY_CHECKS=1;
8.重啟資料庫測試OK就領賞去吧。