DB間でテーブルをまるごとコピーする(注意事項あり)
DB操作に関わる作業をしているとき、現在運用中のテーブルをそのまま弄るのは色々怖い。
そんな場合は、開発用テストDBを作っておき、そこに本番のテーブルをコピーして弄るのが良いと思う。
以下やりかた。
DB | DB名 |
---|---|
本番DB | production |
開発DB | dev |
productionにあるテーブルtest_tableをdevにコピーしたいとする
CREATE TABLE dev.test_table SELECT * FROM production.test_table;
※注意
AUTO_INCREMENTやDEFAULT CHARSETなどの属性はコピー先へ引き継がれない。別途設定が必要です。
属性が落ちていることに気づかず、DB周りのエラーで数時間ハマった。
例えば、
CREATE TABLE test_table ( id BIGINT AUTO_INCREMENT, user_id BIGINT, title VARCHAR(255), body LONGTEXT, INDEX user_id_idx (user_id), PRIMARY KEY(id) ) ENGINE = MyISAM DEFAULT CHARSET = sjis;
なtest_tableをコピーすると、下のようになる。
#コピー元
mysql> show create table dev.test_table -> ; +--------+---------------------------------------------- ------------------------------------------------------+ | Table | Create Table | +--------+---------------------------------------------- ------------------------------------------------------+ | test_table | CREATE TABLE `test_table` ( `id` bigint(20) NOT NULL auto_increment, `user_id` bigint(20) default NULL, `title` varchar(255) default NULL, `body` longtext, PRIMARY KEY (`id`), KEY `user_id_idx` (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=sjis | +--------+---------------------------------------------- ------------------------------------------------------+
#コピー先
mysql> show create table production.test_table; +--------+---------------------------------------------- ---------------------------------+ | Table | Create Table | +--------+---------------------------------------------- ---------------------------------+ | test_table | CREATE TABLE `test_table` ( `id` bigint(20) NOT NULL default '0', `user_id` bigint(20) default NULL, `title` varchar(255) character set sjis default NULL, `body` longtext character set sjis ) ENGINE=MyISAM DEFAULT CHARSET=utf8 | #色々な属性が落ちてしまっている +--------+---------------------------------------------- ---------------------------------+
うーん。属性を保ったままテーブルをコピーする方法はあるんだろうか。