MySQLテーブルのストレージエンジン変更方法
MySQLではテーブルを作成時にストレージエンジンを指定することができますが、利用途中でストレージエンジンを変更することも可能です。
今回は3つの方法を紹介します。
ALTER TABLEを利用する方法
最も簡単な方法はALTER TABLEを利用することです。
mysql> ALTER TABLE test_table ENGINE = InnoDB;
この方法は全てのストレージエンジンで利用できますが、実行にかなり時間がかかる可能性があります。
MySQLは古いテーブルから新しいテーブルへ行単位のコピーを実行します。その間はサーバのディスクI/Oはすべて使用され、
変換中はテーブルに読み取りロックが発生します。アクセスの多いテーブルで利用する場合は注意が必要です。
mysqldumpを利用する方法
mysqldumpを利用してテーブルをダンプする方法です。ダンプしたファイルでは、既存のテーブルのDROP TABLE文と新規に作り直すCREATE TABLE文、データを挿入するINSERT文が含まれているので、
CREATE TABLE文を直接編集してENGINE=の部分を利用したいストレージエンジン名に変更します。
mysqldump -uroot -p testdb test_table > /tmp/dump.sql
vi /tmp/dump.sql
-- MySQL dump 10.13 Distrib 5.5.15, for Linux (x86_64) -- -- Host: localhost Database: testdb -- ------------------------------------------------------ -- Server version 5.5.15-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `test_table` -- DROP TABLE IF EXISTS `test_table`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test_table` ( `id` int(11) DEFAULT NULL, `name` text ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `test_table` -- LOCK TABLES `test_table` WRITE; /*!40000 ALTER TABLE `test_table` DISABLE KEYS */; /*!40000 ALTER TABLE `test_table` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2011-09-14 13:51:10
ストレージエンジン変更前のデータも保持しておきたい場合は、ダンプファイルのDROP文を削除し、CREATE文のテーブル名を変更しましょう。
SELECTを用いた方法
今利用しているテーブルと同じテーブル定義の新テーブルを作成して、新テーブルのエンジンを変更してからデータを流し込む方法です。
mysql> CREATE TABLE new_table LIKE test_table; Query OK, 0 rows affected (0.06 sec)
同じ構造になっています。
mysql> desc new_table; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | text | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.03 sec)
新テーブルのストレージエンジンを変更します。
データはまだいれていないのですぐに完了します。
mysql> ALTER TABLE new_table ENGINE=InnoDB; Query OK, 0 rows affected (0.11 sec) Records: 0 Duplicates: 0 Warnings: 0
変更前のテーブルからデータをインサートします。
mysql> INSERT INTO new_table SELECT * FROM test_table; Query OK, 100000 rows affected (0.35 sec) Records: 100000 Duplicates: 0 Warnings: 0
利用する場面によって、以上の3つの方法を使い分けましょう。