Cara tercepat untuk mengubah tabel data kunci utama 600GB yang diindeks dari INT ke BIGINT

13

Saya perlu mengubah tipe data dari INT ke BIGINT dalam tabel MySQL 600GB. Kolom memiliki indeks unik. Saya mungkin baik dengan INT yang tidak ditandatangani, tetapi saya menganggap mengubah itu atau BIGINT akan menjadi rasa sakit yang sama. Mesin meja adalah InnoDB. Apa yang akan lebih mudah:

  1. ALTER TABEL
  2. Struktur penyalinan dan INSERT INTO (SELECT *)
  3. Tabel dumping dan mengubah definisi tabel file dump
  4. Ada yang lain?

UPDATE: Seperti yang diminta, MySQL ver 5.5.15, tidak ada kunci asing dan buat tabel:

 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
Noam
sumber
Tentukan rasa sakit, luangkan waktu sesingkat mungkin ...? Hasil tercepat?
@AlecTeal Ambil waktu tersingkat
Noam
Meskipun tidak menjawab pertanyaan dan pertanyaan ini mungkin dibahas sebelum tabel menjadi sebesar itu, saya juga akan mencari cara untuk mengurangi ukuran tabel ini.
1
Versi MySQL yang mana? Itu penting karena beberapa versi miliki ALTER TABLE ONLINE. Apakah Anda memiliki kunci asing yang merujuk pada kolom ini? Akan membantu jika Anda menunjukkan SHOW CREATE TABLE tablename;hasilnya.
ypercubeᵀᴹ
2
Jika nama bidang pendek membantu mengurangi ukuran tabel, itu akan menjadi 600 MB .
Jon of All Trades

Jawaban:

2

Dengan asumsi meja Anda tidak memiliki pemicu di dalamnya, Anda harus mempertimbangkan menggunakan pt-online-schema-changekarena akan memungkinkan Anda untuk mengubah tabel tanpa menguncinya.

Masih akan memakan waktu yang cukup lama mengingat ukuran meja.

Juga, dengan metode ini atau dengan ALTER TABLEAnda akan perlu memastikan Anda memiliki 600 GB ruang disk tambahan untuk mendukung dua salinan tabel saat sedang dibangun kembali.

Ike Walker
sumber
Punya perkiraan waktu? (Saya tahu itu tergantung pada banyak faktor, tetapi jika Anda harus menebak, apa yang akan menjadi kisaran)
Noam
@Noam Anda tidak perlu menyalin tabel. Jika Anda menggunakan tabel Alter, KASUS TERBURUK adalah bahwa ia menyalin, jika Anda menggunakan mesin yang matang, itu hanya akan membuat catatan untuk dirinya sendiri bahwa apa pun yang sebelumnya (beberapa lokasi dalam file atau catatan) menggunakan int, posting apa pun menggunakan bigint, sampai Anda mengoptimalkan.
@AlecTeal Apakah Anda memiliki referensi resmi untuk itu?
Noam
@Noam lihat jawabanku.
1
@Noam saya memperkirakan ALTER TABLEakan membutuhkan waktu 24 - 96 jam untuk beroperasi. Anda bisa mendapatkan perkiraan yang lebih baik dengan menjalankan ALTER TABLE di lingkungan pengujian.
Ike Walker
2

Menggunakan perkona toolkit pt-online-schema-changeakan menjadi pilihan saya pada produksi tanpa mempengaruhi penggunaannya. Ini akan menambahkan beberapa pemicu untuk mendapatkan delta dan tabel temporal yang akan berganti nama setelah ini selesai.

contoh:

pt-online-schema-change --alter "CHANGE `id` `id` BIGINT  NOT NULL; " D=DB,t=TABLE
Binatu DBA
sumber
pt adalah jalan untuk pergi. @Noam FYI: INT-> migrasi BIGINT pada tabel ~ 270GB dengan banyak baris pada contoh EC2 dengan aktivitas menulis yang cukup berat pada tabel ini memakan waktu 64 jam menggunakan pt-online-schema-change.
Jakub Głazik