600GBのMySQLテーブルでデータ型をINTからBIGINTに変更する必要があります。列には一意のインデックスがあります。私は符号なしINTで良いかもしれませんが、それへの変更またはBIGINTはほとんど同じ苦痛になると思います。テーブルのエンジンはInnoDBです。何が簡単になるでしょう:
INSERT INTO (SELECT *)
をコピーしています更新:要求どおり、MySQLバージョン5.5.15、外部キーなし、テーブルを作成:
CREATE TABLE `tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`created_at` datetime NOT NULL,
`tid` bigint(20) NOT NULL,
`t` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`f` tinyint(1) NOT NULL,
`i_id` bigint(20) NOT NULL,
`ir_id` int(11) NOT NULL,
`r_c` int(11) NOT NULL,
`r` tinyint(1) NOT NULL,
`e` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`t` varchar(5) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user` (`user_id`,`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=1657146169 DEFAULT CHARSET=utf8
テーブルにトリガーがないと仮定すると、 pt-online-schema-change
ロックしないでテーブルを変更できるためです。
テーブルのサイズを考えると、かなりの時間がかかります。
また、このメソッドまたはALTER TABLE
テーブルの再構築中にテーブルの2つのコピーをサポートするには、600 GBの追加ディスク容量があることを確認する必要があります。
Perconaツールキットの使用pt-online-schema-change
は、使用に影響を与えることなく、本番環境での私の選択です。これにより、デルタを取得するためのトリガーと、これが行われた後に名前を変更するテンポラルテーブルが追加されます。
例:
pt-online-schema-change --alter "CHANGE `id` `id` BIGINT NOT NULL; " D=DB,t=TABLE