ALTER kolom kunci utama dari INT ke BIGINT dalam produksi (MySQL 5.6.19a)


20

Beberapa tabel INNODB di basis data produksi kami akan mencapai batas INT AUTO_INCREMENT dari 2147483647 dan kami perlu mengubahnya ke BIGINT jika tidak, penulisan akan mulai gagal.

Tabel-tabel tersebut dalam database MySQL 5.6.19a produksi yang berjalan di Amazon RDS.

Bagaimana kita bisa melakukan ALTER seperti ini tanpa mengganggu produksi membaca dan memasukkan yang terjadi setiap saat?

ALTER TABLE MYTABLECHANGE id idBIGINT NOT NULL AUTO_INCREMENT;

Inilah DDL untuk tabel:

CREATE TABLE `MYTABLE` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `siteId` int(11) NOT NULL,
  `filter` varchar(10) NOT NULL DEFAULT 'ALL',
  `date` varchar(10) NOT NULL,
  `cards` varchar(250) NOT NULL,
  `apples` varchar(45) NOT NULL,
  `carrots` varchar(45) NOT NULL,
  `corn` varchar(45) NOT NULL,
  `peas` varchar(45) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique` (`siteId`,`filter`,`date`,`cards`),
  KEY `date_k` (`date`),
  KEY `cards_k` (`cards`),
  KEY `apples_k` (`apples`),
  KEY `siteId_k` (`siteId`)
) ENGINE=InnoDB AUTO_INCREMENT=1748961482 DEFAULT CHARSET=utf8

Jawaban:


22

Jika Anda memiliki cukup ruang, Anda bisa membuat salinan tabel aktual dan mengerjakannya:

CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl;

Kemudian Anda dapat mengubah kolom yang diinginkan:

ALTER TABLE tbl_name MODIFY COLUMN col_name BIGINT AUTO_INCREMENT;

Setelah proses selesai, Anda dapat mengganti nama tabel:

RENAME TABLE tbl_name TO new_tbl_name, tbl_name2 TO new_tbl_name2;

Kemudian jatuhkan tabel asli, dan Anda harus memiliki hasil spected.


Saya menggunakan pendekatan ini karena saya bisa mematikan menulis (yang semuanya mode batch) ke meja saat melakukan copy. Butuh waktu sekitar 36 jam.
Mark Hansen

dan Anda ingin menjaga ketiganya dalam satu transaksi. (mengunci / membuka kunci)
Sławomir Lenart

4

percona toolkit adalah jalan yang harus ditempuh, setidaknya jika Anda tidak kekurangan waktu. Konversi mengambil alih meja kami (500Gb, pengaturan master-slave) ketika kami mengujinya sedikit lebih dari 24jam, dalam produksi dibutuhkan (dengan perangkat keras yang lebih baik) hampir 1 bulan (sidenote lucu yang kami miliki sekitar 30 hari sebelum kami kehabisan id, karena itu kami sudah mulai merencanakan untuk rencana B dan C, bekerja dengan cadangan offline, menghapus budak, ...). Penundaan itu terutama karena menunggu replikasi terjadi pada budak (kami mengizinkan jeda waktu maksimal 50 detik). Pastikan juga untuk membatasi jumlah utas bersamaan. Kami memiliki lebih dari 2 juta sisipan / hari dan jutaan baca.

Perlu diketahui juga bahwa setelah peliputan dimulai Anda tidak dapat menghentikannya (atau setidaknya kami tidak menemukan cara untuk memulai kembali) :-(


1

Baik....

KEY TOP_QUERIES_LAST_30DAYS_fk (siteId) berlebihan dengan KUNCI UTAMA, jadi Anda juga dapat MENGHENTIKANnya.

INT UNSIGNED akan membuat Anda mencapai 4 miliar, apakah itu cukup?

Pertimbangkan filteruntuk mengubah ke ENUM.

Apakah Anda memiliki 1,75 miliar baris? Atau apakah Anda "membakar" banyak id? Jika demikian, mungkin kita bisa memperbaikinya? Misalnya REPLACEdan rasa tertentu INSERTakan melontarkan id. INSERT...ON DUPLICATE KEYbiasanya bisa diganti REPLACE. Proses 2 langkah dapat menghindari INSERT IGNOREpembakaran id.

Kembali ke pertanyaan ...

Lihat apakah pt-online-schema-change akan melakukan trik: http://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html


Bisakah saya menggunakan percona dengan Amazon RDS? Ya, kami telah "membakar" banyak ID, tabel sebenarnya memiliki sekitar 330 juta baris.
Mark Hansen

Saya tidak tahu tentang pt & RDS. Jika Anda bisa menghilangkan pembakaran, Anda memiliki id ~ 330M lain sebelum Anda kehabisan kamar.
Rick James
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.