Promosikan Partisi Tabel MySQL ke Tabel

Aug 17 2020

Keterampilan Google Penelusuran saya tidak cukup untuk menemukan solusi untuk ini. Jika memungkinkan, bagaimana cara mempromosikan partisi pada tabel menjadi tabel sendiri?

Mari kita asumsikan saya memiliki part0, part1, dan part2. Apakah ada ALTER TABLEyang bisa saya berikan yang dikonversi part0ke tabel baru?

Proses pemikiran saya adalah, karena data sudah ada di file terpisah di disk, proses pembuatan tabel mungkin lebih cepat daripada membuat tabel baru menggunakan SELECTkueri.

Jawaban

RolandoMySQLDBA Aug 17 2020 at 23:04

Anda tidak perlu SELECT. Ini dapat dilakukan dengan DDL murni.

Untuk contoh ini, katakanlah tabel yang dipartisi adalah sebagai berikut:

  1. Database mydb
  2. Meja mytable
  3. Partisi ( part0, part1, part2)

Ini bisa jadi rumit tapi ini dia

USE mydb
CREATE TABLE mynewtable LIKE mytable;
ALTER TABLE mynewtable REMOVE PARTITIONING; 
ALTER TABLE mytable
    EXCHANGE PARTITION p0
    WITH TABLE mynewtable
    WITHOUT VALIDATION
;
ALTER TABLE mytable DROP PARTITION p0;

Apa yang dilakukannya adalah membuat pertama mynewtabletanpa partisi dan skema yang sama di semua aspek lainnya. Kemudian, itu menukar mynewtabletabel dengan part0.

Jika Anda tidak yakin tentang ini, jalankan

USE mydb
CREATE TABLE mynewtable LIKE mytable;
ALTER TABLE mynewtable REMOVE PARTITIONING; 
ALTER TABLE mytable
    EXCHANGE PARTITION p0
    WITH TABLE mynewtable
    WITHOUT VALIDATION
;

Periksa baris dalam mynewtabledan yang baru part0dan pastikan

  • mynewtable memiliki data dari aslinya part0
  • Yang baru part0harus kosong

Setelah Anda yakin transposisi berfungsi, jalankan

ALTER TABLE mytable DROP PARTITION p0;

Silakan uji ini di lab atau sqlfiddle. COBALAH !!!

RickJames Aug 17 2020 at 21:54

Ya, PARTITIONadalah a TABLE. Namun, dibutuhkan beberapa perintah khusus untuk mengubah partisi menjadi tabel atau sebaliknya.

Lihat "ruang meja yang dapat dipindahkan" dan tabel FLUSH TABEL UNTUK EKSPOR; ALTER TABLE ptable Buang TABEL; ALTER TABLE ptable IMPORT TABLESPACE. Detailnya berbeda antara MySQL 5.6 dan 5.7+.

http://mysql.rjweb.org/doc.php/partitionmaint#use_cases_for_partitioning memiliki tautan ke beberapa tempat yang membahas teknik.