可以看到innodb_file_per_table預設未開啟
mysql> show variables like 'innodb_file_per_table%';
+--------------------------+----------+
| Variable_name | Value |
+--------------------------+----------+
| innodb_file_per_table | OFF |
+--------------------------+----------+
1 rows in set (0.00 sec)
test資料庫裡的內容也看不到ibd獨立表空間檔案,只看到frm表結構定義檔
先作資料庫邏輯全備份,待會恢復要用
mysqldump -uroot -p --all-databases --add-drop-database --flush-privileges --events > /tmp/all-databases.sql
將my.cnf中的 innodb_file_per_table 改成1,如果沒有請補上
rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*
啟動MySQL
/etc/init.d/mysql start
確認已啟用獨立表空間了
mysql> show variables like 'innodb_file_per_table %';
+--------------------------+----------+
| Variable_name | Value |
+--------------------------+----------+
| innodb_file_per_table | ON |
+--------------------------+----------+
1 rows in set (0.00 sec)
檢查一下共享表空間檔案都已自動初始化,容量有變小了,共享表空間基本上要給系統表使用,是不能不存在的
因為設定獨立表空間只對InnoDB新資料表有效,需要重新恢復資料來對舊的資料表套用設定
mysql -uroot -p < /tmp/all-databases.sql
恢復完成後,檢查一下資料庫目錄中的確已產生ibd的獨立表空間檔案,這就完成囉
另一個不用恢復資料表的作法是用ALTER TABLE ENGINE的方法,針對所有Innodb的表作處理,如下
mysql -uroot -p -BN -e "select concat('alter table ',TABLE_SCHEMA ,'.',table_name,' ENGINE=InnoDB;') FROM INFORMATION_SCHEMA.tables where table_type='BASE TABLE' and engine = 'InnoDB';" > recreate.sql
mysql -uroot -p -BN -e "select concat('alter table ',TABLE_SCHEMA ,'.',table_name,' ENGINE=InnoDB;') FROM INFORMATION_SCHEMA.tables where table_type='BASE TABLE' and engine = 'InnoDB';" > recreate.sql
mysql -uroot -p < recreate.sql
而獨立表空間的好處,可參考增加mysql InnoDB的表空间說明
0 意見:
張貼留言