0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

テーブルをinnodb_file_per_tableもしくは特定のディレクトリのテーブルスペースに一気に移動したい時に使うSQLを作成するSQL

Last updated at Posted at 2020-09-14

データ容量が不足して、テーブルスペースを削除したいけど、テーブルスペースを削除するにはテーブルスペースに格納されているデータを別のテーブルスペースに移さないといけない!
そんな時に利用する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 ('<除外したいテーブル名>')
    ;
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?