データ容量が不足して、テーブルスペースを削除したいけど、テーブルスペースを削除するにはテーブルスペースに格納されているデータを別のテーブルスペースに移さないといけない!
そんな時に利用するALTER TABEL文を一気に作成するクエリです。
innodb_file_per_tableテーブルスペースの場合だけ、データ削除によってテーブルに空き領域が出来たときには、ちゃんと必要な分だけ容量を確保するようにMysqlは動きます。
テーブルスペースの場合は、空き容量を回収してくれないので、削除しないとダメなので、運用がちょっと面倒。
テーブルをinnodb_file_per_tableもしくは特定のディレクトリのテーブルスペースに一気に移動したい時に使うSQLを作成するSQL
SELECT
a.NAME AS space_name,
b.NAME AS table_name,
CONCAT( "ALTER TABLE " , REPLACE( b.NAME , "/", "_") , " TABLESPACE innodb_file_per_table;" ) as "innodb_file_per_tableに移動するSQL",
CONCAT( "DROP TABLESPACE " , a.NAME , " ENGINE=INNODB;" ) as "テーブルスペースを削除るSQL",
CONCAT( "CREATE TABLESPACE `" , REPLACE( b.NAME , "/", "_") , "` ADD DATAFILE '<テーブルスペースを作成するディレクトリ>", REPLACE( b.NAME , "/", "_") , ".ibd' FILE_BLOCK_SIZE=8192 Engine=InnoDB;" ) as "特定のディレクトリにテーブルごとにテーブルスペースを作成するSQL",
CONCAT( "ALTER TABLE " , REPLACE( b.NAME , "/", ".") , " TABLESPACE = `" , REPLACE( b.NAME , "/", "_") , "`;" ) as "特定のディレクトリのテーブルごとのテーブルスペースにテーブルを移動するSQL"
FROM
information_schema.INNODB_SYS_TABLESPACES a,
information_schema.INNODB_SYS_TABLES b
WHERE
a.SPACE = b.SPACE
AND a.NAME LIKE '<テーブルスペース名>' -- テーブルスペース単位で指定したい場合はこちら
#AND b.NAME LIKE 'scuel_common' -- データベース単位で指定したい場合はこちら
#AND b.NAME NOT IN ('<除外したいテーブル名>')
;