web-dev-qa-db-ja.com

600 GBのテーブルインデックス付きキーデータ型をINTからBIGINTに変更する最速の方法

600GBのMySQLテーブルでデータ型をINTからBIGINTに変更する必要があります。列には一意のインデックスがあります。私は符号なしINTで良いかもしれませんが、それへの変更またはBIGINTはほとんど同じ苦痛になると思います。テーブルのエンジンはInnoDBです。何が簡単になるでしょう:

  1. 他の机
  2. 構造とINSERT INTO (SELECT *)をコピーしています
  3. ダンプテーブルとダンプファイルテーブル定義の変更
  4. 他に何か?

更新:要求どおり、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
13
Noam

テーブルにトリガーがないと仮定すると、 pt-online-schema-change ロックしないでテーブルを変更できるためです。

テーブルのサイズを考えると、かなりの時間がかかります。

また、このメソッドまたはALTER TABLEテーブルの再構築中にテーブルの2つのコピーをサポートするには、600 GBの追加ディスク容量があることを確認する必要があります。

2
Ike Walker

Perconaツールキットの使用pt-online-schema-changeは、使用に影響を与えることなく、本番環境での私の選択です。これにより、デルタを取得するためのトリガーと、これが行われた後に名前を変更するテンポラルテーブルが追加されます。

例:

pt-online-schema-change --alter "CHANGE `id` `id` BIGINT  NOT NULL; " D=DB,t=TABLE
2
Binlogic DBA