2014年8月15日 星期五

[MySQL]啟用innodb_file_per_table將共享表空間改成獨立表空間

        MySQL預設是共享表空間,而獨立表空間的優點是減少對表空間IO資源的爭用,容易管理及備份,回收空間容易,而本文是教你怎麼套用成獨立表空間

        可以看到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)


        ibdata1共享表空間很大,因為Innodb的資料也放在一起了


        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,如果沒有請補上


        停止MySQL

/etc/init.d/mysql stop

        清除共享表空間檔案
    
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 < recreate.sql

        而獨立表空間的好處,可參考增加mysql InnoDB的表空间說明



0 意見:

張貼留言